ZGlmZiAtLWdpdCBhL21ldGEvcmVjaXBlcy1ic3AvbHJ6c3ovbHJ6c3otMC4xMi4yMC9nZXR0ZXh0LnBhdGNoIGIvbWV0YS9yZWNpcGVzLWJzcC9scnpzei9scnpzei0wLjEyLjIwL2dldHRleHQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyNGExZgotLS0gL2Rldi9udWxsCisrKyBiL21ldGEvcmVjaXBlcy1ic3AvbHJ6c3ovbHJ6c3otMC4xMi4yMC9nZXR0ZXh0LnBhdGNoCkBAIC0wLDAgKzEsMjE4ODQgQEAKK1Vwc3RyZWFtLVN0YXR1czogSW5hcHByb3ByaWF0ZSBbY29uZmlndXJhdGlvbl0KKworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9BQk9VVC1OTFMJMTk5OC0wNC0yNiAwOToyMjozMC4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL0FCT1VULU5MUwkyMDA0LTA5LTEyIDE0OjQwOjM0LjMyMzc1Mjk1MiAtMDQwMAorQEAgLTEsMTQgKzEsMTQgQEAKKyBOb3RlcyBvbiB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorLSAgIEZyZWUgc29mdHdhcmUgaXMgZ29pbmcgaW50ZXJuYXRpb25hbCEgIFRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QKKy1pcyBhIHdheSB0byBnZXQgbWFpbnRhaW5lcnMgb2YgZnJlZSBzb2Z0d2FyZSwgdHJhbnNsYXRvcnMsIGFuZCB1c2VycyBhbGwKKytGcmVlIHNvZnR3YXJlIGlzIGdvaW5nIGludGVybmF0aW9uYWwhICBUaGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0IGlzCisrYSB3YXkgdG8gZ2V0IG1haW50YWluZXJzIG9mIGZyZWUgc29mdHdhcmUsIHRyYW5zbGF0b3JzLCBhbmQgdXNlcnMgYWxsCisgdG9nZXRoZXIsIHNvIHRoYXQgd2lsbCBncmFkdWFsbHkgYmVjb21lIGFibGUgdG8gc3BlYWsgbWFueSBsYW5ndWFnZXMuCisgQSBmZXcgcGFja2FnZXMgYWxyZWFkeSBwcm92aWRlIHRyYW5zbGF0aW9ucyBmb3IgdGhlaXIgbWVzc2FnZXMuCisgCisgICAgSWYgeW91IGZvdW5kIHRoaXMgYEFCT1VULU5MUycgZmlsZSBpbnNpZGUgYSBkaXN0cmlidXRpb24sIHlvdSBtYXkKKyBhc3N1bWUgdGhhdCB0aGUgZGlzdHJpYnV0ZWQgcGFja2FnZSBkb2VzIHVzZSBHTlUgYGdldHRleHQnIGludGVybmFsbHksCistaXRzZWxmIGF2YWlsYWJsZSBhdCB5b3VyIG5lYXJlc3QgR05VIGFyY2hpdmUgc2l0ZS4gIEJ1dCB5b3UgZG8gKm5vdCoKKytpdHNlbGYgYXZhaWxhYmxlIGF0IHlvdXIgbmVhcmVzdCBHTlUgYXJjaGl2ZSBzaXRlLiAgQnV0IHlvdSBkbyBfbm90XworIG5lZWQgdG8gaW5zdGFsbCBHTlUgYGdldHRleHQnIHByaW9yIHRvIGNvbmZpZ3VyaW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nCisgdGhpcyBwYWNrYWdlIHdpdGggbWVzc2FnZXMgdHJhbnNsYXRlZC4KKyAKK0BAIC0yMiwxMCArMjIsMTAgQEAKKyBgZ2V0dGV4dCcgd2hpY2ggaXMgdXNlZC4gIFRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlCisgYGludGwvVkVSU0lPTicgZmlsZSwgaW4gaW50ZXJuYXRpb25hbGl6ZWQgcGFja2FnZXMuCisgCistT25lIGFkdmlzZSBpbiBhZHZhbmNlCistPT09PT09PT09PT09PT09PT09PT09CisrUXVpY2sgY29uZmlndXJhdGlvbiBhZHZpY2UKKys9PT09PT09PT09PT09PT09PT09PT09PT09PQorIAorLSAgIElmIHlvdSB3YW50IHRvIGV4cGxvaXQgdGhlIGZ1bGwgcG93ZXIgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIHlvdQorK0lmIHlvdSB3YW50IHRvIGV4cGxvaXQgdGhlIGZ1bGwgcG93ZXIgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIHlvdQorIHNob3VsZCBjb25maWd1cmUgaXQgdXNpbmcKKyAKKyAgICAgIC4vY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0CitAQCAtMzQsNDIgKzM0LDQwIEBACisgcGFja2FnZSwgZGVzcGl0ZSB0aGUgZXhpc3RlbmNlIG9mIGludGVybmF0aW9uYWxpemluZyBjYXBhYmlsaXRpZXMgaW4gdGhlCisgb3BlcmF0aW5nIHN5c3RlbSB3aGVyZSB0aGlzIHBhY2thZ2UgaXMgYmVpbmcgaW5zdGFsbGVkLiAgU28gZmFyLCBvbmx5CisgdGhlIGBnZXR0ZXh0JyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgR05VIEMgbGlicmFyeSB2ZXJzaW9uIDIgcHJvdmlkZXMgYXMKKy1tYW55IGZlYXR1cmVzIChzdWNoIGFzIGxvY2FsZSBhbGlhcyBvciBtZXNzYWdlIGluaGVyaXRhbmNlKSBhcyB0aGUKKy1pbXBsZW1lbnRhdGlvbiBoZXJlLiAgSXQgaXMgYWxzbyBub3QgcG9zc2libGUgdG8gb2ZmZXIgdGhpcyBhZGRpdGlvbmFsCistZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYSBgY2F0Z2V0cycgaW1wbGVtZW50YXRpb24uICBGdXR1cmUgdmVyc2lvbnMgb2YKKy1HTlUgYGdldHRleHQnIHdpbGwgdmVyeSBsaWtlbHkgY29udmV5IGV2ZW4gbW9yZSBmdW5jdGlvbmFsaXR5LiAgU28gaXQKKy1taWdodCBiZSBhIGdvb2QgaWRlYSB0byBjaGFuZ2UgdG8gR05VIGBnZXR0ZXh0JyBhcyBzb29uIGFzIHBvc3NpYmxlLgorK21hbnkgZmVhdHVyZXMgKHN1Y2ggYXMgbG9jYWxlIGFsaWFzLCBtZXNzYWdlIGluaGVyaXRhbmNlLCBhdXRvbWF0aWMKKytjaGFyc2V0IGNvbnZlcnNpb24gb3IgcGx1cmFsIGZvcm0gaGFuZGxpbmcpIGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlLgorK0l0IGlzIGFsc28gbm90IHBvc3NpYmxlIHRvIG9mZmVyIHRoaXMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IG9uIHRvcAorK29mIGEgYGNhdGdldHMnIGltcGxlbWVudGF0aW9uLiAgRnV0dXJlIHZlcnNpb25zIG9mIEdOVSBgZ2V0dGV4dCcgd2lsbAorK3ZlcnkgbGlrZWx5IGNvbnZleSBldmVuIG1vcmUgZnVuY3Rpb25hbGl0eS4gIFNvIGl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhCisrdG8gY2hhbmdlIHRvIEdOVSBgZ2V0dGV4dCcgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAKKy0gICBTbyB5b3UgbmVlZCBub3QgcHJvdmlkZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIHVzaW5nIEdOVSBsaWJjIDIgb3IKKysgICBTbyB5b3UgbmVlZCBfbm90XyBwcm92aWRlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgdXNpbmcgR05VIGxpYmMgMiBvcgorIHlvdSBoYXZlIGluc3RhbGxlZCBhIHJlY2VudCBjb3B5IG9mIHRoZSBHTlUgZ2V0dGV4dCBwYWNrYWdlIHdpdGggdGhlCisgaW5jbHVkZWQgYGxpYmludGwnLgorIAorIElOU1RBTEwgTWF0dGVycworID09PT09PT09PT09PT09PQorIAorLSAgIFNvbWUgcGFja2FnZXMgYXJlICJsb2NhbGl6YWJsZSIgd2hlbiBwcm9wZXJseSBpbnN0YWxsZWQ7IHRoZQorLXByb2dyYW1zIHRoZXkgY29udGFpbiBjYW4gYmUgbWFkZSB0byBzcGVhayB5b3VyIG93biBuYXRpdmUgbGFuZ3VhZ2UuCistTW9zdCBzdWNoIHBhY2thZ2VzIHVzZSBHTlUgYGdldHRleHQnLiAgT3RoZXIgcGFja2FnZXMgaGF2ZSB0aGVpciBvd24KKy13YXlzIHRvIGludGVybmF0aW9uYWxpemF0aW9uLCBwcmVkYXRpbmcgR05VIGBnZXR0ZXh0Jy4KKytTb21lIHBhY2thZ2VzIGFyZSAibG9jYWxpemFibGUiIHdoZW4gcHJvcGVybHkgaW5zdGFsbGVkOyB0aGUgcHJvZ3JhbXMKKyt0aGV5IGNvbnRhaW4gY2FuIGJlIG1hZGUgdG8gc3BlYWsgeW91ciBvd24gbmF0aXZlIGxhbmd1YWdlLiAgTW9zdCBzdWNoCisrcGFja2FnZXMgdXNlIEdOVSBgZ2V0dGV4dCcuICBPdGhlciBwYWNrYWdlcyBoYXZlIHRoZWlyIG93biB3YXlzIHRvCisraW50ZXJuYXRpb25hbGl6YXRpb24sIHByZWRhdGluZyBHTlUgYGdldHRleHQnLgorIAorICAgIEJ5IGRlZmF1bHQsIHRoaXMgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCB0byBhbGxvdyB0cmFuc2xhdGlvbiBvZgorLW1lc3NhZ2VzLiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGV0aGVyIHRoZSBzeXN0ZW0gcHJvdmlkZXMKKy11c2FibGUgYGNhdGdldHMnIChpZiB1c2luZyB0aGlzIGlzIHNlbGVjdGVkIGJ5IHRoZSBpbnN0YWxsZXIpIG9yCistYGdldHRleHQnIGZ1bmN0aW9ucy4gIElmIG5laXRoZXIgaXMgYXZhaWxhYmxlLCB0aGUgR05VIGBnZXR0ZXh0JyBvd24KKyttZXNzYWdlcy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0aGUgc3lzdGVtIGFscmVhZHkKKytwcm92aWRlcyB0aGUgR05VIGBnZXR0ZXh0JyBmdW5jdGlvbnMuICBJZiBub3QsIHRoZSBHTlUgYGdldHRleHQnIG93bgorIGxpYnJhcnkgd2lsbCBiZSB1c2VkLiAgVGhpcyBsaWJyYXJ5IGlzIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoaXMKKyBwYWNrYWdlLCB1c3VhbGx5IGluIHRoZSBgaW50bC8nIHN1YmRpcmVjdG9yeSwgc28gcHJpb3IgaW5zdGFsbGF0aW9uIG9mCistdGhlIEdOVSBgZ2V0dGV4dCcgcGFja2FnZSBpcyAqbm90KiByZXF1aXJlZC4gIEluc3RhbGxlcnMgbWF5IHVzZQorK3RoZSBHTlUgYGdldHRleHQnIHBhY2thZ2UgaXMgX25vdF8gcmVxdWlyZWQuICBJbnN0YWxsZXJzIG1heSB1c2UKKyBzcGVjaWFsIG9wdGlvbnMgYXQgY29uZmlndXJhdGlvbiB0aW1lIGZvciBjaGFuZ2luZyB0aGUgZGVmYXVsdAorIGJlaGF2aW91ci4gIFRoZSBjb21tYW5kczoKKyAKKyAgICAgIC4vY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0CistICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtY2F0Z2V0cworICAgICAgLi9jb25maWd1cmUgLS1kaXNhYmxlLW5scworIAorLXdpbGwgcmVzcGVjdGl2ZWx5IGJ5cGFzcyBhbnkgcHJlLWV4aXN0aW5nIGBjYXRnZXRzJyBvciBgZ2V0dGV4dCcgdG8gdXNlCistdGhlIGludGVybmF0aW9uYWxpemluZyByb3V0aW5lcyBwcm92aWRlZCB3aXRoaW4gdGhpcyBwYWNrYWdlLCBlbmFibGUKKy10aGUgdXNlIG9mIHRoZSBgY2F0Z2V0cycgZnVuY3Rpb25zIChpZiBmb3VuZCBvbiB0aGUgbG9jYWxlIHN5c3RlbSksIG9yCistZWxzZSwgKnRvdGFsbHkqIGRpc2FibGUgdHJhbnNsYXRpb24gb2YgbWVzc2FnZXMuCisrd2lsbCByZXNwZWN0aXZlbHkgYnlwYXNzIGFueSBwcmUtZXhpc3RpbmcgYGdldHRleHQnIHRvIHVzZSB0aGUKKytpbnRlcm5hdGlvbmFsaXppbmcgcm91dGluZXMgcHJvdmlkZWQgd2l0aGluIHRoaXMgcGFja2FnZSwgb3IgZWxzZSwKKytfdG90YWxseV8gZGlzYWJsZSB0cmFuc2xhdGlvbiBvZiBtZXNzYWdlcy4KKyAKKyAgICBXaGVuIHlvdSBhbHJlYWR5IGhhdmUgR05VIGBnZXR0ZXh0JyBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gYW5kIHJ1bgorIGNvbmZpZ3VyZSB3aXRob3V0IGFuIG9wdGlvbiBmb3IgeW91ciBuZXcgcGFja2FnZSwgYGNvbmZpZ3VyZScgd2lsbAorQEAgLTgzLDE4ICs4MSwxMCBAQAorIAorIHRvIHByZXZlbnQgYXV0by1kZXRlY3Rpb24uCisgCistICAgQnkgZGVmYXVsdCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzIHdpbGwgbm90IHRlc3QgZm9yIHRoZSBgY2F0Z2V0cycKKy1mdW5jdGlvbiBhbmQgdGhlcmVmb3JlIHRoZXkgd2lsbCBub3QgYmUgdXNlZC4gIFRoZSByZWFzb25zIGFyZSBhbHJlYWR5CistZ2l2ZW4gYWJvdmU6IHRoZSBlbXVsYXRpb24gb24gdG9wIG9mIGBjYXRnZXRzJyBjYW5ub3QgcHJvdmlkZSBhbGwgdGhlCistZXh0ZW5zaW9ucyBwcm92aWRlZCBieSB0aGUgR05VIGBnZXR0ZXh0JyBsaWJyYXJ5LiAgSWYgeW91IG5ldmVydGhlbGVzcworLXdhbnQgdG8gdXNlIHRoZSBgY2F0Z2V0cycgZnVuY3Rpb25zIHVzZQorLQorLSAgICAgLi9jb25maWd1cmUgLS13aXRoLWNhdGdldHMKKy0KKy10byBlbmFibGUgdGhlIHRlc3QgZm9yIGBjYXRnZXRzJyAodGhpcyBjYXVzZXMgbm8gaGFybSBpZiBgY2F0Z2V0cycgaXMKKy1ub3QgYXZhaWxhYmxlIG9uIHlvdXIgc3lzdGVtKS4gIElmIHlvdSByZWFsbHkgc2VsZWN0IHRoaXMgb3B0aW9uIHdlCistd291bGQgbGlrZSB0byBoZWFyIGFib3V0IHRoZSByZWFzb25zIGJlY2F1c2Ugd2UgY2Fubm90IHRoaW5rIG9mIGFueQorLWdvb2Qgb25lIG91cnNlbGYuCisrICAgVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIG5vdCB0ZXN0IGZvciB0aGUgYGNhdGdldHMnIGZ1bmN0aW9uCisrYW5kIHRoZXJlZm9yZSBpdCB3aWxsIG5vdCBiZSB1c2VkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGV2ZW4gYW4KKytlbXVsYXRpb24gb2YgYGdldHRleHQnIG9uIHRvcCBvZiBgY2F0Z2V0cycgY291bGQgbm90IHByb3ZpZGUgYWxsIHRoZQorK2V4dGVuc2lvbnMgb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4KKyAKKyAgICBJbnRlcm5hdGlvbmFsaXplZCBwYWNrYWdlcyBoYXZlIHVzdWFsbHkgbWFueSBgcG8vTEwucG8nIGZpbGVzLCB3aGVyZQorIExMIGdpdmVzIGFuIElTTyA2MzkgdHdvLWxldHRlciBjb2RlIGlkZW50aWZ5aW5nIHRoZSBsYW5ndWFnZS4gIFVubGVzcworQEAgLTEwOCw1NyArOTgsNzMgQEAKKyBVc2luZyBUaGlzIFBhY2thZ2UKKyA9PT09PT09PT09PT09PT09PT0KKyAKKy0gICBBcyBhIHVzZXIsIGlmIHlvdXIgbGFuZ3VhZ2UgaGFzIGJlZW4gaW5zdGFsbGVkIGZvciB0aGlzIHBhY2thZ2UsIHlvdQorK0FzIGEgdXNlciwgaWYgeW91ciBsYW5ndWFnZSBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcGFja2FnZSwgeW91Cisgb25seSBoYXZlIHRvIHNldCB0aGUgYExBTkcnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZQorLUlTTyA2MzkgYExMJyB0d28tbGV0dGVyIGNvZGUgcHJpb3IgdG8gdXNpbmcgdGhlIHByb2dyYW1zIGluIHRoZQorLXBhY2thZ2UuICBGb3IgZXhhbXBsZSwgbGV0J3Mgc3VwcG9zZSB0aGF0IHlvdSBzcGVhayBHZXJtYW4uICBBdCB0aGUKKy1zaGVsbCBwcm9tcHQsIG1lcmVseSBleGVjdXRlIGBzZXRlbnYgTEFORyBkZScgKGluIGBjc2gnKSwKKy1gZXhwb3J0IExBTkc7IExBTkc9ZGUnIChpbiBgc2gnKSBvciBgZXhwb3J0IExBTkc9ZGUnIChpbiBgYmFzaCcpLiAgVGhpcworLWNhbiBiZSBkb25lIGZyb20geW91ciBgLmxvZ2luJyBvciBgLnByb2ZpbGUnIGZpbGUsIG9uY2UgYW5kIGZvciBhbGwuCisrYExMX0NDJyBjb21iaW5hdGlvbi4gIEhlcmUgYExMJyBpcyBhbiBJU08gNjM5IHR3by1sZXR0ZXIgbGFuZ3VhZ2UgY29kZSwKKythbmQgYENDJyBpcyBhbiBJU08gMzE2NiB0d28tbGV0dGVyIGNvdW50cnkgY29kZS4gIEZvciBleGFtcGxlLCBsZXQncworK3N1cHBvc2UgdGhhdCB5b3Ugc3BlYWsgR2VybWFuIGFuZCBsaXZlIGluIEdlcm1hbnkuICBBdCB0aGUgc2hlbGwKKytwcm9tcHQsIG1lcmVseSBleGVjdXRlIGBzZXRlbnYgTEFORyBkZV9ERScgKGluIGBjc2gnKSwKKytgZXhwb3J0IExBTkc7IExBTkc9ZGVfREUnIChpbiBgc2gnKSBvciBgZXhwb3J0IExBTkc9ZGVfREUnIChpbiBgYmFzaCcpLgorK1RoaXMgY2FuIGJlIGRvbmUgZnJvbSB5b3VyIGAubG9naW4nIG9yIGAucHJvZmlsZScgZmlsZSwgb25jZSBhbmQgZm9yCisrYWxsLgorIAorLSAgIEFuIG9wZXJhdGluZyBzeXN0ZW0gbWlnaHQgYWxyZWFkeSBvZmZlciBtZXNzYWdlIGxvY2FsaXphdGlvbiBmb3IKKy1tYW55IG9mIGl0cyBwcm9ncmFtcywgd2hpbGUgb3RoZXIgcHJvZ3JhbXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBsb2NhbGx5Cistd2l0aCB0aGUgZnVsbCBjYXBhYmlsaXRpZXMgb2YgR05VIGBnZXR0ZXh0Jy4gIEp1c3QgdXNpbmcgYGdldHRleHQnCistZXh0ZW5kZWQgc3ludGF4IGZvciBgTEFORycgd291bGQgYnJlYWsgcHJvcGVyIGxvY2FsaXphdGlvbiBvZiBhbHJlYWR5CistYXZhaWxhYmxlIG9wZXJhdGluZyBzeXN0ZW0gcHJvZ3JhbXMuICBJbiB0aGlzIGNhc2UsIHVzZXJzIHNob3VsZCBzZXQKKy1ib3RoIGBMQU5HVUFHRScgYW5kIGBMQU5HJyB2YXJpYWJsZXMgaW4gdGhlaXIgZW52aXJvbm1lbnQsIGFzIHByb2dyYW1zCistdXNpbmcgR05VIGBnZXR0ZXh0JyBnaXZlIHByZWZlcmVuY2UgdG8gYExBTkdVQUdFJy4gIEZvciBleGFtcGxlLCBzb21lCistU3dlZGlzaCB1c2VycyB3b3VsZCByYXRoZXIgcmVhZCB0cmFuc2xhdGlvbnMgaW4gR2VybWFuIHRoYW4gRW5nbGlzaCBmb3IKKy13aGVuIFN3ZWRpc2ggaXMgbm90IGF2YWlsYWJsZS4gIFRoaXMgaXMgZWFzaWx5IGFjY29tcGxpc2hlZCBieSBzZXR0aW5nCistYExBTkdVQUdFJyB0byBgc3Y6ZGUnIHdoaWxlIGxlYXZpbmcgYExBTkcnIHRvIGBzdicuCisrICAgWW91IG1pZ2h0IHRoaW5rIHRoYXQgdGhlIGNvdW50cnkgY29kZSBzcGVjaWZpY2F0aW9uIGlzIHJlZHVuZGFudC4KKytCdXQgaW4gZmFjdCwgc29tZSBsYW5ndWFnZXMgaGF2ZSBkaWFsZWN0cyBpbiBkaWZmZXJlbnQgY291bnRyaWVzLiAgRm9yCisrZXhhbXBsZSwgYGRlX0FUJyBpcyB1c2VkIGZvciBBdXN0cmlhLCBhbmQgYHB0X0JSJyBmb3IgQnJhemlsLiAgVGhlCisrY291bnRyeSBjb2RlIHNlcnZlcyB0byBkaXN0aW5ndWlzaCB0aGUgZGlhbGVjdHMuCisrCisrICAgVGhlIGxvY2FsZSBuYW1pbmcgY29udmVudGlvbiBvZiBgTExfQ0MnLCB3aXRoIGBMTCcgZGVub3RpbmcgdGhlCisrbGFuZ3VhZ2UgYW5kIGBDQycgZGVub3RpbmcgdGhlIGNvdW50cnksIGlzIHRoZSBvbmUgdXNlIG9uIHN5c3RlbXMgYmFzZWQKKytvbiBHTlUgbGliYy4gIE9uIG90aGVyIHN5c3RlbXMsIHNvbWUgdmFyaWF0aW9ucyBvZiB0aGlzIHNjaGVtZSBhcmUKKyt1c2VkLCBzdWNoIGFzIGBMTCcgb3IgYExMX0NDLkVOQ09ESU5HJy4gIFlvdSBjYW4gZ2V0IHRoZSBsaXN0IG9mCisrbG9jYWxlcyBzdXBwb3J0ZWQgYnkgeW91ciBzeXN0ZW0gZm9yIHlvdXIgY291bnRyeSBieSBydW5uaW5nIHRoZSBjb21tYW5kCisrYGxvY2FsZSAtYSB8IGdyZXAgJ15MTCcnLgorKworKyAgIE5vdCBhbGwgcHJvZ3JhbXMgaGF2ZSB0cmFuc2xhdGlvbnMgZm9yIGFsbCBsYW5ndWFnZXMuICBCeSBkZWZhdWx0LCBhbgorK0VuZ2xpc2ggbWVzc2FnZSBpcyBzaG93biBpbiBwbGFjZSBvZiBhIG5vbmV4aXN0ZW50IHRyYW5zbGF0aW9uLiAgSWYgeW91CisrdW5kZXJzdGFuZCBvdGhlciBsYW5ndWFnZXMsIHlvdSBjYW4gc2V0IHVwIGEgcHJpb3JpdHkgbGlzdCBvZiBsYW5ndWFnZXMuCisrVGhpcyBpcyBkb25lIHRocm91Z2ggYSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdmFyaWFibGUsIGNhbGxlZAorK2BMQU5HVUFHRScuICBHTlUgYGdldHRleHQnIGdpdmVzIHByZWZlcmVuY2UgdG8gYExBTkdVQUdFJyBvdmVyIGBMQU5HJworK2ZvciB0aGUgcHVycG9zZSBvZiBtZXNzYWdlIGhhbmRsaW5nLCBidXQgeW91IHN0aWxsIG5lZWQgdG8gaGF2ZSBgTEFORycKKytzZXQgdG8gdGhlIHByaW1hcnkgbGFuZ3VhZ2U7IHRoaXMgaXMgcmVxdWlyZWQgYnkgb3RoZXIgcGFydHMgb2YgdGhlCisrc3lzdGVtIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBzb21lIFN3ZWRpc2ggdXNlcnMgd2hvIHdvdWxkIHJhdGhlcgorK3JlYWQgdHJhbnNsYXRpb25zIGluIEdlcm1hbiB0aGFuIEVuZ2xpc2ggZm9yIHdoZW4gU3dlZGlzaCBpcyBub3QKKythdmFpbGFibGUsIHNldCBgTEFOR1VBR0UnIHRvIGBzdjpkZScgd2hpbGUgbGVhdmluZyBgTEFORycgdG8gYHN2X1NFJy4KKysKKysgICBTcGVjaWFsIGFkdmljZSBmb3IgTm9yd2VnaWFuIHVzZXJzOiBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgTm9yd2VnaWFuCisrYm9rbWEqbCBjaGFuZ2VkIGZyb20gYG5vJyB0byBgbmInIHJlY2VudGx5IChpbiAyMDAzKS4gIER1cmluZyB0aGUKKyt0cmFuc2l0aW9uIHBlcmlvZCwgd2hpbGUgc29tZSBtZXNzYWdlIGNhdGFsb2dzIGZvciB0aGlzIGxhbmd1YWdlIGFyZQorK2luc3RhbGxlZCB1bmRlciBgbmInIGFuZCBzb21lIG9sZGVyIG9uZXMgdW5kZXIgYG5vJywgaXQncyByZWNvbW1lbmRlZAorK2ZvciBOb3J3ZWdpYW4gdXNlcnMgdG8gc2V0IGBMQU5HVUFHRScgdG8gYG5iOm5vJyBzbyB0aGF0IGJvdGggbmV3ZXIgYW5kCisrb2xkZXIgdHJhbnNsYXRpb25zIGFyZSB1c2VkLgorKworKyAgIEluIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgbm90IGluIHRoZSBgTEFORycKKytlbnZpcm9ubWVudCB2YXJpYWJsZSwgYExMX0NDJyBjb21iaW5hdGlvbnMgY2FuIGJlIGFiYnJldmlhdGVkIGFzIGBMTCcKKyt0byBkZW5vdGUgdGhlIGxhbmd1YWdlJ3MgbWFpbiBkaWFsZWN0LiAgRm9yIGV4YW1wbGUsIGBkZScgaXMgZXF1aXZhbGVudAorK3RvIGBkZV9ERScgKEdlcm1hbiBhcyBzcG9rZW4gaW4gR2VybWFueSksIGFuZCBgcHQnIHRvIGBwdF9QVCcKKysoUG9ydHVndWVzZSBhcyBzcG9rZW4gaW4gUG9ydHVnYWwpIGluIHRoaXMgY29udGV4dC4KKyAKKyBUcmFuc2xhdGluZyBUZWFtcworID09PT09PT09PT09PT09PT09CisgCistICAgRm9yIHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgdG8gYmUgYSBzdWNjZXNzLCB3ZSBuZWVkIGludGVyZXN0ZWQKKytGb3IgdGhlIEZyZWUgVHJhbnNsYXRpb24gUHJvamVjdCB0byBiZSBhIHN1Y2Nlc3MsIHdlIG5lZWQgaW50ZXJlc3RlZAorIHBlb3BsZSB3aG8gbGlrZSB0aGVpciBvd24gbGFuZ3VhZ2UgYW5kIHdyaXRlIGl0IHdlbGwsIGFuZCB3aG8gYXJlIGFsc28KKyBhYmxlIHRvIHN5bmVyZ2l6ZSB3aXRoIG90aGVyIHRyYW5zbGF0b3JzIHNwZWFraW5nIHRoZSBzYW1lIGxhbmd1YWdlLgorLUVhY2ggdHJhbnNsYXRpb24gdGVhbSBoYXMgaXRzIG93biBtYWlsaW5nIGxpc3QsIGNvdXJ0ZXN5IG9mIExpbnV4CistSW50ZXJuYXRpb25hbC4gIFlvdSBtYXkgcmVhY2ggeW91ciB0cmFuc2xhdGlvbiB0ZWFtIGF0IHRoZSBhZGRyZXNzCistYExMQGxpLm9yZycsIHJlcGxhY2luZyBMTCBieSB0aGUgdHdvLWxldHRlciBJU08gNjM5IGNvZGUgZm9yIHlvdXIKKy1sYW5ndWFnZS4gIExhbmd1YWdlIGNvZGVzIGFyZSAqbm90KiB0aGUgc2FtZSBhcyB0aGUgY291bnRyeSBjb2RlcyBnaXZlbgorLWluIElTTyAzMTY2LiAgVGhlIGZvbGxvd2luZyB0cmFuc2xhdGlvbiB0ZWFtcyBleGlzdCwgYXMgb2YgQXVndXN0IDE5OTc6CistCistICAgICBDaGluZXNlIGB6aCcsIEN6ZWNoIGBjcycsIERhbmlzaCBgZGEnLCBEdXRjaCBgbmwnLCBFbmdsaXNoIGBlbicsCistICAgICBFc3BlcmFudG8gYGVvJywgRmlubmlzaCBgZmknLCBGcmVuY2ggYGZyJywgR2VybWFuIGBkZScsIEh1bmdhcmlhbgorLSAgICAgYGh1JywgSXJpc2ggYGdhJywgSXRhbGlhbiBgaXQnLCBJbmRvbmVzaWFuIGBpZCcsIEphcGFuZXNlIGBqYScsCistICAgICBLb3JlYW4gYGtvJywgTGF0aW4gYGxhJywgTm9yd2VnaWFuIGBubycsIFBlcnNpYW4gYGZhJywgUG9saXNoCistICAgICBgcGwnLCBQb3J0dWd1ZXNlIGBwdCcsIFJ1c3NpYW4gYHJ1JywgU2xvdmVuaWFuIGBzbCcsIFNwYW5pc2ggYGVzJywKKy0gICAgIFN3ZWRpc2ggYHN2JywgYW5kIFR1cmtpc2ggYHRyJy4KKy0KKy1Gb3IgZXhhbXBsZSwgeW91IG1heSByZWFjaCB0aGUgQ2hpbmVzZSB0cmFuc2xhdGlvbiB0ZWFtIGJ5IHdyaXRpbmcgdG8KKy1gemhAbGkub3JnJy4KKytFYWNoIHRyYW5zbGF0aW9uIHRlYW0gaGFzIGl0cyBvd24gbWFpbGluZyBsaXN0LiAgVGhlIHVwLXRvLWRhdGUgbGlzdCBvZgorK3RlYW1zIGNhbiBiZSBmb3VuZCBhdCB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0J3MgaG9tZXBhZ2UsCisrYGh0dHA6Ly93d3cuaXJvLnVtb250cmVhbC5jYS9jb250cmliL3BvL0hUTUwvJywgaW4gdGhlICJOYXRpb25hbCB0ZWFtcyIKKythcmVhLgorIAorLSAgIElmIHlvdSdkIGxpa2UgdG8gdm9sdW50ZWVyIHRvICp3b3JrKiBhdCB0cmFuc2xhdGluZyBtZXNzYWdlcywgeW91CisrICAgSWYgeW91J2QgbGlrZSB0byB2b2x1bnRlZXIgdG8gX3dvcmtfIGF0IHRyYW5zbGF0aW5nIG1lc3NhZ2VzLCB5b3UKKyBzaG91bGQgYmVjb21lIGEgbWVtYmVyIG9mIHRoZSB0cmFuc2xhdGluZyB0ZWFtIGZvciB5b3VyIG93biBsYW5ndWFnZS4KKy1UaGUgc3Vic2NyaWJpbmcgYWRkcmVzcyBpcyAqbm90KiB0aGUgc2FtZSBhcyB0aGUgbGlzdCBpdHNlbGYsIGl0IGhhcworK1RoZSBzdWJzY3JpYmluZyBhZGRyZXNzIGlzIF9ub3RfIHRoZSBzYW1lIGFzIHRoZSBsaXN0IGl0c2VsZiwgaXQgaGFzCisgYC1yZXF1ZXN0JyBhcHBlbmRlZC4gIEZvciBleGFtcGxlLCBzcGVha2VycyBvZiBTd2VkaXNoIGNhbiBzZW5kIGEKKyBtZXNzYWdlIHRvIGBzdi1yZXF1ZXN0QGxpLm9yZycsIGhhdmluZyB0aGlzIG1lc3NhZ2UgYm9keToKKyAKKyAgICAgIHN1YnNjcmliZQorIAorICAgIEtlZXAgaW4gbWluZCB0aGF0IHRlYW0gbWVtYmVycyBhcmUgZXhwZWN0ZWQgdG8gcGFydGljaXBhdGUKKy0qYWN0aXZlbHkqIGluIHRyYW5zbGF0aW9ucywgb3IgYXQgc29sdmluZyB0cmFuc2xhdGlvbmFsIGRpZmZpY3VsdGllcywKKytfYWN0aXZlbHlfIGluIHRyYW5zbGF0aW9ucywgb3IgYXQgc29sdmluZyB0cmFuc2xhdGlvbmFsIGRpZmZpY3VsdGllcywKKyByYXRoZXIgdGhhbiBtZXJlbHkgbHVya2luZyBhcm91bmQuICBJZiB5b3VyIHRlYW0gZG9lcyBub3QgZXhpc3QgeWV0IGFuZAorIHlvdSB3YW50IHRvIHN0YXJ0IG9uZSwgb3IgaWYgeW91IGFyZSB1bnN1cmUgYWJvdXQgd2hhdCB0byBkbyBvciBob3cgdG8KKyBnZXQgc3RhcnRlZCwgcGxlYXNlIHdyaXRlIHRvIGB0cmFuc2xhdGlvbkBpcm8udW1vbnRyZWFsLmNhJyB0byByZWFjaCB0aGUKK0BAIC0xNzEsNDMgKzE3Nyw1NTkgQEAKKyBBdmFpbGFibGUgUGFja2FnZXMKKyA9PT09PT09PT09PT09PT09PT0KKyAKKy0gICBMYW5ndWFnZXMgYXJlIG5vdCBlcXVhbGx5IHN1cHBvcnRlZCBpbiBhbGwgcGFja2FnZXMuICBUaGUgZm9sbG93aW5nCistbWF0cml4IHNob3dzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCBhcyBvZiBBdWd1c3QKKy0xOTk3LiAgVGhlIG1hdHJpeCBzaG93cywgaW4gcmVnYXJkIG9mIGVhY2ggcGFja2FnZSwgZm9yIHdoaWNoIGxhbmd1YWdlcworLVBPIGZpbGVzIGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gdHJhbnNsYXRpb24gY29vcmRpbmF0aW9uLgorK0xhbmd1YWdlcyBhcmUgbm90IGVxdWFsbHkgc3VwcG9ydGVkIGluIGFsbCBwYWNrYWdlcy4gIFRoZSBmb2xsb3dpbmcKKyttYXRyaXggc2hvd3MgdGhlIGN1cnJlbnQgc3RhdGUgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIGFzIG9mIEphbnVhcnkKKysyMDA0LiAgVGhlIG1hdHJpeCBzaG93cywgaW4gcmVnYXJkIG9mIGVhY2ggcGFja2FnZSwgZm9yIHdoaWNoIGxhbmd1YWdlcworK1BPIGZpbGVzIGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gdHJhbnNsYXRpb24gY29vcmRpbmF0aW9uLCB3aXRoIGEKKyt0cmFuc2xhdGlvbiBwZXJjZW50YWdlIG9mIGF0IGxlYXN0IDUwJS4KKyAKKy0gICAgIFJlYWR5IFBPIGZpbGVzICAgIGNzIGRhIGRlIGVuIGVzIGZpIGZyIGl0IGphIGtvIG5sIG5vIHBsIHB0IHNsIHN2CistICAgICAgICAgICAgICAgICAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCistICAgICBiYXNoICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8ICAzCistICAgICBiaXNvbiAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8ICAzCistICAgICBjbGlzcCAgICAgICAgICAgfCAgICAgICBbXSBbXSBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CistICAgICBjcGlvICAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICAgICB8ICA1CistICAgICBkaWZmdXRpbHMgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8ICA1CistICAgICBlbnNjcmlwdCAgICAgICAgfCAgICAgICBbXSAgICBbXSBbXSBbXSAgICAgICAgICBbXSAgICAgICAgICBbXSAgICB8ICA2CistICAgICBmaWxldXRpbHMgICAgICAgfCBbXSAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSAgICBbXSBbXSBbXSBbXSB8IDEwCistICAgICBmaW5kdXRpbHMgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSBbXSAgICBbXSBbXSAgICBbXSAgICAgICBbXSB8ICA4CistICAgICBmbGV4ICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICBbXSB8ICA0CistICAgICBnY2FsICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSB8ICA1CistICAgICBnZXR0ZXh0ICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSB8IDExCistICAgICBncmVwICAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSBbXSBbXSAgICBbXSBbXSB8ICA5CistICAgICBoZWxsbyAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSB8IDEwCistICAgICBpZC11dGlscyAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8ICAzCistICAgICBpbmRlbnQgICAgICAgICAgfCAgICBbXSBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICB8ICA0CistICAgICBsaWJjICAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSAgICBbXSAgICAgICBbXSB8ICA3CistICAgICBtNCAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICAgICBbXSB8ICA1CistICAgICBtYWtlICAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSAgICBbXSAgICAgICAgICB8ICA2CistICAgICBtdXNpYyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8ICAyCistICAgICBwdHggICAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICBbXSBbXSBbXSBbXSAgICBbXSB8ICA4CistICAgICByZWNvZGUgICAgICAgICAgfCAgICBbXSBbXSAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICBbXSBbXSBbXSBbXSB8ICA5CistICAgICBzaC11dGlscyAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSBbXSBbXSAgICBbXSB8ICA3CistICAgICBzaGFydXRpbHMgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICBbXSB8ICA1CistICAgICB0YXIgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSBbXSAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSB8IDEwCistICAgICB0ZXhpbmZvICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCistICAgICB0ZXh0dXRpbHMgICAgICAgfCBbXSAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSBbXSBbXSAgICAgICBbXSB8ICA5CistICAgICB3ZGlmZiAgICAgICAgICAgfCBbXSAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICBbXSBbXSBbXSAgICAgICBbXSB8ICA4CistICAgICAgICAgICAgICAgICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCistICAgICAgIDE2IGxhbmd1YWdlcyAgICBjcyBkYSBkZSBlbiBlcyBmaSBmciBpdCBqYSBrbyBubCBubyBwbCBwdCBzbCBzdgorLSAgICAgICAyNyBwYWNrYWdlcyAgICAgIDMgIDIgMjQgIDEgMTcgIDEgMjYgIDIgIDEgMTEgMjAgIDkgMTkgIDcgIDcgMTcgIDE2NworKyAgICAgUmVhZHkgUE8gZmlsZXMgICAgICAgYWYgYW0gYXIgYXogYmUgYmcgYnMgY2EgY3MgZGEgZGUgZWwgZW4gZW5fR0IgZW8gZXMKKysgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKysgICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgIHwKKysgICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdIHwKKysgICAgIGJhdGNoZWxvciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGJpc29uICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGJsdWV6LXBpbiAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKysgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdIHwKKysgICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGNwaW8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGRhcmtzdGF0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKysgICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICBbXSAgICAgICAgIHwKKysgICAgIGVycm9yICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICBbXSAgICAgIFtdIHwKKysgICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKysgICAgIGZpbGV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGZpbmR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKysgICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdiaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdldHRleHQgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdldHRleHQtZXhhbXBsZXMgICB8IFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdldHRleHQtcnVudGltZSAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdpbXAtcHJpbnQgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICBbXSAgICAgIFtdIHwKKysgICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdudWJpZmYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICgpICAgICAgICBbXSAgICAgIFtdIHwKKysgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdudXBnICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKysgICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1jYWxlbmRhciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1jbG9jayAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1jb250YWN0cyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1vd25lcmluZm8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS1zdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS10YXNrbWFuYWdlciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS10b2RheSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwZS10b2RvICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGdwc2RyaXZlICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICgpICAgICAgICAgICgpIHwKKysgICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKKysgICAgIGdyZXRsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGd0aWNrICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGhlbGxvICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKysgICAgIGlkLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGluZGVudCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdIHwKKysgICAgIGlzb18zMTY2ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKysgICAgIGlzb18zMTY2XzEgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKysgICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGlzb18zMTY2XzMgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGlzb180MjE3ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGp0YWcgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKysgICAgIGxhdHJpbmUgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIGxpYmMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKysgICAgIGxpYmdwZXdpZGdldCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgIFtdIFtdIHwKKysgICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGxpbmdvdGVhY2hfbGVzc29ucyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICgpIHwKKysgICAgIGx5bnggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgIHwKKysgICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIG1ha2UgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpIFtdIFtdICAgICAgICAgICAgICAgICgpIHwKKysgICAgIG1pbmljb20gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIG15c2VjcmV0ZGlhcnkgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIG5hbm9fMV8wICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHB0eCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgIFtdIFtdIHwKKysgICAgIHB5dGhvbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHJlY29kZSAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKysgICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHNjcm9sbGtlZXBlciAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHNlZCAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgIFtdIFtdIHwKKysgICAgIHNoLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHNoYXJlZC1taW1lLWluZm8gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHNoYXJ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKysgICAgIHNpbGt5ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHNrZXRjaCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHRhciAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgIHwKKysgICAgIHRleHR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHRpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAoKSAgICAgICAgIHwKKysgICAgIHRwLXJvYm90ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICBbXSAgICAgIFtdIHwKKysgICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHdkaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHdnZXQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKysgICAgIHhjaGF0ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKKysgICAgIHhmcmVlODZfeGtiX3htbCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHhwYWQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKysgICAgICAgICAgICAgICAgICAgICAgICAgIGFmIGFtIGFyIGF6IGJlIGJnIGJzIGNhIGNzIGRhIGRlIGVsIGVuIGVuX0dCIGVvIGVzCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgMCAgMCAgMSAgOSAgNCAgMSA0MCA0MSA2MCA3OCAxNyAgMSAgIDUgICAxMyA2OAorKyAgICAgCisrICAgICAgICAgICAgICAgICAgICAgICAgICBldCBldSBmYSBmaSBmciBnYSBnbCBoZSBociBodSBpZCBpcyBpdCBqYSBrbyBsZworKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworKyAgICAgYTJwcyAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgKCkgICAgKCkgICAgfAorKyAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorKyAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorKyAgICAgYmlzb24gICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgfAorKyAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgICAgW10gW10gW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgY29yZXV0aWxzICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgfAorKyAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgW10gICAgfAorKyAgICAgZGFya3N0YXQgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorKyAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgICAgW10gICAgICAgfAorKyAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZXJyb3IgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorKyAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorKyAgICAgZmlsZXV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgfAorKyAgICAgZmluZHV0aWxzICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgW10gW10gW10gICAgW10gW10gW10gICAgfAorKyAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAorKyAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgfAorKyAgICAgZ2JpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2V0dGV4dCAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgfAorKyAgICAgZ2V0dGV4dC1leGFtcGxlcyAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorKyAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgfAorKyAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgfAorKyAgICAgZ2ltcC1wcmludCAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorKyAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgW10gICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorKyAgICAgZ251Y2FzaC1nbG9zc2FyeSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorKyAgICAgZ251cGcgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgW10gICAgICAgICAgW10gICAgW10gW10gICAgICAgfAorKyAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLWJlYW0gICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLXN1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorKyAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgfAorKyAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorKyAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgKCkgKCkgICAgICAgfAorKyAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gW10gW10gW10gW10gICAgW10gW10gICAgICAgfAorKyAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorKyAgICAgZ3RpY2sgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgaGVsbG8gICAgICAgICAgICAgIHwgW10gICAgW10gW10gW10gW10gW10gW10gW10gW10gW10gICAgW10gW10gW10gICAgfAorKyAgICAgaWQtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgW10gICAgICAgICAgfAorKyAgICAgaW5kZW50ICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgICAgW10gW10gICAgW10gW10gICAgICAgfAorKyAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgICAgW10gICAgICAgW10gW10gICAgICAgW10gW10gW10gICAgW10gICAgICAgICAgfAorKyAgICAgaXNvXzMxNjZfMSAgICAgICAgIHwgICAgW10gICAgICAgW10gW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorKyAgICAgaXNvXzMxNjZfMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgaXNvXzMxNjZfMyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgICAgW10gW10gICAgICAgfAorKyAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAganBpbG90ICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgfAorKyAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgW10gICAgICAgICAgfAorKyAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgW10gICAgICAgW10gICAgICAgICAgW10gW10gICAgfAorKyAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorKyAgICAgbGliaWNvbnYgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgW10gW10gW10gICAgW10gICAgICAgICAgfAorKyAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorKyAgICAgbGluZ290ZWFjaF9sZXNzb25zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbHlueCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgfAorKyAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgICAgW10gICAgICAgfAorKyAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gW10gW10gICAgICAgICAgICAgW10gW10gICAgfAorKyAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgKCkgICAgICAgfAorKyAgICAgbWluaWNvbSAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgfAorKyAgICAgbXlzZWNyZXRkaWFyeSAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorKyAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgW10gICAgICAgICAgfAorKyAgICAgbmFub18xXzAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgW10gICAgICAgICAgfAorKyAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorKyAgICAgcHR4ICAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorKyAgICAgcHl0aG9uICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gW10gICAgW10gW10gICAgW10gICAgICAgICAgfAorKyAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAorKyAgICAgc2NyZWVtICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorKyAgICAgc2VkICAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgICAgW10gW10gICAgW10gW10gICAgICAgfAorKyAgICAgc2gtdXRpbHMgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgfAorKyAgICAgc2hhcmVkLW1pbWUtaW5mbyAgIHwgICAgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorKyAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgW10gICAgICAgfAorKyAgICAgc2lsa3kgICAgICAgICAgICAgIHwgICAgICAgICAgKCkgW10gICAgICAgICAgICAgKCkgICAgICAgKCkgICAgICAgICAgfAorKyAgICAgc2tlbmNpbCAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorKyAgICAgc3AgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgfAorKyAgICAgdGFyICAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgW10gICAgW10gW10gW10gICAgW10gW10gICAgICAgfAorKyAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgfAorKyAgICAgdGV4dHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gW10gICAgICAgW10gICAgICAgICAgW10gW10gICAgfAorKyAgICAgdGluICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgdHAtcm9ib3QgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgICAgW10gICAgW10gW10gW10gW10gW10gW10gICAgfAorKyAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgdXRpbC1saW51eCAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgKCkgW10gICAgICAgfAorKyAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgd2RpZmYgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorKyAgICAgd2dldCAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgW10gICAgW10gW10gICAgICAgICAgW10gICAgICAgfAorKyAgICAgeGNoYXQgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgeGZyZWU4Nl94a2JfeG1sICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorKyAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXQgZXUgZmEgZmkgZnIgZ2EgZ2wgaGUgaHIgaHUgaWQgaXMgaXQgamEga28gbGcKKysgICAgICAgICAgICAgICAgICAgICAgICAgIDIyICAyICAxIDI2IDEwNiAyOCAyNCAgOCAxMCA0MSAzMyAgMSAyNiAzMyAxMiAgMAorKyAgICAgCisrICAgICAgICAgICAgICAgICAgICAgICAgICBsdCBsdiBtayBtbiBtcyBtdCBuYiBubCBubiBubyBuc28gcGwgcHQgcHRfQlIgcm8gcnUKKysgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisrICAgICBhMnBzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAoKSAgICAgKCkgICAgIFtdICAgW10gW10gfAorKyAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICgpICgpIHwKKysgICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisrICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAorKyAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICgpICAgICAgICAgIFtdICAgIHwKKysgICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgW10gW10gfAorKyAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKysgICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisrICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorKyAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdIFtdIHwKKysgICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICB8CisrICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisrICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gfAorKyAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKysgICAgIGRhcmtzdGF0ICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSAgICB8CisrICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAorKyAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKKysgICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSBbXSB8CisrICAgICBlcnJvciAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gICAgfAorKyAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAoKSAgICAgIFtdIHwKKysgICAgIGZpbGV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisrICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAorKyAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKysgICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisrICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdICAgIHwKKysgICAgIGdiaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisrICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGdldHRleHQgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisrICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gICAgfAorKyAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKysgICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICB8CisrICAgICBnaW1wLXByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdICAgIHwKKysgICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSB8CisrICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAoKSAgICAgIFtdIHwKKysgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICAgICAgICB8CisrICAgICBnbnVwZyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAorKyAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKysgICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisrICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAorKyAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKysgICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisrICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAorKyAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKysgICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSB8CisrICAgICBncGUtbG9naW4gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAorKyAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKysgICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisrICAgICBncGUtc3UgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAorKyAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKysgICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisrICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAorKyAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKysgICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisrICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgW10gICAgfAorKyAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgKCkgICAgICAgICAgICAgICAgIFtdICAgIHwKKysgICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisrICAgICBncmVwICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gIFtdICAgW10gW10gfAorKyAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSB8CisrICAgICBoZWxsbyAgICAgICAgICAgICAgfCAgICBbXSAgICAgICBbXSAgICBbXSBbXSBbXSBbXSAgICAgW10gICAgIFtdICAgW10gW10gfAorKyAgICAgaWQtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdIFtdIHwKKysgICAgIGluZGVudCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSBbXSB8CisrICAgICBpc29fMzE2NiAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgaXNvXzMxNjZfMSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICBpc29fMzE2Nl8zICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgW10gW10gW10gICAgIFtdIFtdICBbXSAgICAgIFtdIHwKKysgICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSAoKSB8CisrICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gICAgfAorKyAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKysgICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICBsaWJjICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgW10gICAgIFtdICAgICAgICAgfAorKyAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIHwKKysgICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisrICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICBsaW5nb3RlYWNoX2xlc3NvbnMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgbHlueCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgIFtdIHwKKysgICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisrICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAorKyAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgICAgIFtdIHwKKysgICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisrICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAorKyAgICAgbXlzZWNyZXRkaWFyeSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdICAgIHwKKysgICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisrICAgICBuYW5vXzFfMCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgW10gICAgICAgICAgW10gW10gfAorKyAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKysgICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICBbXSBbXSAgW10gICAgICAgICB8CisrICAgICBwdHggICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICAgW10gW10gIFtdICAgW10gW10gfAorKyAgICAgcHl0aG9uICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSB8CisrICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAorKyAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgIFtdIHwKKysgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAorKyAgICAgc2VkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdICAgIHwKKysgICAgIHNoLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisrICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKysgICAgIHNpbGt5ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSB8CisrICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgfAorKyAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgIHwKKysgICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKyAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgIFtdICAgICBbXSAgIFtdICAgIHwKKysgICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisrICAgICB0ZXh0dXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorKyAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHRwLXJvYm90ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICB0dXhwYWludCAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgW10gW10gIFtdICAgW10gICAgfAorKyAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKysgICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgW10gfAorKyAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIHwKKysgICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAorKyAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKysgICAgIHhjaGF0ICAgICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisrICAgICB4ZnJlZTg2X3hrYl94bWwgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorKyAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKysgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisrICAgICAgICAgICAgICAgICAgICAgICAgICBsdCBsdiBtayBtbiBtcyBtdCBuYiBubCBubiBubyBuc28gcGwgcHQgcHRfQlIgcm8gcnUKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAyICAwICAzIDEyICAwIDEwIDY5ICA2ICA3ICAxICA0MCAyNiAgMzYgICA3NiA2MworKyAgICAgCisrICAgICAgICAgICAgICAgICAgICAgICAgICBzayBzbCBzciBzdiB0YSB0aCB0ciB1ayB2ZW4gdmkgd2EgeGggemhfQ04gemhfVFcgenUKKysgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisrICAgICBhMnBzICAgICAgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorKyAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKKysgICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisrICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorKyAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKysgICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CisrICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorKyAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKysgICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2CisrICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAgOAorKyAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKKysgICAgIGJsdWV6LXBpbiAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8IDE0CisrICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKKysgICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisrICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNgorKyAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTQKKysgICAgIGRhcmtzdGF0ICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgKCkgICAgICB8IDEyCisrICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAyMworKyAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKKysgICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCisrICAgICBlcnJvciAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNQorKyAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEKKysgICAgIGZpbGV1dGlscyAgICAgICAgICB8ICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICB8IDE3CisrICAgICBmaW5kdXRpbHMgICAgICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAyOQorKyAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTMKKysgICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisrICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworKyAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKKysgICAgIGdiaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CisrICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAorKyAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKKysgICAgIGdldHRleHQgICAgICAgICAgICB8IFtdIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDE2CisrICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNAorKyAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICBbXSAgICBbXSAgICAgIHwgMjIKKysgICAgIGdldHRleHQtdG9vbHMgICAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE0CisrICAgICBnaW1wLXByaW50ICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAorKyAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKysgICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8IDEzCisrICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworKyAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgIDkKKysgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8ICA4CisrICAgICBnbnVwZyAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNworKyAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKKysgICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4CisrICAgICBncGUtY2FsZW5kYXIgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfCAxMworKyAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKKysgICAgIGdwZS1jb25mICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5CisrICAgICBncGUtY29udGFjdHMgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMQorKyAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgIHwgMTIKKysgICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisrICAgICBncGUtbG9naW4gICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfCAxMworKyAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTMKKysgICAgIGdwZS1za2V0Y2hib29rICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5CisrICAgICBncGUtc3UgICAgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAorKyAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKKysgICAgIGdwZS10aW1lc2hlZXQgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDEyCisrICAgICBncGUtdG9kYXkgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfCAxMworKyAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgIHwgMTIKKysgICAgIGdwaG90bzIgICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDExCisrICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorKyAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKysgICAgIGdyYW1hZG9pciAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisrICAgICBncmVwICAgICAgICAgICAgICAgfCAgICBbXSBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNgorKyAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKysgICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3CisrICAgICBoZWxsbyAgICAgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzNAorKyAgICAgaWQtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKKysgICAgIGluZGVudCAgICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIxCisrICAgICBpc29fMzE2NiAgICAgICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgfCAyNworKyAgICAgaXNvXzMxNjZfMSAgICAgICAgIHwgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKKysgICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCisrICAgICBpc29fMzE2Nl8zICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorKyAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgW10gW10gICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMjQKKysgICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCisrICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgW10gICAgICAgIFtdICAgIFtdICAgICAgfCAgOQorKyAgICAganRhZyAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKKysgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICgpICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDExCisrICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQorKyAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKKysgICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisrICAgICBsaWJjICAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAyMAorKyAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwgMTMKKysgICAgIGxpYmljb252ICAgICAgICAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdIFtdICAgICAgICBbXSAgICAgW10gICAgICAgICAgICB8IDI3CisrICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorKyAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKysgICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisrICAgICBsaW5nb3RlYWNoX2xlc3NvbnMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgfCAgMAorKyAgICAgbHlueCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKKysgICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE1CisrICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorKyAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTYKKysgICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisrICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQorKyAgICAgbXlzZWNyZXRkaWFyeSAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKKysgICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE3CisrICAgICBuYW5vXzFfMCAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNworKyAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKKysgICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE1CisrICAgICBwdHggICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMgorKyAgICAgcHl0aG9uICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKKysgICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CisrICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorKyAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKKysgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8ICAyCisrICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNQorKyAgICAgc2VkICAgICAgICAgICAgICAgIHwgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQKKysgICAgIHNoLXV0aWxzICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0CisrICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNworKyAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTcKKysgICAgIHNpbGt5ICAgICAgICAgICAgICB8ICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisrICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgorKyAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKKysgICAgIHNvdW5kdHJhY2tlciAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3CisrICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworKyAgICAgdGFyICAgICAgICAgICAgICAgIHwgW10gW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMjQKKysgICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE0CisrICAgICB0ZXh0dXRpbHMgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNgorKyAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKKysgICAgIHRwLXJvYm90ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisrICAgICB0dXhwYWludCAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgfCAyOQorKyAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKKysgICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisrICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNQorKyAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKKysgICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCisrICAgICB3ZGlmZiAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxOAorKyAgICAgd2dldCAgICAgICAgICAgICAgIHwgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICBbXSAgICBbXSAgICAgIHwgMjQKKysgICAgIHhjaGF0ICAgICAgICAgICAgICB8IFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE1CisrICAgICB4ZnJlZTg2X3hrYl94bWwgICAgfCBbXSAgICBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxMQorKyAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKKysgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisrICAgICAgIDYzIHRlYW1zICAgICAgICAgICBzayBzbCBzciBzdiB0YSB0aCB0ciB1ayB2ZW4gdmkgd2EgeGggemhfQ04gemhfVFcgenUKKysgICAgICAxMzEgZG9tYWlucyAgICAgICAgIDQ3IDE5IDI4IDgzICAwICAwIDU5IDEzICAxICAgMSAxMSAgMCAgMjIgICAgMjIgICAgMCAgMTM3MworIAorICAgIFNvbWUgY291bnRlcnMgaW4gdGhlIHByZWNlZGluZyBtYXRyaXggYXJlIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2YKKyB2aXNpYmxlIGJsb2NrcyBsZXQgdXMgZXhwZWN0LiAgVGhpcyBpcyBiZWNhdXNlIGEgZmV3IGV4dHJhIFBPIGZpbGVzIGFyZQorQEAgLTIyMCw2ICs3NDIsMjcgQEAKKyBsYWcgYmV0d2VlbiB0aGUgbWVyZSBleGlzdGVuY2UgYSBQTyBmaWxlIGFuZCBpdHMgd2lkZSBhdmFpbGFiaWxpdHkgaW4gYQorIGRpc3RyaWJ1dGlvbi4KKyAKKy0gICBJZiBBdWd1c3QgMTk5NyBzZWVtcyB0byBiZSBvbGQsIHlvdSBtYXkgZmV0Y2ggYSBtb3JlIHJlY2VudCBjb3B5IG9mCistdGhpcyBgQUJPVVQtTkxTJyBmaWxlIG9uIG1vc3QgR05VIGFyY2hpdmUgc2l0ZXMuCisrICAgSWYgSmFudWFyeSAyMDA0IHNlZW1zIHRvIGJlIG9sZCwgeW91IG1heSBmZXRjaCBhIG1vcmUgcmVjZW50IGNvcHkgb2YKKyt0aGlzIGBBQk9VVC1OTFMnIGZpbGUgb24gbW9zdCBHTlUgYXJjaGl2ZSBzaXRlcy4gIFRoZSBtb3N0IHVwLXRvLWRhdGUKKyttYXRyaXggd2l0aCBmdWxsIHBlcmNlbnRhZ2UgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKKytgaHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL2NvbnRyaWIvcG8vSFRNTC9tYXRyaXguaHRtbCcuCisrCisrVXNpbmcgYGdldHRleHQnIGluIG5ldyBwYWNrYWdlcworKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKysKKytJZiB5b3UgYXJlIHdyaXRpbmcgYSBmcmVlbHkgYXZhaWxhYmxlIHByb2dyYW0gYW5kIHdhbnQgdG8KKytpbnRlcm5hdGlvbmFsaXplIGl0IHlvdSBhcmUgd2VsY29tZSB0byB1c2UgR05VIGBnZXR0ZXh0JyBpbiB5b3VyCisrcGFja2FnZS4gIE9mIGNvdXJzZSB5b3UgaGF2ZSB0byByZXNwZWN0IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworK0xpY2Vuc2Ugd2hpY2ggY292ZXJzIHRoZSB1c2Ugb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4gIFRoaXMgbWVhbnMKKytpbiBwYXJ0aWN1bGFyIHRoYXQgZXZlbiBub24tZnJlZSBwcm9ncmFtcyBjYW4gdXNlIGBsaWJpbnRsJyBhcyBhIHNoYXJlZAorK2xpYnJhcnksIHdoZXJlYXMgb25seSBmcmVlIHNvZnR3YXJlIGNhbiB1c2UgYGxpYmludGwnIGFzIGEgc3RhdGljCisrbGlicmFyeSBvciB1c2UgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYGxpYmludGwnLgorKworKyAgIE9uY2UgdGhlIHNvdXJjZXMgYXJlIGNoYW5nZWQgYXBwcm9wcmlhdGVseSBhbmQgdGhlIHNldHVwIGNhbiBoYW5kbGUKKyt0aGUgdXNlIG9mIGBnZXR0ZXh0JyB0aGUgb25seSB0aGluZyBtaXNzaW5nIGFyZSB0aGUgdHJhbnNsYXRpb25zLiAgVGhlCisrRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0IGlzIGFsc28gYXZhaWxhYmxlIGZvciBwYWNrYWdlcyB3aGljaCBhcmUgbm90CisrZGV2ZWxvcGVkIGluc2lkZSB0aGUgR05VIHByb2plY3QuICBUaGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIGdpdmVuIGFib3ZlCisrYXBwbGllcyBhbHNvIGZvciBldmVyeSBvdGhlciBGcmVlIFNvZnR3YXJlIFByb2plY3QuICBDb250YWN0CisrYHRyYW5zbGF0aW9uQGlyby51bW9udHJlYWwuY2EnIHRvIG1ha2UgdGhlIGAucG90JyBmaWxlcyBhdmFpbGFibGUgdG8KKyt0aGUgdHJhbnNsYXRpb24gdGVhbXMuCisgCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL0NoYW5nZUxvZwkxOTk4LTEyLTI5IDE3OjQ5OjU2LjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvQ2hhbmdlTG9nCTIwMDQtMDktMTIgMTQ6NDA6MzUuODQ2NTIxNDU2IC0wNDAwCitAQCAtMSwzICsxLDExIEBACisrMjAwNC0wOS0xMiAgZ2V0dGV4dGl6ZSAgPGJ1Zy1nbnUtZ2V0dGV4dEBnbnUub3JnPgorKworKwkqIE1ha2VmaWxlLmFtIChBQ0xPQ0FMX0FNRkxBR1MpOiBOZXcgdmFyaWFibGUuCisrCShFWFRSQV9ESVNUKTogQWRkIGNvbmZpZy5ycGF0aC4KKysJKiBjb25maWd1cmUuaW4gKEFDX09VVFBVVCk6IEFkZCBtNC9NYWtlZmlsZS4KKysJKEFDX09VVFBVVCk6IFJlbW92ZSBjb21tYW5kIHRoYXQgY3JlYXRlZCBwby9NYWtlZmlsZS4KKysJKEFDX0xJTktfRklMRVMpOiBSZW1vdmUgaW52b2NhdGlvbi4KKysKKyAxOTk4LTEyLTI5CVV3ZSBPaHNlICA8dXdlQG9oc2UuZGU+CisgCisgCSogc3JjL2xyei5jOiByZW1vdmVkIHN0cGNweSBjYWxsLgorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9jb25maWcucnBhdGgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2NvbmZpZy5ycGF0aAkyMDA0LTA5LTEyIDE0OjQwOjM0LjMyOTc1MjA0MCAtMDQwMAorQEAgLTAsMCArMSw1NDggQEAKKysjISAvYmluL3NoCisrIyBPdXRwdXQgYSBzeXN0ZW0gZGVwZW5kZW50IHNldCBvZiB2YXJpYWJsZXMsIGRlc2NyaWJpbmcgaG93IHRvIHNldCB0aGUKKysjIHJ1biB0aW1lIHNlYXJjaCBwYXRoIG9mIHNoYXJlZCBsaWJyYXJpZXMgaW4gYW4gZXhlY3V0YWJsZS4KKysjCisrIyAgIENvcHlyaWdodCAxOTk2LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrIyAgIFRha2VuIGZyb20gR05VIGxpYnRvb2wsIDIwMDEKKysjICAgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKysjCisrIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisrIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisrIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisrIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrIworKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisrIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysjICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyMKKysjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKysjCisrIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKysjICAgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisrIyAgIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisrIyAgIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKysjCisrIyBUaGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgZmlsZSBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3BlY2lmaWNhdGlvbiwKKysjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisrIyBvcgorKyMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisrIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIENDLCBHQ0MsIExERkxBR1MsIExELCB3aXRoX2dudV9sZAorKyMgc2hvdWxkIGJlIHNldCBieSB0aGUgY2FsbGVyLgorKyMKKysjIFRoZSBzZXQgb2YgZGVmaW5lZCB2YXJpYWJsZXMgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIHNjcmlwdC4KKysKKysjIEtub3duIGxpbWl0YXRpb25zOgorKyMgLSBPbiBJUklYIDYuNSB3aXRoIENDPSJjYyIsIHRoZSBydW4gdGltZSBzZWFyY2ggcGF0Y2ggbXVzdCBub3QgYmUgbG9uZ2VyCisrIyAgIHRoYW4gMjU2IGJ5dGVzLCBvdGhlcndpc2UgdGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGR1bXAgY29yZS4gVGhlIG9ubHkKKysjICAga25vd24gd29ya2Fyb3VuZCBpcyB0byBjaG9vc2Ugc2hvcnRlciBkaXJlY3RvcnkgbmFtZXMgZm9yIHRoZSBidWlsZAorKyMgICBkaXJlY3RvcnkgYW5kL29yIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorKworKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNJFZDLAorKyMgd2hpY2ggbmVlZHMgJy5saWInKS4KKytsaWJleHQ9YQorK3NocmV4dD0uc28KKysKKytob3N0PSIkMSIKKytob3N0X2NwdT1gZWNobyAiJGhvc3QiIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKKytob3N0X3ZlbmRvcj1gZWNobyAiJGhvc3QiIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKKytob3N0X29zPWBlY2hvICIkaG9zdCIgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorKworKyMgQ29kZSB0YWtlbiBmcm9tIGxpYnRvb2wubTQncyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDLgorKworK3dsPQorK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisrICB3bD0nLVdsLCcKKytlbHNlCisrICBjYXNlICIkaG9zdF9vcyIgaW4KKysgICAgYWl4KikKKysgICAgICB3bD0nLVdsLCcKKysgICAgICA7OworKyAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisrICAgICAgOzsKKysgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisrICAgICAgd2w9Jy1XbCwnCisrICAgICAgOzsKKysgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKysgICAgICB3bD0nLVdsLCcKKysgICAgICA7OworKyAgICBuZXdzb3M2KQorKyAgICAgIDs7CisrICAgIGxpbnV4KikKKysgICAgICBjYXNlICRDQyBpbgorKyAgICAgICAgaWNjfGVjYykKKysgICAgICAgICAgd2w9Jy1XbCwnCisrICAgICAgICAgIDs7CisrICAgICAgICBjY2MpCisrICAgICAgICAgIHdsPSctV2wsJworKyAgICAgICAgICA7OworKyAgICAgIGVzYWMKKysgICAgICA7OworKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisrICAgICAgd2w9Jy1XbCwnCisrICAgICAgOzsKKysgICAgc2NvMy4ydjUqKQorKyAgICAgIDs7CisrICAgIHNvbGFyaXMqKQorKyAgICAgIHdsPSctV2wsJworKyAgICAgIDs7CisrICAgIHN1bm9zNCopCisrICAgICAgd2w9Jy1Rb3B0aW9uIGxkICcKKysgICAgICA7OworKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisrICAgICAgd2w9Jy1XbCwnCisrICAgICAgOzsKKysgICAgc3lzdjQqTVAqKQorKyAgICAgIDs7CisrICAgIHV0czQqKQorKyAgICAgIDs7CisrICBlc2FjCisrZmkKKysKKysjIENvZGUgdGFrZW4gZnJvbSBsaWJ0b29sLm00J3MgQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUy4KKysKKytoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQorK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisraGFyZGNvZGVfZGlyZWN0PW5vCisraGFyZGNvZGVfbWludXNfTD1ubworKworK2Nhc2UgIiRob3N0X29zIiBpbgorKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisrICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisrICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisrICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorKyAgICAgIHdpdGhfZ251X2xkPW5vCisrICAgIGZpCisrICAgIDs7CisrICBvcGVuYnNkKikKKysgICAgd2l0aF9nbnVfbGQ9bm8KKysgICAgOzsKKytlc2FjCisrCisrbGRfc2hsaWJzPXllcworK2lmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKysgIGNhc2UgIiRob3N0X29zIiBpbgorKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisrICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorKyAgICAgICAgbGRfc2hsaWJzPW5vCisrICAgICAgZmkKKysgICAgICA7OworKyAgICBhbWlnYW9zKikKKysgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisrICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKysgICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworKyAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisrICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisrICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKysgICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4gdXNlCisrICAgICAgIyB0aGVtLgorKyAgICAgIGxkX3NobGlicz1ubworKyAgICAgIDs7CisrICAgIGJlb3MqKQorKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorKyAgICAgICAgOgorKyAgICAgIGVsc2UKKysgICAgICAgIGxkX3NobGlicz1ubworKyAgICAgIGZpCisrICAgICAgOzsKKysgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKysgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKysgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKysgICAgICAgIDoKKysgICAgICBlbHNlCisrICAgICAgICBsZF9zaGxpYnM9bm8KKysgICAgICBmaQorKyAgICAgIDs7CisrICAgIG5ldGJzZCopCisrICAgICAgOzsKKysgICAgc29sYXJpcyogfCBzeXN2NSopCisrICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKysgICAgICAgIGxkX3NobGlicz1ubworKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisrICAgICAgICA6CisrICAgICAgZWxzZQorKyAgICAgICAgbGRfc2hsaWJzPW5vCisrICAgICAgZmkKKysgICAgICA7OworKyAgICBzdW5vczQqKQorKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKysgICAgICA7OworKyAgICAqKQorKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorKyAgICAgICAgOgorKyAgICAgIGVsc2UKKysgICAgICAgIGxkX3NobGlicz1ubworKyAgICAgIGZpCisrICAgICAgOzsKKysgIGVzYWMKKysgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCisrICAgICMgVW5saWtlIGxpYnRvb2wsIHdlIHVzZSAtcnBhdGggaGVyZSwgbm90IC0tcnBhdGgsIHNpbmNlIHRoZSBkb2N1bWVudGVkCisrICAgICMgb3B0aW9uIG9mIEdOVSBsZCBpcyBjYWxsZWQgLXJwYXRoLCBub3QgLS1ycGF0aC4KKysgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworKyAgZmkKKytlbHNlCisrICBjYXNlICIkaG9zdF9vcyIgaW4KKysgICAgYWl4MyopCisrICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKysgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisrICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKysgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorKyAgICAgICAgIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisrICAgICAgICAjIGJyb2tlbiBjb2xsZWN0Mi4KKysgICAgICAgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorKyAgICAgIGZpCisrICAgICAgOzsKKysgICAgYWl4NCogfCBhaXg1KikKKysgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorKyAgICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorKyAgICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisrICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisrICAgICAgZWxzZQorKyAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworKyAgICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisrICAgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKysgICAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisrICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKKysgICAgICAgICAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisrICAgICAgICAgICAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKysgICAgICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisrICAgICAgICAgICAgICBicmVhaworKyAgICAgICAgICAgIGZpCisrICAgICAgICAgIGRvbmUKKysgICAgICAgIGVzYWMKKysgICAgICBmaQorKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKysgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisrICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorKyAgICAgICAgICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisrICAgICAgICAgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKysgICAgICAgICAgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisrICAgICAgICAgIHRoZW4KKysgICAgICAgICAgICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKysgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisrICAgICAgICAgIGVsc2UKKysgICAgICAgICAgICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisrICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisrICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKysgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisrICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKysgICAgICAgICAgZmkKKysgICAgICAgIGVzYWMKKysgICAgICBmaQorKyAgICAgICMgQmVnaW4gX0xUX0FDX1NZU19MSUJQQVRIX0FJWC4KKysgICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKKysgICAgICAke0NDfSAke0xERkxBR1N9IGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QKKysgICAgICBhaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCAyPi9kZXYvbnVsbCB8IHNlZCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9CisrfSdgCisrICAgICAgaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbgorKyAgICAgICAgYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QgMj4vZGV2L251bGwgfCBzZWQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorK30nYAorKyAgICAgIGZpCisrICAgICAgaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbgorKyAgICAgICAgYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiCisrICAgICAgZmkKKysgICAgICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0CisrICAgICAgIyBFbmQgX0xUX0FDX1NZU19MSUJQQVRIX0FJWC4KKysgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKysgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisrICAgICAgZWxzZQorKyAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKysgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisrICAgICAgICBlbHNlCisrICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisrICAgICAgICBmaQorKyAgICAgIGZpCisrICAgICAgOzsKKysgICAgYW1pZ2FvcyopCisrICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisrICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorKyAgICAgIGxkX3NobGlicz1ubworKyAgICAgIDs7CisrICAgIGJzZGk0KikKKysgICAgICA7OworKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisrICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKysgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKysgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisrICAgICAgbGliZXh0PWxpYgorKyAgICAgIDs7CisrICAgIGRhcndpbiogfCByaGFwc29keSopCisrICAgICAgaWYgJENDIC12IDI+JjEgfCBncmVwICdBcHBsZScgPi9kZXYvbnVsbCA7IHRoZW4KKysgICAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworKyAgICAgIGZpCisrICAgICAgOzsKKysgICAgZGd1eCopCisrICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworKyAgICAgIDs7CisrICAgIGZyZWVic2QxKikKKysgICAgICBsZF9zaGxpYnM9bm8KKysgICAgICA7OworKyAgICBmcmVlYnNkMi4yKikKKysgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisrICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworKyAgICAgIDs7CisrICAgIGZyZWVic2QyKikKKysgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisrICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKysgICAgICA7OworKyAgICBmcmVlYnNkKikKKysgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisrICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworKyAgICAgIDs7CisrICAgIGhwdXg5KikKKysgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKysgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKysgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisrICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKysgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKysgICAgICBoYXJkY29kZV9taW51c19MPXllcworKyAgICAgIDs7CisrICAgIGhwdXgxMCogfCBocHV4MTEqKQorKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorKyAgICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorKyAgICAgICAgICBocHBhKjY0KikKKysgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKysgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKysgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKysgICAgICAgICAgICA7OworKyAgICAgICAgICBpYTY0KikKKysgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisrICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisrICAgICAgICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKysgICAgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKysgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworKyAgICAgICAgICAgIDs7CisrICAgICAgICAgICopCisrICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisrICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisrICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworKyAgICAgICAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisrICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisrICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKysgICAgICAgICAgICA7OworKyAgICAgICAgZXNhYworKyAgICAgIGZpCisrICAgICAgOzsKKysgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKysgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisrICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisrICAgICAgOzsKKysgICAgbmV0YnNkKikKKysgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisrICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworKyAgICAgIDs7CisrICAgIG5ld3NvczYpCisrICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKysgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKysgICAgICA7OworKyAgICBvcGVuYnNkKikKKysgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisrICAgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisrICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworKyAgICAgIGVsc2UKKysgICAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorKyAgICAgICAgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKysgICAgICAgICAgICA7OworKyAgICAgICAgICAqKQorKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisrICAgICAgICAgICAgOzsKKysgICAgICAgIGVzYWMKKysgICAgICBmaQorKyAgICAgIDs7CisrICAgIG9zMiopCisrICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisrICAgICAgOzsKKysgICAgb3NmMyopCisrICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorKyAgICAgIDs7CisrICAgIG9zZjQqIHwgb3NmNSopCisrICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKysgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKysgICAgICBlbHNlCisrICAgICAgICAjIEJvdGggY2MgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCisrICAgICAgZmkKKysgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKysgICAgICA7OworKyAgICBzY28zLjJ2NSopCisrICAgICAgOzsKKysgICAgc29sYXJpcyopCisrICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworKyAgICAgIDs7CisrICAgIHN1bm9zNCopCisrICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKysgICAgICBoYXJkY29kZV9taW51c19MPXllcworKyAgICAgIDs7CisrICAgIHN5c3Y0KQorKyAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisrICAgICAgICBzbmkpCisrICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisrICAgICAgICAgIDs7CisrICAgICAgICBzaWVtZW5zKQorKyAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKysgICAgICAgICAgOzsKKysgICAgICAgIG1vdG9yb2xhKQorKyAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorKyAgICAgICAgICA7OworKyAgICAgIGVzYWMKKysgICAgICA7OworKyAgICBzeXN2NC4zKikKKysgICAgICA7OworKyAgICBzeXN2NCpNUCopCisrICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorKyAgICAgICAgbGRfc2hsaWJzPXllcworKyAgICAgIGZpCisrICAgICAgOzsKKysgICAgc3lzdjQuMnV3MiopCisrICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KKysgICAgICA7OworKyAgICBzeXN2NU9wZW5VTklYOCogfCBzeXN2NVVuaXhXYXJlNyogfCAgc3lzdjV1d1s3OF0qIHwgdW5peHdhcmU3KikKKysgICAgICA7OworKyAgICBzeXN2NSopCisrICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKysgICAgICA7OworKyAgICB1dHM0KikKKysgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisrICAgICAgOzsKKysgICAgKikKKysgICAgICBsZF9zaGxpYnM9bm8KKysgICAgICA7OworKyAgZXNhYworK2ZpCisrCisrIyBDaGVjayBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MKKysjIENvZGUgdGFrZW4gZnJvbSBsaWJ0b29sLm00J3MgQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIuCisrbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKKytjYXNlICIkaG9zdF9vcyIgaW4KKysgIGFpeDMqKQorKyAgICA7OworKyAgYWl4NCogfCBhaXg1KikKKysgICAgOzsKKysgIGFtaWdhb3MqKQorKyAgICA7OworKyAgYmVvcyopCisrICAgIDs7CisrICBic2RpNCopCisrICAgIDs7CisrICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisrICAgIHNocmV4dD0uZGxsCisrICAgIDs7CisrICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorKyAgICBzaHJleHQ9LmR5bGliCisrICAgIDs7CisrICBkZ3V4KikKKysgICAgOzsKKysgIGZyZWVic2QxKikKKysgICAgOzsKKysgIGZyZWVic2QqKQorKyAgICA7OworKyAgZ251KikKKysgICAgOzsKKysgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisrICAgICAgaWE2NCopCisrICAgICAgICBzaHJleHQ9LnNvCisrICAgICAgICA7OworKyAgICAgIGhwcGEqNjQqKQorKyAgICAgICAgc2hyZXh0PS5zbAorKyAgICAgICAgOzsKKysgICAgICAqKQorKyAgICAgICAgc2hyZXh0PS5zbAorKyAgICAgICAgOzsKKysgICAgZXNhYworKyAgICA7OworKyAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKysgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisrICAgICAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKysgICAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKysgICAgICAgIDs7CisrICAgICAgKikKKysgICAgICAgIGNhc2UgJExEIGluCisrICAgICAgICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpIGxpYnN1ZmY9IHNobGlic3VmZj0gOzsKKysgICAgICAgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIDs7CisrICAgICAgICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKSBsaWJzdWZmPTY0IHNobGlic3VmZj02NCA7OworKyAgICAgICAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IDs7CisrICAgICAgICBlc2FjCisrICAgICAgICA7OworKyAgICBlc2FjCisrICAgIDs7CisrICBsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorKyAgICA7OworKyAgbGludXgqKQorKyAgICA7OworKyAgbmV0YnNkKikKKysgICAgOzsKKysgIG5ld3NvczYpCisrICAgIDs7CisrICBudG8tcW54KQorKyAgICA7OworKyAgb3BlbmJzZCopCisrICAgIDs7CisrICBvczIqKQorKyAgICBsaWJuYW1lX3NwZWM9JyRuYW1lJworKyAgICBzaHJleHQ9LmRsbAorKyAgICA7OworKyAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorKyAgICA7OworKyAgc2NvMy4ydjUqKQorKyAgICA7OworKyAgc29sYXJpcyopCisrICAgIDs7CisrICBzdW5vczQqKQorKyAgICA7OworKyAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorKyAgICA7OworKyAgc3lzdjQqTVAqKQorKyAgICA7OworKyAgdXRzNCopCisrICAgIDs7CisrZXNhYworKworK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFsiYCRcXF1cKS9cXFwxL2cnCisrZXNjYXBlZF93bD1gZWNobyAiWCR3bCIgfCBzZWQgLWUgJ3MvXlgvLycgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorK3NobGliZXh0PWBlY2hvICIkc2hyZXh0IiB8IHNlZCAtZSAncyxeXC4sLCdgCisrZXNjYXBlZF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPWBlY2hvICJYJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHwgc2VkIC1lICdzL15YLy8nIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKysKKytzZWQgLWUgJ3MvXlwoW2EtekEtWjAtOV9dKlwpPS9hY2xfY3ZfXDE9LycgPDxFT0YKKysKKysjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCisrd2w9IiRlc2NhcGVkX3dsIgorKworKyMgU3RhdGljIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiYSIpLgorK2xpYmV4dD0iJGxpYmV4dCIKKysKKysjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgInNvIikuCisrc2hsaWJleHQ9IiRzaGxpYmV4dCIKKysKKysjIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKysjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCisraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGVzY2FwZWRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIKKysKKysjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgorK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9IiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIgorKworKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRS5zbyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisrIyByZXN1bHRpbmcgYmluYXJ5LgorK2hhcmRjb2RlX2RpcmVjdD0iJGhhcmRjb2RlX2RpcmVjdCIKKysKKysjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorKyMgcmVzdWx0aW5nIGJpbmFyeS4KKytoYXJkY29kZV9taW51c19MPSIkaGFyZGNvZGVfbWludXNfTCIKKysKKytFT0YKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvY29uZmlndXJlLmluCTIwMDQtMDktMTIgMTQ6Mzk6NTUuMTYxNzA2NDg4IC0wNDAwCisrKysgbHJ6c3otMC4xMi4yMC9jb25maWd1cmUuaW4JMjAwNC0wOS0xMiAxNDo0MDozNS44MTY1MjYwMTYgLTA0MDAKK0BAIC0yNjAsMTEgKzI2MCwxMCBAQAorIEFNX0dOVV9HRVRURVhUCisgCisgQUNfREVGSU5FX1VOUVVPVEVEKExPQ0FMRURJUiwiJHByZWZpeC8kREFUQURJUk5BTUUiKQorLUFDX0xJTktfRklMRVMoJG5sc19jdl9oZWFkZXJfbGliZ3QsICRubHNfY3ZfaGVhZGVyX2ludGwpCisgCistQUNfT1VUUFVUKFtNYWtlZmlsZSBpbnRsL01ha2VmaWxlIGxpYi9NYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUgXAorK0FDX09VVFBVVChbTWFrZWZpbGUgaW50bC9NYWtlZmlsZSBsaWIvTWFrZWZpbGUgdGVzdHN1aXRlL01ha2VmaWxlICBtNC9NYWtlZmlsZSBcCisgbWFuL01ha2VmaWxlIHBvL01ha2VmaWxlLmluIHNyYy9NYWtlZmlsZSBkZWJpYW4vcnVsZXMgU3BlY2ZpbGUgc3lzdHlwZSBcCisgc3JjL2xyenN6YnVnXSwKKy1bc2VkIC1lICIvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTIiBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlOyAKKytbCisgY2htb2QgK3ggZGViaWFuL3J1bGVzOworIHRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9iaW5kdGV4dGRvbS5jCTE5OTgtMDQtMjYgMDk6MjI6MzYuMDAwMDAwMDAwIC0wNDAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL2JpbmR0ZXh0ZG9tLmMJMjAwNC0wOS0xMiAxNDo0MDozNC4zNDM3NDk5MTIgLTA0MDAKK0BAIC0xLDU5ICsxLDc1IEBACisgLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGJpbmR0ZXh0ZG9tYWluKDMpIGZ1bmN0aW9uCistICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgCistICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICAgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCistICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKy0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworIAorICNpZmRlZiBIQVZFX0NPTkZJR19ICisgIyBpbmNsdWRlIDxjb25maWcuaD4KKyAjZW5kaWYKKyAKKy0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQworLSMgaW5jbHVkZSA8c3RkbGliLmg+CistI2Vsc2UKKy0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKKy0jICBpbmNsdWRlIDxtYWxsb2MuaD4KKy0jIGVsc2UKKy12b2lkIGZyZWUgKCk7CistIyBlbmRpZgorLSNlbmRpZgorKyNpbmNsdWRlIDxzdGRkZWYuaD4KKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2luY2x1ZGUgPHN0cmluZy5oPgorIAorLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQworLSMgaW5jbHVkZSA8c3RyaW5nLmg+CisrI2lmZGVmIF9MSUJDCisrIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisgI2Vsc2UKKy0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KKy0jIGlmbmRlZiBtZW1jcHkKKy0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQorLSMgZW5kaWYKKysjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyAjZW5kaWYKKysjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyAKKyAjaWZkZWYgX0xJQkMKKy0jIGluY2x1ZGUgPGxpYmludGwuaD4KKysvKiBXZSBoYXZlIHRvIGhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLworKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKyAjZWxzZQorLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgorKy8qIFByb3ZpZGUgZHVtbXkgaW1wbGVtZW50YXRpb24gaWYgdGhpcyBpcyBvdXRzaWRlIGdsaWJjLiAgKi8KKysjIGRlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZShDTEFTUywgTkFNRSkKKysjIGRlZmluZSBfX2xpYmNfcndsb2NrX3dybG9jayhOQU1FKQorKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCisrI2VuZGlmCisrCisrLyogVGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiB0aGUgc3RhbmRhbG9uZSBsaWJpbnRsLmEgbXVzdCBoYXZlIGRpZmZlcmVudAorKyAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCisrICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCisrI2lmICFkZWZpbmVkIF9MSUJDCisrIyBkZWZpbmUgX25sX2RlZmF1bHRfZGlybmFtZSBsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZQorKyMgZGVmaW5lIF9ubF9kb21haW5fYmluZGluZ3MgbGliaW50bF9ubF9kb21haW5fYmluZGluZ3MKKysjZW5kaWYKKysKKysvKiBTb21lIGNvbXBpbGVycywgbGlrZSBTdW5PUzQgY2MsIGRvbid0IGhhdmUgb2Zmc2V0b2YgaW4gPHN0ZGRlZi5oPi4gICovCisrI2lmbmRlZiBvZmZzZXRvZgorKyMgZGVmaW5lIG9mZnNldG9mKHR5cGUsaWRlbnQpICgoc2l6ZV90KSYoKCh0eXBlKikwKS0+aWRlbnQpKQorICNlbmRpZgorLSNpbmNsdWRlICJnZXR0ZXh0LmgiCistI2luY2x1ZGUgImdldHRleHRQLmgiCisgCisgLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworIAorIC8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KKyBleHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW107CisrI2lmZGVmIF9MSUJDCisrZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZV9pbnRlcm5hbFtdIGF0dHJpYnV0ZV9oaWRkZW47CisrI2Vsc2UKKysjIGRlZmluZSBJTlRVU0UobmFtZSkgbmFtZQorKyNlbmRpZgorIAorIC8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zLiAgKi8KKyBleHRlcm4gc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7CisgCisrLyogTG9jayB2YXJpYWJsZSB0byBwcm90ZWN0IHRoZSBnbG9iYWwgZGF0YSBpbiB0aGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4gICovCisrX19saWJjX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKKysKKyAKKyAvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorQEAgLTYxLDIzICs3Nyw0MSBAQAorICAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisgI2lmZGVmIF9MSUJDCisgIyBkZWZpbmUgQklORFRFWFRET01BSU4gX19iaW5kdGV4dGRvbWFpbgorLSMgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCisrIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgX19iaW5kX3RleHRkb21haW5fY29kZXNldAorKyMgaWZuZGVmIHN0cmR1cAorKyMgIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQorKyMgZW5kaWYKKyAjZWxzZQorLSMgZGVmaW5lIEJJTkRURVhURE9NQUlOIGJpbmR0ZXh0ZG9tYWluX18KKysjIGRlZmluZSBCSU5EVEVYVERPTUFJTiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluCisrIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldAorICNlbmRpZgorIAorLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAorLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KKy1jaGFyICoKKy1CSU5EVEVYVERPTUFJTiAoZG9tYWlubmFtZSwgZGlybmFtZSkKKy0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7CistICAgICBjb25zdCBjaGFyICpkaXJuYW1lOworKy8qIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IG5hbWUgKkRJUk5BTUVQIGFuZCB0aGUgb3V0cHV0IGNvZGVzZXQgKkNPREVTRVRQCisrICAgdG8gYmUgdXNlZCBmb3IgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nLgorKyAgIElmICpESVJOQU1FUCBvciAqQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5vdAorKyAgIG1vZGlmaWVkLCBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIGlzIHJldHVybmVkLgorKyAgIElmIERJUk5BTUVQIG9yIENPREVTRVRQIGlzIE5VTEwsIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBpcyBuZWl0aGVyCisrICAgbW9kaWZpZWQgbm9yIHJldHVybmVkLiAgKi8KKytzdGF0aWMgdm9pZAorK3NldF9iaW5kaW5nX3ZhbHVlcyAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKysJCSAgICBjb25zdCBjaGFyICoqZGlybmFtZXAsIGNvbnN0IGNoYXIgKipjb2Rlc2V0cCkKKyB7CisgICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKKysgIGludCBtb2RpZmllZDsKKyAKKyAgIC8qIFNvbWUgc2FuaXR5IGNoZWNrcy4gICovCisgICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMIHx8IGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKKy0gICAgcmV0dXJuIE5VTEw7CisrICAgIHsKKysgICAgICBpZiAoZGlybmFtZXApCisrCSpkaXJuYW1lcCA9IE5VTEw7CisrICAgICAgaWYgKGNvZGVzZXRwKQorKwkqY29kZXNldHAgPSBOVUxMOworKyAgICAgIHJldHVybjsKKysgICAgfQorKworKyAgX19saWJjX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKysKKysgIG1vZGlmaWVkID0gMDsKKyAKKyAgIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCisgICAgIHsKK0BAIC05Myw4MSArMTI3LDE3MyBAQAorIAl9CisgICAgIH0KKyAKKy0gIGlmIChkaXJuYW1lID09IE5VTEwpCistICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KKy0gICAgcmV0dXJuIGJpbmRpbmcgPT0gTlVMTCA/IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWUgOiBiaW5kaW5nLT5kaXJuYW1lOworLQorICAgaWYgKGJpbmRpbmcgIT0gTlVMTCkKKyAgICAgeworLSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKKy0JIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKKy0JIG9sZCBiaW5kaW5nLiAgKi8KKy0gICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBiaW5kaW5nLT5kaXJuYW1lKSAhPSAwKQorKyAgICAgIGlmIChkaXJuYW1lcCkKKyAJeworLQkgIGNoYXIgKm5ld19kaXJuYW1lOworKwkgIGNvbnN0IGNoYXIgKmRpcm5hbWUgPSAqZGlybmFtZXA7CisgCistCSAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKKy0JICAgIG5ld19kaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKKysJICBpZiAoZGlybmFtZSA9PSBOVUxMKQorKwkgICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLworKwkgICAgKmRpcm5hbWVwID0gYmluZGluZy0+ZGlybmFtZTsKKyAJICBlbHNlCisgCSAgICB7CisrCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKKysJCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCisrCQkgb2xkIGJpbmRpbmcuICAqLworKwkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5kaXJuYW1lOworKwkgICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCByZXN1bHQpICE9IDApCisrCQl7CisrCQkgIGlmIChzdHJjbXAgKGRpcm5hbWUsIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKSkgPT0gMCkKKysJCSAgICByZXN1bHQgPSAoY2hhciAqKSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7CisrCQkgIGVsc2UKKysJCSAgICB7CisgI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorLQkgICAgICBuZXdfZGlybmFtZSA9IHN0cmR1cCAoZGlybmFtZSk7CistCSAgICAgIGlmIChuZXdfZGlybmFtZSA9PSBOVUxMKQorLQkJcmV0dXJuIE5VTEw7CisrCQkgICAgICByZXN1bHQgPSBzdHJkdXAgKGRpcm5hbWUpOworICNlbHNlCistCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKKy0JICAgICAgbmV3X2Rpcm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CistCSAgICAgIGlmIChuZXdfZGlybmFtZSA9PSBOVUxMKQorLQkJcmV0dXJuIE5VTEw7CistCistCSAgICAgIG1lbWNweSAobmV3X2Rpcm5hbWUsIGRpcm5hbWUsIGxlbik7CisrCQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7CisrCQkgICAgICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisrCQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQorKwkJCW1lbWNweSAocmVzdWx0LCBkaXJuYW1lLCBsZW4pOworICNlbmRpZgorKwkJICAgIH0KKysKKysJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKKysJCSAgICB7CisrCQkgICAgICBpZiAoYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisrCQkJZnJlZSAoYmluZGluZy0+ZGlybmFtZSk7CisrCisrCQkgICAgICBiaW5kaW5nLT5kaXJuYW1lID0gcmVzdWx0OworKwkJICAgICAgbW9kaWZpZWQgPSAxOworKwkJICAgIH0KKysJCX0KKysJICAgICAgKmRpcm5hbWVwID0gcmVzdWx0OworIAkgICAgfQorKwl9CisgCistCSAgaWYgKGJpbmRpbmctPmRpcm5hbWUgIT0gX25sX2RlZmF1bHRfZGlybmFtZSkKKy0JICAgIGZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOworKyAgICAgIGlmIChjb2Rlc2V0cCkKKysJeworKwkgIGNvbnN0IGNoYXIgKmNvZGVzZXQgPSAqY29kZXNldHA7CisgCistCSAgYmluZGluZy0+ZGlybmFtZSA9IG5ld19kaXJuYW1lOworKwkgIGlmIChjb2Rlc2V0ID09IE5VTEwpCisrCSAgICAvKiBUaGUgY3VycmVudCBiaW5kaW5nIGhhcyBiZSB0byByZXR1cm5lZC4gICovCisrCSAgICAqY29kZXNldHAgPSBiaW5kaW5nLT5jb2Rlc2V0OworKwkgIGVsc2UKKysJICAgIHsKKysJICAgICAgLyogVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGJvdW5kLiAgSWYgdGhlIG5ldyB2YWx1ZSBhbmQgdGhlIG9sZAorKwkJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKKysJCSBvbGQgYmluZGluZy4gICovCisrCSAgICAgIGNoYXIgKnJlc3VsdCA9IGJpbmRpbmctPmNvZGVzZXQ7CisrCSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCBzdHJjbXAgKGNvZGVzZXQsIHJlc3VsdCkgIT0gMCkKKysJCXsKKysjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisrCQkgIHJlc3VsdCA9IHN0cmR1cCAoY29kZXNldCk7CisrI2Vsc2UKKysJCSAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoY29kZXNldCkgKyAxOworKwkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisrCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgIT0gTlVMTCwgMSkpCisrCQkgICAgbWVtY3B5IChyZXN1bHQsIGNvZGVzZXQsIGxlbik7CisrI2VuZGlmCisrCisrCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgIT0gTlVMTCwgMSkpCisrCQkgICAgeworKwkJICAgICAgaWYgKGJpbmRpbmctPmNvZGVzZXQgIT0gTlVMTCkKKysJCQlmcmVlIChiaW5kaW5nLT5jb2Rlc2V0KTsKKysKKysJCSAgICAgIGJpbmRpbmctPmNvZGVzZXQgPSByZXN1bHQ7CisrCQkgICAgICBiaW5kaW5nLT5jb2Rlc2V0X2NudHIrKzsKKysJCSAgICAgIG1vZGlmaWVkID0gMTsKKysJCSAgICB9CisrCQl9CisrCSAgICAgICpjb2Rlc2V0cCA9IHJlc3VsdDsKKysJICAgIH0KKyAJfQorICAgICB9CisrICBlbHNlIGlmICgoZGlybmFtZXAgPT0gTlVMTCB8fCAqZGlybmFtZXAgPT0gTlVMTCkKKysJICAgJiYgKGNvZGVzZXRwID09IE5VTEwgfHwgKmNvZGVzZXRwID09IE5VTEwpKQorKyAgICB7CisrICAgICAgLyogU2ltcGx5IHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLworKyAgICAgIGlmIChkaXJuYW1lcCkKKysJKmRpcm5hbWVwID0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworKyAgICAgIGlmIChjb2Rlc2V0cCkKKysJKmNvZGVzZXRwID0gTlVMTDsKKysgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCistICAgICAgc2l6ZV90IGxlbjsKKysgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7CisgICAgICAgc3RydWN0IGJpbmRpbmcgKm5ld19iaW5kaW5nID0KKy0JKHN0cnVjdCBiaW5kaW5nICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3X2JpbmRpbmcpKTsKKysJKHN0cnVjdCBiaW5kaW5nICopIG1hbGxvYyAob2Zmc2V0b2YgKHN0cnVjdCBiaW5kaW5nLCBkb21haW5uYW1lKSArIGxlbik7CisgCistICAgICAgaWYgKG5ld19iaW5kaW5nID09IE5VTEwpCistCXJldHVybiBOVUxMOworKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChuZXdfYmluZGluZyA9PSBOVUxMLCAwKSkKKysJZ290byBmYWlsZWQ7CisgCisrICAgICAgbWVtY3B5IChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSwgZG9tYWlubmFtZSwgbGVuKTsKKysKKysgICAgICBpZiAoZGlybmFtZXApCisrCXsKKysJICBjb25zdCBjaGFyICpkaXJuYW1lID0gKmRpcm5hbWVwOworKworKwkgIGlmIChkaXJuYW1lID09IE5VTEwpCisrCSAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZS4gICovCisrCSAgICBkaXJuYW1lID0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworKwkgIGVsc2UKKysJICAgIHsKKysJICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpKSA9PSAwKQorKwkJZGlybmFtZSA9IElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKysJICAgICAgZWxzZQorKwkJeworKwkJICBjaGFyICpyZXN1bHQ7CisgI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorLSAgICAgIG5ld19iaW5kaW5nLT5kb21haW5uYW1lID0gc3RyZHVwIChkb21haW5uYW1lKTsKKy0gICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKKy0JcmV0dXJuIE5VTEw7CisrCQkgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7CisrCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCisrCQkgICAgZ290byBmYWlsZWRfZGlybmFtZTsKKyAjZWxzZQorLSAgICAgIGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOworLSAgICAgIG5ld19iaW5kaW5nLT5kb21haW5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworLSAgICAgIGlmIChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9PSBOVUxMKQorLQlyZXR1cm4gTlVMTDsKKy0gICAgICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lLCBkb21haW5uYW1lLCBsZW4pOworKwkJICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7CisrCQkgIHJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKysJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKKysJCSAgICBnb3RvIGZhaWxlZF9kaXJuYW1lOworKwkJICBtZW1jcHkgKHJlc3VsdCwgZGlybmFtZSwgbGVuKTsKKyAjZW5kaWYKKy0KKy0gICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQorLQluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7CisrCQkgIGRpcm5hbWUgPSByZXN1bHQ7CisrCQl9CisrCSAgICB9CisrCSAgKmRpcm5hbWVwID0gZGlybmFtZTsKKysJICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIGRpcm5hbWU7CisrCX0KKyAgICAgICBlbHNlCisrCS8qIFRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KKysJbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7CisrCisrICAgICAgbmV3X2JpbmRpbmctPmNvZGVzZXRfY250ciA9IDA7CisrCisrICAgICAgaWYgKGNvZGVzZXRwKQorIAl7CisrCSAgY29uc3QgY2hhciAqY29kZXNldCA9ICpjb2Rlc2V0cDsKKysKKysJICBpZiAoY29kZXNldCAhPSBOVUxMKQorKwkgICAgeworKwkgICAgICBjaGFyICpyZXN1bHQ7CisrCisgI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorLQkgIG5ld19iaW5kaW5nLT5kaXJuYW1lID0gc3RyZHVwIChkaXJuYW1lKTsKKy0JICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgPT0gTlVMTCkKKy0JICAgIHJldHVybiBOVUxMOworKwkgICAgICByZXN1bHQgPSBzdHJkdXAgKGNvZGVzZXQpOworKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQorKwkJZ290byBmYWlsZWRfY29kZXNldDsKKyAjZWxzZQorLQkgIGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOworLQkgIG5ld19iaW5kaW5nLT5kaXJuYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworLQkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSA9PSBOVUxMKQorLQkgICAgcmV0dXJuIE5VTEw7CistCSAgbWVtY3B5IChuZXdfYmluZGluZy0+ZGlybmFtZSwgZGlybmFtZSwgbGVuKTsKKysJICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoY29kZXNldCkgKyAxOworKwkgICAgICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisrCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCisrCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OworKwkgICAgICBtZW1jcHkgKHJlc3VsdCwgY29kZXNldCwgbGVuKTsKKyAjZW5kaWYKKysJICAgICAgY29kZXNldCA9IHJlc3VsdDsKKysJICAgICAgbmV3X2JpbmRpbmctPmNvZGVzZXRfY250cisrOworKwkgICAgfQorKwkgICpjb2Rlc2V0cCA9IGNvZGVzZXQ7CisrCSAgbmV3X2JpbmRpbmctPmNvZGVzZXQgPSAoY2hhciAqKSBjb2Rlc2V0OworIAl9CisrICAgICAgZWxzZQorKwluZXdfYmluZGluZy0+Y29kZXNldCA9IE5VTEw7CisgCisgICAgICAgLyogTm93IGVucXVldWUgaXQuICAqLworICAgICAgIGlmIChfbmxfZG9tYWluX2JpbmRpbmdzID09IE5VTEwKK0BAIC0xODcsMTMgKzMxMyw1MSBAQAorIAkgIGJpbmRpbmctPm5leHQgPSBuZXdfYmluZGluZzsKKyAJfQorIAorLSAgICAgIGJpbmRpbmcgPSBuZXdfYmluZGluZzsKKysgICAgICBtb2RpZmllZCA9IDE7CisrCisrICAgICAgLyogSGVyZSB3ZSBkZWFsIHdpdGggbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMuICAqLworKyAgICAgIGlmICgwKQorKwl7CisrCWZhaWxlZF9jb2Rlc2V0OgorKwkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisrCSAgICBmcmVlIChuZXdfYmluZGluZy0+ZGlybmFtZSk7CisrCWZhaWxlZF9kaXJuYW1lOgorKwkgIGZyZWUgKG5ld19iaW5kaW5nKTsKKysJZmFpbGVkOgorKwkgIGlmIChkaXJuYW1lcCkKKysJICAgICpkaXJuYW1lcCA9IE5VTEw7CisrCSAgaWYgKGNvZGVzZXRwKQorKwkgICAgKmNvZGVzZXRwID0gTlVMTDsKKysJfQorICAgICB9CisgCistICByZXR1cm4gYmluZGluZy0+ZGlybmFtZTsKKysgIC8qIElmIHdlIG1vZGlmaWVkIGFueSBiaW5kaW5nLCB3ZSBmbHVzaCB0aGUgY2FjaGVzLiAgKi8KKysgIGlmIChtb2RpZmllZCkKKysgICAgKytfbmxfbXNnX2NhdF9jbnRyOworKworKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKyt9CisrCisrLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCisrICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLworK2NoYXIgKgorK0JJTkRURVhURE9NQUlOIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICpkaXJuYW1lKQorK3sKKysgIHNldF9iaW5kaW5nX3ZhbHVlcyAoZG9tYWlubmFtZSwgJmRpcm5hbWUsIE5VTEwpOworKyAgcmV0dXJuIChjaGFyICopIGRpcm5hbWU7CisrfQorKworKy8qIFNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiB3aGljaCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUKKysgICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KKytjaGFyICoKKytCSU5EX1RFWFRET01BSU5fQ09ERVNFVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKKyt7CisrICBzZXRfYmluZGluZ192YWx1ZXMgKGRvbWFpbm5hbWUsIE5VTEwsICZjb2Rlc2V0KTsKKysgIHJldHVybiAoY2hhciAqKSBjb2Rlc2V0OworIH0KKyAKKyAjaWZkZWYgX0xJQkMKKy0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KKysvKiBBbGlhc2VzIGZvciBmdW5jdGlvbiBuYW1lcyBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KKyB3ZWFrX2FsaWFzIChfX2JpbmR0ZXh0ZG9tYWluLCBiaW5kdGV4dGRvbWFpbik7Cisrd2Vha19hbGlhcyAoX19iaW5kX3RleHRkb21haW5fY29kZXNldCwgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOworICNlbmRpZgorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2NhdC1jb21wYXQuYwkxOTk4LTA0LTI2IDA5OjIyOjM3LjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9jYXQtY29tcGF0LmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKK0BAIC0xLDI2MiArMCwwIEBACistLyogQ29tcGF0aWJpbGl0eSBjb2RlIGZvciBnZXR0ZXh0LXVzaW5nLWNhdGdldHMgaW50ZXJmYWNlLgorLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy0KKy0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CistICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorLSAgIGFueSBsYXRlciB2ZXJzaW9uLgorLQorLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCistICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCistCistICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworLQorLSNpZmRlZiBIQVZFX0NPTkZJR19ICistIyBpbmNsdWRlIDxjb25maWcuaD4KKy0jZW5kaWYKKy0KKy0jaW5jbHVkZSA8c3RkaW8uaD4KKy0KKy0jaWZkZWYgU1REQ19IRUFERVJTCistIyBpbmNsdWRlIDxzdGRsaWIuaD4KKy0jIGluY2x1ZGUgPHN0cmluZy5oPgorLSNlbHNlCistY2hhciAqZ2V0ZW52ICgpOworLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAorLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgorLSMgZW5kaWYKKy0jZW5kaWYKKy0KKy0jaWZkZWYgSEFWRV9OTF9UWVBFU19ICistIyBpbmNsdWRlIDxubF90eXBlcy5oPgorLSNlbmRpZgorLQorLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCistCistLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworLQorLS8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mIGBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6CistICAgYGBEaXJlY3RzIGBzZXRsb2NhbGUoKScgdG8gcXVlcnkgYGNhdGVnb3J5JyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50CistICAgICBzZXR0aW5nIG9mIGBsb2NhbCcuJycKKy0gICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIEFuZCBldmVuIHdvcnNlOiBQT1NJWAorLSAgIGRlZmluZXMgdGhpcyBub3QgYXQgYWxsLiAgU28gd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgb25seSBvbiBzZWxlY3RlZAorLSAgIHN5c3RlbSAoZS5nLiB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCistI2lmZGVmIF9MSUJDCistIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAorLSNlbmRpZgorLQorLS8qIFRoZSBjYXRhbG9nIGRlc2NyaXB0b3IuICAqLworLXN0YXRpYyBubF9jYXRkIGNhdGFsb2cgPSAobmxfY2F0ZCkgLTE7CistCistLyogTmFtZSBvZiB0aGUgZGVmYXVsdCBjYXRhbG9nLiAgKi8KKy1zdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X2NhdGFsb2dfbmFtZVtdID0gIm1lc3NhZ2VzIjsKKy0KKy0vKiBOYW1lIG9mIGN1cnJlbnRseSB1c2VkIGNhdGFsb2cuICAqLworLXN0YXRpYyBjb25zdCBjaGFyICpjYXRhbG9nX25hbWUgPSBkZWZhdWx0X2NhdGFsb2dfbmFtZTsKKy0KKy0vKiBHZXQgSUQgZm9yIGdpdmVuIHN0cmluZy4gIElmIG5vdCBmb3VuZCByZXR1cm4gLTEuICAqLworLXN0YXRpYyBpbnQgbXNnX3RvX2NhdF9pZCBQQVJBTVMgKChjb25zdCBjaGFyICptc2cpKTsKKy0KKy0vKiBTdWJzdGl0dXRpb24gZm9yIHN5c3RlbXMgbGFja2luZyB0aGlzIGZ1bmN0aW9uIGluIHRoZWlyIEMgbGlicmFyeS4gICovCistI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKKy1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOworLSNlbmRpZgorLQorLQorLS8qIFNldCBjdXJyZW50bHkgdXNlZCBkb21haW4vY2F0YWxvZy4gICovCistY2hhciAqCistdGV4dGRvbWFpbiAoZG9tYWlubmFtZSkKKy0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7CisteworLSAgbmxfY2F0ZCBuZXdfY2F0YWxvZzsKKy0gIGNoYXIgKm5ld19uYW1lOworLSAgc2l6ZV90IG5ld19uYW1lX2xlbjsKKy0gIGNoYXIgKmxhbmc7CistCistI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTIFwKKy0gICAgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCistICBsYW5nID0gc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgTlVMTCk7CistI2Vsc2UKKy0gIGxhbmcgPSBnZXRlbnYgKCJMQ19BTEwiKTsKKy0gIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQorLSAgICB7CistICAgICAgbGFuZyA9IGdldGVudiAoIkxDX01FU1NBR0VTIik7CistICAgICAgaWYgKGxhbmcgPT0gTlVMTCB8fCBsYW5nWzBdID09ICdcMCcpCistCWxhbmcgPSBnZXRlbnYgKCJMQU5HIik7CistICAgIH0KKy0jZW5kaWYKKy0gIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQorLSAgICBsYW5nID0gIkMiOworLQorLSAgLyogU2VlIHdoZXRoZXIgbmFtZSBvZiBjdXJyZW50bHkgdXNlZCBkb21haW4gaXMgYXNrZWQuICAqLworLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKKy0gICAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKKy0KKy0gIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcpCistICAgIGRvbWFpbm5hbWUgPSBkZWZhdWx0X2NhdGFsb2dfbmFtZTsKKy0KKy0gIC8qIENvbXB1dGUgbGVuZ3RoIG9mIGFkZGVkIHBhdGggZWxlbWVudC4gICovCistICBuZXdfbmFtZV9sZW4gPSBzaXplb2YgKExPQ0FMRURJUikgLSAxICsgMSArIHN0cmxlbiAobGFuZykKKy0JCSArIHNpemVvZiAoIi9MQ19NRVNTQUdFUy8iKSAtIDEgKyBzaXplb2YgKFBBQ0tBR0UpIC0gMQorLQkJICsgc2l6ZW9mICgiLmNhdCIpOworLQorLSAgbmV3X25hbWUgPSAoY2hhciAqKSBtYWxsb2MgKG5ld19uYW1lX2xlbik7CistICBpZiAobmV3X25hbWUgPT0gTlVMTCkKKy0gICAgcmV0dXJuIE5VTEw7CistCistICBzdHJjcHkgKG5ld19uYW1lLCBQQUNLQUdFKTsKKy0gIG5ld19jYXRhbG9nID0gY2F0b3BlbiAobmV3X25hbWUsIDApOworLQorLSAgaWYgKG5ld19jYXRhbG9nID09IChubF9jYXRkKSAtMSkKKy0gICAgeworLSAgICAgIC8qIE5MU1BBVEggc2VhcmNoIGRpZG4ndCB3b3JrLCB0cnkgYWJzb2x1dGUgcGF0aCAqLworLSAgICAgIHNwcmludGYgKG5ld19uYW1lLCAiJXMvJXMvTENfTUVTU0FHRVMvJXMuY2F0IiwgTE9DQUxFRElSLCBsYW5nLAorLQkgICAgICAgUEFDS0FHRSk7CistICAgICAgbmV3X2NhdGFsb2cgPSBjYXRvcGVuIChuZXdfbmFtZSwgMCk7CistCistICAgICAgaWYgKG5ld19jYXRhbG9nID09IChubF9jYXRkKSAtMSkKKy0JeworLQkgIGZyZWUgKG5ld19uYW1lKTsKKy0JICByZXR1cm4gKGNoYXIgKikgY2F0YWxvZ19uYW1lOworLQl9CistICAgIH0KKy0KKy0gIC8qIENsb3NlIG9sZCBjYXRhbG9nLiAgKi8KKy0gIGlmIChjYXRhbG9nICE9IChubF9jYXRkKSAtMSkKKy0gICAgY2F0Y2xvc2UgKGNhdGFsb2cpOworLSAgaWYgKGNhdGFsb2dfbmFtZSAhPSBkZWZhdWx0X2NhdGFsb2dfbmFtZSkKKy0gICAgZnJlZSAoKGNoYXIgKikgY2F0YWxvZ19uYW1lKTsKKy0KKy0gIGNhdGFsb2cgPSBuZXdfY2F0YWxvZzsKKy0gIGNhdGFsb2dfbmFtZSA9IG5ld19uYW1lOworLQorLSAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKKy19CistCistY2hhciAqCistYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCistICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOworLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKKy17CistI2lmIEhBVkVfU0VURU5WIHx8IEhBVkVfUFVURU5WCistICBjaGFyICpvbGRfdmFsLCAqbmV3X3ZhbCwgKmNwOworLSAgc2l6ZV90IG5ld192YWxfbGVuOworLQorLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgaGVyZSBidXQgdG8gYmUgY29tcGF0aWJsZSBkbyBpdC4gICovCistICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQorLSAgICByZXR1cm4gTlVMTDsKKy0KKy0gIC8qIENvbXB1dGUgbGVuZ3RoIG9mIGFkZGVkIHBhdGggZWxlbWVudC4gIElmIHdlIHVzZSBzZXRlbnYgd2UgZG9uJ3QgbmVlZAorLSAgICAgdGhlIGZpcnN0IGJ5dHMgZm9yIE5MU1BBVEg9LCBidXQgd2h5IGNvbXBsaWNhdGUgdGhlIGNvZGUgZm9yIHRoaXMKKy0gICAgIHBlYW51dHMuICAqLworLSAgbmV3X3ZhbF9sZW4gPSBzaXplb2YgKCJOTFNQQVRIPSIpIC0gMSArIHN0cmxlbiAoZGlybmFtZSkKKy0JCSsgc2l6ZW9mICgiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOworLQorLSAgb2xkX3ZhbCA9IGdldGVudiAoIk5MU1BBVEgiKTsKKy0gIGlmIChvbGRfdmFsID09IE5VTEwgfHwgb2xkX3ZhbFswXSA9PSAnXDAnKQorLSAgICB7CistICAgICAgb2xkX3ZhbCA9IE5VTEw7CistICAgICAgbmV3X3ZhbF9sZW4gKz0gMSArIHNpemVvZiAoTE9DQUxFRElSKSAtIDEKKy0JICAgICAgICAgICAgICsgc2l6ZW9mICgiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOworLSAgICB9CistICBlbHNlCistICAgIG5ld192YWxfbGVuICs9IHN0cmxlbiAob2xkX3ZhbCk7CistCistICBuZXdfdmFsID0gKGNoYXIgKikgbWFsbG9jIChuZXdfdmFsX2xlbik7CistICBpZiAobmV3X3ZhbCA9PSBOVUxMKQorLSAgICByZXR1cm4gTlVMTDsKKy0KKy0jIGlmIEhBVkVfU0VURU5WCistICBjcCA9IG5ld192YWw7CistIyBlbHNlCistICBjcCA9IHN0cGNweSAobmV3X3ZhbCwgIk5MU1BBVEg9Iik7CistIyBlbmRpZgorLQorLSAgY3AgPSBzdHBjcHkgKGNwLCBkaXJuYW1lKTsKKy0gIGNwID0gc3RwY3B5IChjcCwgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQ6Iik7CistCistICBpZiAob2xkX3ZhbCA9PSBOVUxMKQorLSAgICB7CistIyBpZiBfX1NURENfXworLSAgICAgIHN0cGNweSAoY3AsIExPQ0FMRURJUiAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOworLSMgZWxzZQorLQorLSAgICAgIGNwID0gc3RwY3B5IChjcCwgTE9DQUxFRElSKTsKKy0gICAgICBzdHBjcHkgKGNwLCAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOworLSMgZW5kaWYKKy0gICAgfQorLSAgZWxzZQorLSAgICBzdHBjcHkgKGNwLCBvbGRfdmFsKTsKKy0KKy0jIGlmIEhBVkVfU0VURU5WCistICBzZXRlbnYgKCJOTFNQQVRIIiwgbmV3X3ZhbCwgMSk7CistICBmcmVlIChuZXdfdmFsKTsKKy0jIGVsc2UKKy0gIHB1dGVudiAobmV3X3ZhbCk7CistICAvKiBEbyAqbm90KiBmcmVlIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB3ZSBqdXN0IGVudGVyZWQuICBJdCBpcyB1c2VkCistICAgICBmcm9tIG5vdyBvbi4gICAqLworLSMgZW5kaWYKKy0KKy0jZW5kaWYKKy0KKy0gIHJldHVybiAoY2hhciAqKSBkb21haW5uYW1lOworLX0KKy0KKy0jdW5kZWYgZ2V0dGV4dAorLWNoYXIgKgorLWdldHRleHQgKG1zZykKKy0gICAgIGNvbnN0IGNoYXIgKm1zZzsKKy17CistICBpbnQgbXNnaWQ7CistCistICBpZiAobXNnID09IE5VTEwgfHwgY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCistICAgIHJldHVybiAoY2hhciAqKSBtc2c7CistCistICAvKiBHZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgY2F0YWxvZy4gIFdlIGFsd2F5cyB1c2Ugc2V0IG51bWJlciAxLgorLSAgICAgVGhlIG1lc3NhZ2UgSUQgaXMgY29tcHV0ZWQgYnkgdGhlIGZ1bmN0aW9uIGBtc2dfdG9fY2F0X2lkJworLSAgICAgd2hpY2ggd29ya3Mgb24gdGhlIHRhYmxlIGdlbmVyYXRlZCBieSBgcG8tdG8tdGJsJy4gICovCistICBtc2dpZCA9IG1zZ190b19jYXRfaWQgKG1zZyk7CistICBpZiAobXNnaWQgPT0gLTEpCistICAgIHJldHVybiAoY2hhciAqKSBtc2c7CistCistICByZXR1cm4gY2F0Z2V0cyAoY2F0YWxvZywgMSwgbXNnaWQsIChjaGFyICopIG1zZyk7CistfQorLQorLS8qIExvb2sgdGhyb3VnaCB0aGUgdGFibGUgYF9tc2dfdGJsJyB3aGljaCBoYXMgYF9tc2dfdGJsX2xlbmd0aCcgZW50cmllcworLSAgIGZvciB0aGUgb25lIGVxdWFsIHRvIG1zZy4gIElmIGl0IGlzIGZvdW5kIHJldHVybiB0aGUgSUQuICBJbiBjYXNlIHdoZW4KKy0gICB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZCByZXR1cm4gLTEuICAqLworLXN0YXRpYyBpbnQKKy1tc2dfdG9fY2F0X2lkIChtc2cpCistICAgICBjb25zdCBjaGFyICptc2c7CisteworLSAgaW50IGNudDsKKy0KKy0gIGZvciAoY250ID0gMDsgY250IDwgX21zZ190YmxfbGVuZ3RoOyArK2NudCkKKy0gICAgaWYgKHN0cmNtcCAobXNnLCBfbXNnX3RibFtjbnRdLl9tc2cpID09IDApCistICAgICAgcmV0dXJuIF9tc2dfdGJsW2NudF0uX21zZ19udW1iZXI7CistCistICByZXR1cm4gLTE7CistfQorLQorLQorLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworLQorLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCistICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKKy0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQorLSAgIHRvIGJlIGRlZmluZWQuICAqLworLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCistc3RhdGljIGNoYXIgKgorLXN0cGNweSAoZGVzdCwgc3JjKQorLSAgICAgY2hhciAqZGVzdDsKKy0gICAgIGNvbnN0IGNoYXIgKnNyYzsKKy17CistICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCistICAgIC8qIERvIG5vdGhpbmcuICovIDsKKy0gIHJldHVybiBkZXN0IC0gMTsKKy19CistI2VuZGlmCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvQ2hhbmdlTG9nCTE5OTgtMDQtMjYgMDk6MjI6MzUuMDAwMDAwMDAwIC0wNDAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL0NoYW5nZUxvZwkyMDA0LTA5LTEyIDE0OjQwOjM0LjM0OTc0OTAwMCAtMDQwMAorQEAgLTEsMTAyMiArMSw0IEBACistMTk5Ny0wOS0wNiAwMjoxMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogaW50bGguaW5zdC5pbjogUmVmb3JtYXQgY29weXJpZ2h0LgorLQorLTE5OTctMDgtMTkgMTU6MjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorLQorLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOiBSZW1vdmUgd3JvbmcgY29tbWVudC4KKy0KKy0xOTk3LTA4LTE2IDAwOjEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kYXRhKTogRG9uJ3QgY2hhbmdlIGRpcmVjdG9yeSB0byBpbnN0YWxsLgorLQorLTE5OTctMDgtMDEgMTQ6MzAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorLQorLQkqIGNhdC1jb21wYXQuYzogRml4IGNvcHlyaWdodC4KKy0KKy0JKiBsb2NhbGVhbGlhcy5jOiBEb24ndCBkZWZpbmUgc3RyY2hyIHVubGVzcyAhSEFWRV9TVFJDSFIuCistCistCSogbG9hZG1zZ2NhdC5jOiBVcGRhdGUgY29weXJpZ2h0LiAgRml4IHR5cG9zLgorLQorLQkqIGwxMG5mbGlzdC5jOiBEb24ndCBkZWZpbmUgc3RyY2hyIHVubGVzcyAhSEFWRV9TVFJDSFIuCistCShfbmxfbWFrZV9sMTBuZmxpc3QpOiBIYW5kbGUgc3BvbnNvciBhbmQgcmV2aXNpb24gY29ycmVjdGx5LgorLQorLQkqIGdldHRleHQuYzogVXBkYXRlIGNvcHlyaWdodC4KKy0JKiBnZXR0ZXh0Lmg6IExpa2V3aXNlLgorLQkqIGhhc2gtc3RyaW5nLmg6IExpa2V3aXNlLgorLQorLQkqIGZpbmRkb21haW4uYzogUmVtb2F2ZSBkZWFkIGNvZGUuICBEZWZpbmUgc3RyY2hyIG9ubHkgaWYKKy0JIUhBVkVfU1RSQ0hSLgorLQorLQkqIGV4cGxvZGVuYW1lLmM6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KKy0KKy0JKiBleHBsb2RlbmFtZS5jOiBSZWZvcm1hdCBjb3B5cmlnaHQgdGV4dC4KKy0JKF9ubF9leHBsb2RlX25hbWUpOiBGaXggdHlwby4KKy0KKy0JKiBkY2dldHRleHQuYzogRGVmaW5lIGFuZCB1c2UgX19zZXRfZXJybm8uCistCShndWVzc19jYXRlZ29yeV92YWx1ZSk6IERvbid0IHVzZSBzZXRsb2NhbGUgaWYgSEFWRV9MQ19NRVNTQUdFUyBpcworLQlub3QgZGVmaW5lZC4KKy0KKy0JKiBiaW5kdGV4dGRvbS5jOiBQcmV0dHkgcHJpbnRpbmcuCistCistMTk5Ny0wNS0wMSAwMjoyNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogZGNnZXR0ZXh0LmMgKGd1ZXNzX2NhdGVnb3J5X3ZhbHVlKTogRG9uJ3QgZGVwZW5kIG9uCistCUhBVkVfTENfTUVTU0FHRVMuICBXZSBkb24ndCBuZWVkIHRoZSBtYWNybyBoZXJlLgorLQlQYXRjaCBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBpbG9nLmZyPi4KKy0KKy0JKiBjYXQtY29tcGF0LmMgKHRleHRkb21haW4pOiBEb04ndCByZWZlciB0byBIQVZFX1NFVExPQ0FMRV9OVUxMCistCW1hY3JvLiAgSW5zdGVhZCB1c2UgSEFWRV9MT0NBTEVfTlVMTCBhbmQgZGVmaW5lIGl0IHdoZW4gdXNpbmcKKy0JZ2xpYmMsIGFzIGluIGRjZ2V0dGV4dC5jLgorLQlQYXRjaCBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBpbG9nLmZyPi4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoQ1BQRkxBR1MpOiBOZXcgdmFyaWFibGUuICBSZXBvcnRlZCBieSBGcmFuYyxvaXMKKy0JUGluYXJkLgorLQorLU1vbiBNYXIgMTAgMDY6NTE6MTcgMTk5NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogTWFrZWZpbGUuaW46IEltcGxlbWVudCBoYW5kbGluZyBvZiBsaWJ0b29sLgorLQorLQkqIGdldHRleHRQLmg6IENoYW5nZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHVzZSBvZiBnZW5lcmljIGxvd2xldmVsCistCWkxOG4gZmlsZSBoYW5kbGluZy4KKy0KKy1XZWQgRGVjICA0IDIwOjIxOjE4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorLQorLQkqIHRleHRkb21haW4uYzogUHV0IHBhcmVudGhlc2VzIGFyb3VuZCBhcmd1bWVudHMgb2YgbWVtY3B5IG1hY3JvCistCWRlZmluaXRpb24uCistCSogbG9jYWxlYWxpYXMuYzogTGlrZXdpc2UuCistCSogbDEwbmZsaXN0LmM6IExpa2V3aXNlLgorLQkqIGZpbmRkb21haW4uYzogTGlrZXdpc2UuCistCSogYmluZHRleHRkb20uYzogTGlrZXdpc2UuCistCVJlcG9ydGVkIGJ5IFRob21hcyBFc2tlbi4KKy0KKy1Nb24gTm92IDI1IDIyOjU3OjUxIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorLQorLQkqIHRleHRkb21haW4uYzogTW92ZSBkZWZpbml0aW9uIG9mIGBtZW1jcHlgIG1hY3JvIHRvIHJpZ2h0CistCXBvc2l0aW9uLgorLQorLUZyaSBOb3YgMjIgMDQ6MDE6NTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogZmluZGRvbWFpbi5jIFshSEFWRV9TVFJJTkdfSCAmJiAhX0xJQkNdOiBEZWZpbmUgbWVtY3B5IHVzaW5nCistIAliY29weSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIEVza2VuLgorLQkqIGJpbmR0ZXh0ZG9tLmM6IExpa2V3aXNlLgorLQkqIGwxMG5mbGlzdC5jOiBMaWtld2lzZS4KKy0JKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KKy0JKiB0ZXh0ZG9tYWluLmM6IExpa2V3aXNlLgorLQorLVR1ZSBPY3QgMjkgMTE6MTA6MjcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogTWFrZWZpbGUuaW4gKGxpYmRpcik6IENoYW5nZSB0byB1c2UgZXhlY19wcmVmaXggaW5zdGVhZCBvZgorLSAJcHJlZml4LiAgUmVwb3J0ZWQgYnkgS251dC1I5XZhcmRBa3NuZXMgPGV0b2tuYUBldG8uZXJpY3Nzb24uc2U+LgorLQorLVNhdCBBdWcgMzEgMDM6MDc6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogbDEwbmZsaXN0LmMgKF9ubF9ub3JtYWxpemVfY29kZXNldCk6IFdlIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSwKKy0Jc28gZG9uJ3QgcHJlcGVuZCB1cHBlcmNhc2UgYElTTycgZm9yIG9ubHkgbnVtZXJpYyBhcmcuCistCistRnJpIEp1bCAxOSAwMDoxNTo0NiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKy0KKy0JKiBsMTBuZmxpc3QuYzogTW92ZSBpbmNsdXNpb24gb2YgYXJnei5oLCBjdHlwZS5oLCBzdGRsaWIuaCBhZnRlcgorLQlkZWZpbml0aW9uIG9mIF9HTlVfU09VUkNFLiAgUGF0Y2ggYnkgUm9sYW5kIE1jR3JhdGguCistCistCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IEZpeCBhbm90aGVyIGJ1ZyB3aXRoIGBmb3InIGxvb3AgYW5kCistCWVtcHR5IGFyZ3VtZW50cy4gIFBhdGNoIGJ5IEppbSBNZXllcmluZy4gIENvcnJlY3QgbmFtZSBvcworLQl1bmluc3RhbGxlZCBmaWxlczogbm8gaW50bC0gcHJlZml4IGFueW1vcmUuCistCistCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGF0YSk6IEFnYWluIHdvcmsgYXJvdW5kIHNoZWxscyB3aGljaAorLQljYW5ub3QgaGFuZGxlIG1wdHkgZm9yIGxpc3QuICBSZXBvcnRlZCBieSBKaW0gTWV5ZXJpbmcuCistCistU2F0IEp1bCAxMyAxODoxMTozNSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFNwbGl0IGdvYWwuICBOb3cgZGVwZW5kIG9uIGluc3RhbGwtZXhlYworLSAgICAgICAgYW5kIGluc3RhbGwtZGF0YS4KKy0JKGluc3RhbGwtZXhlYywgaW5zdGFsbC1kYXRhKTogTmV3IGdvYWxzLiAgQ3JlYXRlZCBmcm9tIGZvcm1lcgorLQlpbnN0YWxsIGdvYWwuCistCVJlcG9ydGVkIGJ5IEthcmwgQmVycnkuCistCistU2F0IEp1biAyMiAwNDo1ODoxNCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoTUtJTlNUQUxMRElSUyk6IE5ldyB2YXJpYWJsZS4gIFBhdGggdG8KKy0gICAgICAgIG1raW5zdGFsbGRpcnMgc2NyaXB0LgorLQkoaW5zdGFsbCk6IHVzZSBNS0lOU1RBTExESVJTIHZhcmlhYmxlIG9yIGlmIHRoZSBzY3JpcHQgaXMgbm90IHByZXNlbnQKKy0JdHJ5IHRvIGZpbmQgaXQgaW4gdGhlICR0b3Bfc2NyZGlyKS4KKy0KKy1XZWQgSnVuIDE5IDAyOjU2OjU2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorLQorLQkqIGwxMG5mbGlzdC5jOiBMaW51eCBsaWJjICpwYXJ0bHkqIGluY2x1ZGVzIHRoZSBhcmd6XyogZnVuY3Rpb25zLgorLQlHcnIuICBXb3JrIGFyb3VuZCBieSByZW5hbWluZyB0aGUgc3RhdGljIHZlcnNpb24gYW5kIHVzZSBtYWNyb3MKKy0JZm9yIHJlbmFtaW5nLgorLQorLVR1ZSBKdW4gMTggMjA6MTE6MTcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgcHJlc2VuY2UgdGVzdCBtYWNyb3Mgb2YgX19hcmd6XyogZnVuY3Rpb25zLgorLQorLQkqIGwxMG5mbGlzdC5jOiBJbmNsdWRlIDxhcmd6Lmg+IGJhc2VkIG9uIHRlc3Qgb2YgaXQgaW5zdGVhZCB3aGVuCistCV9fYXJnel8qIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLgorLQlSZXBvcnRlZCBieSBBbmRyZWFzIFNjaHdhYi4KKy0KKy1UaHUgSnVuIDEzIDE1OjE3OjQ0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorLQorLQkqIGV4cGxvZGVuYW1lLmMsIGwxMG5mbGlzdC5jOiBEZWZpbmUgTlVMTCBmb3IgZHVtYiBzeXN0ZW1zLgorLQorLVR1ZSBKdW4gMTEgMTc6MDU6MTMgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogaW50bGguaW5zdC5pbiwgbGliZ2V0dGV4dC5oIChkY2dldHRleHQpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGUKKy0JcmVzdWx0IHRvIF9fcmVzdWx0IHRvIHByZXZlbnQgbmFtZSBjbGFzaC4KKy0KKy0JKiBsMTBuZmxpc3QuYywgbG9jYWxlYWxpYXMuYywgZGNnZXR0ZXh0LmM6IERlZmluZSBfR05VX1NPVVJDRSB0bworLSAgICAgICAgZ2V0IHByb3RvdHlwZSBmb3Igc3RwY3B5IGFuZCBzdHJjYXNlY21wLgorLQorLQkqIGludGxoLmluc3QuaW4sIGxpYmdldHRleHQuaDogTW92ZSBkZWNsYXJhdGlvbiBvZgorLQlgX25sX21zZ19jYXRfY250cicgb3V0c2lkZSBfX2V4dGVuc2lvbl9fIGJsb2NrIHRvIHByZXZlbnQgd2FybmluZworLQlmcm9tIGdjYydzIC1XbmVzdGVkLWV4dGVybiBvcHRpb24uCistCistRnJpIEp1biAgNyAwMTo1ODowMCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSBjb21tZW50LgorLQorLVRodSBKdW4gIDYgMTc6Mjg6MTcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBXb3JrIGFyb3VuZCBmb3IgYW5vdGhlciBCdWdsaXggc3R1cGlkaXR5LgorLQlBbHdheXMgdXNlIGFuIGBlbHNlJyBjbG9zZSBmb3IgYGlmJ3MuICBSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCistCistCSogTWFrZWZpbGUuaW4gKGludGxoLmluc3QpOiBDb3JyZWN0IHR5cG8gaW4gcGhvbnkgcnVsZS4KKy0JUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgorLQorLVRodSBKdW4gIDYgMDE6NDk6NTIgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogZGNnZXR0ZXh0LmMgKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJpYWJsZSBhbGxvY2FfbGlzdCB0bworLQlibG9ja19saXN0IGFzIHRoZSBtYWNybyBjYWxscyBhc3N1bWUuCistCVBhdGNoIGJ5IEVyaWMgQmFja3VzLgorLQorLQkqIGxvY2FsZWFsaWFzLmMgWyFIQVZFX0FMTE9DQV06IERlZmluZSBhbGxvY2EgYXMgbWFjcm8gdXNpbmcKKy0gICAgICAgIG1hbGxvYy4KKy0JKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJyaWFiZSBhbGxvY2FfbGlzdCB0byBibG9ja19saXN0IGFzIHRoZQorLQltYWNybyBjYWxscyBhc3N1bWUuCistCVBhdGNoIGJ5IEVyaWMgQmFja3VzLgorLQorLQkqIGwxMG5mbGlzdC5jOiBDb3JyZWN0IGNvbmRpdGlvbmFsIGZvciA8YXJnei5oPiBpbmNsdXNpb24uCistCVJlcG9ydGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgorLQorLQkqIE1ha2VmaWxlLmluIChhbGwpOiBEZXBlbmQgb24gYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAsIG5vdAorLSAgICAgICAgYWxsLUBVU0VfTkxTQC4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGludGxoLmluc3QgY29tZXMgZnJvbSBsb2NhbCBkaXIsIG5vdAorLSAgICAgICAgJChzcmNkaXIpLgorLQorLQkqIE1ha2VmaWxlLmluIChpbnRsaC5pbnN0KTogU3BlY2lhbCBoYW5kbGluZyBvZiB0aGlzIGdvYWwuICBJZgorLQl1c2VkIGluIGdldHRleHQsIHRoaXMgaXMgcmVhbGx5IGEgcnVsIHRvIGNvbnN0cnVjdCB0aGlzIGZpbGUuICBJZgorLQl1c2VkIGluIGFueSBvdGhlciBwYWNrYWdlIGl0IGlzIGRlZmluZWQgYXMgYSAuUEhPTlkgcnVsZSB3aXRoCistCWVtcHR5IGJvZHkuCistCistCSogZmluZGRvbWFpbi5jOiBFeHRyYWN0IGxvY2FsZSBmaWxlIGluZm9ybWF0aW9uIGhhbmRsaW5nIGludG8KKy0JbDEwbmZpbGUuYy4gIFJlbmFtZSBsb2NhbCBzdHBjcHlfXyBmdW5jdGlvbiB0byBzdHBjcHkuCistCistCSogZGNnZXR0ZXh0LmMgKHN0cGNweSk6IEFkZCBsb2NhbCBkZWZpbml0aW9uLgorLQorLQkqIGwxMG5mbGlzdC5jOiBTb2x2ZSBzb21lIHBvcnRhYmlsaXR5IHByb2JsZW1zLiAgUGF0Y2hlcyBwYXJ0bHkgYnkKKy0JVGhvbWFzIEVza2VuLiAgQWRkIGxvY2FsIGRlZmluaXRpb24gb2Ygc3RwY3B5LgorLQorLVR1ZSBKdW4gIDQgMDI6NDc6NDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogaW50bGguaW5zdC5pbjogRG9uJ3QgZGVwZW5kIGluY2x1ZGluZyA8bG9jYWxlLmg+IG9uCistCUhBVkVfTE9DQUxFX0guICBJbnN0ZWFkIGNvbmZpZ3VyZSBtdXN0IHJld3JpdGUgdGhpcyBmaWlsZQorLQlkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGUgY29uZmlndXJlIHJ1bi4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGxpYmludGwuaW5zdCBpcyBub3cgY2FsbGVkIGludGxoLmluc3QuCistCUFkZCBydWxlcyBmb3IgdXBkYXRpbmcgaW50bGguaW5zdCBmcm9tIGludGxoLmluc3QuaW4uCistCistCSogbGliaW50bC5pbnN0OiBSZW5hbWVkIHRvIGludGxoLmluc3QuaW4uCistCistCSogbG9jYWxlYWxpYXMuYywgZGNnZXR0ZXh0LmMgW19fR05VQ19fXTogRGVmaW5lIEhBVkVfQUxMT0NBIHRvIDEKKy0gICAgICAgIGJlY2F1c2UgZ2NjIGhhcyBfX2J1aXRsaW5fYWxsb2NhLgorLQlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KKy0KKy1Nb24gSnVuICAzIDAwOjMyOjE2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorLQorLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsY2hlY2spOiBOZXcgZ29hbCB0byBmdWxmaWxsIG5lZWRzIG9mCistICAgICAgICBhdXRvbWFrZSdzIGRpc3RjaGVjay4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlb3JkZXIgY29tbWFuZHMgc28gdGhhdCBWRVJTSU9OIGlzCistICAgICAgICBmb3VuZC4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoZ2V0dGV4dHNyY2Rpcik6IE5vdyB1c2Ugc3ViZGlyZWN0b3J5IGludGwvIGluCistICAgICAgICBAZGF0YWRpckAvZ2V0dGV4dC4KKy0JKENPTVNSQ1MpOiBBZGQgbDEwbmZpbGUuYy4KKy0JKE9CSkVDVFMpOiBBZGQgbDEwbmZpbGUuby4KKy0JKERJU1RGSUxFUyk6IFJlbmFtZSB0byBESVNURklMRS5ub3JtYWwuICBSZW1vdmUgJChESVNURklMRVMuY29tbW9uKS4KKy0JKERJU1RGSUxFLmdldHRleHQpOiBSZW1vdmUgJChESVNURklMRVMuY29tbW9uKS4KKy0JKGFsbC1nZXR0ZXh0KTogUmVtb3ZlIGdvYWwuCistCShpbnN0YWxsKTogSWYgJChQQUNLQUdFKSA9IGdldHRleHQgaW5zdGFsbCwgb3RoZXJ3b3NlIGRvIG5vdGhpbmcuICBObworLQlwYWNrYWdlIGJ1dCBnZXR0ZXh0IGl0c2VsZiBzaG91bGQgaW5zdGFsbCBsaWJpbnRsLmggKyBoZWFkZXJzLgorLQkoZGlzdCk6IEV4dGVuZCBnb2FsIHRvIHdvcmsgZm9yIGdldHRleHQsIHRvby4KKy0JKGRpc3QtZ2V0dGV4dCk6IFJlbW92ZSBnb2FsLgorLQorLQkqIGRjZ2V0dGV4dC5jIFshSEFWRV9BTExPQ0FdOiBEZWZpbmUgbWFjcm8gYWxsb2NhIGJ5IHVzaW5nIG1hbGxvYy4KKy0KKy1TdW4gSnVuICAyIDE3OjMzOjA2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorLQorLQkqIGxvYWRtc2djYXQuYyAoX25sX2xvYWRfZG9tYWluKTogUGFyYW1ldGVyIGlzIG5vdyBjb21lcyBmcm9tCistICAgICAgICBmaW5kX2wxMG5maWxlLgorLQorLVNhdCBKdW4gIDEgMDI6MjM6MDMgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CistCistCSogbDEwbmZsaXN0LmMgKF9fYXJnel9uZXh0KTogQWRkIGRlZmluaXRpb24uCistCistCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IEFkZCBjb2RlIGZvciBoYW5kbGluZyBtaXNzaW5nIGFsbG9jYQorLQljb2RlLiAgVXNlIG5ldyBsMTBuZmlsZSBoYW5kbGluZy4KKy0KKy0JKiBsb2NhbGVhbGlhcy5jIFshSEFWRV9BTExPQ0FdOiBBZGQgY29kZSBmb3IgaGFuZGxpbmcgbWlzc2luZworLSAgICAgICAgYWxsb2NhIGNvZGUuCistCistCSogbDEwbmZsaXN0LmM6IEluaXRpYWwgcmV2aXNpb24uCistCistVHVlIEFwciAgMiAxODo1MToxOCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIE1ha2VmaWxlLmluIChhbGwtZ2V0dGV4dCk6IE5ldyBnb2FsLiAgU2FtZSBhcyBhbGwteWVzLgorLQorLVRodSBNYXIgMjggMjM6MDE6MjIgMTk5NiAgS2FybCBFaWNod2FsZGVyICA8a2VAa2UuY2VudHJhbC5kZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoZ2V0dGV4dHNyY2Rpcik6IERlZmluZSB1c2luZyBAZGF0YWRpckAuCistCistVHVlIE1hciAyNiAxMjozOToxNCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIGZpbmRkb21haW4uYzogSW5jbHVkZSA8Y3R5cGUuaD4uICBSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KKy0KKy1TYXQgTWFyIDIzIDAyOjAwOjM1IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOiBSZW5hbWUgdG8gc3RwY3B5X18gdG8gcHJldmVudCBjbGFzaGluZworLSAgICAgICAgd2l0aCBleHRlcm5hbCBkZWNsYXJhdGlvbi4KKy0KKy1TYXQgTWFyICAyIDAwOjQ3OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKGFsbC1ubyk6IFJlbmFtZSBmcm9tIGFsbF9uby4KKy0KKy1TYXQgRmViIDE3IDAwOjI1OjU5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZ2V0dGV4dFAuaCBbbG9hZGVkX2RvbWFpbl06IEFycmF5IGBzdWNjZXNzb3InIG11c3Qgbm93IGNvbnRhaW4gdXAKKy0gICAgICAgIHRvIDYzIGVsZW1lbnRzIChiZWNhdXNlIG9mIGNvZGVzZXQgbmFtZSBub3JtYWxpemF0aW9uKS4KKy0KKy0JKiBmaW5kZG9tYWluLmM6IEltcGxlbWVudCBjb2Rlc2V0IG5hbWUgbm9ybWFsaXphdGlvbi4KKy0KKy1UaHUgRmViIDE1IDA0OjM5OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlZmluZSB0byBgYWxsLUBVU0VfTkxTQCcuCistCShhbGwteWVzLCBhbGxfbm8pOiBOZXcgZ29hbHMuICBgYWxsLW5vJyBpcyBub29wLCBgYWxsLXllcycKKy0JaXMgZm9ybWVyIGFsbC4KKy0KKy1Nb24gSmFuIDE1IDIxOjQ2OjAxIDE5OTYgIEhvd2FyZCBHYXlsZSAgPGhvd2FyZEBoYWwuY29tPgorLQorLQkqIGxvY2FsZWFsaWFzLmMgKGFsaWFzX2NvbXBhcmUpOiBJbmNyZW1lbnQgc3RyaW5nIHBvaW50ZXJzIGluIGxvb3AKKy0gICAgICAgIG9mIHN0cmNhc2VjbXAgcmVwbGFjZW1lbnQuCistCistRnJpIERlYyAyOSAyMToxNjozNCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IFdobyBjb21tZW50ZWQgdGhpcyBnb2FsIG91dCA/IDotKQorLQorLUZyaSBEZWMgMjkgMTU6MDg6MTYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogU2F2ZSBgZXJybm8nLiAgRmFpbGluZyBzeXN0ZW0gY2FsbHMKKy0Jc2hvdWxkIG5vdCBlZmZlY3QgaXQgYmVjYXVzZSBhIG1pc3NpbmcgY2F0YWxvZyBpcyBubyBlcnJvci4KKy0JUmVwb3J0ZWQgYnkgSGFyYWxkIEs8bzo+bmlnIDxrb2VuaWdAdGF0LnBoeXNpay51bmktdHVlYmluZ2VuLmRlPi4KKy0KKy1UdWUgRGVjIDE5IDIyOjA5OjEzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRXhwbGljaXRseSB1c2UgJChTSEVMTCkgZm9yIHJ1bm5pbmcKKy0gICAgICAgIHNoZWxsIHNjcmlwdHMuCistCistRnJpIERlYyAxNSAxNzozNDo1OSAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOiBPbmx5IGluc3RhbGwgbGlicmFyeSBhbmQgaGVhZGVyIHdoZW4KKy0Jd2UgdXNlIHRoZSBvd24gaW1wbGVtZW50YXRpb24uICBEb24ndCBkbyBpdCB3aGVuIHVzaW5nIHRoZQorLQlzeXN0ZW0ncyBnZXR0ZXh0IG9yIGNhdGdldHMgZnVuY3Rpb25zLgorLQorLQkqIGRjZ2V0dGV4dC5jIChmaW5kX21zZyk6IE11c3Qgbm90IHN3YXAgZG9tYWluLT5oYXNoX3NpemUgaGVyZS4KKy0KKy1TYXQgRGVjICA5IDE2OjI0OjM3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogbG9jYWxlYWxpYXMuYywgbGliaW50bC5pbnN0LCBsaWJnZXR0ZXh0LmgsIGhhc2gtc3RyaW5nLmgsCistCWdldHRleHRQLmgsIGZpbmRkb21haW4uYywgZGNnZXR0ZXh0LmMsIGNhdC1jb21wYXQuYzoKKy0JVXNlIFBBUkFNUyBpbnN0ZWFkIG9mIF9fUC4gIFN1Z2dlc3RlZCBieSBSb2xhbmQgTWNHcmF0aC4KKy0KKy1UdWUgRGVjICA1IDExOjM5OjE0IDE5OTUgIExhcnJ5IFNjaHdpbW1lciAgPHJvc2VidWRAY3ljbG9uZS5zdGFuZm9yZC5lZHU+CistCistCSogbGliZ2V0dGV4dC5oOiBVc2UgYCNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCknIGluc3RlYWQgb2YgYCNpZgorLQkhX0xJQklOVExfSCcgYmVjYXVzZSBTb2xhcmlzIGRlZmluZXMgX0xJQklOVExfSCBhcyBlbXB0eS4KKy0KKy1Nb24gRGVjICA0IDE1OjQyOjA3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKToKKy0JSW5zdGFsbCBsaWJpbnRsLmluc3QgaW5zdGVhZCBvZiBsaWJpbnRsLmguaW5zdGFsbC4KKy0KKy1TYXQgRGVjICAyIDIyOjUxOjM4IDE5OTUgIE1hcmN1cyBEYW5pZWxzICA8bWFyY3VzQHN5c2MucGR4LmVkdT4KKy0KKy0JKiBjYXQtY29tcGF0LmMgKHRleHRkb21haW4pOgorLQlSZXZlcnNlIG9yZGVyIGluIHdoaWNoIGZpbGVzIGFyZSB0cmllZCB5b3UgbG9hZC4gIEZpcnN0CistCXRyeSBsb2NhbCBmaWxlLCB3aGVuIHRoaXMgZmFpbGVkIGFic29sdXRlIHBhdGguCistCistV2VkIE5vdiAyOSAwMjowMzo1MyAxOTk1ICBOZWxzb24gSC4gRi4gQmVlYmUgIDxiZWViZUBtYXRoLnV0YWguZWR1PgorLQorLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOiBBZGQgbWlzc2luZyB7IH0uCistCistU3VuIE5vdiAyNiAxODoyMTo0MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIGxpYmludGwuaW5zdDogQWRkIG1pc3NpbmcgX19QIGRlZmluaXRpb24uICBSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCistCistCSogTWFrZWZpbGUuaW46CistCUFkZCBkdW1teSBgYWxsJyBhbmQgYGR2aScgZ29hbHMuICBSZXBvcnRlZCBieSBUb20gVHJvbWV5LgorLQorLVNhdCBOb3YgMjUgMTY6MTI6MDEgMTk5NSAgRnJhbmMsb2lzIFBpbmFyZCAgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPgorLQorLQkqIGhhc2gtc3RyaW5nLmg6IENhcGl0YWxpemUgYXJndW1lbnRzIG9mIG1hY3Jvcy4KKy0KKy1TYXQgTm92IDI1IDEyOjAxOjM2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IFByZXZlbnQgZmlsZXMgbmFtZXMgbG9uZ2VyIHRoYW4gMTMKKy0JY2hhcmFjdGVycy4gIGxpYmludGwuaC5nbGliYy0+bGliaW50bC5nbGliYywKKy0JbGliaW50bC5oLmluc3RhbGwtPmxpYmludGwuaW5zdC4gIFJlcG9ydGVkIGJ5IEpvc2h1YSBSLiBQb3Vsc29uLgorLQorLVNhdCBOb3YgMjUgMTE6MzE6MTIgMTk5NSAgRXJpYyBCYWNrdXMgIDxlcmljYkBsc2lkLmhwLmNvbT4KKy0KKy0JKiBkY2dldHRleHQuYzogRml4IGJ1ZyBpbiBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzLgorLQorLVNhdCBOb3YgMjUgMDI6MzU6MjcgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KKy0KKy0JKiBsaWJnZXR0ZXh0Lmg6IFNvbGFyaXMgY2MgZG9lcyBub3QgdW5kZXJzdGFuZAorLQkgI2lmICFTWU1CT0wxICYmICFTWU1CT0wyLiAgU2FkCWJ1dCB0cnVlLgorLQorLVRodSBOb3YgMjMgMTY6MjI6MTQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6CistCUZpeCBmb3IgbWFjaGluZSB3aXRoID4zMiBiaXQgYHVuc2lnbmVkIGxvbmcncy4KKy0KKy0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKToKKy0JRml4IGhvcnJpYmxlIGJ1ZyBpbiBsb29wIGZvciBhbHRlcm5hdGl2ZSB0cmFuc2xhdGlvbi4KKy0KKy1UaHUgTm92IDIzIDAxOjQ1OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogcG8ydGJsLnNlZC5pbiwgbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDoKKy0JU29tZSBmdXJ0aGVyIHNpbXBsaWZpY2F0aW9ucyBpbiBtZXNzYWdlIG51bWJlciBnZW5lcmF0aW9uLgorLQorLU1vbiBOb3YgMjAgMjE6MDg6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBsaWJpbnRsLmguZ2xpYmM6IFVzZSBfX2NvbnN0IGluc3RlYWQgb2YgY29uc3QgaW4gcHJvdG90eXBlcy4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOgorLQlJbnN0YWxsIGxpYmludGwuaC5pbnN0YWxsIGluc3RlYWQgb2YgbGliaW50bC5oLiAgVGhpcworLQlpcyBhIHN0cmlwcGVkLWRvd24gdmVyc2lvbi4gIFN1Z2dlc3RlZCBieSBQZXRlciBNaWxsZXIuCistCistCSogbGliaW50bC5oLmluc3RhbGwsIGxpYmludGwuaC5nbGliYzogSW5pdGlhbCByZXZpc2lvbi4KKy0KKy0JKiBsb2NhbGVhbGlhcy5jIChfbmxfZXhwYW5kX2FsaWFzLCByZWFkX2FsaWFzX2ZpbGUpOgorLQlQcm90ZWN0IHByb3RvdHlwZXMgaW4gdHlwZSBjYXN0cyBieSBfX1AuCistCistVHVlIE5vdiAxNCAxNjo0Mzo1OCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIGhhc2gtc3RyaW5nLmg6IENvcnJlY3QgcHJvdG90eXBlIGZvciBoYXNoX3N0cmluZy4KKy0KKy1TdW4gTm92IDEyIDEyOjQyOjMwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOiBBZGQgcHJvdG90eXBlLgorLQorLQkqIGdldHRleHRQLmg6IEZpeCBjb3B5cmlnaHQuCistCShTV0FQKTogQWRkIHByb3RvdHlwZS4KKy0KKy1XZWQgTm92ICA4IDIyOjU2OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKTogRm9yZ290IHNpemVvZi4KKy0JQXZvaWQgY2FsbGluZyAqcHJpbnRmIGZ1bmN0aW9uLiAgVGhpcyBpbnRyb2R1Y2VzIGEgYmlnIG92ZXJoZWFkLgorLQlQYXRjaCBieSBSb2xhbmQgTWNHcmF0aC4KKy0KKy1UdWUgTm92ICA3IDE0OjIxOjA4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZmluZGRvbWFpbi5jLCBjYXQtY29tcGF0LmM6IFdyb25nIGluZGVudGF0aW9uIGluICNpZiBmb3Igc3RwY3B5LgorLQorLQkqIGZpbmRkb21haW4uYyAoc3RwY3B5KToKKy0JRGVmaW5lIHN1YnN0aXR1dGlvbiBmdW5jdGlvbiBsb2NhbC4gIFRoZSBtYWNybyB3YXMgdG8gZmxha3kuCistCistCSogY2F0LWNvbXBhdC5jOiBGaXggdHlwby4KKy0KKy0JKiB4b3Blbi1tc2cuc2VkLCBsaW51eC1tc2cuc2VkOgorLQlXaGlsZSBicmluZ2luZyBtZXNzYWdlIG51bWJlciB0byByaWdodCBwbGFjZSBvbmx5IGFjY2VwdCBkaWdpdHMuCistCistCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDogTm93IHRoYXQgdGhlIGNvdW50ZXIgZG9lcyBub3QgaGF2ZQorLQlsZWFkaW5nIDBzIHdlIGRvbid0IG5lZWQgdG8gcmVtb3ZlIHRoZW0uICBSZXBvcnRlZCBieSBNYXJjdXMKKy0JRGFuaWVscy4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoLi4vcG8vY2F0LWlkLXRibC5vKTogVXNlICQodG9wX3NyZGlyKSBpbgorLQlkZXBlbmRlbmN5LiAgUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCistCistCSogY2F0LWNvbXBhdC5jOiAoc3RwY3B5KSBbIV9MSUJDICYmICFIQVZFX1NUUENQWV06IERlZmluZSByZXBsYWNlbWVudC4KKy0JR2VuZXJhbGx5IGNsZWFudXAgdXNpbmcgI2lmIGluc3RlYWQgb2YgI2lmbmRlZi4KKy0KKy0JKiBNYWtlZmlsZS5pbjogQ29ycmVjdCB0eXBvcyBpbiBjb21tZW50LiAgQnkgRnJhbmMsb2lzIFBpbmFyZC4KKy0KKy1Nb24gTm92ICA2IDAwOjI3OjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogRG9uJ3QgaW5zdGFsbCBsaWJpbnRsLmggYW5kIGxpYmludGwuYQorLQlpZiB3ZSB1c2UgYW4gYXZhaWxhYmxlIGdldHRleHQgaW1wbGVtZW50YXRpb24uCistCistU3VuIE5vdiAgNSAyMjowMjowOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIGxpYmdldHRleHQuaDogRml4IHR5cG86IEhBVkVfQ0FUR0VUVFMgLT4gSEFWRV9DQVRHRVRTLiAgUmVwb3J0ZWQKKy0JYnkgRnJhbmMsb2lzIFBpbmFyZC4KKy0KKy0JKiBsaWJnZXR0ZXh0Lmg6IFVzZSAjaWYgaW5zdGVhZCBvZiAjaWZkZWYvI2lmbmRlZi4KKy0KKy0JKiBmaW5kZG9tYWluLmM6CistCUNvbW1lbnRzIGRlc2NyaWJpbmcgd2hhdCBoYXMgdG8gYmUgZG9uZSBzaG91bGQgc3RhcnQgd2l0aCBGSVhNRS4KKy0KKy1TdW4gTm92ICA1IDE5OjM4OjAxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IFNwbGl0LiAgVXNlIERJU1RGSUxFUyB3aXRoIG5vcm1hbCBtZWFuaW5nLgorLQlESVNURklMRVMuY29tbW9uIG5hbWVzIHRoZSBmaWxlcyBjb21tb24gdG8gYm90aCBkaXN0IGdvYWxzLgorLQlESVNURklMRVMuZ2V0dGV4dCBhcmUgdGhlIGZpbGVzIG9ubHkgZGlzdHJpYnV0ZWQgaW4gR05VIGdldHRleHQuCistCistU3VuIE5vdiAgNSAxNzozMjo1NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOiBDb3JyZWN0IHNlYXJjaGluZyBpbiBkZXJpdmVkIGxvY2FsZXMuCistCVRoaXMgd2FzIG5lY2Vzc2FyeSBzaW5jZSBhIGNoYW5nZSBpbiBfbmxfZmluZF9tc2cgc2V2ZXJhbCB3ZWVrcworLQlhZ28uICBJIHJlYWxseSBkb24ndCBrbm93IHRoaXMgaXMgc3RpbGwgbm90IGZpeGVkLgorLQorLVN1biBOb3YgIDUgMTI6NDM6MTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6IFRlc3QgZm9yIEZJTEVOQU1FID09IE5VTEwuICBUaGlzCistCW1pZ2h0IG1hcmsgYSBzcGVjaWFsIGNvbmRpdGlvbi4KKy0KKy0JKiBmaW5kZG9tYWluLmMgKG1ha2VfZW50cnlfcmVjKTogRG9uJ3QgbWFrZSBpbGxlZ2FsIGVudHJ5IGFzIGRlY2lkZWQuCistCistCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBTdXBwcmVzcyBlcnJvciBtZXNzYWdlIHdoZW4gbG4gZmFpbGVkLgorLQlHZXQgZmlsZXMgZnJvbSAkKHNyY2RpcikgZXhwbGljaXRseS4KKy0KKy0JKiBsaWJnZXR0ZXh0LmggKGdldHRleHRfY29uc3QpOiBSZW5hbWUgdG8gZ2V0dGV4dF9ub29wLgorLQorLUZyaSBOb3YgIDMgMDc6MzY6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBmaW5kZG9tYWluLmMgKG1ha2VfZW50cnlfcmVjKToKKy0JUHJvdGVjdCBhZ2FpbnN0IHdyb25nIGxvY2FsZSBuYW1lcyBieSB0ZXN0aW5nIG1hc2suCistCistCSogbGliZ2V0dGV4dC5oIChnZXR0ZXh0X2NvbnN0KTogQWRkIG1hY3JvIGRlZmluaXRpb24uCistCUNhcGl0YWxpemUgbWFjcm8gYXJndW1lbnRzLgorLQorLVRodSBOb3YgIDIgMjM6MTU6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6CistCVRlc3QgZm9yIHBvaW50ZXIgIT0gTlVMTCBiZWZvcmUgYWNjZXNzaW5nIHZhbHVlLgorLQlSZXBvcnRlZCBieSBUb20gVHJvbWV5LgorLQorLQkqIGdldHRleHQuYyAoTlVMTCk6CistCURlZmluZSBhcyAodm9pZCopMCBpbnN0YWQgb2YgMC4gIFJlcG9ydGVkIGJ5IEZyYW5jLG9pcyBQaW5hcmQuCistCistTW9uIE9jdCAzMCAyMToyODo1MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIHBvMnRibC5zZWQuaW46IFNlcmlvdXMgdHlwbyBidWcgZml4ZWQgYnkgSmltIE1leWVyaW5nLgorLQorLVNhdCBPY3QgMjggMjM6MjA6NDcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBsaWJnZXR0ZXh0Lmg6IERpc2FibGUgZGNnZXR0ZXh0IG9wdGltaXphdGlvbiBmb3IgU29sYXJpcyAyLjMuCistCistCSogbG9jYWxlYWxpYXMuYyAoYWxpYXNfY29tcGFyZSk6CistCVBldGVyIE1pbGxlciByZXBvcnRlZCB0aGF0IHRvbG93ZXIgaW4gc29tZSBzeXN0ZW1zIGlzCistCWV2ZW4gZHVtYmVyIHRoYW4gSSB0aG91Z2h0LiAgUHJvdGVjdCBjYWxsIGJ5IGBpc3VwcGVyJy4KKy0KKy1GcmkgT2N0IDI3IDIyOjIyOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKGxpYmRpciwgaW5jbHVkZWRpcik6IE5ldyB2YXJpYWJsZXMuCistCShpbnN0YWxsLXNyYyk6IEluc3RhbGwgbGliaW50bC5hIGFuZCBsaWJpbnRsLmggaW4gY29ycmVjdCBkaXJzLgorLQorLUZyaSBPY3QgMjcgMjI6MDc6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoU09VUkNFUyk6IEZpeCB0eXBvOiBpbnRybC5jb21wYXQuYyAtPiBpbnRsLWNvbXBhdC5jLgorLQorLQkqIHBvMnRibC5zZWQuaW46IFBhdGNoIGZvciBidWdneSBTRURzIGJ5IENocmlzdGlhbiB2b24gUm9xdWVzLgorLQorLQkqIGxvY2FsZWFsaWFzLmM6CistCUZpeCB0eXBvIGFuZCBzdXBlcmZsb3VzIHRlc3QuICBSZXBvcnRlZCBieSBDaHJpc3RpYW4gdm9uIFJvcXVlcy4KKy0KKy1GcmkgT2N0ICA2IDExOjUyOjA1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgorLQlDb3JyZWN0IHNvbWUgcmVtYWluZGVyIGZyb20gdGhlIHByZS1DRU4gc3ludGF4LiAgTm93CistCXdlIGRvbid0IGhhdmUgYSBjb25zdGFudCBudW1iZXIgb2Ygc3VjY2Vzc29ycyBhbnltb3JlLgorLQorLVdlZCBTZXAgMjcgMjE6NDE6MTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogQWRkIGxpYmludGwuaC5nbGliYy4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoZGlzdC1saWJjKTogQWRkIGdvYWwgZm9yIHBhY2tpbmcgc291cmNlcyBmb3IgZ2xpYmMuCistCShDT01TUkNTLCBDT01IRFJTKTogU3BsaXR0ZWQgdG8gc2VwYXJhdGUgc291cmNlcyBzaGFyZWQgd2l0aCBnbGliYy4KKy0KKy0JKiBsb2FkbXNnY2F0LmM6IEZvcmdldCB0byBjb250aW51ZSAjaWYgbGluZS4KKy0KKy0JKiBsb2NhbGVhbGlhcy5jOgorLQlbX0xJQkNdOiBSZW5hbWUgc3RyY2FzZWNtcCB0byBfX3N0cmNhc2VjbXAgdG8ga2VlcCBBTlNJIEMgbmFtZQorLQlzcGFjZSBjbGVhbi4KKy0KKy0JKiBkY2dldHRleHQuYywgZmluZGRvbWFpbi5jOiBCZXR0ZXIgY29tbWVudCB0byBsYXN0IGNoYW5nZS4KKy0KKy0JKiBsb2FkbXNnY2F0LmM6CistCVtfTElCQ106IFJlbmFtZSBmc3RhdCwgb3BlbiwgY2xvc2UsIHJlYWQsIG1tYXAsIGFuZCBtdW5tYXAgdG8KKy0JX19mc3RhdCwgX19vcGVuLCBfX2Nsb3NlLCBfX3JlYWQsIF9fbW1hcCwgYW5kIF9fbXVubWFwIHJlc3AKKy0JdG8ga2VlcCBBTlNJIEMgbmFtZSBzcGFjZSBjbGVhbi4KKy0KKy0JKiBmaW5kZG9tYWluLmM6CistCVtfTElCQ106IFJlbmFtZSBzdHBjcHkgdG8gX19zdHBjcHkgdG8ga2VlcCBBTlNJIEMgbmFtZSBzcGFjZSBjbGVhbi4KKy0KKy0JKiBkY2dldHRleHQuYzoKKy0JW19MSUJDXTogUmVuYW1lIGdldGNlZCBhbmQgc3RwY3B5IHRvIF9fZ2V0Y3dkIGFuZCBfX3N0cGNweSByZXNwIHRvCistCWtlZXAgQU5TSSBDIG5hbWUgc3BhY2UgY2xlYW4uCistCistCSogbGliZ2V0dGV4dC5oOgorLQlJbmNsdWRlIHN5cy90eXBlcy5oIGZvciB0aG9zZSBvbGQgU3lzViBzeXN0ZW1zIG91dCB0aGVyZS4KKy0JUmVwb3J0ZWQgYnkgRnJhbmNlc2NvIFBvdG9ydGlgLgorLQorLQkqIGxvYWRtc2djYXQuYyAodXNlX21tYXApOiBEZWZpbmUgaWYgY29tcGlsZWQgZm9yIGdsaWJjLgorLQorLQkqIGJpbmR0ZXh0ZG9tLmM6IEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKKy0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCistCistCSogZmluZGRvbWFpbi5jOiBGaXggMiB0aW1lcyBkZWZpZW5kIC0+IGRlZmluZWQuCistCistCSogdGV4dGRvbWFpbi5jOiBJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuCistCWNvbXBpbGluZyBmb3IgZ2xpYmMuICBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCistCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgorLQorLQkqIGxvY2FsZWFsaWFzLmMsIGxvYWRtc2djYXQuYzogUHJlcGFyZSB0byBiZSBjb21waWxlZCBpbiBnbGliYy4KKy0KKy0JKiBnZXR0ZXh0LmM6CistCUluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KKy0JR2V0IE5VTEwgZnJvbSBzdGRkZWYuaCBpZiB3ZSBjb21waWxlIGZvciBnbGliYy4KKy0KKy0JKiBmaW5kZG9tYWluLmM6IEluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oIHdoZW4KKy0JY29tcGlsaW5nIGZvciBnbGliYy4gIEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKKy0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCistCistCSogZGNnZXR0ZXh0LmM6IEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMgdW5jb25kaXRpb25hbGx5CistCWlmIF9MSUJDIGlzIGRlZmluZWQuCistCistCSogZGdldHRleHQuYzogSWYgY29tcGlsZWQgaW4gZ2xpYmMgaW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZgorLQlsaWJnZXR0ZXh0LmguCistCShsb2NhbGUuaCk6IERvbid0IHJlbHkgb24gSEFWRV9MT0NBTEVfSCB3aGVuIGNvbXBpbGluZyBmb3IgZ2xpYmMuCistCistCSogZGNnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKKy0JbGliZ2V0dGV4dC5oLgorLQkoZ2V0Y3dkKTogRG9uJ3QgcmVseSBvbiBIQVZFX0dFVENXRCB3aGVuIGNvbXBpbGluZyBmb3IgZ2xpYmMuCistCistCSogYmluZHRleHRkb20uYzoKKy0JSWYgY29tcGlsZWQgaW4gZ2xpYmMgaW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0LmguCistCistTW9uIFNlcCAyNSAyMjoyMzowNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMpOiBEb24ndCBjYWxsIGJzZWFyY2ggaWYgTk1BUCA8PSAwLgorLQlSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KKy0KKy0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKKy0JU3RyaW5nIHVzZWQgaW4gcHV0ZW52IG11c3Qgbm90IGJlIHJlY3ljbGVkLgorLQlSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KKy0KKy0JKiBsaWJnZXR0ZXh0LmggKF9fVVNFX0dOVV9HRVRURVhUKToKKy0JQWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIEdOVSBnZXR0ZXh0CistCWxpYnJhcnkuCistCistCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6CistCUZpeCBidWcgd2l0aCB0aGUgc3RyYW5nZSBzdHBjcHkgcmVwbGFjZW1lbnQuCistCVJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KKy0KKy1TYXQgU2VwIDIzIDA4OjIzOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogY2F0LWNvbXBhdC5jOiBJbmNsdWRlIDxzdHJpbmcuaD4gZm9yIHN0cGNweSBwcm90b3R5cGUuCistCistCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKKy0JV2hpbGUgZXhwYW5kIHN0cmR1cCBjb2RlIHRlbXBvcmFyeSB2YXJpYWJsZSBgY3AnIGhpZGVkCistCWhpZ2hlciBsZXZlbCB2YXJpYWJsZSB3aXRoIHNhbWUgbmFtZS4gIFJlbmFtZSB0byBgdHAnLgorLQorLQkqIHRleHRkb21haW4uYyAodGV4dGRvbWFpbik6CistCUF2b2lkIHdhcm5pbmcgYnkgdXNpbmcgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIHN0cmR1cCBjb2RlLgorLQorLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgYXBwbGljYXRpb24nLgorLQorLVRodSBTZXAgMjEgMTU6NTE6NDQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKKy0JVXNlIHN0cmNhc2VjbXAoKSBvbmx5IGlmIGF2YWlsYWJsZS4gIEVsc2UgdXNlCistCWltcGxlbWVudGF0aW9uIGluIHBsYWNlLgorLQorLQkqIGludGwtY29tcGF0LmM6CistCVdyYXBwZXIgZnVuY3Rpb25zIG5vdyBjYWxsICpfXyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBfXyouCistCistCSogbGliZ2V0dGV4dC5oOiBEZWNsYXJlIHByb3RvdHlwZXMgZm9yICpfXyBmdW5jdGlvbnMgaW5zdGVhZCBmb3IgX18qLgorLQorLQkqIGNhdC1jb21wYXQuYywgbG9hZG1zZ2NhdC5jOgorLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKKy0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAorLQlzdGFuZGFsb25lLgorLQorLQkqIGJpbmR0ZXh0ZG9tLmM6CistCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAorLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCistCXN0YW5kYWxvbmUuCistCVJlbmFtZSB0byBiaW5kdGV4dGRvbWFpbl9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCistCistCSogZGdldHRleHQuYzoKKy0JUmVuYW1lIGZ1bmN0aW9uIHRvIGRnZXR0ZXh0X18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KKy0KKy0JKiBnZXR0ZXh0LmM6CistCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAorLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCistCXN0YW5kYWxvbmUuCistCUZ1bmN0aW9ucyBub3cgY2FsbGVkIGdldHRleHRfXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgorLQorLQkqIGRjZ2V0dGV4dC5jLCBsb2NhbGVhbGlhcy5jLCB0ZXh0ZG9tYWluLmMsIGZpbmRkb21haW4uYzoKKy0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0CistCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKKy0Jc3RhbmRhbG9uZS4KKy0KKy1TdW4gU2VwIDE3IDIzOjE0OjQ5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZmluZGRvbWFpbi5jOiBDb3JyZWN0IHNvbWUgYnVncyBpbiBoYW5kbGluZyBvZiBDRU4gc3RhbmRhcmQKKy0gCWxvY2FsZSBkZWZpbml0aW9ucy4KKy0KKy1UaHUgU2VwICA3IDAxOjQ5OjI4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZmluZGRvbWFpbi5jOiBJbXBsZW1lbnQgQ0VOIHN5bnRheC4KKy0KKy0JKiBnZXR0ZXh0UC5oIChsb2FkZWRfZG9tYWluKTogRXh0ZW5kIG51bWJlciBvZiBzdWNjZXNzb3JzIHRvIDMxLgorLQorLVNhdCBBdWcgMTkgMTk6MjU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoYWxpYXNwYXRoKTogUmVtb3ZlIHBhdGggdG8gWDExIGxvY2FsZSBkaXIuCistCistCSogTWFrZWZpbGUuaW46IE1ha2UgaW5zdGFsbC1zcmMgZGVwZW5kIG9uIGluc3RhbGwuICBUaGlzIGhlbHBzCistIAlnZXR0ZXh0IHRvIGluc3RhbGwgdGhlIHNvdXJjZXMgYW5kIG90aGVyIHBhY2thZ2VzIGNhbiB1c2UgdGhlCistIAlpbnN0YWxsIGdvYWwuCistCistU2F0IEF1ZyAxOSAxNToxOTozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIE1ha2VmaWxlLmluICh1bmluc3RhbGwpOiBSZW1vdmUgc3R1ZmYgaW5zdGFsbGVkIGJ5IGluc3RhbGwtc3JjLgorLQorLVR1ZSBBdWcgMTUgMTM6MTM6NTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBWRVJTSU9OLmluOiBJbml0aWFsIHJldmlzaW9uLgorLQorLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOgorLQlBZGQgVkVSU0lPTiBmaWxlLiAgVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGZvciBnZXR0ZXh0LCBidXQKKy0JZm9yIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoaXMgbGlicmFyeS4KKy0KKy1UdWUgQXVnIDE1IDA2OjE2OjQ0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZ2V0dGV4dFAuaCAoX25sX2ZpbmRfZG9tYWluKToKKy0JTmV3IHByb3RvdHlwZSBhZnRlciBjaGFuZ2luZyBzZWFyY2ggc3RyYXRlZ3kuCistCistCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgorLQlXZSBub3cgdHJ5IG9ubHkgdG8gZmluZCBhIHNwZWNpZmllZCBjYXRhbG9nLiAgRmFsbCBiYWNrIHRvIG90aGVyCistCWNhdGFsb2dzIGxpc3RlZCBpbiB0aGUgbG9jYWxlIGxpc3QgaXMgbm93IGRvbmUgaW4gX19kY2dldHRleHQuCistCistCSogZGNnZXR0ZXh0LmMgKF9fZGNnZXR0ZXh0KToKKy0JTm93IHdlIHByb3ZpZGUgbWVzc2FnZSBmYWxsIGJhY2sgZXZlbiB0byBkaWZmZXJlbnQgbGFuZ3VhZ2VzLgorLQlJLmUuIGlmIGEgbWVzc2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIG9uZSBsYW5ndWFnZSBhbGwgdGhlIG90aGVyCistIAlpbiB0aGUgbG9jYWxlIGxpc3QgYSB0cmllZC4gIEZvcm1lcmx5IGZhbGwgYmFjayB3YXMgb25seSBwb3NzaWJsZQorLSAJd2l0aGluIG9uZSBsYW5ndWFnZS4gIEltcGxlbWVudGVkIGJ5IG1vdmluZyBvbmUgbG9vcCBmcm9tCistIAlfbmxfZmluZF9kb21haW4gdG8gaGVyZS4KKy0KKy1Nb24gQXVnIDE0IDIzOjQ1OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOgorLQlEaXJlY3Rvcnkgd2hlcmUgc291cmNlIG9mIEdOVSBnZXR0ZXh0IGxpYnJhcnkgYXJlIG1hZGUKKy0JYXZhaWxhYmxlLgorLQkoSU5TVEFMTCwgSU5TVEFMTF9EQVRBKTogUHJvZ3JhbXMgdXNlZCBmb3IgaW5zdGFsbGluZyBzb3VyY2VzLgorLQkoZ2V0dGV4dC1zcmMpOiBOZXcuICBSdWxlIHRvIGluc3RhbGwgR05VIGdldHRleHQgc291cmNlcyBmb3IgdXNlIGluCistCWdldHRleHRpemUgc2hlbGwgc2NyaXB0LgorLQorLVN1biBBdWcgMTMgMTQ6NDA6NDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6CistCVVzZSBtbWFwIGZvciBsb2FkaW5nIG9ubHkgd2hlbiBtdW5tYXAgZnVuY3Rpb24gaXMKKy0JYWxzbyBhdmFpbGFibGUuCistCistCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgb24gYGFsbCcgZ29hbC4KKy0KKy1XZWQgQXVnICA5IDExOjA0OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKKy0JRG8gbm90IG92ZXJ3cml0ZSAnXG4nIHdoZW4gdGVybWluYXRpbmcgYWxpYXMgdmFsdWUgc3RyaW5nLgorLQorLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6CistCUhhbmRsZSBsb25nIGxpbmVzLiAgSWdub3JlIHRoZSByZXN0IG5vdCBmaXR0aW5nIGluCistCXRoZSBidWZmZXIgYWZ0ZXIgdGhlIGluaXRpYWwgYGZnZXRzJyBjYWxsLgorLQorLVdlZCBBdWcgIDkgMDA6NTQ6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBnZXR0ZXh0UC5oIChfbmxfbG9hZF9kb21haW4pOgorLQlBZGQgcHJvdG90eXBlLCByZXBsYWNpbmcgcHJvdG90eXBlIGZvciBfbmxfbG9hZF9tc2dfY2F0LgorLQorLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKKy0JUmVtb3ZlIHVubmVlZGVkIHZhcmlhYmxlIGZpbGVuYW1lIGFuZCBmaWxlbmFtZV9sZW4uCistCShleHBhbmRfYWxpYXMpOiBSZW1vdmUgcHJvdG90eXBlIGJlY2F1c2UgZnVuY3Rpb25zIGRvZXMgbm90CistIAlleGlzdCBhbnltb3JlLgorLQorLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6CistCUNoYW5nZSB0eXBlIG9mIGZuYW1lX2xlbiBwYXJhbWV0ZXIgdG8gaW50LgorLQkoeG1hbGxvYyk6IEFkZCBwcm90b3R5cGUuCistCistCSogbG9hZG1zZ2NhdC5jOiBCZXR0ZXIgcHJvdG90eXBlcyBmb3IgeG1hbGxvYy4KKy0KKy1UdWUgQXVnICA4IDIyOjMwOjM5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgorLQlBbGxvdyBhbGlhcyBuYW1lIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGZvdXIgY29tcG9uZW50cy4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoYWxpYXNwYXRoKTogTmV3IHZhcmlhYmxlLiAgU2V0IHRvIHByZWxpbWluYXJ5IHZhbHVlLgorLQkoU09VUkNFUyk6IEFkZCBsb2NhbGVhbGlhcy5jLgorLQkoT0JKRUNUUyk6IEFkZCBsb2NhbGVhbGlhcy5vLgorLQorLQkqIGdldHRleHRQLmg6IEFkZCBwcm90b3R5cGUgZm9yIF9ubF9leHBhbmRfYWxpYXMuCistCistCSogZmluZGRvbWFpbi5jOiBBbGlhc2luZyBoYW5kbGVkIGluIGludGwvbG9jYWxlYWxpYXMuYy4KKy0KKy0JKiBsb2NhbGVhbGlhcy5jOiBBbGlhc2luZyBmb3IgbG9jYWxlIG5hbWVzLgorLQorLQkqIGJpbmR0ZXh0ZG9tLmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jIGFuZCB4c3RyZHVwLgorLQorLU1vbiBBdWcgIDcgMjM6NDc6NDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogZ2V0dGV4dC5wZXJsIGlzIG5vdyBmb3VuZCBpbiBtaXNjLy4KKy0KKy0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKKy0JQ29ycmVjdCBpbXBsZW1lbnRhdGlvbi4gIGRpcm5hbWUgcGFyYW1ldGVyIHdhcyBub3QgdXNlZC4KKy0JUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCistCistCSogZ2V0dGV4dFAuaCAobG9hZGVkX2RvbWFpbik6CistCU5ldyBmaWVsZHMgYHN1Y2Nlc3NvcicgYW5kIGBkZWNpZGVkJyBmb3Igb28sIGxhenkKKy0JbWVzc2FnZSBoYW5kbGluZyBpbXBsZW1lbnRhdGlvbi4KKy0KKy0JKiBkY2dldHRleHQuYzoKKy0JQWRvcHQgZm9yIG9vLCBsYXp5IG1lc3NhZ2UgaGFuZGxpaW5nLgorLSAgCU5vdyB3ZSBjYW4gaW5oZXJpdCB0cmFuc2xhdGlvbnMgZnJvbSBsZXNzIHNwZWNpZmljIGxvY2FsZXMuCistCShmaW5kX21zZyk6IE5ldyBmdW5jdGlvbi4KKy0KKy0JKiBsb2FkbXNnY2F0LmMsIGZpbmRkb21haW4uYzoKKy0JQ29tcGxldGUgcmV3cml0ZS4gIEltcGxlbWVudCBvbywgbGF6eSBtZXNzYWdlIGhhbmRsaW5nIDotKS4KKy0gIAlXZSBub3cgaGF2ZSBhbiBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlIGBMQU5HVUFHRScgd2l0aAorLSAJYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBMQ19BTEwgZm9yIHRoZSBMQ19NRVNTQUdFIGxvY2FsZS4KKy0gIAlIZXJlIHdlIGNhbiBzZXQgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBzcGVjaWZpY2F0aW9ucyBlYWNoCistIAlvZiB0aGUgZm9ybSBgbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0nLgorLQorLVNhdCBBdWcgIDUgMDk6NTU6NDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBmaW5kZG9tYWluLmMgKHVuaXN0ZC5oKToKKy0JSW5jbHVkZSB0byBnZXQgX1BDX1BBVEhfTUFYIGRlZmluZWQgb24gc3lzdGVtIGhhdmluZyBpdC4KKy0KKy1GcmkgQXVnICA0IDIyOjQyOjAwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOiBJbmNsdWRlIHByb3RvdHlwZS4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IFJlbW92ZSBgY29weWluZyBpbnN0ZWFkJyBtZXNzYWdlLgorLQorLVdlZCBBdWcgIDIgMTg6NTI6MDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoSUQsIFRBR1MpOiBEbyBub3QgdXNlICReLgorLQorLVR1ZSBBdWcgIDEgMjA6MDc6MTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoVEFHUywgSUQpOiBVc2UgJF4gYXMgY29tbWFuZCBhcmd1bWVudC4KKy0JKFRBR1MpOiBHaXZlIGV0YWdzIC1vIG9wdGlvbiB0IHdyaXRlIHRvIGN1cnJlbnQgZGlyZWN0b3J5LAorLSAJbm90ICQoc3JjZGlyKS4KKy0JKElEKTogVXNlICQoc3JjZGlyKSBpbnN0ZWFkIG9zICQodG9wX3NyY2Rpcikvc3JjLgorLQkoZGlzdGNsZWFuKTogUmVtb3ZlIElELgorLQorLVN1biBKdWwgMzAgMTE6NTE6NDYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoZ251bG9jYWxlZGlyKToKKy0JTmV3IHZhcmlhYmxlLCBhbHdheXMgdXNpbmcgc2hhcmUvIGZvciBkYXRhIGRpcmVjdG9yeS4KKy0JKERFRlMpOiBBZGQgR05VTE9DQUxFRElSLCB1c2VkIGluIGZpbmRkb21haW4uYy4KKy0KKy0JKiBmaW5kZG9tYWluLmMgKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOgorLQlTZXQgdG8gR05VTE9DQUxFRElSLCBiZWNhdXNlIGl0IGFsd2F5cyBoYXMgdG8gcG9pbnQKKy0JdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBHTlUgZ2V0dGV4dCBMaWJyYXJ5IHdyaXRlcyBpdCB0by4KKy0KKy0JKiBpbnRsLWNvbXBhdC5jICh0ZXh0ZG9tYWluLCBiaW5kdGV4dGRvbWFpbik6CistCVVuZGVmaW5lIG1hY3JvcyBiZWZvcmUgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKy0KKy1TYXQgSnVsIDIyIDAxOjEwOjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogbGliZ2V0dGV4dC5oIChfTElCSU5UTF9IKToKKy0JUHJvdGVjdCBkZWZpbml0aW9uIGluIGNhc2Ugd2hlcmUgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGFzCistCWxpYmdldHRleHQuaCBvbiBTb2xhcmlzIG1hY2hpbmVzLiAgQWRkIGNvbW1lbnQgYWJvdXQgdGhpcy4KKy0KKy1XZWQgSnVsIDE5IDAyOjM2OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogaW50bC1jb21wYXQuYyAodGV4dGRvbWFpbik6IENvcnJlY3QgdHlwby4KKy0KKy1XZWQgSnVsIDE5IDAxOjUxOjM1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogZGNnZXR0ZXh0LmMgKGRjZ2V0dGV4dCk6IEZ1bmN0aW9uIG5vdyBjYWxsZWQgX19kY2dldHRleHQuCistCistCSogZGdldHRleHQuYyAoZGdldHRleHQpOiBOb3cgY2FsbGVkIF9fZGdldHRleHQgYW5kIGNhbGxzCistIAlfX2RjZ2V0dGV4dC4KKy0KKy0JKiBnZXR0ZXh0LmMgKGdldHRleHQpOgorLQlGdW5jdGlvbiBub3cgY2FsbGVkIF9fZ2V0dGV4dCBhbmQgY2FsbHMgX19kZ2V0dGV4dC4KKy0KKy0JKiB0ZXh0ZG9tYWluLmMgKHRleHRkb21haW4pOiBGdW5jdGlvbiBub3cgY2FsbGVkIF9fdGV4dGRvbWFpbi4KKy0KKy0JKiBiaW5kdGV4dGRvbS5jIChiaW5kdGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQKKy0gCV9fYmluZHRleHRkb21haW4uCistCistCSogaW50bC1jb21wYXQuYzogSW5pdGlhbCByZXZpc2lvbi4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoU09VUkNFUyk6IEFkZCBpbnRsLWNvbXBhdC5jLgorLQkoT0JKRUNUUyk6IFdlIGFsd2F5cyBjb21waWxlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGZ1bmN0aW9ucy4KKy0gIAlPQkpFQ1RTIGNvbnRhaW5zIGFsbCBvYmplY3RzIGJ1dCBjYXQtY29tcGF0Lm8sIC4uL3BvL2NhdC1pZi10YmwubywKKy0gCWFuZCBpbnRsLWNvbXBhdC5vLgorLSAgCShHRVRUT0JKUyk6IENvbnRhaW5zIG5vdyBvbmx5IGludGwtY29tcGF0Lm8uCistCistCSogbGliZ2V0dGV4dC5oOgorLQlSZS1pbmNsdWRlIHByb3RlY3Rpb24gbWF0Y2hlcyBkdWFsaXN0aWMgY2hhcmFjdGVyIG9mIGxpYmdldHRleHQuaC4KKy0JRm9yIGFsbCBmdW5jdGlvbnMgaW4gR05VIGdldHRleHQgbGlicmFyeSBkZWZpbmUgX18gY291bnRlciBwYXJ0LgorLQorLQkqIGZpbmRkb21haW4uYyAoc3RyY2hyKTogRGVmaW5lIGFzIGluZGV4IGlmIG5vdCBmb3VuZCBpbiBDIGxpYnJhcnkuCistCShfbmxfZmluZF9kb21haW4pOiBGb3IgcmVsYXRpdmUgcGF0aHMgcGFzdGUgLyBpbiBiZXR3ZWVuLgorLQorLVR1ZSBKdWwgMTggMTY6Mzc6NDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBsb2FkbXNnY2F0LmMsIGZpbmRkb21haW4uYzogQWRkIGluY2x1c2lvbiBvZiBzeXMvdHlwZXMuaC4KKy0KKy0JKiB4b3Blbi1tc2cuc2VkOiBGaXggYnVnIHdpdGggYG1zZ3N0ciAiIicgbGluZXMuCistCUEgbGl0dGxlIGJpdCBiZXR0ZXIgY29tbWVudHMuCistCistVHVlIEp1bCAxOCAwMToxODoyNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIE1ha2VmaWxlLmluOgorLQlwby1tb2RlLmVsLCBtYWtlbGlua3MsIGNvbWJpbmUtc2ggYXJlIG5vdyBmb3VuZCBpbiAuLi9taXNjLgorLQorLQkqIHBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCwgZWxpc3AtY29tcDoKKy0JTW92ZWQgdG8gLi4vbWlzYy8uCistCistCSogbGliZ2V0dGV4dC5oLCBnZXR0ZXh0UC5oLCBnZXR0ZXh0Lmg6IFVuaWZvcm0gdGVzdCBmb3IgX19TVERDX18uCistCistU3VuIEp1bCAxNiAyMjozMzowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMLCBJTlNUQUxMX0RBVEEpOiBOZXcgdmFyaWFibGVzLgorLQkoaW5zdGFsbC1kYXRhLCB1bmluc3RhbGwpOiBJbnN0YWxsL3VuaW5zdGFsbCAuZWxjIGZpbGUuCistCistCSogcG8tbW9kZS5lbCAoSW5zdGFsbGF0aW9uIGNvbW1lbnQpOgorLQlBZGQgLnBveCBhcyBwb3NzaWJsZSBleHRlbnNpb24gb2YgLnBvIGZpbGVzLgorLQorLVN1biBKdWwgMTYgMTM6MjM6MjcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBlbGlzcC1jb21wOiBDb21wbGV0ZSBuZXcgdmVyc2lvbiBieSBGcmFuYyxvaXM6IFRoaXMgZG9lcyBub3QKKy0gCWZhaWwgd2hlbiBub3QgY29tcGlsaW5nIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorLQorLVN1biBKdWwgMTYgMDA6MTI6MTcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoLi4vcG8vY2F0LWlkLXRibC5vKToKKy0JVXNlICQoTUFLRSkgaW5zdGVhZCBvZiBtYWtlIGZvciByZWN1cnNpdmUgbWFrZS4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoLmVsLmVsYyk6IFVzZSAkKFNIRUxMKSBpbnN0ZWFkIG9mIC9iaW4vc2guCistCShpbnN0YWxsLWV4ZWMpOiBBZGQgbWlzc2luZyBkdW1teSBnb2FsLgorLQkoaW5zdGFsbC1kYXRhLCB1bmluc3RhbGwpOiBAIGluIG11bHRpLWxpbmUgc2hlbGwgY29tbWFuZCBhdAorLSAJYmVnaW5uaW5nLCBub3QgaW4gZnJvbnQgb2YgZWNoby4gIFJlcG9ydGVkIGJ5IEVyaWMgQmFja3VzLgorLQorLVNhdCBKdWwgMTUgMDA6MjE6MjggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKToKKy0JUmVuYW1lIGxpYmdldHRleHQucGVybCB0byBnZXR0ZXh0LnBlcmwgdG8gZml0IGluIDE0IGNoYXJzCistCWZpbGUgc3lzdGVtcy4KKy0KKy0JKiBnZXR0ZXh0LnBlcmw6CistIAlSZW5hbWUgdG8gZ2V0dGV4dC5wZXJsIHRvIGZpdCBpbiAxNCBjaGFycyBmaWxlIHN5c3RlbXMuCistCistVGh1IEp1bCAxMyAyMzoxNzoyMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIGNhdC1jb21wYXQuYzogSWYgIVNURENfSEVBREVSUyB0cnkgdG8gaW5jbHVkZSBtYWxsb2MuaC4KKy0KKy1UaHUgSnVsIDEzIDIwOjU1OjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogcG8ydGJsLnNlZC5pbjogUHJldHR5IHByaW50aW5nLgorLQorLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6CistCUNvcnJlY3QgYnVncyB3aXRoIGhhbmRsaW5nIHN1YnN0aXR1dGUgZmxhZ3MgaW4gYnJhbmNoZXMuCistCistCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOgorLQlPbGQgSyZSIGNvbXBpbGVycyBkb24ndCB1bmRlciBzdGFuZCBgdW5zaWduZWQgY2hhcicuCistCistCSogZ2V0dGV4dC5oIChubHNfdWludDMyKToKKy0JU29tZSBvbGQgSyZSIGNvbXBpbGVycyAoZWcgSFApIGRvbid0IHVuZGVyc3RhbmQgYHVuc2lnbmVkIGludCcuCistCistCSogY2F0LWNvbXBhdC5jIChtc2dfdG9fY2F0X2lkKTogRGUtQU5TSS1meSBwcm90b3R5cGVzLgorLQorLVRodSBKdWwgMTMgMDE6MzQ6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiBNYWtlZmlsZS5pbiAoRUxDRklMRVMpOiBOZXcgdmFyaWFibGUuCistCShESVNURklMRVMpOiBBZGQgZWxpc3AtY29tcC4KKy0JQWRkIGltcGxpY2l0IHJ1bGUgZm9yIC5lbCAtPiAuZWxjIGNvbXBpbGF0aW9uLgorLQkoaW5zdGFsbC1kYXRhKTogaW5zdGFsbCAkRUxDRklMRVMKKy0JKGNsZWFuKTogcmVuYW1lZCBwby10by10YmwgYW5kIHBvLXRvLW1zZyB0byBwbzJ0YmwgYW5kIHBvMm1zZyByZXNwLgorLQorLQkqIGVsaXNwLWNvbXA6IEluaXRpYWwgcmV2aXNpb24KKy0KKy1XZWQgSnVsIDEyIDE2OjE0OjUyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW46CistCWNhdC1pZC10YmwuYyBpcyBub3cgZm91bmQgaW4gcG8vLiAgVGhpcyBlbmFibGVzIHVzIHRvIHVzZSBhbiBpZGVudGljYWwKKy0JaW50bC8gZGlyZWN0b3J5IGluIGFsbCBwYWNrYWdlcy4KKy0KKy0JKiBkY2dldHRleHQuYyAoZGNnZXR0ZXh0KTogaGFzaGluZyBkb2VzIG5vdCB3b3JrIGZvciB0YWJsZSBzaXplIDw9IDIuCistCistCSogdGV4dGRvbWFpbi5jOiBmaXggdHlwbyAoI2lmIGRlZiAtPiAjaWYgZGVmaW5lZCkKKy0KKy1UdWUgSnVsIDExIDE4OjQ0OjQzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW4gKHN0YW1wLWNhdC1pZCk6IHVzZSB0b3Bfc3JjZGlyIHRvIGFkZHJlc3Mgc291cmNlIGZpbGVzCistCShESVNURklMRVMsZGlzdGNsZWFuKTogbW92ZSB0dXBkYXRlLnBlcmwgdG8gc3JjLworLQorLQkqIHBvLXRvLXRibC5zZWQuaW46CistCWFkZCBhZGRpdGlvbmFsIGp1bXAgdG8gY2xlYXIgY2hhbmdlIGZsYWcgdG8gcmVjb2duaXplIG11bHRpbGluZSBzdHJpbmdzCistCistVHVlIEp1bCAxMSAwMTozMjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIHRleHRkb21haW4uYzogUHJvdGVjdCBpbmNsdXNpb24gb2Ygc3RkbGliLmggYW5kIHN0cmluZy5oLgorLQorLQkqIGxvYWRtc2djYXQuYzogUHJvdGVjdCBpbmNsdXNpb24gb2Ygc3RkbGliLmguCistCistCSogbGliZ2V0dGV4dC5oOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBsb2NhbGUuaC4KKy0JQWxsb3cgdXNlIGluIEMrKyBwcm9ncmFtcy4KKy0JRGVmaW5lIE5VTEwgaXMgbm90IGhhcHBlbmVkIGFscmVhZHkuCistCistCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IHNoaXAgcG8tdG8tdGJsLnNlZC5pbiBpbnN0ZWFkIG9mCistCXBvLXRvLXRibC5zZWQuCistCShkaXN0Y2xlYW4pOiByZW1vdmUgcG8tdG8tdGJsLnNlZCBhbmQgdHVwZGF0ZS5wZXJsLgorLQorLQkqIHR1cGRhdGUucGVybC5pbjogU3Vic3RpdHV0ZSBQZXJsIHBhdGggZXZlbiBpbiBleGVjIGxpbmUuCistCURvbid0IGluY2x1ZGUgZW50cmllcyB3aXRob3V0IHRyYW5zbGF0aW9uIGZyb20gb2xkIC5wbyBmaWxlLgorLQorLVR1ZSBKdWwgIDQgMDA6NDE6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKy0KKy0JKiB0dXBkYXRlLnBlcmwuaW46IHVzZSAiVXBkYXRlZDogIiBpbiBtc2dpZCAiIi4KKy0KKy0JKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvIChMT0NBTERJUiAtPiBMT0NBTEVESVIpLgorLSAJRGVmaW5lIGdldGVudiBpZiAhX19TVERDX18uCistCistCSogYmluZHRleHRkb20uYzogUHJvdGVjdCBzdGRsaWIuaCBhbmQgc3RyaW5nLmggaW5jbHVzaW9uLgorLSAJRGVmaW5lIGZyZWUgaWYgIV9fU1REQ19fLgorLQorLQkqIGZpbmRkb21haW4uYzogQ2hhbmdlIERFRl9NU0dfRE9NX0RJUiB0byBMT0NBTEVESVIuCistIAlEZWZpbmUgZnJlZSBpZiAhX19TVERDX18uCistCistCSogY2F0LWNvbXBhdC5jOiBDaGFuZ2UgREVGX01TR19ET01fRElSIHRvIExPQ0FMRURJUi4KKy0KKy1Nb24gSnVsICAzIDIzOjU2OjMwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CistCistCSogTWFrZWZpbGUuaW46IFVzZSBMT0NBTEVESVIgaW5zdGVhZCBvZiBERUZfTVNHX0RPTV9ESVIuCistCVJlbW92ZSB1bm5lZWRlZCAkKHNyY2RpcikgZnJvbSBNYWtlZmlsZS5pbiBkZXBlbmRlbmN5LgorLQorLQkqIG1ha2VsaW5rczogQWRkIGNvcHlyaWdodCBhbmQgc2hvcnQgZGVzY3JpcHRpb24uCistCistCSogcG8tbW9kZS5lbDogTGFzdCB2ZXJzaW9uIGZvciAwLjcuCistCistCSogdHVwZGF0ZS5wZXJsLmluOiBGaXggZGllIG1lc3NhZ2UuCistCistCSogZGNnZXR0ZXh0LmM6IFByb3RlY3QgaW5jbHVkZSBvZiBzdHJpbmcuaC4KKy0KKy0JKiBnZXR0ZXh0LmM6IFByb3RlY3QgaW5jbHVkZSBvZiBzdGRsaWIuaCBhbmQgZnVydGhlciB0cmllcyB0byBnZXQgTlVMTC4KKy0KKy0JKiBmaW5kZG9tYWluLmM6IFNvbWUgY29ycmVjdGlvbnMgaW4gaW5jbHVkZXMuCistCistCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogUHJ1bmUgbGlzdCBjb3JyZWN0IHBhdGggdG8gTWFrZWZpbGUuaW4uCistCistCSogcG8tdG8tdGJsLnNlZDogQWRvcHQgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCistCistCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDogQWRvcHQgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCistCistU3VuIEp1bCAgMiAyMzo1NTowMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorLQorLQkqIHR1cGRhdGUucGVybC5pbjogQ29tcGxldGUgcmV3cml0ZSBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KKysyMDA0LTAxLTI5ICBHTlUgIDxidWctZ251LWdldHRleHRAZ251Lm9yZz4KKyAKKy1TdW4gSnVsICAyIDAyOjA2OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisrCSogVmVyc2lvbiAwLjE0LjEgcmVsZWFzZWQuCisgCistCSogRmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZS4gIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGFsbCB0aGUgY29kZQorLQluZWVkZWQgdG8gaW50ZXJuYXRpb25hbGl6ZSBvd24gcGFja2FnZXMuICBJdCBwcm92aWRlcyBmdW5jdGlvbnMKKy0Jd2hpY2ggYWxsb3cgdG8gdXNlIHRoZSBYL09wZW4gY2F0Z2V0cyBmdW5jdGlvbiB3aXRoIGFuIGludGVyZmFjZQorLQlsaWtlIHRoZSBVbmlmb3J1bSBnZXR0ZXh0IGZ1bmN0aW9uLiAgRm9yIHN5c3RlbSB3aGljaCBkb2VzIG5vdAorLQloYXZlIG5laXRoZXIgb2YgdGhvc2UgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZC4KKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9jb25maWcuY2hhcnNldAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9jb25maWcuY2hhcnNldAkyMDA0LTA5LTEyIDE0OjQwOjM0LjM1NDc0ODI0MCAtMDQwMAorQEAgLTAsMCArMSw2MDggQEAKKysjISAvYmluL3NoCisrIyBPdXRwdXQgYSBzeXN0ZW0gZGVwZW5kZW50IHRhYmxlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbGlhc2VzLgorKyMKKysjICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrIworKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysjICAgYW55IGxhdGVyIHZlcnNpb24uCisrIworKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysjICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrIworKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyMgICBVU0EuCisrIworKyMgVGhlIHRhYmxlIGNvbnNpc3RzIG9mIGxpbmVzIG9mIHRoZSBmb3JtCisrIyAgICBBTElBUyAgQ0FOT05JQ0FMCisrIworKyMgQUxJQVMgaXMgdGhlIChzeXN0ZW0gZGVwZW5kZW50KSByZXN1bHQgb2YgIm5sX2xhbmdpbmZvIChDT0RFU0VUKSIuCisrIyBBTElBUyBpcyBjb21wYXJlZCBpbiBhIGNhc2Ugc2Vuc2l0aXZlIHdheS4KKysjCisrIyBDQU5PTklDQUwgaXMgdGhlIEdOVSBjYW5vbmljYWwgbmFtZSBmb3IgdGhpcyBjaGFyYWN0ZXIgZW5jb2RpbmcuCisrIyBJdCBtdXN0IGJlIGFuIGVuY29kaW5nIHN1cHBvcnRlZCBieSBsaWJpY29udi4gU3VwcG9ydCBieSBHTlUgbGliYyBpcworKyMgYWxzbyBkZXNpcmFibGUuIENBTk9OSUNBTCBpcyBjYXNlIGluc2Vuc2l0aXZlLiBVc3VhbGx5IGFuIHVwcGVyIGNhc2UKKysjIE1JTUUgY2hhcnNldCBuYW1lIGlzIHByZWZlcnJlZC4KKysjIFRoZSBjdXJyZW50IGxpc3Qgb2YgR05VIGNhbm9uaWNhbCBjaGFyc2V0IG5hbWVzIGlzIGFzIGZvbGxvd3MuCisrIworKyMgICAgICAgbmFtZSAgICAgICAgICAgICAgTUlNRT8gICAgICAgICAgICAgdXNlZCBieSB3aGljaCBzeXN0ZW1zCisrIyAgIEFTQ0lJLCBBTlNJX1gzLjQtMTk2OCAgICAgICBnbGliYyBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisrIyAgIElTTy04ODU5LTEgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisrIyAgIElTTy04ODU5LTIgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisrIyAgIElTTy04ODU5LTMgICAgICAgICAgICAgIFkgICBnbGliYyBzb2xhcmlzCisrIyAgIElTTy04ODU5LTQgICAgICAgICAgICAgIFkgICBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorKyMgICBJU08tODg1OS01ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorKyMgICBJU08tODg1OS02ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggc29sYXJpcworKyMgICBJU08tODg1OS03ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcworKyMgICBJU08tODg1OS04ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKKysjICAgSVNPLTg4NTktOSAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMKKysjICAgSVNPLTg4NTktMTMgICAgICAgICAgICAgICAgIGdsaWJjCisrIyAgIElTTy04ODU5LTE0ICAgICAgICAgICAgICAgICBnbGliYworKyMgICBJU08tODg1OS0xNSAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IG9zZiBzb2xhcmlzIGZyZWVic2QKKysjICAgS09JOC1SICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKysjICAgS09JOC1VICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGZyZWVic2QgZGFyd2luCisrIyAgIEtPSTgtVCAgICAgICAgICAgICAgICAgICAgICBnbGliYworKyMgICBDUDQzNyAgICAgICAgICAgICAgICAgICAgICAgZG9zCisrIyAgIENQNzc1ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKysjICAgQ1A4NTAgICAgICAgICAgICAgICAgICAgICAgIGFpeCBvc2YgZG9zCisrIyAgIENQODUyICAgICAgICAgICAgICAgICAgICAgICBkb3MKKysjICAgQ1A4NTUgICAgICAgICAgICAgICAgICAgICAgIGRvcworKyMgICBDUDg1NiAgICAgICAgICAgICAgICAgICAgICAgYWl4CisrIyAgIENQODU3ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKysjICAgQ1A4NjEgICAgICAgICAgICAgICAgICAgICAgIGRvcworKyMgICBDUDg2MiAgICAgICAgICAgICAgICAgICAgICAgZG9zCisrIyAgIENQODY0ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKysjICAgQ1A4NjUgICAgICAgICAgICAgICAgICAgICAgIGRvcworKyMgICBDUDg2NiAgICAgICAgICAgICAgICAgICAgICAgZnJlZWJzZCBkYXJ3aW4gZG9zCisrIyAgIENQODY5ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKysjICAgQ1A4NzQgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcworKyMgICBDUDkyMiAgICAgICAgICAgICAgICAgICAgICAgYWl4CisrIyAgIENQOTMyICAgICAgICAgICAgICAgICAgICAgICBhaXggd29lMzIgZG9zCisrIyAgIENQOTQzICAgICAgICAgICAgICAgICAgICAgICBhaXgKKysjICAgQ1A5NDkgICAgICAgICAgICAgICAgICAgICAgIG9zZiB3b2UzMiBkb3MKKysjICAgQ1A5NTAgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcworKyMgICBDUDEwNDYgICAgICAgICAgICAgICAgICAgICAgYWl4CisrIyAgIENQMTEyNCAgICAgICAgICAgICAgICAgICAgICBhaXgKKysjICAgQ1AxMTI1ICAgICAgICAgICAgICAgICAgICAgIGRvcworKyMgICBDUDExMjkgICAgICAgICAgICAgICAgICAgICAgYWl4CisrIyAgIENQMTI1MCAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorKyMgICBDUDEyNTEgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcyBkYXJ3aW4gd29lMzIKKysjICAgQ1AxMjUyICAgICAgICAgICAgICAgICAgICAgIGFpeCB3b2UzMgorKyMgICBDUDEyNTMgICAgICAgICAgICAgICAgICAgICAgd29lMzIKKysjICAgQ1AxMjU0ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisrIyAgIENQMTI1NSAgICAgICAgICAgICAgICAgICAgICBnbGliYyB3b2UzMgorKyMgICBDUDEyNTYgICAgICAgICAgICAgICAgICAgICAgd29lMzIKKysjICAgQ1AxMjU3ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisrIyAgIEdCMjMxMiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKysjICAgRVVDLUpQICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKysjICAgRVVDLUtSICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKysjICAgRVVDLVRXICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMKKysjICAgQklHNSAgICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisrIyAgIEJJRzUtSEtTQ1MgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzCisrIyAgIEdCSyAgICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgd29lMzIgZG9zCisrIyAgIEdCMTgwMzAgICAgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzCisrIyAgIFNISUZUX0pJUyAgICAgICAgICAgICAgIFkgICBocHV4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisrIyAgIEpPSEFCICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzIHdvZTMyCisrIyAgIFRJUy02MjAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcworKyMgICBWSVNDSUkgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMKKysjICAgVENWTjU3MTItMSAgICAgICAgICAgICAgICAgIGdsaWJjCisrIyAgIEdFT1JHSUFOLVBTICAgICAgICAgICAgICAgICBnbGliYworKyMgICBIUC1ST01BTjggICAgICAgICAgICAgICAgICAgaHB1eAorKyMgICBIUC1BUkFCSUM4ICAgICAgICAgICAgICAgICAgaHB1eAorKyMgICBIUC1HUkVFSzggICAgICAgICAgICAgICAgICAgaHB1eAorKyMgICBIUC1IRUJSRVc4ICAgICAgICAgICAgICAgICAgaHB1eAorKyMgICBIUC1UVVJLSVNIOCAgICAgICAgICAgICAgICAgaHB1eAorKyMgICBIUC1LQU5BOCAgICAgICAgICAgICAgICAgICAgaHB1eAorKyMgICBERUMtS0FOSkkgICAgICAgICAgICAgICAgICAgb3NmCisrIyAgIERFQy1IQU5ZVSAgICAgICAgICAgICAgICAgICBvc2YKKysjICAgVVRGLTggICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzCisrIworKyMgTm90ZTogTmFtZXMgd2hpY2ggYXJlIG5vdCBtYXJrZWQgYXMgYmVpbmcgYSBNSU1FIG5hbWUgc2hvdWxkIG5vdCBiZSB1c2VkIGluCisrIyBJbnRlcm5ldCBwcm90b2NvbHMgZm9yIGluZm9ybWF0aW9uIGludGVyY2hhbmdlIChtYWlsLCBuZXdzLCBldGMuKS4KKysjCisrIyBOb3RlOiBBU0NJSSBhbmQgQU5TSV9YMy40LTE5NjggYXJlIHN5bm9ueW1vdXMgY2Fub25pY2FsIG5hbWVzLiBBcHBsaWNhdGlvbnMKKysjIG11c3QgdW5kZXJzdGFuZCBib3RoIG5hbWVzIGFuZCB0cmVhdCB0aGVtIGFzIGVxdWl2YWxlbnQuCisrIworKyMgVGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIGZpbGUgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHNwZWNpZmljYXRpb24sCisrIyAgICBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorKyMgb3IKKysjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorKworK2hvc3Q9IiQxIgorK29zPWBlY2hvICIkaG9zdCIgfCBzZWQgLWUgJ3MvXlteLV0qLVteLV0qLVwoLipcKSQvXDEvJ2AKKytlY2hvICIjIFRoaXMgZmlsZSBjb250YWlucyBhIHRhYmxlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbGlhc2VzLCIKKytlY2hvICIjIHN1aXRhYmxlIGZvciBvcGVyYXRpbmcgc3lzdGVtICcke29zfScuIgorK2VjaG8gIiMgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gY29uZmlnLmNoYXJzZXQuIgorKyMgTGlzdCBvZiByZWZlcmVuY2VzLCB1cGRhdGVkIGR1cmluZyBpbnN0YWxsYXRpb246CisrZWNobyAiIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICIKKytjYXNlICIkb3MiIGluCisrICAgIGxpbnV4LWdudWxpYmMxKikKKysJIyBMaW51eCBsaWJjNSBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQorKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKysJIyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisrCWVjaG8gIkMgQVNDSUkiCisrCWVjaG8gIlBPU0lYIEFTQ0lJIgorKwlmb3IgbCBpbiBhZiBhZl9aQSBjYSBjYV9FUyBkYSBkYV9ESyBkZSBkZV9BVCBkZV9CRSBkZV9DSCBkZV9ERSBkZV9MVSBcCisrCSAgICAgICAgIGVuIGVuX0FVIGVuX0JXIGVuX0NBIGVuX0RLIGVuX0dCIGVuX0lFIGVuX05aIGVuX1VTIGVuX1pBIFwKKysJICAgICAgICAgZW5fWlcgZXMgZXNfQVIgZXNfQk8gZXNfQ0wgZXNfQ08gZXNfRE8gZXNfRUMgZXNfRVMgZXNfR1QgXAorKwkgICAgICAgICBlc19ITiBlc19NWCBlc19QQSBlc19QRSBlc19QWSBlc19TViBlc19VUyBlc19VWSBlc19WRSBldCBcCisrCSAgICAgICAgIGV0X0VFIGV1IGV1X0VTIGZpIGZpX0ZJIGZvIGZvX0ZPIGZyIGZyX0JFIGZyX0NBIGZyX0NIIGZyX0ZSIFwKKysJICAgICAgICAgZnJfTFUgZ2EgZ2FfSUUgZ2wgZ2xfRVMgaWQgaWRfSUQgaW4gaW5fSUQgaXMgaXNfSVMgaXQgaXRfQ0ggXAorKwkgICAgICAgICBpdF9JVCBrbCBrbF9HTCBubCBubF9CRSBubF9OTCBubyBub19OTyBwdCBwdF9CUiBwdF9QVCBzdiBcCisrCSAgICAgICAgIHN2X0ZJIHN2X1NFOyBkbworKwkgIGVjaG8gIiRsIElTTy04ODU5LTEiCisrCSAgZWNobyAiJGwuaXNvLTg4NTktMSBJU08tODg1OS0xIgorKwkgIGVjaG8gIiRsLmlzby04ODU5LTE1IElTTy04ODU5LTE1IgorKwkgIGVjaG8gIiRsLmlzby04ODU5LTE1QGV1cm8gSVNPLTg4NTktMTUiCisrCSAgZWNobyAiJGxAZXVybyBJU08tODg1OS0xNSIKKysJICBlY2hvICIkbC5jcC00MzcgQ1A0MzciCisrCSAgZWNobyAiJGwuY3AtODUwIENQODUwIgorKwkgIGVjaG8gIiRsLmNwLTEyNTIgQ1AxMjUyIgorKwkgIGVjaG8gIiRsLmNwLTEyNTJAZXVybyBDUDEyNTIiCisrCSAgI2VjaG8gIiRsLmF0YXJpLXN0IEFUQVJJLVNUIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKKysJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKysJICBlY2hvICIkbC51dGYtOEBldXJvIFVURi04IgorKwlkb25lCisrCWZvciBsIGluIGNzIGNzX0NaIGhyIGhyX0hSIGh1IGh1X0hVIHBsIHBsX1BMIHJvIHJvX1JPIHNrIHNrX1NLIHNsIFwKKysJICAgICAgICAgc2xfU0kgc3Igc3JfQ1Mgc3JfWVU7IGRvCisrCSAgZWNobyAiJGwgSVNPLTg4NTktMiIKKysJICBlY2hvICIkbC5pc28tODg1OS0yIElTTy04ODU5LTIiCisrCSAgZWNobyAiJGwuY3AtODUyIENQODUyIgorKwkgIGVjaG8gIiRsLmNwLTEyNTAgQ1AxMjUwIgorKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorKwlkb25lCisrCWZvciBsIGluIG1rIG1rX01LIHJ1IHJ1X1JVOyBkbworKwkgIGVjaG8gIiRsIElTTy04ODU5LTUiCisrCSAgZWNobyAiJGwuaXNvLTg4NTktNSBJU08tODg1OS01IgorKwkgIGVjaG8gIiRsLmtvaTgtciBLT0k4LVIiCisrCSAgZWNobyAiJGwuY3AtODY2IENQODY2IgorKwkgIGVjaG8gIiRsLmNwLTEyNTEgQ1AxMjUxIgorKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorKwlkb25lCisrCWZvciBsIGluIGFyIGFyX1NBOyBkbworKwkgIGVjaG8gIiRsIElTTy04ODU5LTYiCisrCSAgZWNobyAiJGwuaXNvLTg4NTktNiBJU08tODg1OS02IgorKwkgIGVjaG8gIiRsLmNwLTg2NCBDUDg2NCIKKysJICAjZWNobyAiJGwuY3AtODY4IENQODY4IiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKKysJICBlY2hvICIkbC5jcC0xMjU2IENQMTI1NiIKKysJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKysJZG9uZQorKwlmb3IgbCBpbiBlbCBlbF9HUiBnciBncl9HUjsgZG8KKysJICBlY2hvICIkbCBJU08tODg1OS03IgorKwkgIGVjaG8gIiRsLmlzby04ODU5LTcgSVNPLTg4NTktNyIKKysJICBlY2hvICIkbC5jcC04NjkgQ1A4NjkiCisrCSAgZWNobyAiJGwuY3AtMTI1MyBDUDEyNTMiCisrCSAgZWNobyAiJGwuY3AtMTI1M0BldXJvIENQMTI1MyIKKysJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKysJICBlY2hvICIkbC51dGYtOEBldXJvIFVURi04IgorKwlkb25lCisrCWZvciBsIGluIGhlIGhlX0lMIGl3IGl3X0lMOyBkbworKwkgIGVjaG8gIiRsIElTTy04ODU5LTgiCisrCSAgZWNobyAiJGwuaXNvLTg4NTktOCBJU08tODg1OS04IgorKwkgIGVjaG8gIiRsLmNwLTg2MiBDUDg2MiIKKysJICBlY2hvICIkbC5jcC0xMjU1IENQMTI1NSIKKysJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKysJZG9uZQorKwlmb3IgbCBpbiB0ciB0cl9UUjsgZG8KKysJICBlY2hvICIkbCBJU08tODg1OS05IgorKwkgIGVjaG8gIiRsLmlzby04ODU5LTkgSVNPLTg4NTktOSIKKysJICBlY2hvICIkbC5jcC04NTcgQ1A4NTciCisrCSAgZWNobyAiJGwuY3AtMTI1NCBDUDEyNTQiCisrCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisrCWRvbmUKKysJZm9yIGwgaW4gbHQgbHRfTFQgbHYgbHZfTFY7IGRvCisrCSAgI2VjaG8gIiRsIEJBTFRJQyIgIyBub3QgYSBjb21tb25seSB1c2VkIGVuY29kaW5nLCB3cm9uZyBlbmNvZGluZyBuYW1lCisrCSAgZWNobyAiJGwgSVNPLTg4NTktMTMiCisrCWRvbmUKKysJZm9yIGwgaW4gcnVfVUEgdWsgdWtfVUE7IGRvCisrCSAgZWNobyAiJGwgS09JOC1VIgorKwlkb25lCisrCWZvciBsIGluIHpoIHpoX0NOOyBkbworKwkgICNlY2hvICIkbCBHQl8yMzEyLTgwIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcsIHdyb25nIGVuY29kaW5nIG5hbWUKKysJICBlY2hvICIkbCBHQjIzMTIiCisrCWRvbmUKKysJZm9yIGwgaW4gamEgamFfSlAgamFfSlAuRVVDOyBkbworKwkgIGVjaG8gIiRsIEVVQy1KUCIKKysJZG9uZQorKwlmb3IgbCBpbiBrbyBrb19LUjsgZG8KKysJICBlY2hvICIkbCBFVUMtS1IiCisrCWRvbmUKKysJZm9yIGwgaW4gdGggdGhfVEg7IGRvCisrCSAgZWNobyAiJGwgVElTLTYyMCIKKysJZG9uZQorKwlmb3IgbCBpbiBmYSBmYV9JUjsgZG8KKysJICAjZWNobyAiJGwgSVNJUkktMzM0MiIgIyBhIGJyb2tlbiBlbmNvZGluZworKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorKwlkb25lCisrCTs7CisrICAgIGxpbnV4KiB8ICotZ251KikKKysJIyBXaXRoIGdsaWJjLTIuMSBvciBuZXdlciwgd2UgZG9uJ3QgbmVlZCBhbnkgY2Fub25pY2FsaXphdGlvbiwKKysJIyBiZWNhdXNlIGdsaWJjIGhhcyBpY29udiBhbmQgYm90aCBnbGliYyBhbmQgbGliaWNvbnYgc3VwcG9ydCBhbGwKKysJIyBHTlUgY2Fub25pY2FsIG5hbWVzIGRpcmVjdGx5LiBUaGVyZWZvcmUsIHRoZSBNYWtlZmlsZSBkb2VzIG5vdAorKwkjIG5lZWQgdG8gaW5zdGFsbCB0aGUgYWxpYXMgZmlsZSBhdCBhbGwuCisrCSMgVGhlIGZvbGxvd2luZyBhcHBsaWVzIG9ubHkgdG8gZ2xpYmMtMi4wLnggYW5kIG9sZGVyIGxpYmNzLgorKwllY2hvICJJU09fNjQ2LklSVjoxOTgzIEFTQ0lJIgorKwk7OworKyAgICBhaXgqKQorKwllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKKysJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisrCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgorKwllY2hvICJJU084ODU5LTYgSVNPLTg4NTktNiIKKysJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisrCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgorKwllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKKysJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKysJZWNobyAiSUJNLTg1MCBDUDg1MCIKKysJZWNobyAiSUJNLTg1NiBDUDg1NiIKKysJZWNobyAiSUJNLTkyMSBJU08tODg1OS0xMyIKKysJZWNobyAiSUJNLTkyMiBDUDkyMiIKKysJZWNobyAiSUJNLTkzMiBDUDkzMiIKKysJZWNobyAiSUJNLTk0MyBDUDk0MyIKKysJZWNobyAiSUJNLTEwNDYgQ1AxMDQ2IgorKwllY2hvICJJQk0tMTEyNCBDUDExMjQiCisrCWVjaG8gIklCTS0xMTI5IENQMTEyOSIKKysJZWNobyAiSUJNLTEyNTIgQ1AxMjUyIgorKwllY2hvICJJQk0tZXVjQ04gR0IyMzEyIgorKwllY2hvICJJQk0tZXVjSlAgRVVDLUpQIgorKwllY2hvICJJQk0tZXVjS1IgRVVDLUtSIgorKwllY2hvICJJQk0tZXVjVFcgRVVDLVRXIgorKwllY2hvICJiaWc1IEJJRzUiCisrCWVjaG8gIkdCSyBHQksiCisrCWVjaG8gIlRJUy02MjAgVElTLTYyMCIKKysJZWNobyAiVVRGLTggVVRGLTgiCisrCTs7CisrICAgIGhwdXgqKQorKwllY2hvICJpc284ODU5MSBJU08tODg1OS0xIgorKwllY2hvICJpc284ODU5MiBJU08tODg1OS0yIgorKwllY2hvICJpc284ODU5NSBJU08tODg1OS01IgorKwllY2hvICJpc284ODU5NiBJU08tODg1OS02IgorKwllY2hvICJpc284ODU5NyBJU08tODg1OS03IgorKwllY2hvICJpc284ODU5OCBJU08tODg1OS04IgorKwllY2hvICJpc284ODU5OSBJU08tODg1OS05IgorKwllY2hvICJpc284ODU5MTUgSVNPLTg4NTktMTUiCisrCWVjaG8gInJvbWFuOCBIUC1ST01BTjgiCisrCWVjaG8gImFyYWJpYzggSFAtQVJBQklDOCIKKysJZWNobyAiZ3JlZWs4IEhQLUdSRUVLOCIKKysJZWNobyAiaGVicmV3OCBIUC1IRUJSRVc4IgorKwllY2hvICJ0dXJraXNoOCBIUC1UVVJLSVNIOCIKKysJZWNobyAia2FuYTggSFAtS0FOQTgiCisrCWVjaG8gInRpczYyMCBUSVMtNjIwIgorKwllY2hvICJiaWc1IEJJRzUiCisrCWVjaG8gImV1Y0pQIEVVQy1KUCIKKysJZWNobyAiZXVjS1IgRVVDLUtSIgorKwllY2hvICJldWNUVyBFVUMtVFciCisrCWVjaG8gImhwMTVDTiBHQjIzMTIiCisrCSNlY2hvICJjY2RjID8iICMgd2hhdCBpcyB0aGlzPworKwllY2hvICJTSklTIFNISUZUX0pJUyIKKysJZWNobyAidXRmOCBVVEYtOCIKKysJOzsKKysgICAgaXJpeCopCisrCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgorKwllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKKysJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisrCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgorKwllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKKysJZWNobyAiZXVjQ04gR0IyMzEyIgorKwllY2hvICJldWNKUCBFVUMtSlAiCisrCWVjaG8gImV1Y0tSIEVVQy1LUiIKKysJZWNobyAiZXVjVFcgRVVDLVRXIgorKwk7OworKyAgICBvc2YqKQorKwllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKKysJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisrCWVjaG8gIklTTzg4NTktNCBJU08tODg1OS00IgorKwllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKKysJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisrCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgorKwllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKKysJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKysJZWNobyAiY3A4NTAgQ1A4NTAiCisrCWVjaG8gImJpZzUgQklHNSIKKysJZWNobyAiZGVjaGFueXUgREVDLUhBTllVIgorKwllY2hvICJkZWNoYW56aSBHQjIzMTIiCisrCWVjaG8gImRlY2thbmppIERFQy1LQU5KSSIKKysJZWNobyAiZGVja29yZWFuIEVVQy1LUiIKKysJZWNobyAiZXVjSlAgRVVDLUpQIgorKwllY2hvICJldWNLUiBFVUMtS1IiCisrCWVjaG8gImV1Y1RXIEVVQy1UVyIKKysJZWNobyAiR0JLIEdCSyIKKysJZWNobyAiS1NDNTYwMSBDUDk0OSIKKysJZWNobyAic2RlY2thbmppIEVVQy1KUCIKKysJZWNobyAiU0pJUyBTSElGVF9KSVMiCisrCWVjaG8gIlRBQ1RJUyBUSVMtNjIwIgorKwllY2hvICJVVEYtOCBVVEYtOCIKKysJOzsKKysgICAgc29sYXJpcyopCisrCWVjaG8gIjY0NiBBU0NJSSIKKysJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisrCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgorKwllY2hvICJJU084ODU5LTMgSVNPLTg4NTktMyIKKysJZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCisrCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgorKwllY2hvICJJU084ODU5LTYgSVNPLTg4NTktNiIKKysJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisrCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgorKwllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKKysJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKysJZWNobyAia29pOC1yIEtPSTgtUiIKKysJZWNobyAiYW5zaS0xMjUxIENQMTI1MSIKKysJZWNobyAiQklHNSBCSUc1IgorKwllY2hvICJCaWc1LUhLU0NTIEJJRzUtSEtTQ1MiCisrCWVjaG8gImdiMjMxMiBHQjIzMTIiCisrCWVjaG8gIkdCSyBHQksiCisrCWVjaG8gIkdCMTgwMzAgR0IxODAzMCIKKysJZWNobyAiY25zMTE2NDMgRVVDLVRXIgorKwllY2hvICI1NjAxIEVVQy1LUiIKKysJZWNobyAia29fS1Iuam9oYXA5MiBKT0hBQiIKKysJZWNobyAiZXVjSlAgRVVDLUpQIgorKwllY2hvICJQQ0sgU0hJRlRfSklTIgorKwllY2hvICJUSVM2MjAuMjUzMyBUSVMtNjIwIgorKwkjZWNobyAic3VuX2V1X2dyZWVrID8iICMgd2hhdCBpcyB0aGlzPworKwllY2hvICJVVEYtOCBVVEYtOCIKKysJOzsKKysgICAgZnJlZWJzZCogfCBvczIqKQorKwkjIEZyZWVCU0QgNC4yIGRvZXNuJ3QgaGF2ZSBubF9sYW5naW5mbyhDT0RFU0VUKTsgdGhlcmVmb3JlCisrCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQorKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKysJIyBMaWtld2lzZSBmb3IgT1MvMi4gT1MvMiBoYXMgWEZyZWU4NiBqdXN0IGxpa2UgRnJlZUJTRC4gSnVzdAorKwkjIHJldXNlIEZyZWVCU0QncyBsb2NhbGUgZGF0YSBmb3IgT1MvMi4KKysJZWNobyAiQyBBU0NJSSIKKysJZWNobyAiVVMtQVNDSUkgQVNDSUkiCisrCWZvciBsIGluIGxhX0xOIGx0X0xOOyBkbworKwkgIGVjaG8gIiRsLkFTQ0lJIEFTQ0lJIgorKwlkb25lCisrCWZvciBsIGluIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGVzX0VTIFwKKysJICAgICAgICAgZmlfRkkgZnJfQkUgZnJfQ0EgZnJfQ0ggZnJfRlIgaXNfSVMgaXRfQ0ggaXRfSVQgbGFfTE4gXAorKwkgICAgICAgICBsdF9MTiBubF9CRSBubF9OTCBub19OTyBwdF9QVCBzdl9TRTsgZG8KKysJICBlY2hvICIkbC5JU09fODg1OS0xIElTTy04ODU5LTEiCisrCSAgZWNobyAiJGwuRElTXzg4NTktMTUgSVNPLTg4NTktMTUiCisrCWRvbmUKKysJZm9yIGwgaW4gY3NfQ1ogaHJfSFIgaHVfSFUgbGFfTE4gbHRfTE4gcGxfUEwgc2xfU0k7IGRvCisrCSAgZWNobyAiJGwuSVNPXzg4NTktMiBJU08tODg1OS0yIgorKwlkb25lCisrCWZvciBsIGluIGxhX0xOIGx0X0xUOyBkbworKwkgIGVjaG8gIiRsLklTT184ODU5LTQgSVNPLTg4NTktNCIKKysJZG9uZQorKwlmb3IgbCBpbiBydV9SVSBydV9TVTsgZG8KKysJICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgorKwkgIGVjaG8gIiRsLklTT184ODU5LTUgSVNPLTg4NTktNSIKKysJICBlY2hvICIkbC5DUDg2NiBDUDg2NiIKKysJZG9uZQorKwllY2hvICJ1a19VQS5LT0k4LVUgS09JOC1VIgorKwllY2hvICJ6aF9UVy5CSUc1IEJJRzUiCisrCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKKysJZWNobyAiemhfQ04uRVVDIEdCMjMxMiIKKysJZWNobyAiamFfSlAuRVVDIEVVQy1KUCIKKysJZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCisrCWVjaG8gImphX0pQLlNoaWZ0X0pJUyBTSElGVF9KSVMiCisrCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCisrCTs7CisrICAgIG5ldGJzZCopCisrCWVjaG8gIjY0NiBBU0NJSSIKKysJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisrCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgorKwllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKKysJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisrCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCisrCWVjaG8gImV1Y0NOIEdCMjMxMiIKKysJZWNobyAiZXVjSlAgRVVDLUpQIgorKwllY2hvICJldWNLUiBFVUMtS1IiCisrCWVjaG8gImV1Y1RXIEVVQy1UVyIKKysJZWNobyAiQklHNSBCSUc1IgorKwllY2hvICJTSklTIFNISUZUX0pJUyIKKysJOzsKKysgICAgZGFyd2luKikKKysJIyBEYXJ3aW4gNi44IGRvZXNuJ3QgaGF2ZSBubF9sYW5naW5mbyhDT0RFU0VUKTsgdGhlcmVmb3JlCisrCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQorKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKysJZWNobyAiQyBBU0NJSSIKKysJZm9yIGwgaW4gZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgbGFfTE47IGRvCisrCSAgZWNobyAiJGwuVVMtQVNDSUkgQVNDSUkiCisrCWRvbmUKKysJZm9yIGwgaW4gZGFfREsgZGVfQVQgZGVfQ0ggZGVfREUgZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgZXNfRVMgXAorKwkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBubF9CRSBcCisrCSAgICAgICAgIG5sX05MIG5vX05PIHB0X1BUIHN2X1NFOyBkbworKwkgIGVjaG8gIiRsIElTTy04ODU5LTEiCisrCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCisrCSAgZWNobyAiJGwuSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKysJZG9uZQorKwlmb3IgbCBpbiBsYV9MTjsgZG8KKysJICBlY2hvICIkbC5JU084ODU5LTEgSVNPLTg4NTktMSIKKysJICBlY2hvICIkbC5JU084ODU5LTE1IElTTy04ODU5LTE1IgorKwlkb25lCisrCWZvciBsIGluIGNzX0NaIGhyX0hSIGh1X0hVIGxhX0xOIHBsX1BMIHNsX1NJOyBkbworKwkgIGVjaG8gIiRsLklTTzg4NTktMiBJU08tODg1OS0yIgorKwlkb25lCisrCWZvciBsIGluIGxhX0xOIGx0X0xUOyBkbworKwkgIGVjaG8gIiRsLklTTzg4NTktNCBJU08tODg1OS00IgorKwlkb25lCisrCWZvciBsIGluIHJ1X1JVOyBkbworKwkgIGVjaG8gIiRsLktPSTgtUiBLT0k4LVIiCisrCSAgZWNobyAiJGwuSVNPODg1OS01IElTTy04ODU5LTUiCisrCSAgZWNobyAiJGwuQ1A4NjYgQ1A4NjYiCisrCWRvbmUKKysJZm9yIGwgaW4gYmdfQkc7IGRvCisrCSAgZWNobyAiJGwuQ1AxMjUxIENQMTI1MSIKKysJZG9uZQorKwllY2hvICJ1a19VQS5LT0k4LVUgS09JOC1VIgorKwllY2hvICJ6aF9UVy5CSUc1IEJJRzUiCisrCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKKysJZWNobyAiemhfQ04uRVVDIEdCMjMxMiIKKysJZWNobyAiamFfSlAuRVVDIEVVQy1KUCIKKysJZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCisrCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCisrCTs7CisrICAgIGJlb3MqKQorKwkjIEJlT1MgaGFzIGEgc2luZ2xlIGxvY2FsZSwgYW5kIGl0IGhhcyBVVEYtOCBlbmNvZGluZy4KKysJZWNobyAiKiBVVEYtOCIKKysJOzsKKysgICAgbXNkb3NkamdwcCopCisrCSMgREpHUFAgMi4wMyBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQorKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKysJIyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisrCWVjaG8gIiMiCisrCWVjaG8gIiMgVGhlIGVuY29kaW5ncyBnaXZlbiBoZXJlIG1heSBub3QgYWxsIGJlIGNvcnJlY3QuIgorKwllY2hvICIjIElmIHlvdSBmaW5kIHRoYXQgdGhlIGVuY29kaW5nIGdpdmVuIGZvciB5b3VyIGxhbmd1YWdlIGFuZCIKKysJZWNobyAiIyBjb3VudHJ5IGlzIG5vdCB0aGUgb25lIHlvdXIgRE9TIG1hY2hpbmUgYWN0dWFsbHkgdXNlcywganVzdCIKKysJZWNobyAiIyBjb3JyZWN0IGl0IGluIHRoaXMgZmlsZSwgYW5kIHNlbmQgYSBtYWlsIHRvIgorKwllY2hvICIjIEp1YW4gTWFudWVsIEd1ZXJyZXJvIDxzdDAwMTkwNkBocnoxLmhyei50dS1kYXJtc3RhZHQuZGU+IgorKwllY2hvICIjIGFuZCBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4uIgorKwllY2hvICIjIgorKwllY2hvICJDIEFTQ0lJIgorKwkjIElTTy04ODU5LTEgbGFuZ3VhZ2VzCisrCWVjaG8gImNhIENQODUwIgorKwllY2hvICJjYV9FUyBDUDg1MCIKKysJZWNobyAiZGEgQ1A4NjUiICAgICMgbm90IENQODUwID8/CisrCWVjaG8gImRhX0RLIENQODY1IiAjIG5vdCBDUDg1MCA/PworKwllY2hvICJkZSBDUDg1MCIKKysJZWNobyAiZGVfQVQgQ1A4NTAiCisrCWVjaG8gImRlX0NIIENQODUwIgorKwllY2hvICJkZV9ERSBDUDg1MCIKKysJZWNobyAiZW4gQ1A4NTAiCisrCWVjaG8gImVuX0FVIENQODUwIiAjIG5vdCBDUDQzNyA/PworKwllY2hvICJlbl9DQSBDUDg1MCIKKysJZWNobyAiZW5fR0IgQ1A4NTAiCisrCWVjaG8gImVuX05aIENQNDM3IgorKwllY2hvICJlbl9VUyBDUDQzNyIKKysJZWNobyAiZW5fWkEgQ1A4NTAiICMgbm90IENQNDM3ID8/CisrCWVjaG8gImVzIENQODUwIgorKwllY2hvICJlc19BUiBDUDg1MCIKKysJZWNobyAiZXNfQk8gQ1A4NTAiCisrCWVjaG8gImVzX0NMIENQODUwIgorKwllY2hvICJlc19DTyBDUDg1MCIKKysJZWNobyAiZXNfQ1IgQ1A4NTAiCisrCWVjaG8gImVzX0NVIENQODUwIgorKwllY2hvICJlc19ETyBDUDg1MCIKKysJZWNobyAiZXNfRUMgQ1A4NTAiCisrCWVjaG8gImVzX0VTIENQODUwIgorKwllY2hvICJlc19HVCBDUDg1MCIKKysJZWNobyAiZXNfSE4gQ1A4NTAiCisrCWVjaG8gImVzX01YIENQODUwIgorKwllY2hvICJlc19OSSBDUDg1MCIKKysJZWNobyAiZXNfUEEgQ1A4NTAiCisrCWVjaG8gImVzX1BZIENQODUwIgorKwllY2hvICJlc19QRSBDUDg1MCIKKysJZWNobyAiZXNfU1YgQ1A4NTAiCisrCWVjaG8gImVzX1VZIENQODUwIgorKwllY2hvICJlc19WRSBDUDg1MCIKKysJZWNobyAiZXQgQ1A4NTAiCisrCWVjaG8gImV0X0VFIENQODUwIgorKwllY2hvICJldSBDUDg1MCIKKysJZWNobyAiZXVfRVMgQ1A4NTAiCisrCWVjaG8gImZpIENQODUwIgorKwllY2hvICJmaV9GSSBDUDg1MCIKKysJZWNobyAiZnIgQ1A4NTAiCisrCWVjaG8gImZyX0JFIENQODUwIgorKwllY2hvICJmcl9DQSBDUDg1MCIKKysJZWNobyAiZnJfQ0ggQ1A4NTAiCisrCWVjaG8gImZyX0ZSIENQODUwIgorKwllY2hvICJnYSBDUDg1MCIKKysJZWNobyAiZ2FfSUUgQ1A4NTAiCisrCWVjaG8gImdkIENQODUwIgorKwllY2hvICJnZF9HQiBDUDg1MCIKKysJZWNobyAiZ2wgQ1A4NTAiCisrCWVjaG8gImdsX0VTIENQODUwIgorKwllY2hvICJpZCBDUDg1MCIgICAgIyBub3QgQ1A0MzcgPz8KKysJZWNobyAiaWRfSUQgQ1A4NTAiICMgbm90IENQNDM3ID8/CisrCWVjaG8gImlzIENQODYxIiAgICAjIG5vdCBDUDg1MCA/PworKwllY2hvICJpc19JUyBDUDg2MSIgIyBub3QgQ1A4NTAgPz8KKysJZWNobyAiaXQgQ1A4NTAiCisrCWVjaG8gIml0X0NIIENQODUwIgorKwllY2hvICJpdF9JVCBDUDg1MCIKKysJZWNobyAibHQgQ1A3NzUiCisrCWVjaG8gImx0X0xUIENQNzc1IgorKwllY2hvICJsdiBDUDc3NSIKKysJZWNobyAibHZfTFYgQ1A3NzUiCisrCWVjaG8gIm5iIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworKwllY2hvICJuYl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKysJZWNobyAibmwgQ1A4NTAiCisrCWVjaG8gIm5sX0JFIENQODUwIgorKwllY2hvICJubF9OTCBDUDg1MCIKKysJZWNobyAibm4gQ1A4NjUiICAgICMgbm90IENQODUwID8/CisrCWVjaG8gIm5uX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PworKwllY2hvICJubyBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKysJZWNobyAibm9fTk8gQ1A4NjUiICMgbm90IENQODUwID8/CisrCWVjaG8gInB0IENQODUwIgorKwllY2hvICJwdF9CUiBDUDg1MCIKKysJZWNobyAicHRfUFQgQ1A4NTAiCisrCWVjaG8gInN2IENQODUwIgorKwllY2hvICJzdl9TRSBDUDg1MCIKKysJIyBJU08tODg1OS0yIGxhbmd1YWdlcworKwllY2hvICJjcyBDUDg1MiIKKysJZWNobyAiY3NfQ1ogQ1A4NTIiCisrCWVjaG8gImhyIENQODUyIgorKwllY2hvICJocl9IUiBDUDg1MiIKKysJZWNobyAiaHUgQ1A4NTIiCisrCWVjaG8gImh1X0hVIENQODUyIgorKwllY2hvICJwbCBDUDg1MiIKKysJZWNobyAicGxfUEwgQ1A4NTIiCisrCWVjaG8gInJvIENQODUyIgorKwllY2hvICJyb19STyBDUDg1MiIKKysJZWNobyAic2sgQ1A4NTIiCisrCWVjaG8gInNrX1NLIENQODUyIgorKwllY2hvICJzbCBDUDg1MiIKKysJZWNobyAic2xfU0kgQ1A4NTIiCisrCWVjaG8gInNxIENQODUyIgorKwllY2hvICJzcV9BTCBDUDg1MiIKKysJZWNobyAic3IgQ1A4NTIiICAgICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KKysJZWNobyAic3JfQ1MgQ1A4NTIiICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KKysJZWNobyAic3JfWVUgQ1A4NTIiICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KKysJIyBJU08tODg1OS0zIGxhbmd1YWdlcworKwllY2hvICJtdCBDUDg1MCIKKysJZWNobyAibXRfTVQgQ1A4NTAiCisrCSMgSVNPLTg4NTktNSBsYW5ndWFnZXMKKysJZWNobyAiYmUgQ1A4NjYiCisrCWVjaG8gImJlX0JFIENQODY2IgorKwllY2hvICJiZyBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KKysJZWNobyAiYmdfQkcgQ1A4NjYiICMgbm90IENQODU1ID8/CisrCWVjaG8gIm1rIENQODY2IiAgICAjIG5vdCBDUDg1NSA/PworKwllY2hvICJta19NSyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KKysJZWNobyAicnUgQ1A4NjYiCisrCWVjaG8gInJ1X1JVIENQODY2IgorKwllY2hvICJ1ayBDUDExMjUiCisrCWVjaG8gInVrX1VBIENQMTEyNSIKKysJIyBJU08tODg1OS02IGxhbmd1YWdlcworKwllY2hvICJhciBDUDg2NCIKKysJZWNobyAiYXJfQUUgQ1A4NjQiCisrCWVjaG8gImFyX0RaIENQODY0IgorKwllY2hvICJhcl9FRyBDUDg2NCIKKysJZWNobyAiYXJfSVEgQ1A4NjQiCisrCWVjaG8gImFyX0lSIENQODY0IgorKwllY2hvICJhcl9KTyBDUDg2NCIKKysJZWNobyAiYXJfS1cgQ1A4NjQiCisrCWVjaG8gImFyX01BIENQODY0IgorKwllY2hvICJhcl9PTSBDUDg2NCIKKysJZWNobyAiYXJfUUEgQ1A4NjQiCisrCWVjaG8gImFyX1NBIENQODY0IgorKwllY2hvICJhcl9TWSBDUDg2NCIKKysJIyBJU08tODg1OS03IGxhbmd1YWdlcworKwllY2hvICJlbCBDUDg2OSIKKysJZWNobyAiZWxfR1IgQ1A4NjkiCisrCSMgSVNPLTg4NTktOCBsYW5ndWFnZXMKKysJZWNobyAiaGUgQ1A4NjIiCisrCWVjaG8gImhlX0lMIENQODYyIgorKwkjIElTTy04ODU5LTkgbGFuZ3VhZ2VzCisrCWVjaG8gInRyIENQODU3IgorKwllY2hvICJ0cl9UUiBDUDg1NyIKKysJIyBKYXBhbmVzZQorKwllY2hvICJqYSBDUDkzMiIKKysJZWNobyAiamFfSlAgQ1A5MzIiCisrCSMgQ2hpbmVzZQorKwllY2hvICJ6aF9DTiBHQksiCisrCWVjaG8gInpoX1RXIENQOTUwIiAjIG5vdCBDUDkzOCA/PworKwkjIEtvcmVhbgorKwllY2hvICJrciBDUDk0OSIgICAgIyBub3QgQ1A5MzQgPz8KKysJZWNobyAia3JfS1IgQ1A5NDkiICMgbm90IENQOTM0ID8/CisrCSMgVGhhaQorKwllY2hvICJ0aCBDUDg3NCIKKysJZWNobyAidGhfVEggQ1A4NzQiCisrCSMgT3RoZXIKKysJZWNobyAiZW8gQ1A4NTAiCisrCWVjaG8gImVvX0VPIENQODUwIgorKwk7OworK2VzYWMKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9kY2dldHRleHQuYwkxOTk4LTA0LTI2IDA5OjIyOjM2LjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9kY2dldHRleHQuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjM1OTc0NzQ4MCAtMDQwMAorQEAgLTEsNTkzICsxLDU2IEBACistLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbgorLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGNnZXR0ZXh0KDMpIGZ1bmN0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgCistICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICAgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCistICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKy0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworIAorICNpZmRlZiBIQVZFX0NPTkZJR19ICisgIyBpbmNsdWRlIDxjb25maWcuaD4KKyAjZW5kaWYKKyAKKy0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CistCistI2lmZGVmIF9fR05VQ19fCistIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKy0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCistI2Vsc2UKKy0jIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCistIyAgaW5jbHVkZSA8YWxsb2NhLmg+CistIyBlbHNlCistIyAgaWZkZWYgX0FJWAorLSAjcHJhZ21hIGFsbG9jYQorLSMgIGVsc2UKKy0jICAgaWZuZGVmIGFsbG9jYQorLWNoYXIgKmFsbG9jYSAoKTsKKy0jICAgZW5kaWYKKy0jICBlbmRpZgorLSMgZW5kaWYKKy0jZW5kaWYKKy0KKy0jaW5jbHVkZSA8ZXJybm8uaD4KKy0jaWZuZGVmIGVycm5vCistZXh0ZXJuIGludCBlcnJubzsKKy0jZW5kaWYKKy0jaWZuZGVmIF9fc2V0X2Vycm5vCistIyBkZWZpbmUgX19zZXRfZXJybm8odmFsKSBlcnJubyA9ICh2YWwpCistI2VuZGlmCistCistI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKKy0jIGluY2x1ZGUgPHN0ZGxpYi5oPgorLSNlbHNlCistY2hhciAqZ2V0ZW52ICgpOworLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAorLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgorLSMgZWxzZQorLXZvaWQgZnJlZSAoKTsKKy0jIGVuZGlmCistI2VuZGlmCistCistI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCistIyBpZm5kZWYgX0dOVV9TT1VSQ0UKKy0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorLSMgZW5kaWYKKy0jIGluY2x1ZGUgPHN0cmluZy5oPgorLSNlbHNlCistIyBpbmNsdWRlIDxzdHJpbmdzLmg+CistI2VuZGlmCistI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQworLSMgaWZuZGVmIHN0cmNocgorLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKKy0jIGVuZGlmCistI2VuZGlmCistCistI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCistIyBpbmNsdWRlIDx1bmlzdGQuaD4KKy0jZW5kaWYKKy0KKy0jaW5jbHVkZSAiZ2V0dGV4dC5oIgorICNpbmNsdWRlICJnZXR0ZXh0UC5oIgorICNpZmRlZiBfTElCQworICMgaW5jbHVkZSA8bGliaW50bC5oPgorICNlbHNlCistIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisrIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisgI2VuZGlmCistI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCisgCisgLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworIAorLSNpZmRlZiBfTElCQworLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKy0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCistIyBkZWZpbmUgZ2V0Y3dkIF9fZ2V0Y3dkCistIyBkZWZpbmUgc3RwY3B5IF9fc3RwY3B5CistI2Vsc2UKKy0jIGlmICFkZWZpbmVkIEhBVkVfR0VUQ1dECistY2hhciAqZ2V0d2QgKCk7CistIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKKy0jIGVsc2UKKy1jaGFyICpnZXRjd2QgKCk7CistIyBlbmRpZgorLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCistc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKKy0jIGVuZGlmCistI2VuZGlmCistCistLyogQW1vdW50IHRvIGluY3JlYXNlIGJ1ZmZlciBzaXplIGJ5IGluIGVhY2ggdHJ5LiAgKi8KKy0jZGVmaW5lIFBBVEhfSU5DUiAzMgorLQorLS8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLworLS8qIE5vbi1QT1NJWCBCU0Qgc3lzdGVtcyBtaWdodCBoYXZlIGdjYydzIGxpbWl0cy5oLCB3aGljaCBkb2Vzbid0IGRlZmluZQorLSAgIFBBVEhfTUFYIGJ1dCBtaWdodCBjYXVzZSByZWRlZmluaXRpb24gd2FybmluZ3Mgd2hlbiBzeXMvcGFyYW0uaCBpcworLSAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KKy0jaWYgZGVmaW5lZChfUE9TSVhfVkVSU0lPTikgfHwgKGRlZmluZWQoSEFWRV9MSU1JVFNfSCkgJiYgIWRlZmluZWQoX19HTlVDX18pKQorLSMgaW5jbHVkZSA8bGltaXRzLmg+CistI2VuZGlmCistCistI2lmbmRlZiBfUE9TSVhfUEFUSF9NQVgKKy0jIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1CistI2VuZGlmCistCistI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKF9QQ19QQVRIX01BWCkKKy0jIGRlZmluZSBQQVRIX01BWCAocGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSA8IDEgPyAxMDI0IDogcGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSkKKy0jZW5kaWYKKy0KKy0vKiBEb24ndCBpbmNsdWRlIHN5cy9wYXJhbS5oIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4uICAqLworLSNpZiBkZWZpbmVkKEhBVkVfU1lTX1BBUkFNX0gpICYmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiAhZGVmaW5lZChNQVhQQVRITEVOKQorLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CistI2VuZGlmCistCistI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKE1BWFBBVEhMRU4pCistIyBkZWZpbmUgUEFUSF9NQVggTUFYUEFUSExFTgorLSNlbmRpZgorLQorLSNpZm5kZWYgUEFUSF9NQVgKKy0jIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKKy0jZW5kaWYKKy0KKy0vKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiBgc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgorLSAgIGBgRGlyZWN0cyBgc2V0bG9jYWxlKCknIHRvIHF1ZXJ5IGBjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAorLSAgICAgc2V0dGluZyBvZiBgbG9jYWwnLicnCistICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBBbmQgZXZlbiB3b3JzZTogUE9TSVgKKy0gICBkZWZpbmVzIHRoaXMgbm90IGF0IGFsbC4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQKKy0gICBzeXN0ZW0gKGUuZy4gdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLworLSNpZmRlZiBfTElCQworLSMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKKy0jZW5kaWYKKy0KKy0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCistICAgdGV4dGRvbWFpbigzKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGlzICJtZXNzYWdlcyIuICAqLworLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSA9ICJtZXNzYWdlcyI7CistCistLyogVmFsdWUgdXNlZCBhcyB0aGUgZGVmYXVsdCBkb21haW4gZm9yIGdldHRleHQoMykuICAqLworLWNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47CistCistLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLworLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gR05VTE9DQUxFRElSOworLQorLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zIGNyZWF0ZWQgYnkgYmluZHRleHRkb21haW4oKQorLSAgIGNhbGxzLiAgKi8KKy1zdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKKy0KKy0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLworLXN0YXRpYyBjaGFyICpmaW5kX21zZyBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKy0JCQkgICAgICAgY29uc3QgY2hhciAqbXNnaWQpKTsKKy1zdGF0aWMgY29uc3QgY2hhciAqY2F0ZWdvcnlfdG9fbmFtZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnkpKTsKKy1zdGF0aWMgY29uc3QgY2hhciAqZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgUEFSQU1TICgoaW50IGNhdGVnb3J5LAorLQkJCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpKTsKKy0KKy0KKy0vKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKKy0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLworLSNpZmRlZiBIQVZFX0FMTE9DQQorLS8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLworLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCistIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLworLSNlbHNlCistc3RydWN0IGJsb2NrX2xpc3QKKy17CistICB2b2lkICphZGRyZXNzOworLSAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7CistfTsKKy0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCistICBkbyB7CQkJCQkJCQkJICAgICAgXAorLSAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKKy0gICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAorLSAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKKy0gICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCistICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCistICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCistICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAorLSAgICB9CQkJCQkJCQkJICAgICAgXAorLSAgfSB3aGlsZSAoMCkKKy0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKKy0gIGRvIHsJCQkJCQkJCQkgICAgICBcCistICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCistICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCistICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAorLSAgICAgIGZyZWUgKG9sZCk7CQkJCQkJCSAgICAgIFwKKy0gICAgfQkJCQkJCQkJCSAgICAgIFwKKy0gIH0gd2hpbGUgKDApCistIyB1bmRlZiBhbGxvY2EKKy0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCistI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCistCistCisgLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworICNpZmRlZiBfTElCQworICMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAorKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisgI2Vsc2UKKy0jIGRlZmluZSBEQ0dFVFRFWFQgZGNnZXR0ZXh0X18KKysjIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKKysjIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAorICNlbmRpZgorIAorIC8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQorICAgIGxvY2FsZS4gICovCisgY2hhciAqCistRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCistICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOworLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7CistICAgICBpbnQgY2F0ZWdvcnk7CisrRENHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCwgaW50IGNhdGVnb3J5KQorIHsKKy0jaWZuZGVmIEhBVkVfQUxMT0NBCistICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7CistI2VuZGlmCistICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW47CistICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKKy0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKKy0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5dmFsdWU7CistICBjaGFyICpkaXJuYW1lLCAqeGRvbWFpbm5hbWU7CistICBjaGFyICpzaW5nbGVfbG9jYWxlOworLSAgY2hhciAqcmV0dmFsOworLSAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87CistCistICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KKy0gIGlmIChtc2dpZCA9PSBOVUxMKQorLSAgICByZXR1cm4gTlVMTDsKKy0KKy0gIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKKy0gICAgIENBVEVHT1JZIGlzIG5vdCBMQ19NRVNTQUdFUyB0aGlzIG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgYnV0IHRoZQorLSAgICAgZGVmaW50aW9uIGxlZnQgdGhpcyB1bmRlZmluZWQuICAqLworLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKKy0gICAgZG9tYWlubmFtZSA9IF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworLQorLSAgLyogRmlyc3QgZmluZCBtYXRjaGluZyBiaW5kaW5nLiAgKi8KKy0gIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCistICAgIHsKKy0gICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7CistICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKKy0JLyogV2UgZm91bmQgaXQhICAqLworLQlicmVhazsKKy0gICAgICBpZiAoY29tcGFyZSA8IDApCistCXsKKy0JICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLworLQkgIGJpbmRpbmcgPSBOVUxMOworLQkgIGJyZWFrOworLQl9CistICAgIH0KKy0KKy0gIGlmIChiaW5kaW5nID09IE5VTEwpCistICAgIGRpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOworLSAgZWxzZSBpZiAoYmluZGluZy0+ZGlybmFtZVswXSA9PSAnLycpCistICAgIGRpcm5hbWUgPSBiaW5kaW5nLT5kaXJuYW1lOworLSAgZWxzZQorLSAgICB7CistICAgICAgLyogV2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGguICBNYWtlIGl0IGFic29sdXRlIG5vdy4gICovCistICAgICAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChiaW5kaW5nLT5kaXJuYW1lKSArIDE7CistICAgICAgc2l6ZV90IHBhdGhfbWF4OworLSAgICAgIGNoYXIgKnJldDsKKy0KKy0gICAgICBwYXRoX21heCA9ICh1bnNpZ25lZCkgUEFUSF9NQVg7CistICAgICAgcGF0aF9tYXggKz0gMjsJCS8qIFRoZSBnZXRjd2QgZG9jcyBzYXkgdG8gZG8gdGhpcy4gICovCistCistICAgICAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7CistICAgICAgQUREX0JMT0NLIChibG9ja19saXN0LCBkaXJuYW1lKTsKKy0KKy0gICAgICBfX3NldF9lcnJubyAoMCk7CistICAgICAgd2hpbGUgKChyZXQgPSBnZXRjd2QgKGRpcm5hbWUsIHBhdGhfbWF4KSkgPT0gTlVMTCAmJiBlcnJubyA9PSBFUkFOR0UpCistCXsKKy0JICBwYXRoX21heCArPSBQQVRIX0lOQ1I7CistCSAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7CistCSAgQUREX0JMT0NLIChibG9ja19saXN0LCBkaXJuYW1lKTsKKy0JICBfX3NldF9lcnJubyAoMCk7CistCX0KKy0KKy0gICAgICBpZiAocmV0ID09IE5VTEwpCistCXsKKy0JICAvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCistCSAgICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KKy0JICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CistCSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKKy0JICByZXR1cm4gKGNoYXIgKikgbXNnaWQ7CistCX0KKy0KKy0gICAgICBzdHBjcHkgKHN0cGNweSAoc3RyY2hyIChkaXJuYW1lLCAnXDAnKSwgIi8iKSwgYmluZGluZy0+ZGlybmFtZSk7CistICAgIH0KKy0KKy0gIC8qIE5vdyBkZXRlcm1pbmUgdGhlIHN5bWJvbGljIG5hbWUgb2YgQ0FURUdPUlkgYW5kIGl0cyB2YWx1ZS4gICovCistICBjYXRlZ29yeW5hbWUgPSBjYXRlZ29yeV90b19uYW1lIChjYXRlZ29yeSk7CistICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOworLQorLSAgeGRvbWFpbm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnluYW1lKQorLQkJCQkgKyBzdHJsZW4gKGRvbWFpbm5hbWUpICsgNSk7CistICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKKy0KKy0gIHN0cGNweSAoc3RwY3B5IChzdHBjcHkgKHN0cGNweSAoeGRvbWFpbm5hbWUsIGNhdGVnb3J5bmFtZSksICIvIiksCistCQkgIGRvbWFpbm5hbWUpLAorLQkgICIubW8iKTsKKy0KKy0gIC8qIENyZWF0aW5nIHdvcmtpbmcgYXJlYS4gICovCistICBzaW5nbGVfbG9jYWxlID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5dmFsdWUpICsgMSk7CistICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHNpbmdsZV9sb2NhbGUpOworLQorLQorLSAgLyogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhpcyBpcyBhIGxvb3AgYmVjYXVzZSB3ZSBwZXJoYXBzCistICAgICBnb3QgYW4gb3JkZXJlZCBsaXN0IG9mIGxhbmd1YWdlcyB0byBjb25zaWRlciBmb3IgdGggdHJhbnNsYXRpb24uICAqLworLSAgd2hpbGUgKDEpCistICAgIHsKKy0gICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCistICAgICAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdID09ICc6JykKKy0JKytjYXRlZ29yeXZhbHVlOworLSAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCistCXsKKy0JICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKKy0JICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCistCSAgICAgYnkgaW1wbGljaXRseSBhcHBlbmRpbmcgYSAiQyIgZW50cnksIGkuZS4gbm8gdHJhbnNsYXRpb24KKy0JICAgICB3aWxsIHRha2UgcGxhY2UuICAqLworLQkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7CistCSAgc2luZ2xlX2xvY2FsZVsxXSA9ICdcMCc7CistCX0KKy0gICAgICBlbHNlCistCXsKKy0JICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7CistCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKKy0JICAgICpjcCsrID0gKmNhdGVnb3J5dmFsdWUrKzsKKy0JICAqY3AgPSAnXDAnOworLQl9CistCistICAgICAgLyogSWYgdGhlIGN1cnJlbnQgbG9jYWxlIHZhbHVlIGlzIEMgKG9yIFBPU0lYKSB3ZSBkb24ndCBsb2FkIGEKKy0JIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLworLSAgICAgIGlmIChzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJDIikgPT0gMAorLQkgIHx8IHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIlBPU0lYIikgPT0gMCkKKy0JeworLQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKy0JICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOworLQkgIHJldHVybiAoY2hhciAqKSBtc2dpZDsKKy0JfQorLQorLQorLSAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKKy0JIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZLiAgKi8KKy0gICAgICBkb21haW4gPSBfbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIHNpbmdsZV9sb2NhbGUsIHhkb21haW5uYW1lKTsKKy0KKy0gICAgICBpZiAoZG9tYWluICE9IE5VTEwpCistCXsKKy0JICByZXR2YWwgPSBmaW5kX21zZyAoZG9tYWluLCBtc2dpZCk7CistCistCSAgaWYgKHJldHZhbCA9PSBOVUxMKQorLQkgICAgeworLQkgICAgICBpbnQgY250OworLQorLQkgICAgICBmb3IgKGNudCA9IDA7IGRvbWFpbi0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCistCQl7CistCQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBtc2dpZCk7CistCistCQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKKy0JCSAgICBicmVhazsKKy0JCX0KKy0JICAgIH0KKy0KKy0JICBpZiAocmV0dmFsICE9IE5VTEwpCistCSAgICB7CistCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKy0JICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKKy0JICAgICAgcmV0dXJuIHJldHZhbDsKKy0JICAgIH0KKy0JfQorLSAgICB9CistICAvKiBOT1RSRUFDSEVEICovCisrICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIE5VTEwsIDAsIDAsIGNhdGVnb3J5KTsKKyB9CisgCisgI2lmZGVmIF9MSUJDCisgLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCisrSU5UREVGKF9fZGNnZXR0ZXh0KQorIHdlYWtfYWxpYXMgKF9fZGNnZXR0ZXh0LCBkY2dldHRleHQpOworICNlbmRpZgorLQorLQorLXN0YXRpYyBjaGFyICoKKy1maW5kX21zZyAoZG9tYWluX2ZpbGUsIG1zZ2lkKQorLSAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGU7CistICAgICBjb25zdCBjaGFyICptc2dpZDsKKy17CistICBzaXplX3QgdG9wLCBhY3QsIGJvdHRvbTsKKy0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47CistCistICBpZiAoZG9tYWluX2ZpbGUtPmRlY2lkZWQgPT0gMCkKKy0gICAgX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSk7CistCistICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKKy0gICAgcmV0dXJuIE5VTEw7CistCistICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7CistCistICAvKiBMb2NhdGUgdGhlIE1TR0lEIGFuZCBpdHMgdHJhbnNsYXRpb24uICAqLworLSAgaWYgKGRvbWFpbi0+aGFzaF9zaXplID4gMiAmJiBkb21haW4tPmhhc2hfdGFiICE9IE5VTEwpCistICAgIHsKKy0gICAgICAvKiBVc2UgdGhlIGhhc2hpbmcgdGFibGUuICAqLworLSAgICAgIG5sc191aW50MzIgbGVuID0gc3RybGVuIChtc2dpZCk7CistICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7CistICAgICAgbmxzX3VpbnQzMiBpZHggPSBoYXNoX3ZhbCAlIGRvbWFpbi0+aGFzaF9zaXplOworLSAgICAgIG5sc191aW50MzIgaW5jciA9IDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7CistICAgICAgbmxzX3VpbnQzMiBuc3RyID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7CistCistICAgICAgaWYgKG5zdHIgPT0gMCkKKy0JLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCistCXJldHVybiBOVUxMOworLQorLSAgICAgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ubGVuZ3RoKSA9PSBsZW4KKy0JICAmJiBzdHJjbXAgKG1zZ2lkLAorLQkJICAgICBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKy0JCQkJICAgICAgIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLm9mZnNldCkpID09IDApCistCXJldHVybiAoY2hhciAqKSBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKy0JCQkJCSAgZG9tYWluLT50cmFuc190YWJbbnN0ciAtIDFdLm9mZnNldCk7CistCistICAgICAgd2hpbGUgKDEpCistCXsKKy0JICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKKy0JICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7CistCSAgZWxzZQorLQkgICAgaWR4ICs9IGluY3I7CistCistCSAgbnN0ciA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOworLQkgIGlmIChuc3RyID09IDApCistCSAgICAvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KKy0JICAgIHJldHVybiBOVUxMOworLQorLQkgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ubGVuZ3RoKSA9PSBsZW4KKy0JICAgICAgJiYgc3RyY21wIChtc2dpZCwKKy0JCQkgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCistCQkJCQkgICBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5vZmZzZXQpKQorLQkgICAgICAgICA9PSAwKQorLQkgICAgcmV0dXJuIChjaGFyICopIGRvbWFpbi0+ZGF0YQorLQkgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYltuc3RyIC0gMV0ub2Zmc2V0KTsKKy0JfQorLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKy0gICAgfQorLQorLSAgLyogTm93IHdlIHRyeSB0aGUgZGVmYXVsdCBtZXRob2Q6ICBiaW5hcnkgc2VhcmNoIGluIHRoZSBzb3J0ZWQKKy0gICAgIGFycmF5IG9mIG1lc3NhZ2VzLiAgKi8KKy0gIGJvdHRvbSA9IDA7CistICB0b3AgPSBkb21haW4tPm5zdHJpbmdzOworLSAgd2hpbGUgKGJvdHRvbSA8IHRvcCkKKy0gICAgeworLSAgICAgIGludCBjbXBfdmFsOworLQorLSAgICAgIGFjdCA9IChib3R0b20gKyB0b3ApIC8gMjsKKy0gICAgICBjbXBfdmFsID0gc3RyY21wIChtc2dpZCwgZG9tYWluLT5kYXRhCistCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCistCQkJCSAgICBkb21haW4tPm9yaWdfdGFiW2FjdF0ub2Zmc2V0KSk7CistICAgICAgaWYgKGNtcF92YWwgPCAwKQorLQl0b3AgPSBhY3Q7CistICAgICAgZWxzZSBpZiAoY21wX3ZhbCA+IDApCistCWJvdHRvbSA9IGFjdCArIDE7CistICAgICAgZWxzZQorLQlicmVhazsKKy0gICAgfQorLQorLSAgLyogSWYgYW4gdHJhbnNsYXRpb24gaXMgZm91bmQgcmV0dXJuIHRoaXMuICAqLworLSAgcmV0dXJuIGJvdHRvbSA+PSB0b3AgPyBOVUxMIDogKGNoYXIgKikgZG9tYWluLT5kYXRhCistICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorLQkJCQkgICAgIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ub2Zmc2V0KTsKKy19CistCistCistLyogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBsb2NhbGUgQ0FURUdPUlkuICAqLworLXN0YXRpYyBjb25zdCBjaGFyICoKKy1jYXRlZ29yeV90b19uYW1lIChjYXRlZ29yeSkKKy0gICAgIGludCBjYXRlZ29yeTsKKy17CistICBjb25zdCBjaGFyICpyZXR2YWw7CistCistICBzd2l0Y2ggKGNhdGVnb3J5KQorLSAgeworLSNpZmRlZiBMQ19DT0xMQVRFCistICBjYXNlIExDX0NPTExBVEU6CistICAgIHJldHZhbCA9ICJMQ19DT0xMQVRFIjsKKy0gICAgYnJlYWs7CistI2VuZGlmCistI2lmZGVmIExDX0NUWVBFCistICBjYXNlIExDX0NUWVBFOgorLSAgICByZXR2YWwgPSAiTENfQ1RZUEUiOworLSAgICBicmVhazsKKy0jZW5kaWYKKy0jaWZkZWYgTENfTU9ORVRBUlkKKy0gIGNhc2UgTENfTU9ORVRBUlk6CistICAgIHJldHZhbCA9ICJMQ19NT05FVEFSWSI7CistICAgIGJyZWFrOworLSNlbmRpZgorLSNpZmRlZiBMQ19OVU1FUklDCistICBjYXNlIExDX05VTUVSSUM6CistICAgIHJldHZhbCA9ICJMQ19OVU1FUklDIjsKKy0gICAgYnJlYWs7CistI2VuZGlmCistI2lmZGVmIExDX1RJTUUKKy0gIGNhc2UgTENfVElNRToKKy0gICAgcmV0dmFsID0gIkxDX1RJTUUiOworLSAgICBicmVhazsKKy0jZW5kaWYKKy0jaWZkZWYgTENfTUVTU0FHRVMKKy0gIGNhc2UgTENfTUVTU0FHRVM6CistICAgIHJldHZhbCA9ICJMQ19NRVNTQUdFUyI7CistICAgIGJyZWFrOworLSNlbmRpZgorLSNpZmRlZiBMQ19SRVNQT05TRQorLSAgY2FzZSBMQ19SRVNQT05TRToKKy0gICAgcmV0dmFsID0gIkxDX1JFU1BPTlNFIjsKKy0gICAgYnJlYWs7CistI2VuZGlmCistI2lmZGVmIExDX0FMTAorLSAgY2FzZSBMQ19BTEw6CistICAgIC8qIFRoaXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UgYnV0IGlzIHBlcmhhcHMgYmV0dGVyIHRoYW4gYW55IG90aGVyCistICAgICAgIHZhbHVlLiAgKi8KKy0gICAgcmV0dmFsID0gIkxDX0FMTCI7CistICAgIGJyZWFrOworLSNlbmRpZgorLSAgZGVmYXVsdDoKKy0gICAgLyogSWYgeW91IGhhdmUgYSBiZXR0ZXIgaWRlYSBmb3IgYSBkZWZhdWx0IHZhbHVlIGxldCBtZSBrbm93LiAgKi8KKy0gICAgcmV0dmFsID0gIkxDX1hYWCI7CistICB9CistCistICByZXR1cm4gcmV0dmFsOworLX0KKy0KKy0vKiBHdWVzcyB2YWx1ZSBvZiBjdXJyZW50IGxvY2FsZSBmcm9tIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLworLXN0YXRpYyBjb25zdCBjaGFyICoKKy1ndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSkKKy0gICAgIGludCBjYXRlZ29yeTsKKy0gICAgIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKKy17CistICBjb25zdCBjaGFyICpyZXR2YWw7CistCistICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudAorLSAgICAgdmFyaWFibGUuICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCistICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOworLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQorLSAgICByZXR1cm4gcmV0dmFsOworLQorLSAgLyogYExBTkdVQUdFJyBpcyBub3Qgc2V0LiAgU28gd2UgaGF2ZSB0byBwcm9jZWVkIHdpdGggdGhlIFBPU0lYCistICAgICBtZXRob2RzIG9mIGxvb2tpbmcgdG8gYExDX0FMTCcsIGBMQ194eHgnLCBhbmQgYExBTkcnLiAgT24gc29tZQorLSAgICAgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZSBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLworLSNpZiBkZWZpbmVkIEhBVkVfU0VUTE9DQUxFICYmIGRlZmluZWQgSEFWRV9MQ19NRVNTQUdFUyAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKKy0gIHJldHVybiBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKTsKKy0jZWxzZQorLSAgLyogU2V0dGluZyBvZiBMQ19BTEwgb3ZlcndyaXRlcyBhbGwgb3RoZXIuICAqLworLSAgcmV0dmFsID0gZ2V0ZW52ICgiTENfQUxMIik7CistICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCistICAgIHJldHVybiByZXR2YWw7CistCistICAvKiBOZXh0IGNvbWVzIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNhdGVnb3J5LiAgKi8KKy0gIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKKy0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKKy0gICAgcmV0dXJuIHJldHZhbDsKKy0KKy0gIC8qIExhc3QgcG9zc2liaWxpdHkgaXMgdGhlIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLworLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFORyIpOworLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQorLSAgICByZXR1cm4gcmV0dmFsOworLQorLSAgLyogV2UgdXNlIEMgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiAgUE9TSVggc2F5cyB0aGlzIGlzIGltcGxlbWVudGF0aW9uCistICAgICBkZWZpbmVkLiAgKi8KKy0gIHJldHVybiAiQyI7CistI2VuZGlmCistfQorLQorLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworLQorLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCistICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKKy0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQorLSAgIHRvIGJlIGRlZmluZWQuICAqLworLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCistc3RhdGljIGNoYXIgKgorLXN0cGNweSAoZGVzdCwgc3JjKQorLSAgICAgY2hhciAqZGVzdDsKKy0gICAgIGNvbnN0IGNoYXIgKnNyYzsKKy17CistICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCistICAgIC8qIERvIG5vdGhpbmcuICovIDsKKy0gIHJldHVybiBkZXN0IC0gMTsKKy19CistI2VuZGlmCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZGNpZ2V0dGV4dC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL2RjaWdldHRleHQuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjM2OTc0NTk2MCAtMDQwMAorQEAgLTAsMCArMSwxMjE5IEBACisrLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGRjaWdldHRleHQgZnVuY3Rpb24uCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgYW55IGxhdGVyIHZlcnNpb24uCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisrCisrLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgbWVtcGNweSgpLgorKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKysjaWZuZGVmIF9HTlVfU09VUkNFCisrIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorKyNlbmRpZgorKworKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrIyBpbmNsdWRlIDxjb25maWcuaD4KKysjZW5kaWYKKysKKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrCisrI2lmZGVmIF9fR05VQ19fCisrIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKysjIGRlZmluZSBIQVZFX0FMTE9DQSAxCisrI2Vsc2UKKysjIGlmZGVmIF9NU0NfVkVSCisrIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisrIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisrIyBlbHNlCisrIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKKysjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisrIyAgZWxzZQorKyMgICBpZmRlZiBfQUlYCisrICNwcmFnbWEgYWxsb2NhCisrIyAgIGVsc2UKKysjICAgIGlmbmRlZiBhbGxvY2EKKytjaGFyICphbGxvY2EgKCk7CisrIyAgICBlbmRpZgorKyMgICBlbmRpZgorKyMgIGVuZGlmCisrIyBlbmRpZgorKyNlbmRpZgorKworKyNpbmNsdWRlIDxlcnJuby5oPgorKyNpZm5kZWYgZXJybm8KKytleHRlcm4gaW50IGVycm5vOworKyNlbmRpZgorKyNpZm5kZWYgX19zZXRfZXJybm8KKysjIGRlZmluZSBfX3NldF9lcnJubyh2YWwpIGVycm5vID0gKHZhbCkKKysjZW5kaWYKKysKKysjaW5jbHVkZSA8c3RkZGVmLmg+CisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxzdHJpbmcuaD4KKysKKysjaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKKysjIGluY2x1ZGUgPHVuaXN0ZC5oPgorKyNlbmRpZgorKworKyNpbmNsdWRlIDxsb2NhbGUuaD4KKysKKysjaWZkZWYgX0xJQkMKKysgIC8qIEd1ZXNzIHdoZXRoZXIgaW50ZWdlciBkaXZpc2lvbiBieSB6ZXJvIHJhaXNlcyBzaWduYWwgU0lHRlBFLgorKyAgICAgU2V0IHRvIDEgb25seSBpZiB5b3Uga25vdyBmb3Igc3VyZS4gIEluIGNhc2Ugb2YgZG91YnQsIHNldCB0byAwLiAgKi8KKysjIGlmIGRlZmluZWQgX19hbHBoYV9fIHx8IGRlZmluZWQgX19hcm1fXyB8fCBkZWZpbmVkIF9faTM4Nl9fIFwKKysgICAgIHx8IGRlZmluZWQgX19tNjhrX18gfHwgZGVmaW5lZCBfX3MzOTBfXworKyMgIGRlZmluZSBJTlRESVYwX1JBSVNFU19TSUdGUEUgMQorKyMgZWxzZQorKyMgIGRlZmluZSBJTlRESVYwX1JBSVNFU19TSUdGUEUgMAorKyMgZW5kaWYKKysjZW5kaWYKKysjaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQorKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisrI2VuZGlmCisrCisrI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCB8fCBkZWZpbmVkIF9MSUJDCisrIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKysjZW5kaWYKKysKKysjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKysjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorKyNpZmRlZiBfTElCQworKyMgaW5jbHVkZSA8bGliaW50bC5oPgorKyNlbHNlCisrIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisrI2VuZGlmCisrI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCisrCisrLyogVGhyZWFkIHNhZmV0eW5lc3MuICAqLworKyNpZmRlZiBfTElCQworKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKysjZWxzZQorKy8qIFByb3ZpZGUgZHVtbXkgaW1wbGVtZW50YXRpb24gaWYgdGhpcyBpcyBvdXRzaWRlIGdsaWJjLiAgKi8KKysjIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsIE5BTUUpCisrIyBkZWZpbmUgX19saWJjX2xvY2tfbG9jayhOQU1FKQorKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9jayhOQU1FKQorKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLCBOQU1FKQorKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfcmRsb2NrKE5BTUUpCisrIyBkZWZpbmUgX19saWJjX3J3bG9ja191bmxvY2soTkFNRSkKKysjZW5kaWYKKysKKysvKiBBbGlnbm1lbnQgb2YgdHlwZXMuICAqLworKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKysjIGRlZmluZSBhbGlnbm9mKFRZUEUpIF9fYWxpZ25vZl9fIChUWVBFKQorKyNlbHNlCisrIyBkZWZpbmUgYWxpZ25vZihUWVBFKSBcCisrICAgICgoaW50KSAmKChzdHJ1Y3QgeyBjaGFyIGR1bW15MTsgVFlQRSBkdW1teTI7IH0gKikgMCktPmR1bW15MikKKysjZW5kaWYKKysKKysvKiBUaGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoZSBzdGFuZGFsb25lIGxpYmludGwuYSBtdXN0IGhhdmUgZGlmZmVyZW50CisrICAgbmFtZXMgdGhhbiB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIEdOVSBsaWJjLCBvdGhlcndpc2UgcHJvZ3JhbXMKKysgICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KKysjaWYgIWRlZmluZWQgX0xJQkMKKysjIGRlZmluZSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4KKysjIGRlZmluZSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4KKysjIGRlZmluZSBfbmxfZGVmYXVsdF9kaXJuYW1lIGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lCisrIyBkZWZpbmUgX25sX2RvbWFpbl9iaW5kaW5ncyBsaWJpbnRsX25sX2RvbWFpbl9iaW5kaW5ncworKyNlbmRpZgorKworKy8qIFNvbWUgY29tcGlsZXJzLCBsaWtlIFN1bk9TNCBjYywgZG9uJ3QgaGF2ZSBvZmZzZXRvZiBpbiA8c3RkZGVmLmg+LiAgKi8KKysjaWZuZGVmIG9mZnNldG9mCisrIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSxpZGVudCkgKChzaXplX3QpJigoKHR5cGUqKTApLT5pZGVudCkpCisrI2VuZGlmCisrCisrLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworKworKyNpZmRlZiBfTElCQworKy8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorKyAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKysgICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCisrIyBkZWZpbmUgZ2V0Y3dkIF9fZ2V0Y3dkCisrIyBpZm5kZWYgc3RwY3B5CisrIyAgZGVmaW5lIHN0cGNweSBfX3N0cGNweQorKyMgZW5kaWYKKysjIGRlZmluZSB0ZmluZCBfX3RmaW5kCisrI2Vsc2UKKysjIGlmICFkZWZpbmVkIEhBVkVfR0VUQ1dECisrY2hhciAqZ2V0d2QgKCk7CisrIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKKysjIGVsc2UKKysjICBpZiBWTVMKKysjICAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgKGdldGN3ZCkgKGJ1ZiwgbWF4LCAwKQorKyMgIGVsc2UKKytjaGFyICpnZXRjd2QgKCk7CisrIyAgZW5kaWYKKysjIGVuZGlmCisrIyBpZm5kZWYgSEFWRV9TVFBDUFkKKytzdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOworKyMgZW5kaWYKKysjIGlmbmRlZiBIQVZFX01FTVBDUFkKKytzdGF0aWMgdm9pZCAqbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7CisrIyBlbmRpZgorKyNlbmRpZgorKworKy8qIEFtb3VudCB0byBpbmNyZWFzZSBidWZmZXIgc2l6ZSBieSBpbiBlYWNoIHRyeS4gICovCisrI2RlZmluZSBQQVRIX0lOQ1IgMzIKKysKKysvKiBUaGUgZm9sbG93aW5nIGlzIGZyb20gcGF0aG1heC5oLiAgKi8KKysvKiBOb24tUE9TSVggQlNEIHN5c3RlbXMgbWlnaHQgaGF2ZSBnY2MncyBsaW1pdHMuaCwgd2hpY2ggZG9lc24ndCBkZWZpbmUKKysgICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKKysgICBsYXRlciBpbmNsdWRlZCAoYXMgb24gTU9SRS9CU0QgNC4zKS4gICovCisrI2lmIGRlZmluZWQgX1BPU0lYX1ZFUlNJT04gfHwgKGRlZmluZWQgSEFWRV9MSU1JVFNfSCAmJiAhZGVmaW5lZCBfX0dOVUNfXykKKysjIGluY2x1ZGUgPGxpbWl0cy5oPgorKyNlbmRpZgorKworKyNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCisrIyBkZWZpbmUgX1BPU0lYX1BBVEhfTUFYIDI1NQorKyNlbmRpZgorKworKyNpZiAhZGVmaW5lZCBQQVRIX01BWCAmJiBkZWZpbmVkIF9QQ19QQVRIX01BWAorKyMgZGVmaW5lIFBBVEhfTUFYIChwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpIDwgMSA/IDEwMjQgOiBwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpKQorKyNlbmRpZgorKworKy8qIERvbid0IGluY2x1ZGUgc3lzL3BhcmFtLmggaWYgaXQgYWxyZWFkeSBoYXMgYmVlbi4gICovCisrI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCAmJiAhZGVmaW5lZCBQQVRIX01BWCAmJiAhZGVmaW5lZCBNQVhQQVRITEVOCisrIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKysjZW5kaWYKKysKKysjaWYgIWRlZmluZWQgUEFUSF9NQVggJiYgZGVmaW5lZCBNQVhQQVRITEVOCisrIyBkZWZpbmUgUEFUSF9NQVggTUFYUEFUSExFTgorKyNlbmRpZgorKworKyNpZm5kZWYgUEFUSF9NQVgKKysjIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKKysjZW5kaWYKKysKKysvKiBQYXRobmFtZSBzdXBwb3J0LgorKyAgIElTU0xBU0goQykgICAgICAgICAgIHRlc3RzIHdoZXRoZXIgQyBpcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyLgorKyAgIElTX0FCU09MVVRFX1BBVEgoUCkgIHRlc3RzIHdoZXRoZXIgUCBpcyBhbiBhYnNvbHV0ZSBwYXRoLiAgSWYgaXQgaXMgbm90LAorKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCisrICAgSVNfUEFUSF9XSVRIX0RJUihQKSAgdGVzdHMgd2hldGhlciBQIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24uCisrICovCisrI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCisrIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisrICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKKysgICAgICYmIChQKVsxXSA9PSAnOicpCisrIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKKysjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIFwKKysgICAgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMIHx8IHN0cmNociAoUCwgJ1xcJykgIT0gTlVMTCB8fCBIQVNfREVWSUNFIChQKSkKKysjZWxzZQorKyAgLyogVW5peCAqLworKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCisrIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCisrIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwpCisrI2VuZGlmCisrCisrLyogVGhpcyBpcyB0aGUgdHlwZSB1c2VkIGZvciB0aGUgc2VhcmNoIHRyZWUgd2hlcmUga25vd24gdHJhbnNsYXRpb25zCisrICAgYXJlIHN0b3JlZC4gICovCisrc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QKKyt7CisrICAvKiBEb21haW4gaW4gd2hpY2ggdG8gc2VhcmNoLiAgKi8KKysgIGNoYXIgKmRvbWFpbm5hbWU7CisrCisrICAvKiBUaGUgY2F0ZWdvcnkuICAqLworKyAgaW50IGNhdGVnb3J5OworKworKyAgLyogU3RhdGUgb2YgdGhlIGNhdGFsb2cgY291bnRlciBhdCB0aGUgcG9pbnQgdGhlIHN0cmluZyB3YXMgZm91bmQuICAqLworKyAgaW50IGNvdW50ZXI7CisrCisrICAvKiBDYXRhbG9nIHdoZXJlIHRoZSBzdHJpbmcgd2FzIGZvdW5kLiAgKi8KKysgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKKysKKysgIC8qIEFuZCBmaW5hbGx5IHRoZSB0cmFuc2xhdGlvbi4gICovCisrICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbjsKKysgIHNpemVfdCB0cmFuc2xhdGlvbl9sZW5ndGg7CisrCisrICAvKiBQb2ludGVyIHRvIHRoZSBzdHJpbmcgaW4gcXVlc3Rpb24uICAqLworKyAgY2hhciBtc2dpZFtaRVJPXTsKKyt9OworKworKy8qIFJvb3Qgb2YgdGhlIHNlYXJjaCB0cmVlIHdpdGgga25vd24gdHJhbnNsYXRpb25zLiAgV2UgY2FuIHVzZSB0aGlzCisrICAgb25seSBpZiB0aGUgc3lzdGVtIHByb3ZpZGVzIHRoZSBgdHNlYXJjaCcgZnVuY3Rpb24gZmFtaWx5LiAgKi8KKysjaWYgZGVmaW5lZCBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQworKyMgaW5jbHVkZSA8c2VhcmNoLmg+CisrCisrc3RhdGljIHZvaWQgKnJvb3Q7CisrCisrIyBpZmRlZiBfTElCQworKyMgIGRlZmluZSB0c2VhcmNoIF9fdHNlYXJjaAorKyMgZW5kaWYKKysKKysvKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBrbm93biB0cmFuc2xhdGlvbnMuICAqLworK3N0YXRpYyBpbnQKKyt0cmFuc2NtcCAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQorK3sKKysgIGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICpzMTsKKysgIGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICpzMjsKKysgIGludCByZXN1bHQ7CisrCisrICBzMSA9IChjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKSBwMTsKKysgIHMyID0gKGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopIHAyOworKworKyAgcmVzdWx0ID0gc3RyY21wIChzMS0+bXNnaWQsIHMyLT5tc2dpZCk7CisrICBpZiAocmVzdWx0ID09IDApCisrICAgIHsKKysgICAgICByZXN1bHQgPSBzdHJjbXAgKHMxLT5kb21haW5uYW1lLCBzMi0+ZG9tYWlubmFtZSk7CisrICAgICAgaWYgKHJlc3VsdCA9PSAwKQorKwkvKiBXZSBjb21wYXJlIHRoZSBjYXRlZ29yeSBsYXN0ICh0aG91Z2ggdGhpcyBpcyB0aGUgY2hlYXBlc3QKKysJICAgb3BlcmF0aW9uKSBzaW5jZSBpdCBpcyBob3BlZnVsbHkgYWx3YXlzIHRoZSBzYW1lIChuYW1lbHkKKysJICAgTENfTUVTU0FHRVMpLiAgKi8KKysJcmVzdWx0ID0gczEtPmNhdGVnb3J5IC0gczItPmNhdGVnb3J5OworKyAgICB9CisrCisrICByZXR1cm4gcmVzdWx0OworK30KKysjZW5kaWYKKysKKysjaWZuZGVmIElOVFZBUkRFRgorKyMgZGVmaW5lIElOVFZBUkRFRihuYW1lKQorKyNlbmRpZgorKyNpZm5kZWYgSU5UVVNFCisrIyBkZWZpbmUgSU5UVVNFKG5hbWUpIG5hbWUKKysjZW5kaWYKKysKKysvKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCisrICAgdGV4dGRvbWFpbigzKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGlzICJtZXNzYWdlcyIuICAqLworK2NvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSBhdHRyaWJ1dGVfaGlkZGVuID0gIm1lc3NhZ2VzIjsKKysKKysvKiBWYWx1ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGRvbWFpbiBmb3IgZ2V0dGV4dCgzKS4gICovCisrY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gYXR0cmlidXRlX2hpZGRlbgorKyAgICAgPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKKysKKysvKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCisrI2lmIGRlZmluZWQgX19FTVhfXworK2V4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKKysjZWxzZQorK2NvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gTE9DQUxFRElSOworK0lOVFZBUkRFRiAoX25sX2RlZmF1bHRfZGlybmFtZSkKKysjZW5kaWYKKysKKysvKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucyBjcmVhdGVkIGJ5IGJpbmR0ZXh0ZG9tYWluKCkKKysgICBjYWxscy4gICovCisrc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7CisrCisrLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KKytzdGF0aWMgY2hhciAqcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLAorKwkJCSAgICB1bnNpZ25lZCBsb25nIGludCBuLAorKwkJCSAgICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbiwgc2l6ZV90IHRyYW5zbGF0aW9uX2xlbikKKysgICAgIGludGVybmFsX2Z1bmN0aW9uOworK3N0YXRpYyBjb25zdCBjaGFyICpndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LAorKwkJCQkJIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKKysgICAgIGludGVybmFsX2Z1bmN0aW9uOworKyNpZmRlZiBfTElCQworKyMgaW5jbHVkZSAiLi4vbG9jYWxlL2xvY2FsZWluZm8uaCIKKysjIGRlZmluZSBjYXRlZ29yeV90b19uYW1lKGNhdGVnb3J5KQlfbmxfY2F0ZWdvcnlfbmFtZXNbY2F0ZWdvcnldCisrI2Vsc2UKKytzdGF0aWMgY29uc3QgY2hhciAqY2F0ZWdvcnlfdG9fbmFtZSAoaW50IGNhdGVnb3J5KSBpbnRlcm5hbF9mdW5jdGlvbjsKKysjZW5kaWYKKysKKysKKysvKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKKysgICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLworKyNpZmRlZiBIQVZFX0FMTE9DQQorKy8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLworKyMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KKysjIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLworKyMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KKysjZWxzZQorK3N0cnVjdCBibG9ja19saXN0CisreworKyAgdm9pZCAqYWRkcmVzczsKKysgIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OworK307CisrIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAorKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKysgICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCisrICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKKysgICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCisrICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAorKyAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAorKyAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAorKyAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKKysgICAgfQkJCQkJCQkJCSAgICAgIFwKKysgIH0gd2hpbGUgKDApCisrIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCisrICBkbyB7CQkJCQkJCQkJICAgICAgXAorKyAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAorKyAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAorKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKKysgICAgICBmcmVlIChvbGQtPmFkZHJlc3MpOwkJCQkJCSAgICAgIFwKKysgICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCisrICAgIH0JCQkJCQkJCQkgICAgICBcCisrICB9IHdoaWxlICgwKQorKyMgdW5kZWYgYWxsb2NhCisrIyBkZWZpbmUgYWxsb2NhKHNpemUpIChtYWxsb2MgKHNpemUpKQorKyMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCisrI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCisrCisrCisrI2lmZGVmIF9MSUJDCisrLyogTGlzdCBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciB0cmFuc2xhdGlvbnMuICAqLworK3R5cGVkZWYgc3RydWN0IHRyYW5zbWVtX2xpc3QKKyt7CisrICBzdHJ1Y3QgdHJhbnNtZW1fbGlzdCAqbmV4dDsKKysgIGNoYXIgZGF0YVtaRVJPXTsKKyt9IHRyYW5zbWVtX2Jsb2NrX3Q7Cisrc3RhdGljIHN0cnVjdCB0cmFuc21lbV9saXN0ICp0cmFuc21lbV9saXN0OworKyNlbHNlCisrdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRyYW5zbWVtX2Jsb2NrX3Q7CisrI2VuZGlmCisrCisrCisrLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKysgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKysgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworKyNpZmRlZiBfTElCQworKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisrI2Vsc2UKKysjIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAorKyNlbmRpZgorKworKy8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLworKyNpZmRlZiBfTElCQworK19fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkICgsIF9ubF9zdGF0ZV9sb2NrIGF0dHJpYnV0ZV9oaWRkZW4pCisrI2VuZGlmCisrCisrLyogQ2hlY2tpbmcgd2hldGhlciB0aGUgYmluYXJpZXMgcnVucyBTVUlEIG11c3QgYmUgZG9uZSBhbmQgZ2xpYmMgcHJvdmlkZXMKKysgICBlYXNpZXIgbWV0aG9kcyB0aGVyZWZvcmUgd2UgbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisrI2lmZGVmIF9MSUJDCisrIyBkZWZpbmUgRU5BQkxFX1NFQ1VSRSBfX2xpYmNfZW5hYmxlX3NlY3VyZQorKyMgZGVmaW5lIERFVEVSTUlORV9TRUNVUkUKKysjZWxzZQorKyMgaWZuZGVmIEhBVkVfR0VUVUlECisrIyAgZGVmaW5lIGdldHVpZCgpIDAKKysjIGVuZGlmCisrIyBpZm5kZWYgSEFWRV9HRVRHSUQKKysjICBkZWZpbmUgZ2V0Z2lkKCkgMAorKyMgZW5kaWYKKysjIGlmbmRlZiBIQVZFX0dFVEVVSUQKKysjICBkZWZpbmUgZ2V0ZXVpZCgpIGdldHVpZCgpCisrIyBlbmRpZgorKyMgaWZuZGVmIEhBVkVfR0VURUdJRAorKyMgIGRlZmluZSBnZXRlZ2lkKCkgZ2V0Z2lkKCkKKysjIGVuZGlmCisrc3RhdGljIGludCBlbmFibGVfc2VjdXJlOworKyMgZGVmaW5lIEVOQUJMRV9TRUNVUkUgKGVuYWJsZV9zZWN1cmUgPT0gMSkKKysjIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFIFwKKysgIGlmIChlbmFibGVfc2VjdXJlID09IDApCQkJCQkJICAgICAgXAorKyAgICB7CQkJCQkJCQkJICAgICAgXAorKyAgICAgIGlmIChnZXR1aWQgKCkgIT0gZ2V0ZXVpZCAoKSB8fCBnZXRnaWQgKCkgIT0gZ2V0ZWdpZCAoKSkJCSAgICAgIFwKKysJZW5hYmxlX3NlY3VyZSA9IDE7CQkJCQkJICAgICAgXAorKyAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKysJZW5hYmxlX3NlY3VyZSA9IC0xOwkJCQkJCSAgICAgIFwKKysgICAgfQorKyNlbmRpZgorKworKy8qIEdldCB0aGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUgdGhlIHBsdXJhbCBleHByZXNzaW9uLiAgKi8KKysjaW5jbHVkZSAiZXZhbC1wbHVyYWwuaCIKKysKKysvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKysgICBDQVRFR09SWSBsb2NhbGUgYW5kLCBpZiBQTFVSQUwgaXMgbm9uemVybywgc2VhcmNoIG92ZXIgc3RyaW5nCisrICAgZGVwZW5kaW5nIG9uIHRoZSBwbHVyYWwgZm9ybSBkZXRlcm1pbmVkIGJ5IE4uICAqLworK2NoYXIgKgorK0RDSUdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLAorKwkgICAgaW50IHBsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgbiwgaW50IGNhdGVnb3J5KQorK3sKKysjaWZuZGVmIEhBVkVfQUxMT0NBCisrICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7CisrI2VuZGlmCisrICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW47CisrICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKKysgIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKKysgIGNvbnN0IGNoYXIgKmNhdGVnb3J5dmFsdWU7CisrICBjaGFyICpkaXJuYW1lLCAqeGRvbWFpbm5hbWU7CisrICBjaGFyICpzaW5nbGVfbG9jYWxlOworKyAgY2hhciAqcmV0dmFsOworKyAgc2l6ZV90IHJldGxlbjsKKysgIGludCBzYXZlZF9lcnJubzsKKysjaWYgZGVmaW5lZCBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQworKyAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnNlYXJjaDsKKysgIHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqZm91bmRwID0gTlVMTDsKKysgIHNpemVfdCBtc2dpZF9sZW47CisrI2VuZGlmCisrICBzaXplX3QgZG9tYWlubmFtZV9sZW47CisrCisrICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KKysgIGlmIChtc2dpZDEgPT0gTlVMTCkKKysgICAgcmV0dXJuIE5VTEw7CisrCisrI2lmZGVmIF9MSUJDCisrICBpZiAoY2F0ZWdvcnkgPCAwIHx8IGNhdGVnb3J5ID49IF9fTENfTEFTVCB8fCBjYXRlZ29yeSA9PSBMQ19BTEwpCisrICAgIC8qIEJvZ3VzLiAgKi8KKysgICAgcmV0dXJuIChwbHVyYWwgPT0gMAorKwkgICAgPyAoY2hhciAqKSBtc2dpZDEKKysJICAgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLworKwkgICAgOiBuID09IDEgPyAoY2hhciAqKSBtc2dpZDEgOiAoY2hhciAqKSBtc2dpZDIpOworKyNlbmRpZgorKworKyAgX19saWJjX3J3bG9ja19yZGxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKysKKysgIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKKysgICAgIENBVEVHT1JZIGlzIG5vdCBMQ19NRVNTQUdFUyB0aGlzIG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgYnV0IHRoZQorKyAgICAgZGVmaW5pdGlvbiBsZWZ0IHRoaXMgdW5kZWZpbmVkLiAgKi8KKysgIGlmIChkb21haW5uYW1lID09IE5VTEwpCisrICAgIGRvbWFpbm5hbWUgPSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKysKKysgIC8qIE9TLzIgc3BlY2lmaWM6IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBsaWJpbnRsIHZlcnNpb25zICAqLworKyNpZmRlZiBMQ19NRVNTQUdFU19DT01QQVQKKysgIGlmIChjYXRlZ29yeSA9PSBMQ19NRVNTQUdFU19DT01QQVQpCisrICAgIGNhdGVnb3J5ID0gTENfTUVTU0FHRVM7CisrI2VuZGlmCisrCisrI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKKysgIG1zZ2lkX2xlbiA9IHN0cmxlbiAobXNnaWQxKSArIDE7CisrCisrICAvKiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gYW1vbmcgdGhvc2Ugd2hpY2ggd2UgZm91bmQgYXQKKysgICAgIHNvbWUgdGltZS4gICovCisrICBzZWFyY2ggPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikKKysJICAgYWxsb2NhIChvZmZzZXRvZiAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QsIG1zZ2lkKSArIG1zZ2lkX2xlbik7CisrICBtZW1jcHkgKHNlYXJjaC0+bXNnaWQsIG1zZ2lkMSwgbXNnaWRfbGVuKTsKKysgIHNlYXJjaC0+ZG9tYWlubmFtZSA9IChjaGFyICopIGRvbWFpbm5hbWU7CisrICBzZWFyY2gtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisrCisrICBmb3VuZHAgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKiopIHRmaW5kIChzZWFyY2gsICZyb290LCB0cmFuc2NtcCk7CisrICBmcmVlYSAoc2VhcmNoKTsKKysgIGlmIChmb3VuZHAgIT0gTlVMTCAmJiAoKmZvdW5kcCktPmNvdW50ZXIgPT0gX25sX21zZ19jYXRfY250cikKKysgICAgeworKyAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KKysgICAgICBpZiAocGx1cmFsKQorKwlyZXR2YWwgPSBwbHVyYWxfbG9va3VwICgoKmZvdW5kcCktPmRvbWFpbiwgbiwgKCpmb3VuZHApLT50cmFuc2xhdGlvbiwKKysJCQkJKCpmb3VuZHApLT50cmFuc2xhdGlvbl9sZW5ndGgpOworKyAgICAgIGVsc2UKKysJcmV0dmFsID0gKGNoYXIgKikgKCpmb3VuZHApLT50cmFuc2xhdGlvbjsKKysKKysgICAgICBfX2xpYmNfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOworKyAgICAgIHJldHVybiByZXR2YWw7CisrICAgIH0KKysjZW5kaWYKKysKKysgIC8qIFByZXNlcnZlIHRoZSBgZXJybm8nIHZhbHVlLiAgKi8KKysgIHNhdmVkX2Vycm5vID0gZXJybm87CisrCisrICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgb3Igbm90LiAgKi8KKysgIERFVEVSTUlORV9TRUNVUkU7CisrCisrICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLworKyAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKKysgICAgeworKyAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKKysgICAgICBpZiAoY29tcGFyZSA9PSAwKQorKwkvKiBXZSBmb3VuZCBpdCEgICovCisrCWJyZWFrOworKyAgICAgIGlmIChjb21wYXJlIDwgMCkKKysJeworKwkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCisrCSAgYmluZGluZyA9IE5VTEw7CisrCSAgYnJlYWs7CisrCX0KKysgICAgfQorKworKyAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKKysgICAgZGlybmFtZSA9IChjaGFyICopIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKysgIGVsc2UgaWYgKElTX0FCU09MVVRFX1BBVEggKGJpbmRpbmctPmRpcm5hbWUpKQorKyAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKKysgIGVsc2UKKysgICAgeworKyAgICAgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLworKyAgICAgIHNpemVfdCBkaXJuYW1lX2xlbiA9IHN0cmxlbiAoYmluZGluZy0+ZGlybmFtZSkgKyAxOworKyAgICAgIHNpemVfdCBwYXRoX21heDsKKysgICAgICBjaGFyICpyZXQ7CisrCisrICAgICAgcGF0aF9tYXggPSAodW5zaWduZWQgaW50KSBQQVRIX01BWDsKKysgICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KKysKKysgICAgICBmb3IgKDs7KQorKwl7CisrCSAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7CisrCSAgQUREX0JMT0NLIChibG9ja19saXN0LCBkaXJuYW1lKTsKKysKKysJICBfX3NldF9lcnJubyAoMCk7CisrCSAgcmV0ID0gZ2V0Y3dkIChkaXJuYW1lLCBwYXRoX21heCk7CisrCSAgaWYgKHJldCAhPSBOVUxMIHx8IGVycm5vICE9IEVSQU5HRSkKKysJICAgIGJyZWFrOworKworKwkgIHBhdGhfbWF4ICs9IHBhdGhfbWF4IC8gMjsKKysJICBwYXRoX21heCArPSBQQVRIX0lOQ1I7CisrCX0KKysKKysgICAgICBpZiAocmV0ID09IE5VTEwpCisrCS8qIFdlIGNhbm5vdCBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBEb24ndCBzaWduYWwgYW4KKysJICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KKysJZ290byByZXR1cm5fdW50cmFuc2xhdGVkOworKworKyAgICAgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKGRpcm5hbWUsICdcMCcpLCAiLyIpLCBiaW5kaW5nLT5kaXJuYW1lKTsKKysgICAgfQorKworKyAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KKysgIGNhdGVnb3J5bmFtZSA9IGNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KTsKKysgIGNhdGVnb3J5dmFsdWUgPSBndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7CisrCisrICBkb21haW5uYW1lX2xlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSk7CisrICB4ZG9tYWlubmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeW5hbWUpCisrCQkJCSArIGRvbWFpbm5hbWVfbGVuICsgNSk7CisrICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKKysKKysgIHN0cGNweSAobWVtcGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAorKwkJICBkb21haW5uYW1lLCBkb21haW5uYW1lX2xlbiksCisrCSAgIi5tbyIpOworKworKyAgLyogQ3JlYXRpbmcgd29ya2luZyBhcmVhLiAgKi8KKysgIHNpbmdsZV9sb2NhbGUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnl2YWx1ZSkgKyAxKTsKKysgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgc2luZ2xlX2xvY2FsZSk7CisrCisrCisrICAvKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuICBUaGlzIGlzIGEgbG9vcCBiZWNhdXNlIHdlIHBlcmhhcHMKKysgICAgIGdvdCBhbiBvcmRlcmVkIGxpc3Qgb2YgbGFuZ3VhZ2VzIHRvIGNvbnNpZGVyIGZvciB0aGUgdHJhbnNsYXRpb24uICAqLworKyAgd2hpbGUgKDEpCisrICAgIHsKKysgICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCisrICAgICAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdID09ICc6JykKKysJKytjYXRlZ29yeXZhbHVlOworKyAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCisrCXsKKysJICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKKysJICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCisrCSAgICAgYnkgaW1wbGljaXRseSBhcHBlbmRpbmcgYSAiQyIgZW50cnksIGkuZS4gbm8gdHJhbnNsYXRpb24KKysJICAgICB3aWxsIHRha2UgcGxhY2UuICAqLworKwkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7CisrCSAgc2luZ2xlX2xvY2FsZVsxXSA9ICdcMCc7CisrCX0KKysgICAgICBlbHNlCisrCXsKKysJICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7CisrCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKKysJICAgICpjcCsrID0gKmNhdGVnb3J5dmFsdWUrKzsKKysJICAqY3AgPSAnXDAnOworKworKwkgIC8qIFdoZW4gdGhpcyBpcyBhIFNVSUQgYmluYXJ5IHdlIG11c3Qgbm90IGFsbG93IGFjY2Vzc2luZyBmaWxlcworKwkgICAgIG91dHNpZGUgdGhlIGRlZGljYXRlZCBkaXJlY3Rvcmllcy4gICovCisrCSAgaWYgKEVOQUJMRV9TRUNVUkUgJiYgSVNfUEFUSF9XSVRIX0RJUiAoc2luZ2xlX2xvY2FsZSkpCisrCSAgICAvKiBJbmdvcmUgdGhpcyBlbnRyeS4gICovCisrCSAgICBjb250aW51ZTsKKysJfQorKworKyAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCisrCSBkb21haW4uICBSZXR1cm4gdGhlIE1TR0lELiAgKi8KKysgICAgICBpZiAoc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiQyIpID09IDAKKysJICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCisrCWJyZWFrOworKworKyAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKKysJIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZLiAgKi8KKysgICAgICBkb21haW4gPSBfbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIHNpbmdsZV9sb2NhbGUsIHhkb21haW5uYW1lLCBiaW5kaW5nKTsKKysKKysgICAgICBpZiAoZG9tYWluICE9IE5VTEwpCisrCXsKKysJICByZXR2YWwgPSBfbmxfZmluZF9tc2cgKGRvbWFpbiwgYmluZGluZywgbXNnaWQxLCAmcmV0bGVuKTsKKysKKysJICBpZiAocmV0dmFsID09IE5VTEwpCisrCSAgICB7CisrCSAgICAgIGludCBjbnQ7CisrCisrCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKKysJCXsKKysJCSAgcmV0dmFsID0gX25sX2ZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBiaW5kaW5nLAorKwkJCQkJIG1zZ2lkMSwgJnJldGxlbik7CisrCisrCQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKKysJCSAgICB7CisrCQkgICAgICBkb21haW4gPSBkb21haW4tPnN1Y2Nlc3NvcltjbnRdOworKwkJICAgICAgYnJlYWs7CisrCQkgICAgfQorKwkJfQorKwkgICAgfQorKworKwkgIGlmIChyZXR2YWwgIT0gTlVMTCkKKysJICAgIHsKKysJICAgICAgLyogRm91bmQgdGhlIHRyYW5zbGF0aW9uIG9mIE1TR0lEMSBpbiBkb21haW4gRE9NQUlOOgorKwkJIHN0YXJ0aW5nIGF0IFJFVFZBTCwgUkVUTEVOIGJ5dGVzLiAgKi8KKysJICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOworKyNpZiBkZWZpbmVkIEhBVkVfVFNFQVJDSCB8fCBkZWZpbmVkIF9MSUJDCisrCSAgICAgIGlmIChmb3VuZHAgPT0gTlVMTCkKKysJCXsKKysJCSAgLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIHNlYXJjaCB0cmVlLiAgKi8KKysJCSAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKm5ld3A7CisrCisrCQkgIG5ld3AgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikKKysJCSAgICBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCwgbXNnaWQpCisrCQkJICAgICsgbXNnaWRfbGVuICsgZG9tYWlubmFtZV9sZW4gKyAxKTsKKysJCSAgaWYgKG5ld3AgIT0gTlVMTCkKKysJCSAgICB7CisrCQkgICAgICBuZXdwLT5kb21haW5uYW1lID0KKysJCQltZW1wY3B5IChuZXdwLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOworKwkJICAgICAgbWVtY3B5IChuZXdwLT5kb21haW5uYW1lLCBkb21haW5uYW1lLCBkb21haW5uYW1lX2xlbiArIDEpOworKwkJICAgICAgbmV3cC0+Y2F0ZWdvcnkgPSBjYXRlZ29yeTsKKysJCSAgICAgIG5ld3AtPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOworKwkJICAgICAgbmV3cC0+ZG9tYWluID0gZG9tYWluOworKwkJICAgICAgbmV3cC0+dHJhbnNsYXRpb24gPSByZXR2YWw7CisrCQkgICAgICBuZXdwLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47CisrCisrCQkgICAgICAvKiBJbnNlcnQgdGhlIGVudHJ5IGluIHRoZSBzZWFyY2ggdHJlZS4gICovCisrCQkgICAgICBmb3VuZHAgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKiopCisrCQkJdHNlYXJjaCAobmV3cCwgJnJvb3QsIHRyYW5zY21wKTsKKysJCSAgICAgIGlmIChmb3VuZHAgPT0gTlVMTAorKwkJCSAgfHwgX19idWlsdGluX2V4cGVjdCAoKmZvdW5kcCAhPSBuZXdwLCAwKSkKKysJCQkvKiBUaGUgaW5zZXJ0IGZhaWxlZC4gICovCisrCQkJZnJlZSAobmV3cCk7CisrCQkgICAgfQorKwkJfQorKwkgICAgICBlbHNlCisrCQl7CisrCQkgIC8qIFdlIGNhbiB1cGRhdGUgdGhlIGV4aXN0aW5nIGVudHJ5LiAgKi8KKysJCSAgKCpmb3VuZHApLT5jb3VudGVyID0gX25sX21zZ19jYXRfY250cjsKKysJCSAgKCpmb3VuZHApLT5kb21haW4gPSBkb21haW47CisrCQkgICgqZm91bmRwKS0+dHJhbnNsYXRpb24gPSByZXR2YWw7CisrCQkgICgqZm91bmRwKS0+dHJhbnNsYXRpb25fbGVuZ3RoID0gcmV0bGVuOworKwkJfQorKyNlbmRpZgorKwkgICAgICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOworKworKwkgICAgICAvKiBOb3cgZGVhbCB3aXRoIHBsdXJhbC4gICovCisrCSAgICAgIGlmIChwbHVyYWwpCisrCQlyZXR2YWwgPSBwbHVyYWxfbG9va3VwIChkb21haW4sIG4sIHJldHZhbCwgcmV0bGVuKTsKKysKKysJICAgICAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKysJICAgICAgcmV0dXJuIHJldHZhbDsKKysJICAgIH0KKysJfQorKyAgICB9CisrCisrIHJldHVybl91bnRyYW5zbGF0ZWQ6CisrICAvKiBSZXR1cm4gdGhlIHVudHJhbnNsYXRlZCBNU0dJRC4gICovCisrICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CisrICBfX2xpYmNfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOworKyNpZm5kZWYgX0xJQkMKKysgIGlmICghRU5BQkxFX1NFQ1VSRSkKKysgICAgeworKyAgICAgIGV4dGVybiB2b2lkIF9ubF9sb2dfdW50cmFuc2xhdGVkIChjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwKKysJCQkJCWNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisrCQkJCQljb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwKKysJCQkJCWludCBwbHVyYWwpOworKyAgICAgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lID0gZ2V0ZW52ICgiR0VUVEVYVF9MT0dfVU5UUkFOU0xBVEVEIik7CisrCisrICAgICAgaWYgKGxvZ2ZpbGVuYW1lICE9IE5VTEwgJiYgbG9nZmlsZW5hbWVbMF0gIT0gJ1wwJykKKysJX25sX2xvZ191bnRyYW5zbGF0ZWQgKGxvZ2ZpbGVuYW1lLCBkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgcGx1cmFsKTsKKysgICAgfQorKyNlbmRpZgorKyAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKKysgIHJldHVybiAocGx1cmFsID09IDAKKysJICA/IChjaGFyICopIG1zZ2lkMQorKwkgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLworKwkgIDogbiA9PSAxID8gKGNoYXIgKikgbXNnaWQxIDogKGNoYXIgKikgbXNnaWQyKTsKKyt9CisrCisrCisrY2hhciAqCisraW50ZXJuYWxfZnVuY3Rpb24KKytfbmxfZmluZF9tc2cgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAorKwkgICAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZywgY29uc3QgY2hhciAqbXNnaWQsCisrCSAgICAgIHNpemVfdCAqbGVuZ3RocCkKKyt7CisrICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOworKyAgbmxzX3VpbnQzMiBuc3RyaW5nczsKKysgIHNpemVfdCBhY3Q7CisrICBjaGFyICpyZXN1bHQ7CisrICBzaXplX3QgcmVzdWx0bGVuOworKworKyAgaWYgKGRvbWFpbl9maWxlLT5kZWNpZGVkID09IDApCisrICAgIF9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcpOworKworKyAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCisrICAgIHJldHVybiBOVUxMOworKworKyAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOworKworKyAgbnN0cmluZ3MgPSBkb21haW4tPm5zdHJpbmdzOworKworKyAgLyogTG9jYXRlIHRoZSBNU0dJRCBhbmQgaXRzIHRyYW5zbGF0aW9uLiAgKi8KKysgIGlmIChkb21haW4tPmhhc2hfdGFiICE9IE5VTEwpCisrICAgIHsKKysgICAgICAvKiBVc2UgdGhlIGhhc2hpbmcgdGFibGUuICAqLworKyAgICAgIG5sc191aW50MzIgbGVuID0gc3RybGVuIChtc2dpZCk7CisrICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7CisrICAgICAgbmxzX3VpbnQzMiBpZHggPSBoYXNoX3ZhbCAlIGRvbWFpbi0+aGFzaF9zaXplOworKyAgICAgIG5sc191aW50MzIgaW5jciA9IDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7CisrCisrICAgICAgd2hpbGUgKDEpCisrCXsKKysJICBubHNfdWludDMyIG5zdHIgPQorKwkgICAgVyAoZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7CisrCisrCSAgaWYgKG5zdHIgPT0gMCkKKysJICAgIC8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLworKwkgICAgcmV0dXJuIE5VTEw7CisrCisrCSAgbnN0ci0tOworKworKwkgIC8qIENvbXBhcmUgbXNnaWQgd2l0aCB0aGUgb3JpZ2luYWwgc3RyaW5nIGF0IGluZGV4IG5zdHIuCisrCSAgICAgV2UgY29tcGFyZSB0aGUgbGVuZ3RocyB3aXRoID49LCBub3QgPT0sIGJlY2F1c2UgcGx1cmFsIGVudHJpZXMKKysJICAgICBhcmUgcmVwcmVzZW50ZWQgYnkgc3RyaW5ncyB3aXRoIGFuIGVtYmVkZGVkIE5VTC4gICovCisrCSAgaWYgKG5zdHIgPCBuc3RyaW5ncworKwkgICAgICA/IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHJdLmxlbmd0aCkgPj0gbGVuCisrCQkmJiAoc3RyY21wIChtc2dpZCwKKysJCQkgICAgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisrCQkJCQkgICAgICBkb21haW4tPm9yaWdfdGFiW25zdHJdLm9mZnNldCkpCisrCQkgICAgPT0gMCkKKysJICAgICAgOiBkb21haW4tPm9yaWdfc3lzZGVwX3RhYltuc3RyIC0gbnN0cmluZ3NdLmxlbmd0aCA+IGxlbgorKwkJJiYgKHN0cmNtcCAobXNnaWQsCisrCQkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiW25zdHIgLSBuc3RyaW5nc10ucG9pbnRlcikKKysJCSAgICA9PSAwKSkKKysJICAgIHsKKysJICAgICAgYWN0ID0gbnN0cjsKKysJICAgICAgZ290byBmb3VuZDsKKysJICAgIH0KKysKKysJICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKKysJICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7CisrCSAgZWxzZQorKwkgICAgaWR4ICs9IGluY3I7CisrCX0KKysgICAgICAvKiBOT1RSRUFDSEVEICovCisrICAgIH0KKysgIGVsc2UKKysgICAgeworKyAgICAgIC8qIFRyeSB0aGUgZGVmYXVsdCBtZXRob2Q6ICBiaW5hcnkgc2VhcmNoIGluIHRoZSBzb3J0ZWQgYXJyYXkgb2YKKysJIG1lc3NhZ2VzLiAgKi8KKysgICAgICBzaXplX3QgdG9wLCBib3R0b207CisrCisrICAgICAgYm90dG9tID0gMDsKKysgICAgICB0b3AgPSBuc3RyaW5nczsKKysgICAgICB3aGlsZSAoYm90dG9tIDwgdG9wKQorKwl7CisrCSAgaW50IGNtcF92YWw7CisrCisrCSAgYWN0ID0gKGJvdHRvbSArIHRvcCkgLyAyOworKwkgIGNtcF92YWwgPSBzdHJjbXAgKG1zZ2lkLCAoZG9tYWluLT5kYXRhCisrCQkJCSAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorKwkJCQkJIGRvbWFpbi0+b3JpZ190YWJbYWN0XS5vZmZzZXQpKSk7CisrCSAgaWYgKGNtcF92YWwgPCAwKQorKwkgICAgdG9wID0gYWN0OworKwkgIGVsc2UgaWYgKGNtcF92YWwgPiAwKQorKwkgICAgYm90dG9tID0gYWN0ICsgMTsKKysJICBlbHNlCisrCSAgICBnb3RvIGZvdW5kOworKwl9CisrICAgICAgLyogTm8gdHJhbnNsYXRpb24gd2FzIGZvdW5kLiAgKi8KKysgICAgICByZXR1cm4gTlVMTDsKKysgICAgfQorKworKyBmb3VuZDoKKysgIC8qIFRoZSB0cmFuc2xhdGlvbiB3YXMgZm91bmQgYXQgaW5kZXggQUNULiAgSWYgd2UgaGF2ZSB0byBjb252ZXJ0IHRoZQorKyAgICAgc3RyaW5nIHRvIHVzZSBhIGRpZmZlcmVudCBjaGFyYWN0ZXIgc2V0LCB0aGlzIGlzIHRoZSB0aW1lLiAgKi8KKysgIGlmIChhY3QgPCBuc3RyaW5ncykKKysgICAgeworKyAgICAgIHJlc3VsdCA9IChjaGFyICopCisrCShkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT50cmFuc190YWJbYWN0XS5vZmZzZXQpKTsKKysgICAgICByZXN1bHRsZW4gPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT50cmFuc190YWJbYWN0XS5sZW5ndGgpICsgMTsKKysgICAgfQorKyAgZWxzZQorKyAgICB7CisrICAgICAgcmVzdWx0ID0gKGNoYXIgKikgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiW2FjdCAtIG5zdHJpbmdzXS5wb2ludGVyOworKyAgICAgIHJlc3VsdGxlbiA9IGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYlthY3QgLSBuc3RyaW5nc10ubGVuZ3RoOworKyAgICB9CisrCisrI2lmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVgorKyAgaWYgKGRvbWFpbi0+Y29kZXNldF9jbnRyCisrICAgICAgIT0gKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCA/IGRvbWFpbmJpbmRpbmctPmNvZGVzZXRfY250ciA6IDApKQorKyAgICB7CisrICAgICAgLyogVGhlIGRvbWFpbidzIGNvZGVzZXQgaGFzIGNoYW5nZWQgdGhyb3VnaCBiaW5kX3RleHRkb21haW5fY29kZXNldCgpCisrCSBzaW5jZSB0aGUgbWVzc2FnZSBjYXRhbG9nIHdhcyBpbml0aWFsaXplZCBvciBsYXN0IGFjY2Vzc2VkLiAgV2UKKysJIGhhdmUgdG8gcmVpbml0aWFsaXplIHRoZSBjb252ZXJ0ZXIuICAqLworKyAgICAgIF9ubF9mcmVlX2RvbWFpbl9jb252IChkb21haW4pOworKyAgICAgIF9ubF9pbml0X2RvbWFpbl9jb252IChkb21haW5fZmlsZSwgZG9tYWluLCBkb21haW5iaW5kaW5nKTsKKysgICAgfQorKworKyAgaWYgKAorKyMgaWZkZWYgX0xJQkMKKysgICAgICBkb21haW4tPmNvbnYgIT0gKF9fZ2NvbnZfdCkgLTEKKysjIGVsc2UKKysjICBpZiBIQVZFX0lDT05WCisrICAgICAgZG9tYWluLT5jb252ICE9IChpY29udl90KSAtMQorKyMgIGVuZGlmCisrIyBlbmRpZgorKyAgICAgICkKKysgICAgeworKyAgICAgIC8qIFdlIGFyZSBzdXBwb3NlZCB0byBkbyBhIGNvbnZlcnNpb24uICBGaXJzdCBhbGxvY2F0ZSBhbgorKwkgYXBwcm9wcmlhdGUgdGFibGUgd2l0aCB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIHRhYmxlCisrCSBvZiB0cmFuc2xhdGlvbnMgaW4gdGhlIGZpbGUsIHdoZXJlIHdlIGNhbiBwdXQgdGhlIHBvaW50ZXJzCisrCSB0byB0aGUgY29udmVydGVkIHN0cmluZ3MgaW4uCisrCSBUaGVyZSBpcyBhIHNsaWdodCBjb21wbGljYXRpb24gd2l0aCBwbHVyYWwgZW50cmllcy4gIFRoZXkKKysJIGFyZSByZXByZXNlbnRlZCBieSBjb25zZWN1dGl2ZSBOVUwgdGVybWluYXRlZCBzdHJpbmdzLiAgV2UKKysJIGhhbmRsZSB0aGlzIGNhc2UgYnkgY29udmVydGluZyBSRVNVTFRMRU4gYnl0ZXMsIGluY2x1ZGluZworKwkgTlVMcy4gICovCisrCisrICAgICAgaWYgKGRvbWFpbi0+Y29udl90YWIgPT0gTlVMTAorKwkgICYmICgoZG9tYWluLT5jb252X3RhYiA9CisrCQkgKGNoYXIgKiopIGNhbGxvYyAobnN0cmluZ3MgKyBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MsCisrCQkJCSAgIHNpemVvZiAoY2hhciAqKSkpCisrCSAgICAgID09IE5VTEwpKQorKwkvKiBNYXJrIHRoYXQgd2UgZGlkbid0IHN1Y2NlZWQgYWxsb2NhdGluZyBhIHRhYmxlLiAgKi8KKysJZG9tYWluLT5jb252X3RhYiA9IChjaGFyICoqKSAtMTsKKysKKysgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoZG9tYWluLT5jb252X3RhYiA9PSAoY2hhciAqKikgLTEsIDApKQorKwkvKiBOb3RoaW5nIHdlIGNhbiBkbywgbm8gbW9yZSBtZW1vcnkuICAqLworKwlnb3RvIGNvbnZlcnRlZDsKKysKKysgICAgICBpZiAoZG9tYWluLT5jb252X3RhYlthY3RdID09IE5VTEwpCisrCXsKKysJICAvKiBXZSBoYXZlbid0IHVzZWQgdGhpcyBzdHJpbmcgc28gZmFyLCBzbyBpdCBpcyBub3QKKysJICAgICB0cmFuc2xhdGVkIHlldC4gIERvIHRoaXMgbm93LiAgKi8KKysJICAvKiBXZSB1c2UgYSBiaXQgbW9yZSBlZmZpY2llbnQgbWVtb3J5IGhhbmRsaW5nLgorKwkgICAgIFdlIGFsbG9jYXRlIGFsd2F5cyBsYXJnZXIgYmxvY2tzIHdoaWNoIGdldCB1c2VkIG92ZXIKKysJICAgICB0aW1lLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBtYW55IHNtYWxsIGFsbG9jYXRpb25zLiAgICovCisrCSAgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spCisrIyBkZWZpbmUgSU5JVElBTF9CTE9DS19TSVpFCTQwODAKKysJICBzdGF0aWMgdW5zaWduZWQgY2hhciAqZnJlZW1lbTsKKysJICBzdGF0aWMgc2l6ZV90IGZyZWVtZW1fc2l6ZTsKKysKKysJICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZjsKKysJICB1bnNpZ25lZCBjaGFyICpvdXRidWY7CisrCSAgaW50IG1hbGxvY19jb3VudDsKKysjIGlmbmRlZiBfTElCQworKwkgIHRyYW5zbWVtX2Jsb2NrX3QgKnRyYW5zbWVtX2xpc3QgPSBOVUxMOworKyMgZW5kaWYKKysKKysJICBfX2xpYmNfbG9ja19sb2NrIChsb2NrKTsKKysKKysJICBpbmJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJlc3VsdDsKKysJICBvdXRidWYgPSBmcmVlbWVtICsgc2l6ZW9mIChzaXplX3QpOworKworKwkgIG1hbGxvY19jb3VudCA9IDA7CisrCSAgd2hpbGUgKDEpCisrCSAgICB7CisrCSAgICAgIHRyYW5zbWVtX2Jsb2NrX3QgKm5ld21lbTsKKysjIGlmZGVmIF9MSUJDCisrCSAgICAgIHNpemVfdCBub25fcmV2ZXJzaWJsZTsKKysJICAgICAgaW50IHJlczsKKysKKysJICAgICAgaWYgKGZyZWVtZW1fc2l6ZSA8IHNpemVvZiAoc2l6ZV90KSkKKysJCWdvdG8gcmVzaXplX2ZyZWVtZW07CisrCisrCSAgICAgIHJlcyA9IF9fZ2NvbnYgKGRvbWFpbi0+Y29udiwKKysJCQkgICAgICZpbmJ1ZiwgaW5idWYgKyByZXN1bHRsZW4sCisrCQkJICAgICAmb3V0YnVmLAorKwkJCSAgICAgb3V0YnVmICsgZnJlZW1lbV9zaXplIC0gc2l6ZW9mIChzaXplX3QpLAorKwkJCSAgICAgJm5vbl9yZXZlcnNpYmxlKTsKKysKKysJICAgICAgaWYgKHJlcyA9PSBfX0dDT05WX09LIHx8IHJlcyA9PSBfX0dDT05WX0VNUFRZX0lOUFVUKQorKwkJYnJlYWs7CisrCisrCSAgICAgIGlmIChyZXMgIT0gX19HQ09OVl9GVUxMX09VVFBVVCkKKysJCXsKKysJCSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKKysJCSAgZ290byBjb252ZXJ0ZWQ7CisrCQl9CisrCisrCSAgICAgIGluYnVmID0gcmVzdWx0OworKyMgZWxzZQorKyMgIGlmIEhBVkVfSUNPTlYKKysJICAgICAgY29uc3QgY2hhciAqaW5wdHIgPSAoY29uc3QgY2hhciAqKSBpbmJ1ZjsKKysJICAgICAgc2l6ZV90IGlubGVmdCA9IHJlc3VsdGxlbjsKKysJICAgICAgY2hhciAqb3V0cHRyID0gKGNoYXIgKikgb3V0YnVmOworKwkgICAgICBzaXplX3Qgb3V0bGVmdDsKKysKKysJICAgICAgaWYgKGZyZWVtZW1fc2l6ZSA8IHNpemVvZiAoc2l6ZV90KSkKKysJCWdvdG8gcmVzaXplX2ZyZWVtZW07CisrCisrCSAgICAgIG91dGxlZnQgPSBmcmVlbWVtX3NpemUgLSBzaXplb2YgKHNpemVfdCk7CisrCSAgICAgIGlmIChpY29udiAoZG9tYWluLT5jb252LAorKwkJCSAoSUNPTlZfQ09OU1QgY2hhciAqKikgJmlucHRyLCAmaW5sZWZ0LAorKwkJCSAmb3V0cHRyLCAmb3V0bGVmdCkKKysJCSAgIT0gKHNpemVfdCkgKC0xKSkKKysJCXsKKysJCSAgb3V0YnVmID0gKHVuc2lnbmVkIGNoYXIgKikgb3V0cHRyOworKwkJICBicmVhazsKKysJCX0KKysJICAgICAgaWYgKGVycm5vICE9IEUyQklHKQorKwkJeworKwkJICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworKwkJICBnb3RvIGNvbnZlcnRlZDsKKysJCX0KKysjICBlbmRpZgorKyMgZW5kaWYKKysKKysJICAgIHJlc2l6ZV9mcmVlbWVtOgorKwkgICAgICAvKiBXZSBtdXN0IGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBvciByZXNpemUgdGhlIG9sZCBvbmUuICAqLworKwkgICAgICBpZiAobWFsbG9jX2NvdW50ID4gMCkKKysJCXsKKysJCSAgKyttYWxsb2NfY291bnQ7CisrCQkgIGZyZWVtZW1fc2l6ZSA9IG1hbGxvY19jb3VudCAqIElOSVRJQUxfQkxPQ0tfU0laRTsKKysJCSAgbmV3bWVtID0gKHRyYW5zbWVtX2Jsb2NrX3QgKikgcmVhbGxvYyAodHJhbnNtZW1fbGlzdCwKKysJCQkJCQkJIGZyZWVtZW1fc2l6ZSk7CisrIyBpZmRlZiBfTElCQworKwkJICBpZiAobmV3bWVtICE9IE5VTEwpCisrCQkgICAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7CisrCQkgIGVsc2UKKysJCSAgICB7CisrCQkgICAgICBzdHJ1Y3QgdHJhbnNtZW1fbGlzdCAqb2xkID0gdHJhbnNtZW1fbGlzdDsKKysKKysJCSAgICAgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OworKwkJICAgICAgZnJlZSAob2xkKTsKKysJCSAgICB9CisrIyBlbmRpZgorKwkJfQorKwkgICAgICBlbHNlCisrCQl7CisrCQkgIG1hbGxvY19jb3VudCA9IDE7CisrCQkgIGZyZWVtZW1fc2l6ZSA9IElOSVRJQUxfQkxPQ0tfU0laRTsKKysJCSAgbmV3bWVtID0gKHRyYW5zbWVtX2Jsb2NrX3QgKikgbWFsbG9jIChmcmVlbWVtX3NpemUpOworKwkJfQorKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3bWVtID09IE5VTEwsIDApKQorKwkJeworKwkJICBmcmVlbWVtID0gTlVMTDsKKysJCSAgZnJlZW1lbV9zaXplID0gMDsKKysJCSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKKysJCSAgZ290byBjb252ZXJ0ZWQ7CisrCQl9CisrCisrIyBpZmRlZiBfTElCQworKwkgICAgICAvKiBBZGQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGJsb2NrcyB3ZSBoYXZlIHRvIGZyZWUKKysgICAgICAgICAgICAgICAgIGF0IHNvbWUgcG9pbnQuICAqLworKwkgICAgICBuZXdtZW0tPm5leHQgPSB0cmFuc21lbV9saXN0OworKwkgICAgICB0cmFuc21lbV9saXN0ID0gbmV3bWVtOworKworKwkgICAgICBmcmVlbWVtID0gbmV3bWVtLT5kYXRhOworKwkgICAgICBmcmVlbWVtX3NpemUgLT0gb2Zmc2V0b2YgKHN0cnVjdCB0cmFuc21lbV9saXN0LCBkYXRhKTsKKysjIGVsc2UKKysJICAgICAgdHJhbnNtZW1fbGlzdCA9IG5ld21lbTsKKysJICAgICAgZnJlZW1lbSA9IG5ld21lbTsKKysjIGVuZGlmCisrCisrCSAgICAgIG91dGJ1ZiA9IGZyZWVtZW0gKyBzaXplb2YgKHNpemVfdCk7CisrCSAgICB9CisrCisrCSAgLyogV2UgaGF2ZSBub3cgaW4gb3VyIGJ1ZmZlciBhIGNvbnZlcnRlZCBzdHJpbmcuICBQdXQgdGhpcworKwkgICAgIGludG8gdGhlIHRhYmxlIG9mIGNvbnZlcnNpb25zLiAgKi8KKysJICAqKHNpemVfdCAqKSBmcmVlbWVtID0gb3V0YnVmIC0gZnJlZW1lbSAtIHNpemVvZiAoc2l6ZV90KTsKKysJICBkb21haW4tPmNvbnZfdGFiW2FjdF0gPSAoY2hhciAqKSBmcmVlbWVtOworKwkgIC8qIFNocmluayBmcmVlbWVtLCBidXQga2VlcCBpdCBhbGlnbmVkLiAgKi8KKysJICBmcmVlbWVtX3NpemUgLT0gb3V0YnVmIC0gZnJlZW1lbTsKKysJICBmcmVlbWVtID0gb3V0YnVmOworKwkgIGZyZWVtZW0gKz0gZnJlZW1lbV9zaXplICYgKGFsaWdub2YgKHNpemVfdCkgLSAxKTsKKysJICBmcmVlbWVtX3NpemUgPSBmcmVlbWVtX3NpemUgJiB+IChhbGlnbm9mIChzaXplX3QpIC0gMSk7CisrCisrCSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKKysJfQorKworKyAgICAgIC8qIE5vdyBkb21haW4tPmNvbnZfdGFiW2FjdF0gY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIG9mIGFsbAorKwkgdGhlIHBsdXJhbCB2YXJpYW50cy4gICovCisrICAgICAgcmVzdWx0ID0gZG9tYWluLT5jb252X3RhYlthY3RdICsgc2l6ZW9mIChzaXplX3QpOworKyAgICAgIHJlc3VsdGxlbiA9ICooc2l6ZV90ICopIGRvbWFpbi0+Y29udl90YWJbYWN0XTsKKysgICAgfQorKworKyBjb252ZXJ0ZWQ6CisrICAvKiBUaGUgcmVzdWx0IHN0cmluZyBpcyBjb252ZXJ0ZWQuICAqLworKworKyNlbmRpZiAvKiBfTElCQyB8fCBIQVZFX0lDT05WICovCisrCisrICAqbGVuZ3RocCA9IHJlc3VsdGxlbjsKKysgIHJldHVybiByZXN1bHQ7CisrfQorKworKworKy8qIExvb2sgdXAgYSBwbHVyYWwgdmFyaWFudC4gICovCisrc3RhdGljIGNoYXIgKgorK2ludGVybmFsX2Z1bmN0aW9uCisrcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGludCBuLAorKwkgICAgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCisreworKyAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbmRhdGEgPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluLT5kYXRhOworKyAgdW5zaWduZWQgbG9uZyBpbnQgaW5kZXg7CisrICBjb25zdCBjaGFyICpwOworKworKyAgaW5kZXggPSBwbHVyYWxfZXZhbCAoZG9tYWluZGF0YS0+cGx1cmFsLCBuKTsKKysgIGlmIChpbmRleCA+PSBkb21haW5kYXRhLT5ucGx1cmFscykKKysgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSXQgbWVhbnMgdGhlIHBsdXJhbCBleHByZXNzaW9uIGFuZCB0aGUKKysgICAgICAgZ2l2ZW4gbWF4aW11bSB2YWx1ZSBkbyBub3QgbWF0Y2guICAqLworKyAgICBpbmRleCA9IDA7CisrCisrICAvKiBTa2lwIElOREVYIHN0cmluZ3MgYXQgVFJBTlNMQVRJT04uICAqLworKyAgcCA9IHRyYW5zbGF0aW9uOworKyAgd2hpbGUgKGluZGV4LS0gPiAwKQorKyAgICB7CisrI2lmZGVmIF9MSUJDCisrICAgICAgcCA9IF9fcmF3bWVtY2hyIChwLCAnXDAnKTsKKysjZWxzZQorKyAgICAgIHAgPSBzdHJjaHIgKHAsICdcMCcpOworKyNlbmRpZgorKyAgICAgIC8qIEFuZCBza2lwIG92ZXIgdGhlIE5VTCBieXRlLiAgKi8KKysgICAgICBwKys7CisrCisrICAgICAgaWYgKHAgPj0gdHJhbnNsYXRpb24gKyB0cmFuc2xhdGlvbl9sZW4pCisrCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IG1lYW5zIHRoZSBwbHVyYWwgZXhwcmVzc2lvbgorKwkgICBldmFsdWF0ZWQgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHZhcmlhbnRzCisrCSAgIGF2YWlsYWJsZSBmb3IgTVNHSUQxLiAgKi8KKysJcmV0dXJuIChjaGFyICopIHRyYW5zbGF0aW9uOworKyAgICB9CisrICByZXR1cm4gKGNoYXIgKikgcDsKKyt9CisrCisrI2lmbmRlZiBfTElCQworKy8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbG9jYWxlIENBVEVHT1JZLiAgKi8KKytzdGF0aWMgY29uc3QgY2hhciAqCisraW50ZXJuYWxfZnVuY3Rpb24KKytjYXRlZ29yeV90b19uYW1lIChpbnQgY2F0ZWdvcnkpCisreworKyAgY29uc3QgY2hhciAqcmV0dmFsOworKworKyAgc3dpdGNoIChjYXRlZ29yeSkKKysgIHsKKysjaWZkZWYgTENfQ09MTEFURQorKyAgY2FzZSBMQ19DT0xMQVRFOgorKyAgICByZXR2YWwgPSAiTENfQ09MTEFURSI7CisrICAgIGJyZWFrOworKyNlbmRpZgorKyNpZmRlZiBMQ19DVFlQRQorKyAgY2FzZSBMQ19DVFlQRToKKysgICAgcmV0dmFsID0gIkxDX0NUWVBFIjsKKysgICAgYnJlYWs7CisrI2VuZGlmCisrI2lmZGVmIExDX01PTkVUQVJZCisrICBjYXNlIExDX01PTkVUQVJZOgorKyAgICByZXR2YWwgPSAiTENfTU9ORVRBUlkiOworKyAgICBicmVhazsKKysjZW5kaWYKKysjaWZkZWYgTENfTlVNRVJJQworKyAgY2FzZSBMQ19OVU1FUklDOgorKyAgICByZXR2YWwgPSAiTENfTlVNRVJJQyI7CisrICAgIGJyZWFrOworKyNlbmRpZgorKyNpZmRlZiBMQ19USU1FCisrICBjYXNlIExDX1RJTUU6CisrICAgIHJldHZhbCA9ICJMQ19USU1FIjsKKysgICAgYnJlYWs7CisrI2VuZGlmCisrI2lmZGVmIExDX01FU1NBR0VTCisrICBjYXNlIExDX01FU1NBR0VTOgorKyAgICByZXR2YWwgPSAiTENfTUVTU0FHRVMiOworKyAgICBicmVhazsKKysjZW5kaWYKKysjaWZkZWYgTENfUkVTUE9OU0UKKysgIGNhc2UgTENfUkVTUE9OU0U6CisrICAgIHJldHZhbCA9ICJMQ19SRVNQT05TRSI7CisrICAgIGJyZWFrOworKyNlbmRpZgorKyNpZmRlZiBMQ19BTEwKKysgIGNhc2UgTENfQUxMOgorKyAgICAvKiBUaGlzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlIGJ1dCBpcyBwZXJoYXBzIGJldHRlciB0aGFuIGFueSBvdGhlcgorKyAgICAgICB2YWx1ZS4gICovCisrICAgIHJldHZhbCA9ICJMQ19BTEwiOworKyAgICBicmVhazsKKysjZW5kaWYKKysgIGRlZmF1bHQ6CisrICAgIC8qIElmIHlvdSBoYXZlIGEgYmV0dGVyIGlkZWEgZm9yIGEgZGVmYXVsdCB2YWx1ZSBsZXQgbWUga25vdy4gICovCisrICAgIHJldHZhbCA9ICJMQ19YWFgiOworKyAgfQorKworKyAgcmV0dXJuIHJldHZhbDsKKyt9CisrI2VuZGlmCisrCisrLyogR3Vlc3MgdmFsdWUgb2YgY3VycmVudCBsb2NhbGUgZnJvbSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KKytzdGF0aWMgY29uc3QgY2hhciAqCisraW50ZXJuYWxfZnVuY3Rpb24KKytndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCisreworKyAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7CisrICBjb25zdCBjaGFyICpyZXR2YWw7CisrCisrICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudAorKyAgICAgdmFyaWFibGUuICBCdXQgd2UgZG9uJ3QgdXNlIHRoZSB2YWx1ZSBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisrICAgICBsb2NhbGUgaXMgdGhlIEMgbG9jYWxlLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLworKyAgbGFuZ3VhZ2UgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOworKyAgaWYgKGxhbmd1YWdlICE9IE5VTEwgJiYgbGFuZ3VhZ2VbMF0gPT0gJ1wwJykKKysgICAgbGFuZ3VhZ2UgPSBOVUxMOworKworKyAgLyogV2UgaGF2ZSB0byBwcm9jZWVkIHdpdGggdGhlIFBPU0lYIG1ldGhvZHMgb2YgbG9va2luZyB0byBgTENfQUxMJywKKysgICAgIGBMQ194eHgnLCBhbmQgYExBTkcnLiAgT24gc29tZSBzeXN0ZW1zIHRoaXMgY2FuIGJlIGRvbmUgYnkgdGhlCisrICAgICBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLworKyNpZmRlZiBfTElCQworKyAgcmV0dmFsID0gX19jdXJyZW50X2xvY2FsZV9uYW1lIChjYXRlZ29yeSk7CisrI2Vsc2UKKysgIHJldHZhbCA9IF9ubF9sb2NhbGVfbmFtZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7CisrI2VuZGlmCisrCisrICAvKiBJZ25vcmUgTEFOR1VBR0UgaWYgdGhlIGxvY2FsZSBpcyBzZXQgdG8gIkMiIGJlY2F1c2UKKysgICAgIDEuICJDIiBsb2NhbGUgdXN1YWxseSB1c2VzIHRoZSBBU0NJSSBlbmNvZGluZywgYW5kIG1vc3QgaW50ZXJuYXRpb25hbAorKwltZXNzYWdlcyB1c2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoZXNlIGNoYXJhY3RlcnMgZ2V0IGRpc3BsYXllZAorKwlhcyBxdWVzdGlvbiBtYXJrcyAoaWYgdXNpbmcgZ2xpYmMncyBpY29udigpKSBvciBhcyBpbnZhbGlkIDgtYml0CisrCWNoYXJhY3RlcnMgKGJlY2F1c2Ugb3RoZXIgaWNvbnYoKXMgcmVmdXNlIHRvIGNvbnZlcnQgbW9zdCBub24tQVNDSUkKKysJY2hhcmFjdGVycyB0byBBU0NJSSkuIEluIGFueSBjYXNlLCB0aGUgb3V0cHV0IGlzIHVnbHkuCisrICAgICAyLiBUaGUgcHJlY2lzZSBvdXRwdXQgb2Ygc29tZSBwcm9ncmFtcyBpbiB0aGUgIkMiIGxvY2FsZSBpcyBzcGVjaWZpZWQKKysJYnkgUE9TSVggYW5kIHNob3VsZCBub3QgZGVwZW5kIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBsaWtlCisrCSJMQU5HVUFHRSIuICBXZSBhbGxvdyBzdWNoIHByb2dyYW1zIHRvIHVzZSBnZXR0ZXh0KCkuICAqLworKyAgcmV0dXJuIGxhbmd1YWdlICE9IE5VTEwgJiYgc3RyY21wIChyZXR2YWwsICJDIikgIT0gMCA/IGxhbmd1YWdlIDogcmV0dmFsOworK30KKysKKysvKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKysKKysvKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQorKyAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCisrICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKKysgICB0byBiZSBkZWZpbmVkLiAgKi8KKysjaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQorK3N0YXRpYyBjaGFyICoKKytzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKKyt7CisrICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisrICAgIC8qIERvIG5vdGhpbmcuICovIDsKKysgIHJldHVybiBkZXN0IC0gMTsKKyt9CisrI2VuZGlmCisrCisrI2lmICFfTElCQyAmJiAhSEFWRV9NRU1QQ1BZCisrc3RhdGljIHZvaWQgKgorK21lbXBjcHkgKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCisreworKyAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBtZW1jcHkgKGRlc3QsIHNyYywgbikgKyBuKTsKKyt9CisrI2VuZGlmCisrCisrCisrI2lmZGVmIF9MSUJDCisrLyogSWYgd2Ugd2FudCB0byBmcmVlIGFsbCByZXNvdXJjZXMgd2UgaGF2ZSB0byBkbyBzb21lIHdvcmsgYXQKKysgICBwcm9ncmFtJ3MgZW5kLiAgKi8KKytsaWJjX2ZyZWVyZXNfZm4gKGZyZWVfbWVtKQorK3sKKysgIHZvaWQgKm9sZDsKKysKKysgIHdoaWxlIChfbmxfZG9tYWluX2JpbmRpbmdzICE9IE5VTEwpCisrICAgIHsKKysgICAgICBzdHJ1Y3QgYmluZGluZyAqb2xkcCA9IF9ubF9kb21haW5fYmluZGluZ3M7CisrICAgICAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IF9ubF9kb21haW5fYmluZGluZ3MtPm5leHQ7CisrICAgICAgaWYgKG9sZHAtPmRpcm5hbWUgIT0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpKQorKwkvKiBZZXMsIHRoaXMgaXMgYSBwb2ludGVyIGNvbXBhcmlzb24uICAqLworKwlmcmVlIChvbGRwLT5kaXJuYW1lKTsKKysgICAgICBmcmVlIChvbGRwLT5jb2Rlc2V0KTsKKysgICAgICBmcmVlIChvbGRwKTsKKysgICAgfQorKworKyAgaWYgKF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQorKyAgICAvKiBZZXMsIGFnYWluIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KKysgICAgZnJlZSAoKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4pOworKworKyAgLyogUmVtb3ZlIHRoZSBzZWFyY2ggdHJlZSB3aXRoIHRoZSBrbm93biB0cmFuc2xhdGlvbnMuICAqLworKyAgX190ZGVzdHJveSAocm9vdCwgZnJlZSk7CisrICByb290ID0gTlVMTDsKKysKKysgIHdoaWxlICh0cmFuc21lbV9saXN0ICE9IE5VTEwpCisrICAgIHsKKysgICAgICBvbGQgPSB0cmFuc21lbV9saXN0OworKyAgICAgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OworKyAgICAgIGZyZWUgKG9sZCk7CisrICAgIH0KKyt9CisrI2VuZGlmCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZGNuZ2V0dGV4dC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL2RjbmdldHRleHQuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjM3NTc0NTA0OCAtMDQwMAorQEAgLTAsMCArMSw1NyBAQAorKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY25nZXR0ZXh0KDMpIGZ1bmN0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrIyBpbmNsdWRlIDxjb25maWcuaD4KKysjZW5kaWYKKysKKysjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKysjaWZkZWYgX0xJQkMKKysjIGluY2x1ZGUgPGxpYmludGwuaD4KKysjZWxzZQorKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorKyNlbmRpZgorKworKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKysKKysvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisrICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisrI2lmZGVmIF9MSUJDCisrIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKKysjIGRlZmluZSBEQ0lHRVRURVhUIF9fZGNpZ2V0dGV4dAorKyNlbHNlCisrIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKKysjIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAorKyNlbmRpZgorKworKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQorKyAgIGxvY2FsZS4gICovCisrY2hhciAqCisrRENOR0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKysJICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuLAorKwkgICAgaW50IGNhdGVnb3J5KQorK3sKKysgIHJldHVybiBEQ0lHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgMSwgbiwgY2F0ZWdvcnkpOworK30KKysKKysjaWZkZWYgX0xJQkMKKysvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KKyt3ZWFrX2FsaWFzIChfX2RjbmdldHRleHQsIGRjbmdldHRleHQpOworKyNlbmRpZgorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2RnZXR0ZXh0LmMJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvZGdldHRleHQuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjM4MDc0NDI4OCAtMDQwMAorQEAgLTEsMzIgKzEsMzMgQEAKKy0vKiBkZ2V0dGV4dC5jIC0tIGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZ2V0dGV4dCgzKSBmdW5jdGlvbgorLSAgIENvcHlyaWdodCAoQykgMTk5NSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRnZXR0ZXh0KDMpIGZ1bmN0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgCistVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKy1hbnkgbGF0ZXIgdmVyc2lvbi4KKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgYW55IGxhdGVyIHZlcnNpb24uCisgCistVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCistYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCistWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisgCisgI2lmZGVmIEhBVkVfQ09ORklHX0gKKyAjIGluY2x1ZGUgPGNvbmZpZy5oPgorICNlbmRpZgorIAorLSNpZiBkZWZpbmVkIEhBVkVfTE9DQUxFX0ggfHwgZGVmaW5lZCBfTElCQworLSMgaW5jbHVkZSA8bG9jYWxlLmg+CistI2VuZGlmCisrI2luY2x1ZGUgImdldHRleHRQLmgiCisrCisrI2luY2x1ZGUgPGxvY2FsZS5oPgorIAorICNpZmRlZiBfTElCQworICMgaW5jbHVkZSA8bGliaW50bC5oPgorICNlbHNlCistIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisrIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisgI2VuZGlmCisgCisgLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworQEAgLTM3LDE4ICszOCwxNiBAQAorICAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisgI2lmZGVmIF9MSUJDCisgIyBkZWZpbmUgREdFVFRFWFQgX19kZ2V0dGV4dAorLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAorKyMgZGVmaW5lIERDR0VUVEVYVCBJTlRVU0UoX19kY2dldHRleHQpCisgI2Vsc2UKKy0jIGRlZmluZSBER0VUVEVYVCBkZ2V0dGV4dF9fCistIyBkZWZpbmUgRENHRVRURVhUIGRjZ2V0dGV4dF9fCisrIyBkZWZpbmUgREdFVFRFWFQgbGliaW50bF9kZ2V0dGV4dAorKyMgZGVmaW5lIERDR0VUVEVYVCBsaWJpbnRsX2RjZ2V0dGV4dAorICNlbmRpZgorIAorIC8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50CisgICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KKyBjaGFyICoKKy1ER0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQpCistICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOworLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7CisrREdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkKQorIHsKKyAgIHJldHVybiBEQ0dFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUyk7CisgfQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2RuZ2V0dGV4dC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL2RuZ2V0dGV4dC5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuMzg1NzQzNTI4IC0wNDAwCitAQCAtMCwwICsxLDU5IEBACisrLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKysgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisrI2VuZGlmCisrCisrI2luY2x1ZGUgImdldHRleHRQLmgiCisrCisrI2luY2x1ZGUgPGxvY2FsZS5oPgorKworKyNpZmRlZiBfTElCQworKyMgaW5jbHVkZSA8bGliaW50bC5oPgorKyNlbHNlCisrIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisrI2VuZGlmCisrCisrLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworKworKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKysgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisrICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisrICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKysjaWZkZWYgX0xJQkMKKysjIGRlZmluZSBETkdFVFRFWFQgX19kbmdldHRleHQKKysjIGRlZmluZSBEQ05HRVRURVhUIF9fZGNuZ2V0dGV4dAorKyNlbHNlCisrIyBkZWZpbmUgRE5HRVRURVhUIGxpYmludGxfZG5nZXR0ZXh0CisrIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKKysjZW5kaWYKKysKKysvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBvZiB0aGUgY3VycmVudAorKyAgIExDX01FU1NBR0VTIGxvY2FsZSBhbmQgc2tpcCBtZXNzYWdlIGFjY29yZGluZyB0byB0aGUgcGx1cmFsIGZvcm0uICAqLworK2NoYXIgKgorK0ROR0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKysJICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCisreworKyAgcmV0dXJuIERDTkdFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuLCBMQ19NRVNTQUdFUyk7CisrfQorKworKyNpZmRlZiBfTElCQworKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLworK3dlYWtfYWxpYXMgKF9fZG5nZXR0ZXh0LCBkbmdldHRleHQpOworKyNlbmRpZgorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2V2YWwtcGx1cmFsLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvZXZhbC1wbHVyYWwuaAkyMDA0LTA5LTEyIDE0OjQwOjM0LjM5MDc0Mjc2OCAtMDQwMAorQEAgLTAsMCArMSwxMDggQEAKKysvKiBQbHVyYWwgZXhwcmVzc2lvbiBldmFsdWF0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZuZGVmIFNUQVRJQworKyNkZWZpbmUgU1RBVElDIHN0YXRpYworKyNlbmRpZgorKworKy8qIEV2YWx1YXRlIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiBhbmQgcmV0dXJuIGFuIGluZGV4IHZhbHVlLiAgKi8KKytTVEFUSUMKKyt1bnNpZ25lZCBsb25nIGludAorK2ludGVybmFsX2Z1bmN0aW9uCisrcGx1cmFsX2V2YWwgKHN0cnVjdCBleHByZXNzaW9uICpwZXhwLCB1bnNpZ25lZCBsb25nIGludCBuKQorK3sKKysgIHN3aXRjaCAocGV4cC0+bmFyZ3MpCisrICAgIHsKKysgICAgY2FzZSAwOgorKyAgICAgIHN3aXRjaCAocGV4cC0+b3BlcmF0aW9uKQorKwl7CisrCWNhc2UgdmFyOgorKwkgIHJldHVybiBuOworKwljYXNlIG51bToKKysJICByZXR1cm4gcGV4cC0+dmFsLm51bTsKKysJZGVmYXVsdDoKKysJICBicmVhazsKKysJfQorKyAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKysgICAgICBicmVhazsKKysgICAgY2FzZSAxOgorKyAgICAgIHsKKysJLyogcGV4cC0+b3BlcmF0aW9uIG11c3QgYmUgbG5vdC4gICovCisrCXVuc2lnbmVkIGxvbmcgaW50IGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7CisrCXJldHVybiAhIGFyZzsKKysgICAgICB9CisrICAgIGNhc2UgMjoKKysgICAgICB7CisrCXVuc2lnbmVkIGxvbmcgaW50IGxlZnRhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOworKwlpZiAocGV4cC0+b3BlcmF0aW9uID09IGxvcikKKysJICByZXR1cm4gbGVmdGFyZyB8fCBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMV0sIG4pOworKwllbHNlIGlmIChwZXhwLT5vcGVyYXRpb24gPT0gbGFuZCkKKysJICByZXR1cm4gbGVmdGFyZyAmJiBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMV0sIG4pOworKwllbHNlCisrCSAgeworKwkgICAgdW5zaWduZWQgbG9uZyBpbnQgcmlnaHRhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMV0sIG4pOworKworKwkgICAgc3dpdGNoIChwZXhwLT5vcGVyYXRpb24pCisrCSAgICAgIHsKKysJICAgICAgY2FzZSBtdWx0OgorKwkJcmV0dXJuIGxlZnRhcmcgKiByaWdodGFyZzsKKysJICAgICAgY2FzZSBkaXZpZGU6CisrI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKKysJCWlmIChyaWdodGFyZyA9PSAwKQorKwkJICByYWlzZSAoU0lHRlBFKTsKKysjZW5kaWYKKysJCXJldHVybiBsZWZ0YXJnIC8gcmlnaHRhcmc7CisrCSAgICAgIGNhc2UgbW9kdWxlOgorKyNpZiAhSU5URElWMF9SQUlTRVNfU0lHRlBFCisrCQlpZiAocmlnaHRhcmcgPT0gMCkKKysJCSAgcmFpc2UgKFNJR0ZQRSk7CisrI2VuZGlmCisrCQlyZXR1cm4gbGVmdGFyZyAlIHJpZ2h0YXJnOworKwkgICAgICBjYXNlIHBsdXM6CisrCQlyZXR1cm4gbGVmdGFyZyArIHJpZ2h0YXJnOworKwkgICAgICBjYXNlIG1pbnVzOgorKwkJcmV0dXJuIGxlZnRhcmcgLSByaWdodGFyZzsKKysJICAgICAgY2FzZSBsZXNzX3RoYW46CisrCQlyZXR1cm4gbGVmdGFyZyA8IHJpZ2h0YXJnOworKwkgICAgICBjYXNlIGdyZWF0ZXJfdGhhbjoKKysJCXJldHVybiBsZWZ0YXJnID4gcmlnaHRhcmc7CisrCSAgICAgIGNhc2UgbGVzc19vcl9lcXVhbDoKKysJCXJldHVybiBsZWZ0YXJnIDw9IHJpZ2h0YXJnOworKwkgICAgICBjYXNlIGdyZWF0ZXJfb3JfZXF1YWw6CisrCQlyZXR1cm4gbGVmdGFyZyA+PSByaWdodGFyZzsKKysJICAgICAgY2FzZSBlcXVhbDoKKysJCXJldHVybiBsZWZ0YXJnID09IHJpZ2h0YXJnOworKwkgICAgICBjYXNlIG5vdF9lcXVhbDoKKysJCXJldHVybiBsZWZ0YXJnICE9IHJpZ2h0YXJnOworKwkgICAgICBkZWZhdWx0OgorKwkJYnJlYWs7CisrCSAgICAgIH0KKysJICB9CisrCS8qIE5PVFJFQUNIRUQgKi8KKysJYnJlYWs7CisrICAgICAgfQorKyAgICBjYXNlIDM6CisrICAgICAgeworKwkvKiBwZXhwLT5vcGVyYXRpb24gbXVzdCBiZSBxbW9wLiAgKi8KKysJdW5zaWduZWQgbG9uZyBpbnQgYm9vbGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7CisrCXJldHVybiBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbYm9vbGFyZyA/IDEgOiAyXSwgbik7CisrICAgICAgfQorKyAgICB9CisrICAvKiBOT1RSRUFDSEVEICovCisrICByZXR1cm4gMDsKKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZXhwbG9kZW5hbWUuYwkxOTk4LTA0LTI2IDA5OjIyOjM3LjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9leHBsb2RlbmFtZS5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuMzk1NzQyMDA4IC0wNDAwCitAQCAtMSwxOSArMSwyMCBAQAorLS8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KKyAKKy0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CistICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCistICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisgCisgI2lmZGVmIEhBVkVfQ09ORklHX0gKKyAjIGluY2x1ZGUgPGNvbmZpZy5oPgorQEAgLTM2LDE4ICszNywyMyBAQAorIAorIC8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKyAKKytjaGFyICoKKytfbmxfZmluZF9sYW5ndWFnZSAoY29uc3QgY2hhciAqbmFtZSkKKyt7CisrICB3aGlsZSAobmFtZVswXSAhPSAnXDAnICYmIG5hbWVbMF0gIT0gJ18nICYmIG5hbWVbMF0gIT0gJ0AnCisrCSAmJiBuYW1lWzBdICE9ICcrJyAmJiBuYW1lWzBdICE9ICcsJykKKysgICAgKytuYW1lOworKworKyAgcmV0dXJuIChjaGFyICopIG5hbWU7CisrfQorKworKworIGludAorLV9ubF9leHBsb2RlX25hbWUgKG5hbWUsIGxhbmd1YWdlLCBtb2RpZmllciwgdGVycml0b3J5LCBjb2Rlc2V0LAorLQkJICBub3JtYWxpemVkX2NvZGVzZXQsIHNwZWNpYWwsIHNwb25zb3IsIHJldmlzaW9uKQorLSAgICAgY2hhciAqbmFtZTsKKy0gICAgIGNvbnN0IGNoYXIgKipsYW5ndWFnZTsKKy0gICAgIGNvbnN0IGNoYXIgKiptb2RpZmllcjsKKy0gICAgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnk7CistICAgICBjb25zdCBjaGFyICoqY29kZXNldDsKKy0gICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQ7CistICAgICBjb25zdCBjaGFyICoqc3BlY2lhbDsKKy0gICAgIGNvbnN0IGNoYXIgKipzcG9uc29yOworLSAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uOworK19ubF9leHBsb2RlX25hbWUgKGNoYXIgKm5hbWUsCisrCQkgIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwgY29uc3QgY2hhciAqKm1vZGlmaWVyLAorKwkJICBjb25zdCBjaGFyICoqdGVycml0b3J5LCBjb25zdCBjaGFyICoqY29kZXNldCwKKysJCSAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCwgY29uc3QgY2hhciAqKnNwZWNpYWwsCisrCQkgIGNvbnN0IGNoYXIgKipzcG9uc29yLCBjb25zdCBjaGFyICoqcmV2aXNpb24pCisgeworICAgZW51bSB7IHVuZGVjaWRlZCwgeHBnLCBjZW4gfSBzeW50YXg7CisgICBjaGFyICpjcDsKK0BAIC02Nyw5ICs3Myw3IEBACisgICBtYXNrID0gMDsKKyAgIHN5bnRheCA9IHVuZGVjaWRlZDsKKyAgICpsYW5ndWFnZSA9IGNwID0gbmFtZTsKKy0gIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdfJyAmJiBjcFswXSAhPSAnQCcKKy0JICYmIGNwWzBdICE9ICcrJyAmJiBjcFswXSAhPSAnLCcpCistICAgICsrY3A7CisrICBjcCA9IF9ubF9maW5kX2xhbmd1YWdlICgqbGFuZ3VhZ2UpOworIAorICAgaWYgKCpsYW5ndWFnZSA9PSBjcCkKKyAgICAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlOiBsYW5ndWFnZSBoYXMgdG8gYmUgc3BlY2lmaWVkLiAgVXNlCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZmluZGRvbWFpbi5jCTE5OTgtMDQtMjYgMDk6MjI6MzYuMDAwMDAwMDAwIC0wNDAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL2ZpbmRkb21haW4uYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjQxNTczODk2OCAtMDQwMAorQEAgLTEsNjQgKzEsNDAgQEAKKyAvKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncworLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KKysgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251Lm9yZz4sIDE5OTUuCisgCistICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICAgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCistICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKy0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworIAorICNpZmRlZiBIQVZFX0NPTkZJR19ICisgIyBpbmNsdWRlIDxjb25maWcuaD4KKyAjZW5kaWYKKyAKKy0jaW5jbHVkZSA8Y3R5cGUuaD4KKy0jaW5jbHVkZSA8ZXJybm8uaD4KKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CistCistI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKKy0jIGluY2x1ZGUgPHN0ZGxpYi5oPgorLSNlbHNlCistIyBpZmRlZiBIQVZFX01BTExPQ19ICistIyAgaW5jbHVkZSA8bWFsbG9jLmg+CistIyBlbHNlCistdm9pZCBmcmVlICgpOworLSMgZW5kaWYKKy0jZW5kaWYKKy0KKy0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKKy0jIGluY2x1ZGUgPHN0cmluZy5oPgorLSNlbHNlCistIyBpbmNsdWRlIDxzdHJpbmdzLmg+CistIyBpZm5kZWYgbWVtY3B5CistIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKKy0jIGVuZGlmCistI2VuZGlmCistI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQworLSMgaWZuZGVmIHN0cmNocgorLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKKy0jIGVuZGlmCistI2VuZGlmCisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyAKKyAjaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKKyAjIGluY2x1ZGUgPHVuaXN0ZC5oPgorICNlbmRpZgorIAorLSNpbmNsdWRlICJnZXR0ZXh0LmgiCisgI2luY2x1ZGUgImdldHRleHRQLmgiCisgI2lmZGVmIF9MSUJDCisgIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisgI2Vsc2UKKy0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKKysjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyAjZW5kaWYKKyAKKyAvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCitAQCAtNzAsMTAgKzQ2LDkgQEAKKyAgICB0aGUgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkgcGFyYW1ldGVycyB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnRseQorICAgIGVzdGFibGlzaGVkIGJpbmRpbmdzLiAgKi8KKyBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKKy1fbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIGxvY2FsZSwgZG9tYWlubmFtZSkKKy0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7CistICAgICBjaGFyICpsb2NhbGU7CistICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOworK2ludGVybmFsX2Z1bmN0aW9uCisrX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpkaXJuYW1lLCBjaGFyICpsb2NhbGUsCisrCQkgY29uc3QgY2hhciAqZG9tYWlubmFtZSwgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCisgeworICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOworICAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7CitAQCAtOTUsOSArNzAsOSBAQAorIAorIAlsYW5ndWFnZVtfdGVycml0b3J5XVsrYXVkaWVuY2VdWytzcGVjaWFsXVssW3Nwb25zb3JdW19yZXZpc2lvbl1dCisgCistICAgICBCZXNpZGUgdGhlIGZpcnN0IGFsbCBvZiB0aGVtIGFyZSBhbGxvd2VkIHRvIGJlIG1pc3NpbmcuICBJZiB0aGUKKy0gICAgIGZ1bGwgc3BlY2lmaWVkIGxvY2FsZSBpcyBub3QgZm91bmQsIHRoZSBsZXNzIHNwZWNpZmljIG9uZSBhcmUKKy0gICAgIGxvb2tlZCBmb3IuICBUaGUgdmFyaW91cyBwYXJ0IHdpbGwgYmUgc3RyaXBwZWQgb2YgYWNjb3JkaW5nIHRvCisrICAgICBCZXNpZGUgdGhlIGZpcnN0IHBhcnQgYWxsIG9mIHRoZW0gYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZy4gIElmCisrICAgICB0aGUgZnVsbCBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZCwgdGhlIGxlc3Mgc3BlY2lmaWMgb25lIGFyZQorKyAgICAgbG9va2VkIGZvci4gIFRoZSB2YXJpb3VzIHBhcnRzIHdpbGwgYmUgc3RyaXBwZWQgb2ZmIGFjY29yZGluZyB0bworICAgICAgdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAJCSgxKSByZXZpc2lvbgorIAkJKDIpIHNwb25zb3IKK0BAIC0xMTksNyArOTQsNyBAQAorICAgICAgIGludCBjbnQ7CisgCisgICAgICAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQorLQlfbmxfbG9hZF9kb21haW4gKHJldHZhbCk7CisrCV9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLCBkb21haW5iaW5kaW5nKTsKKyAKKyAgICAgICBpZiAocmV0dmFsLT5kYXRhICE9IE5VTEwpCisgCXJldHVybiByZXR2YWw7CitAQCAtMTI3LDcgKzEwMiw3IEBACisgICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQorIAl7CisgCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKKy0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSk7CisrCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0sIGRvbWFpbmJpbmRpbmcpOworIAorIAkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCisgCSAgICBicmVhazsKK0BAIC0xNDIsMTIgKzExNywxOCBAQAorICAgYWxpYXNfdmFsdWUgPSBfbmxfZXhwYW5kX2FsaWFzIChsb2NhbGUpOworICAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCisgICAgIHsKKysjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisrICAgICAgbG9jYWxlID0gc3RyZHVwIChhbGlhc192YWx1ZSk7CisrICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQorKwlyZXR1cm4gTlVMTDsKKysjZWxzZQorICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7CisgICAgICAgbG9jYWxlID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworICAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKKyAJcmV0dXJuIE5VTEw7CisgCisgICAgICAgbWVtY3B5IChsb2NhbGUsIGFsaWFzX3ZhbHVlLCBsZW4pOworKyNlbmRpZgorICAgICB9CisgCisgICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKK0BAIC0xNjgsMTQgKzE0OSwxNCBAQAorICAgICByZXR1cm4gTlVMTDsKKyAKKyAgIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKKy0gICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwpOworKyAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7CisgICBpZiAocmV0dmFsLT5kYXRhID09IE5VTEwpCisgICAgIHsKKyAgICAgICBpbnQgY250OworICAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKKyAJeworIAkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCistCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0pOworKwkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLCBkb21haW5iaW5kaW5nKTsKKyAJICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQorIAkgICAgYnJlYWs7CisgCX0KK0BAIC0xODUsNSArMTY2LDI3IEBACisgICBpZiAoYWxpYXNfdmFsdWUgIT0gTlVMTCkKKyAgICAgZnJlZSAobG9jYWxlKTsKKyAKKysgIC8qIFRoZSBzcGFjZSBmb3Igbm9ybWFsaXplZF9jb2Rlc2V0IGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQuICAqLworKyAgaWYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKQorKyAgICBmcmVlICgodm9pZCAqKSBub3JtYWxpemVkX2NvZGVzZXQpOworKworICAgcmV0dXJuIHJldHZhbDsKKyB9CisrCisrCisrI2lmZGVmIF9MSUJDCisrbGliY19mcmVlcmVzX2ZuIChmcmVlX21lbSkKKyt7CisrICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpydW5wID0gX25sX2xvYWRlZF9kb21haW5zOworKworKyAgd2hpbGUgKHJ1bnAgIT0gTlVMTCkKKysgICAgeworKyAgICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmhlcmUgPSBydW5wOworKyAgICAgIGlmIChydW5wLT5kYXRhICE9IE5VTEwpCisrCV9ubF91bmxvYWRfZG9tYWluICgoc3RydWN0IGxvYWRlZF9kb21haW4gKikgcnVucC0+ZGF0YSk7CisrICAgICAgcnVucCA9IHJ1bnAtPm5leHQ7CisrICAgICAgZnJlZSAoKGNoYXIgKikgaGVyZS0+ZmlsZW5hbWUpOworKyAgICAgIGZyZWUgKGhlcmUpOworKyAgICB9CisrfQorKyNlbmRpZgorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2dldHRleHQuYwkxOTk4LTA0LTI2IDA5OjIyOjM2LjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9nZXR0ZXh0LmMJMjAwNC0wOS0xMiAxNDo0MDozNC40MjA3MzgyMDggLTA0MDAKK0BAIC0xLDE5ICsxLDIwIEBACistLyogSW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dCgzKSBmdW5jdGlvbgorLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysvKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIAorLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CistICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCistICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKy0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCistICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKyAKKyAjaWZkZWYgSEFWRV9DT05GSUdfSAorICMgaW5jbHVkZSA8Y29uZmlnLmg+CitAQCAtMjMsMjEgKzI0LDE0IEBACisgIyBkZWZpbmUgX19uZWVkX05VTEwKKyAjIGluY2x1ZGUgPHN0ZGRlZi5oPgorICNlbHNlCistIyBpZmRlZiBTVERDX0hFQURFUlMKKy0jICBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLworLSMgZWxzZQorLSMgIGlmZGVmIEhBVkVfU1RSSU5HX0gKKy0jICAgaW5jbHVkZSA8c3RyaW5nLmg+CistIyAgZWxzZQorLSMgICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKy0jICBlbmRpZgorLSMgZW5kaWYKKysjIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCisgI2VuZGlmCisgCisrI2luY2x1ZGUgImdldHRleHRQLmgiCisgI2lmZGVmIF9MSUJDCisgIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisgI2Vsc2UKKy0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKKysjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyAjZW5kaWYKKyAKKyAvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCitAQCAtNDgsMjAgKzQyLDE5IEBACisgICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyAjaWZkZWYgX0xJQkMKKyAjIGRlZmluZSBHRVRURVhUIF9fZ2V0dGV4dAorLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKKysjIGRlZmluZSBEQ0dFVFRFWFQgSU5UVVNFKF9fZGNnZXR0ZXh0KQorICNlbHNlCistIyBkZWZpbmUgR0VUVEVYVCBnZXR0ZXh0X18KKy0jIGRlZmluZSBER0VUVEVYVCBkZ2V0dGV4dF9fCisrIyBkZWZpbmUgR0VUVEVYVCBsaWJpbnRsX2dldHRleHQKKysjIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKKyAjZW5kaWYKKyAKKyAvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICAgdGV4dCkuICAqLworIGNoYXIgKgorLUdFVFRFWFQgKG1zZ2lkKQorLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7CisrR0VUVEVYVCAoY29uc3QgY2hhciAqbXNnaWQpCisgeworLSAgcmV0dXJuIERHRVRURVhUIChOVUxMLCBtc2dpZCk7CisrICByZXR1cm4gRENHRVRURVhUIChOVUxMLCBtc2dpZCwgTENfTUVTU0FHRVMpOworIH0KKyAKKyAjaWZkZWYgX0xJQkMKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9nZXR0ZXh0LmgJMTk5OC0wNC0yNiAwOToyMjozNS4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvZ2V0dGV4dC5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCitAQCAtMSwxMDUgKzAsMCBAQAorLS8qIEludGVybmFsIGhlYWRlciBmb3IgR05VIGdldHRleHQgaW50ZXJuYXRpb25hbGl6YXRpb24gZnVuY3Rpb25zCistICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLQorLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CistICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCistICAgYW55IGxhdGVyIHZlcnNpb24uCistCistICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCistICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy0KKy0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAorLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKy0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCistCistI2lmbmRlZiBfR0VUVEVYVF9ICistI2RlZmluZSBfR0VUVEVYVF9IIDEKKy0KKy0jaW5jbHVkZSA8c3RkaW8uaD4KKy0KKy0jaWYgSEFWRV9MSU1JVFNfSCB8fCBfTElCQworLSMgaW5jbHVkZSA8bGltaXRzLmg+CistI2VuZGlmCistCistLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworLQorLS8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KKy0jZGVmaW5lIF9NQUdJQyAweDk1MDQxMmRlCistI2RlZmluZSBfTUFHSUNfU1dBUFBFRCAweGRlMTIwNDk1CistCistLyogUmV2aXNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgdXNlZCAubW8gKGJpbmFyeSkgZmlsZSBmb3JtYXQuICAqLworLSNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSIDAKKy0KKy0vKiBUaGUgZm9sbG93aW5nIGNvbnRvcnRpb25zIGFyZSBhbiBhdHRlbXB0IHRvIHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IKKy0gICB0byBkZXRlcm1pbmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIDMyIGJpdHMgd2lkZS4gIEFuCistICAgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgdG8gdXNlIGF1dG9jb25mJ3MgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvLCBidXQKKy0gICBkb2luZyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBjb21waWxlIGFuZCAqcnVuKgorLSAgIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZS4gIExvY2FsbHkgcnVubmluZyBjcm9zcy1jb21waWxlZCBleGVjdXRhYmxlcworLSAgIGlzIHVzdWFsbHkgbm90IHBvc3NpYmxlLiAgKi8KKy0KKy0jaWYgX19TVERDX18KKy0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDQyOTQ5NjcyOTVVCistI2Vsc2UKKy0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKKy0jZW5kaWYKKy0KKy0vKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgorLSAgIFRoaXMgc2hvdWxkIGJlIHZhbGlkIGZvciBhbGwgc3lzdGVtcyBHTlUgY2FyZXMgYWJvdXQgYmVjYXVzZQorLSAgIHRoYXQgZG9lc24ndCBpbmNsdWRlIDE2LWJpdCBzeXN0ZW1zLCBhbmQgb25seSBtb2Rlcm4gc3lzdGVtcworLSAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCistCistI2lmbmRlZiBVSU5UX01BWAorLSMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKKy0jZW5kaWYKKy0KKy0jaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUworLXR5cGVkZWYgdW5zaWduZWQgbmxzX3VpbnQzMjsKKy0jZWxzZQorLSMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKKy10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG5sc191aW50MzI7CistIyBlbHNlCistIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKKy10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbmxzX3VpbnQzMjsKKy0jICBlbHNlCistICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKKy0gICAgIG5vdCBwb3J0YWJsZSBlbm91Z2guICAqLworLSAgIkNhbm5vdCBkZXRlcm1pbmUgdW5zaWduZWQgMzItYml0IGRhdGEgdHlwZS4iCistIyAgZW5kaWYKKy0jIGVuZGlmCistI2VuZGlmCistCistCistLyogSGVhZGVyIGZvciBiaW5hcnkgLm1vIGZpbGUgZm9ybWF0LiAgKi8KKy1zdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKKy17CistICAvKiBUaGUgbWFnaWMgbnVtYmVyLiAgKi8KKy0gIG5sc191aW50MzIgbWFnaWM7CistICAvKiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdC4gICovCistICBubHNfdWludDMyIHJldmlzaW9uOworLSAgLyogVGhlIG51bWJlciBvZiBzdHJpbmdzIHBhaXJzLiAgKi8KKy0gIG5sc191aW50MzIgbnN0cmluZ3M7CistICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN0cmluZ3MuICAqLworLSAgbmxzX3VpbnQzMiBvcmlnX3RhYl9vZmZzZXQ7CistICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIHRyYW5zbGF0aW9uIHN0cmluZ3MuICAqLworLSAgbmxzX3VpbnQzMiB0cmFuc190YWJfb2Zmc2V0OworLSAgLyogU2l6ZSBvZiBoYXNoaW5nIHRhYmxlLiAgKi8KKy0gIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKKy0gIC8qIE9mZnNldCBvZiBmaXJzdCBoYXNoaW5nIGVudHJ5LiAgKi8KKy0gIG5sc191aW50MzIgaGFzaF90YWJfb2Zmc2V0OworLX07CistCistc3RydWN0IHN0cmluZ19kZXNjCisteworLSAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcuICAqLworLSAgbmxzX3VpbnQzMiBsZW5ndGg7CistICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLworLSAgbmxzX3VpbnQzMiBvZmZzZXQ7CistfTsKKy0KKy0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKy0KKy0jZW5kaWYJLyogZ2V0dGV4dC5oICAqLworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2dldHRleHRQLmgJMTk5OC0wNC0yNiAwOToyMjozNS4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvZ2V0dGV4dFAuaAkyMDA0LTA5LTEyIDE0OjQwOjM0LjQyNjczNzI5NiAtMDQwMAorQEAgLTEsMzMgKzEsNTMgQEAKKy0vKiBIZWFkZXIgZGVzY3JpYmluZyBpbnRlcm5hbHMgb2YgZ2V0dGV4dCBsaWJyYXJ5CistICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKy8qIEhlYWRlciBkZXNjcmliaW5nIGludGVybmFscyBvZiBsaWJpbnRsIGxpYnJhcnkuCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIAorLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CistICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCistICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKy0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCistICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKyAKKyAjaWZuZGVmIF9HRVRURVhUUF9ICisgI2RlZmluZSBfR0VUVEVYVFBfSAorIAorKyNpbmNsdWRlIDxzdGRkZWYuaD4JCS8qIEdldCBzaXplX3QuICAqLworKworKyNpZmRlZiBfTElCQworKyMgaW5jbHVkZSAiLi4vaWNvbnYvZ2NvbnZfaW50LmgiCisrI2Vsc2UKKysjIGlmIEhBVkVfSUNPTlYKKysjICBpbmNsdWRlIDxpY29udi5oPgorKyMgZW5kaWYKKysjZW5kaWYKKysKKyAjaW5jbHVkZSAibG9hZGluZm8uaCIKKyAKKysjaW5jbHVkZSAiZ21vLmgiCQkvKiBHZXQgbmxzX3VpbnQzMi4gICovCisrCisgLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworIAorLSNpZm5kZWYgUEFSQU1TCistIyBpZiBfX1NURENfXworLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncworLSMgZWxzZQorLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKKy0jIGVuZGlmCisrI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgorKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisrI2VuZGlmCisrCisrI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCisrIyBkZWZpbmUgYXR0cmlidXRlX2hpZGRlbgorKyNlbmRpZgorKworKy8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKKysgICBhbG1vc3QgYWx3YXlzIHRydWUgb3IgYWxtb3N0IGFsd2F5cyBmYWxzZS4gICovCisrI2lmbmRlZiBIQVZFX0JVSUxUSU5fRVhQRUNUCisrIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQorICNlbmRpZgorIAorICNpZm5kZWYgVworQEAgLTM1LDM4ICs1NSwxNjAgQEAKKyAjZW5kaWYKKyAKKyAKKy1zdGF0aWMgbmxzX3VpbnQzMiBTV0FQIFBBUkFNUyAoKG5sc191aW50MzIgaSkpOworLQorKyNpZmRlZiBfTElCQworKyMgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKysjIGRlZmluZSBTV0FQKGkpIGJzd2FwXzMyIChpKQorKyNlbHNlCisgc3RhdGljIGlubGluZSBubHNfdWludDMyCisgU1dBUCAoaSkKKyAgICAgIG5sc191aW50MzIgaTsKKyB7CisgICByZXR1cm4gKGkgPDwgMjQpIHwgKChpICYgMHhmZjAwKSA8PCA4KSB8ICgoaSA+PiA4KSAmIDB4ZmYwMCkgfCAoaSA+PiAyNCk7CisgfQorKyNlbmRpZgorKworIAorKy8qIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCisrc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYworK3sKKysgIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisrICBzaXplX3QgbGVuZ3RoOworKyAgLyogUG9pbnRlciB0byBhZGRyZXNzZWQgc3RyaW5nLiAgKi8KKysgIGNvbnN0IGNoYXIgKnBvaW50ZXI7CisrfTsKKyAKKysvKiBUaGUgcmVwcmVzZW50YXRpb24gb2YgYW4gb3BlbmVkIG1lc3NhZ2UgY2F0YWxvZy4gICovCisgc3RydWN0IGxvYWRlZF9kb21haW4KKyB7CisrICAvKiBQb2ludGVyIHRvIG1lbW9yeSBjb250YWluaW5nIHRoZSAubW8gZmlsZS4gICovCisgICBjb25zdCBjaGFyICpkYXRhOworKyAgLyogMSBpZiB0aGUgbWVtb3J5IGlzIG1tYXAoKWVkLCAwIGlmIHRoZSBtZW1vcnkgaXMgbWFsbG9jKCllZC4gICovCisrICBpbnQgdXNlX21tYXA7CisrICAvKiBTaXplIG9mIG1tYXAoKWVkIG1lbW9yeS4gICovCisrICBzaXplX3QgbW1hcF9zaXplOworKyAgLyogMSBpZiB0aGUgLm1vIGZpbGUgdXNlcyBhIGRpZmZlcmVudCBlbmRpYW5uZXNzIHRoYW4gdGhpcyBtYWNoaW5lLiAgKi8KKyAgIGludCBtdXN0X3N3YXA7CisrICAvKiBQb2ludGVyIHRvIGFkZGl0aW9uYWwgbWFsbG9jKCllZCBtZW1vcnkuICAqLworKyAgdm9pZCAqbWFsbG9jZWQ7CisrCisrICAvKiBOdW1iZXIgb2Ygc3RhdGljIHN0cmluZ3MgcGFpcnMuICAqLworICAgbmxzX3VpbnQzMiBuc3RyaW5nczsKKy0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqb3JpZ190YWI7CistICBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKnRyYW5zX3RhYjsKKysgIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2Ygb3JpZ2luYWwgc3RyaW5ncyBpbiB0aGUgZmlsZS4gICovCisrICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKm9yaWdfdGFiOworKyAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiB0cmFuc2xhdGVkIHN0cmluZ3MgaW4gdGhlIGZpbGUuICAqLworKyAgY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICp0cmFuc190YWI7CisrCisrICAvKiBOdW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIHBhaXJzLiAgKi8KKysgIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKKysgIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLworKyAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqb3JpZ19zeXNkZXBfdGFiOworKyAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiB0cmFuc2xhdGVkIHN5c2RlcCBzdHJpbmdzLiAgKi8KKysgIGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKnRyYW5zX3N5c2RlcF90YWI7CisrCisrICAvKiBTaXplIG9mIGhhc2ggdGFibGUuICAqLworICAgbmxzX3VpbnQzMiBoYXNoX3NpemU7CistICBubHNfdWludDMyICpoYXNoX3RhYjsKKysgIC8qIFBvaW50ZXIgdG8gaGFzaCB0YWJsZS4gICovCisrICBjb25zdCBubHNfdWludDMyICpoYXNoX3RhYjsKKysgIC8qIDEgaWYgdGhlIGhhc2ggdGFibGUgdXNlcyBhIGRpZmZlcmVudCBlbmRpYW5uZXNzIHRoYW4gdGhpcyBtYWNoaW5lLiAgKi8KKysgIGludCBtdXN0X3N3YXBfaGFzaF90YWI7CisrCisrICBpbnQgY29kZXNldF9jbnRyOworKyNpZmRlZiBfTElCQworKyAgX19nY29udl90IGNvbnY7CisrI2Vsc2UKKysjIGlmIEhBVkVfSUNPTlYKKysgIGljb252X3QgY29udjsKKysjIGVuZGlmCisrI2VuZGlmCisrICBjaGFyICoqY29udl90YWI7CisrCisrICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcGx1cmFsOworKyAgdW5zaWduZWQgbG9uZyBpbnQgbnBsdXJhbHM7CisgfTsKKyAKKysvKiBXZSB3YW50IHRvIGFsbG9jYXRlIGEgc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdC4gIEJ1dCBJU08gQworKyAgIGRvZXNuJ3QgYWxsb3cgemVybyBzaXplZCBhcnJheXMuICAqLworKyNpZmRlZiBfX0dOVUNfXworKyMgZGVmaW5lIFpFUk8gMAorKyNlbHNlCisrIyBkZWZpbmUgWkVSTyAxCisrI2VuZGlmCisrCisrLyogQSBzZXQgb2Ygc2V0dGluZ3MgYm91bmQgdG8gYSBtZXNzYWdlIGRvbWFpbi4gIFVzZWQgdG8gc3RvcmUgc2V0dGluZ3MKKysgICBmcm9tIGJpbmR0ZXh0ZG9tYWluKCkgYW5kIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkuICAqLworIHN0cnVjdCBiaW5kaW5nCisgeworICAgc3RydWN0IGJpbmRpbmcgKm5leHQ7CistICBjaGFyICpkb21haW5uYW1lOworICAgY2hhciAqZGlybmFtZTsKKysgIGludCBjb2Rlc2V0X2NudHI7CS8qIEluY3JlbWVudGVkIGVhY2ggdGltZSBjb2Rlc2V0IGNoYW5nZXMuICAqLworKyAgY2hhciAqY29kZXNldDsKKysgIGNoYXIgZG9tYWlubmFtZVtaRVJPXTsKKyB9OworIAorLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9maW5kX2RvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2Rpcm5hbWUsCistCQkJCQkJIGNoYXIgKl9fbG9jYWxlLAorLQkJCQkJCSBjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKKy12b2lkIF9ubF9sb2FkX2RvbWFpbiBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfX2RvbWFpbikpOworKy8qIEEgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgc29tZSBwcmV2aW91cyB0cmFuc2xhdGlvbnMKKysgICBiZWNvbWUgaW52YWxpZC4KKysgICBUaGlzIHZhcmlhYmxlIGlzIHBhcnQgb2YgdGhlIGV4dGVybmFsIEFCSSBvZiB0aGUgR05VIGxpYmludGwuICAqLworK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKysKKysjaWZuZGVmIF9MSUJDCisrY29uc3QgY2hhciAqX25sX2xvY2FsZV9uYW1lIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSk7CisrI2VuZGlmCisrCisrc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpfX2Rpcm5hbWUsIGNoYXIgKl9fbG9jYWxlLAorKwkJCQkJIGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKysJCQkJCSBzdHJ1Y3QgYmluZGluZyAqX19kb21haW5iaW5kaW5nKQorKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247Cisrdm9pZCBfbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9fZG9tYWluLAorKwkJICAgICAgc3RydWN0IGJpbmRpbmcgKl9fZG9tYWluYmluZGluZykKKysgICAgIGludGVybmFsX2Z1bmN0aW9uOworK3ZvaWQgX25sX3VubG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfZG9tYWluICpfX2RvbWFpbikKKysgICAgIGludGVybmFsX2Z1bmN0aW9uOworK2NvbnN0IGNoYXIgKl9ubF9pbml0X2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfX2RvbWFpbl9maWxlLAorKwkJCQkgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpfX2RvbWFpbiwKKysJCQkJICBzdHJ1Y3QgYmluZGluZyAqX19kb21haW5iaW5kaW5nKQorKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247Cisrdm9pZCBfbmxfZnJlZV9kb21haW5fY29udiAoc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluKQorKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisrCisrY2hhciAqX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKysJCSAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZywgY29uc3QgY2hhciAqbXNnaWQsCisrCQkgICAgc2l6ZV90ICpsZW5ndGhwKQorKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisrCisrI2lmZGVmIF9MSUJDCisrZXh0ZXJuIGNoYXIgKl9fZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCk7CisrZXh0ZXJuIGNoYXIgKl9fZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCk7CisrZXh0ZXJuIGNoYXIgKl9fZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisrCQkJICBpbnQgX19jYXRlZ29yeSk7CisrZXh0ZXJuIGNoYXIgKl9fbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKysJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19uKTsKKytleHRlcm4gY2hhciAqX19kbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKysJCQkgIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKysJCQkgIHVuc2lnbmVkIGxvbmcgaW50IG4pOworK2V4dGVybiBjaGFyICpfX2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKysJCQkgICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisrCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSk7CisrZXh0ZXJuIGNoYXIgKl9fZGNpZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorKwkJCSAgIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKysJCQkgICBpbnQgX19wbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwKKysJCQkgICBpbnQgX19jYXRlZ29yeSk7CisrZXh0ZXJuIGNoYXIgKl9fdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKTsKKytleHRlcm4gY2hhciAqX19iaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorKwkJCSAgICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpOworK2V4dGVybiBjaGFyICpfX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisrCQkJCQljb25zdCBjaGFyICpfX2NvZGVzZXQpOworKyNlbHNlCisrLyogRGVjbGFyZSB0aGUgZXhwb3J0ZWQgbGliaW50bF8qIGZ1bmN0aW9ucywgaW4gYSB3YXkgdGhhdCBhbGxvd3MgdXMgdG8KKysgICBjYWxsIHRoZW0gdW5kZXIgdGhlaXIgcmVhbCBuYW1lLiAgKi8KKysjIHVuZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorKyMgdW5kZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisrIyBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisrIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisrZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNpZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorKwkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorKwkJCQkgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCisrCQkJCSBpbnQgX19jYXRlZ29yeSk7CisrI2VuZGlmCisgCisgLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCisgCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZ21vLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvZ21vLmgJMjAwNC0wOS0xMiAxNDo0MDozNC40MzE3MzY1MzYgLTA0MDAKK0BAIC0wLDAgKzEsMTQ5IEBACisrLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IGdlbmVyYWwgZmlsZSBsYXlvdXQuCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKyNpZm5kZWYgX0dFVFRFWFRfSAorKyNkZWZpbmUgX0dFVFRFWFRfSCAxCisrCisrI2luY2x1ZGUgPGxpbWl0cy5oPgorKworKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKysKKysvKiBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdC4gICovCisrI2RlZmluZSBfTUFHSUMgMHg5NTA0MTJkZQorKyNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQorKworKy8qIFJldmlzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudGx5IHVzZWQgLm1vIChiaW5hcnkpIGZpbGUgZm9ybWF0LiAgKi8KKysjZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCisrI2RlZmluZSBNT19SRVZJU0lPTl9OVU1CRVJfV0lUSF9TWVNERVBfSSAxCisrCisrLyogVGhlIGZvbGxvd2luZyBjb250b3J0aW9ucyBhcmUgYW4gYXR0ZW1wdCB0byB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yCisrICAgdG8gZGV0ZXJtaW5lIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUgdGhhdCBpcyAzMiBiaXRzIHdpZGUuICBBbgorKyAgIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIHVzZSBhdXRvY29uZidzIEFDX0NIRUNLX1NJWkVPRiBtYWNybywgYnV0CisrICAgYXMgb2YgdmVyc2lvbiBhdXRvY29uZi0yLjEzLCB0aGUgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvIGRvZXNuJ3Qgd29yaworKyAgIHdoZW4gY3Jvc3MtY29tcGlsaW5nLiAgKi8KKysKKysjaWYgX19TVERDX18KKysjIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDQyOTQ5NjcyOTVVCisrI2Vsc2UKKysjIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKKysjZW5kaWYKKysKKysvKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgorKyAgIFRoaXMgc2hvdWxkIGJlIHZhbGlkIGZvciBhbGwgc3lzdGVtcyBHTlUgY2FyZXMgYWJvdXQgYmVjYXVzZQorKyAgIHRoYXQgZG9lc24ndCBpbmNsdWRlIDE2LWJpdCBzeXN0ZW1zLCBhbmQgb25seSBtb2Rlcm4gc3lzdGVtcworKyAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCisrCisrI2lmbmRlZiBVSU5UX01BWAorKyMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKKysjZW5kaWYKKysKKysjaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUworK3R5cGVkZWYgdW5zaWduZWQgbmxzX3VpbnQzMjsKKysjZWxzZQorKyMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKKyt0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG5sc191aW50MzI7CisrIyBlbHNlCisrIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKKyt0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbmxzX3VpbnQzMjsKKysjICBlbHNlCisrICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKKysgICAgIG5vdCBwb3J0YWJsZSBlbm91Z2guICAqLworKyAgIkNhbm5vdCBkZXRlcm1pbmUgdW5zaWduZWQgMzItYml0IGRhdGEgdHlwZS4iCisrIyAgZW5kaWYKKysjIGVuZGlmCisrI2VuZGlmCisrCisrCisrLyogSGVhZGVyIGZvciBiaW5hcnkgLm1vIGZpbGUgZm9ybWF0LiAgKi8KKytzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKKyt7CisrICAvKiBUaGUgbWFnaWMgbnVtYmVyLiAgKi8KKysgIG5sc191aW50MzIgbWFnaWM7CisrICAvKiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdC4gICovCisrICBubHNfdWludDMyIHJldmlzaW9uOworKworKyAgLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1ham9yIHJldmlzaW9uIDAgb3IgMS4gICovCisrCisrICAvKiBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgcGFpcnMuICAqLworKyAgbmxzX3VpbnQzMiBuc3RyaW5nczsKKysgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3RyaW5ncy4gICovCisrICBubHNfdWludDMyIG9yaWdfdGFiX29mZnNldDsKKysgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRlZCBzdHJpbmdzLiAgKi8KKysgIG5sc191aW50MzIgdHJhbnNfdGFiX29mZnNldDsKKysgIC8qIFNpemUgb2YgaGFzaCB0YWJsZS4gICovCisrICBubHNfdWludDMyIGhhc2hfdGFiX3NpemU7CisrICAvKiBPZmZzZXQgb2YgZmlyc3QgaGFzaCB0YWJsZSBlbnRyeS4gICovCisrICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKKysKKysgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtaW5vciByZXZpc2lvbiA+PSAxLiAgKi8KKysKKysgIC8qIFRoZSBudW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCisrICBubHNfdWludDMyIG5fc3lzZGVwX3NlZ21lbnRzOworKyAgLyogT2Zmc2V0IG9mIHRhYmxlIGRlc2NyaWJpbmcgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCisrICBubHNfdWludDMyIHN5c2RlcF9zZWdtZW50c19vZmZzZXQ7CisrICAvKiBUaGUgbnVtYmVyIG9mIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBwYWlycy4gICovCisrICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7CisrICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN5c2RlcCBzdHJpbmdzLiAgKi8KKysgIG5sc191aW50MzIgb3JpZ19zeXNkZXBfdGFiX29mZnNldDsKKysgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCisrICBubHNfdWludDMyIHRyYW5zX3N5c2RlcF90YWJfb2Zmc2V0OworK307CisrCisrLyogRGVzY3JpcHRvciBmb3Igc3RhdGljIHN0cmluZyBjb250YWluZWQgaW4gdGhlIGJpbmFyeSAubW8gZmlsZS4gICovCisrc3RydWN0IHN0cmluZ19kZXNjCisreworKyAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcsIG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisrICBubHNfdWludDMyIGxlbmd0aDsKKysgIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCisrICBubHNfdWludDMyIG9mZnNldDsKKyt9OworKworKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtaW5vciByZXZpc2lvbiA+PSAxLiAgKi8KKysKKysvKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LiAgKi8KKytzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQKKyt7CisrICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLworKyAgbmxzX3VpbnQzMiBsZW5ndGg7CisrICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLworKyAgbmxzX3VpbnQzMiBvZmZzZXQ7CisrfTsKKysKKysvKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCisrc3RydWN0IHN5c2RlcF9zdHJpbmcKKyt7CisrICAvKiBPZmZzZXQgb2Ygc3RhdGljIHN0cmluZyBzZWdtZW50cyBpbiBmaWxlLiAgKi8KKysgIG5sc191aW50MzIgb2Zmc2V0OworKyAgLyogQWx0ZXJuYXRpbmcgc2VxdWVuY2Ugb2Ygc3RhdGljIGFuZCBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLgorKyAgICAgVGhlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXRpYyBzZWdtZW50LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisrICBzdHJ1Y3Qgc2VnbWVudF9wYWlyCisrICB7CisrICAgIC8qIFNpemUgb2Ygc3RhdGljIHNlZ21lbnQuICAqLworKyAgICBubHNfdWludDMyIHNlZ3NpemU7CisrICAgIC8qIFJlZmVyZW5jZSB0byBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LCBvciB+MCBhdCB0aGUgZW5kLiAgKi8KKysgICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7CisrICB9IHNlZ21lbnRzWzFdOworK307CisrCisrLyogTWFya2VyIGZvciB0aGUgZW5kIG9mIHRoZSBzZWdtZW50c1tdIGFycmF5LiAgVGhpcyBoYXMgdGhlIHZhbHVlIDB4RkZGRkZGRkYsCisrICAgcmVnYXJkbGVzcyB3aGV0aGVyICdpbnQnIGlzIDE2IGJpdCwgMzIgYml0LCBvciA2NCBiaXQuICAqLworKyNkZWZpbmUgU0VHTUVOVFNfRU5EICgobmxzX3VpbnQzMikgfjApCisrCisrLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCisrCisrI2VuZGlmCS8qIGdldHRleHQuaCAgKi8KKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9oYXNoLXN0cmluZy5oCTE5OTgtMDQtMjYgMDk6MjI6MzYuMDAwMDAwMDAwIC0wNDAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL2hhc2gtc3RyaW5nLmgJMjAwNC0wOS0xMiAxNDo0MDozNC40MzY3MzU3NzYgLTA0MDAKK0BAIC0xLDM1ICsxLDIzIEBACistLyogSW1wbGVtZW50cyBhIHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgorLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysvKiBEZXNjcmlwdGlvbiBvZiBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdDogc3RyaW5nIGhhc2hpbmcgZnVuY3Rpb24uCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAKKy0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CistICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKy0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKy0gICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCistICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworLQorLSNpZmRlZiBIQVZFX1ZBTFVFU19ICistIyBpbmNsdWRlIDx2YWx1ZXMuaD4KKy0jZW5kaWYKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKyAKKyAvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisgCistI2lmbmRlZiBQQVJBTVMKKy0jIGlmIF9fU1REQ19fCistIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSBBcmdzCistIyBlbHNlCistIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSAoKQorLSMgZW5kaWYKKy0jZW5kaWYKKy0KKyAvKiBXZSBhc3N1bWUgdG8gaGF2ZSBgdW5zaWduZWQgbG9uZyBpbnQnIHZhbHVlIHdpdGggYXQgbGVhc3QgMzIgYml0cy4gICovCisgI2RlZmluZSBIQVNIV09SREJJVFMgMzIKKyAKK0BAIC0zNywxMSArMjUsOCBAQAorIC8qIERlZmluZXMgdGhlIHNvIGNhbGxlZCBgaGFzaHBqdycgZnVuY3Rpb24gYnkgUC5KLiBXZWluYmVyZ2VyCisgICAgW3NlZSBBaG8vU2V0aGkvVWxsbWFuLCBDT01QSUxFUlM6IFByaW5jaXBsZXMsIFRlY2huaXF1ZXMgYW5kIFRvb2xzLAorICAgIDE5ODYsIDE5ODcgQmVsbCBUZWxlcGhvbmUgTGFib3JhdG9yaWVzLCBJbmMuXSAgKi8KKy1zdGF0aWMgdW5zaWduZWQgbG9uZyBoYXNoX3N0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICpfX3N0cl9wYXJhbSkpOworLQorLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworLWhhc2hfc3RyaW5nIChzdHJfcGFyYW0pCistICAgICBjb25zdCBjaGFyICpzdHJfcGFyYW07Cisrc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGludAorK2hhc2hfc3RyaW5nIChjb25zdCBjaGFyICpzdHJfcGFyYW0pCisgeworICAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgZzsKKyAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cl9wYXJhbTsKK0BAIC01MSw4ICszNiw4IEBACisgICB3aGlsZSAoKnN0ciAhPSAnXDAnKQorICAgICB7CisgICAgICAgaHZhbCA8PD0gNDsKKy0gICAgICBodmFsICs9ICh1bnNpZ25lZCBsb25nKSAqc3RyKys7CistICAgICAgZyA9IGh2YWwgJiAoKHVuc2lnbmVkIGxvbmcpIDB4ZiA8PCAoSEFTSFdPUkRCSVRTIC0gNCkpOworKyAgICAgIGh2YWwgKz0gKHVuc2lnbmVkIGNoYXIpICpzdHIrKzsKKysgICAgICBnID0gaHZhbCAmICgodW5zaWduZWQgbG9uZyBpbnQpIDB4ZiA8PCAoSEFTSFdPUkRCSVRTIC0gNCkpOworICAgICAgIGlmIChnICE9IDApCisgCXsKKyAJICBodmFsIF49IGcgPj4gKEhBU0hXT1JEQklUUyAtIDgpOworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2ludGwtY29tcGF0LmMJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvaW50bC1jb21wYXQuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjQ0MTczNTAxNiAtMDQwMAorQEAgLTEsNzYgKzEsMTMxIEBACisgLyogaW50bC1jb21wYXQuYyAtIFN0dWIgZnVuY3Rpb25zIHRvIGNhbGwgZ2V0dGV4dCBmdW5jdGlvbnMgZnJvbSBHTlUgZ2V0dGV4dAorICAgIExpYnJhcnkuCistICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDIwMDAtMjAwMyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgCistVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKy1hbnkgbGF0ZXIgdmVyc2lvbi4KKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgYW55IGxhdGVyIHZlcnNpb24uCisgCistVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCistYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCistWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisgCisgI2lmZGVmIEhBVkVfQ09ORklHX0gKKyAjIGluY2x1ZGUgPGNvbmZpZy5oPgorICNlbmRpZgorIAorLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisrI2luY2x1ZGUgImdldHRleHRQLmgiCisgCisgLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworIAorKy8qIFRoaXMgZmlsZSByZWRpcmVjdHMgdGhlIGdldHRleHQgZnVuY3Rpb25zICh3aXRob3V0IHByZWZpeCkgdG8gdGhvc2UKKysgICBkZWZpbmVkIGluIHRoZSBpbmNsdWRlZCBHTlUgbGliaW50bCBsaWJyYXJ5ICh3aXRoICJsaWJpbnRsXyIgcHJlZml4KS4KKysgICBJdCBpcyBjb21waWxlZCBpbnRvIGxpYmludGwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgQU1fR05VX0dFVFRFWFQgdGVzdAorKyAgIG9mIGdldHRleHQgPD0gMC4xMS4yIHdvcmsgd2l0aCB0aGUgbGliaW50bCBsaWJyYXJ5ID49IDAuMTEuMyB3aGljaAorKyAgIGhhcyB0aGUgcmVkaXJlY3Rpb25zIHByaW1hcmlseSBpbiB0aGUgPGxpYmludGwuaD4gaW5jbHVkZSBmaWxlLgorKyAgIEl0IGlzIGFsc28gY29tcGlsZWQgaW50byBsaWJnbnVpbnRsIHNvIHRoYXQgbGliZ251aW50bC5zbyBjYW4gYmUgdXNlZAorKyAgIGFzIExEX1BSRUxPQURhYmxlIGxpYnJhcnkgb24gZ2xpYmMgc3lzdGVtcywgdG8gcHJvdmlkZSB0aGUgZXh0cmEKKysgICBmZWF0dXJlcyB0aGF0IHRoZSBmdW5jdGlvbnMgaW4gdGhlIGxpYmMgZG9uJ3QgaGF2ZSAobmFtZWx5LCBsb2dnaW5nKS4gICovCisrCisgCisgI3VuZGVmIGdldHRleHQKKyAjdW5kZWYgZGdldHRleHQKKyAjdW5kZWYgZGNnZXR0ZXh0CisrI3VuZGVmIG5nZXR0ZXh0CisrI3VuZGVmIGRuZ2V0dGV4dAorKyN1bmRlZiBkY25nZXR0ZXh0CisgI3VuZGVmIHRleHRkb21haW4KKyAjdW5kZWYgYmluZHRleHRkb21haW4KKysjdW5kZWYgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKKysKKysKKysvKiBXaGVuIGJ1aWxkaW5nIGEgRExMLCB3ZSBtdXN0IGV4cG9ydCBzb21lIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBiZWNhdXNlCisrICAgdGhlIGZ1bmN0aW9ucyBhcmUgb25seSBkZWZpbmVkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UKKysgICBkb24ndCBuZWVkIHRvIHVzZSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW4gYW55IGNhc2UuICAqLworKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIEJVSUxESU5HX0RMTAorKyMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKysjZWxzZQorKyMgZGVmaW5lIERMTF9FWFBPUlRFRAorKyNlbmRpZgorIAorIAorK0RMTF9FWFBPUlRFRAorIGNoYXIgKgorLWJpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKQorLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKKy0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7CisrZ2V0dGV4dCAoY29uc3QgY2hhciAqbXNnaWQpCisgeworLSAgcmV0dXJuIGJpbmR0ZXh0ZG9tYWluX18gKGRvbWFpbm5hbWUsIGRpcm5hbWUpOworKyAgcmV0dXJuIGxpYmludGxfZ2V0dGV4dCAobXNnaWQpOworIH0KKyAKKyAKKytETExfRVhQT1JURUQKKyBjaGFyICoKKy1kY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkKKy0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7CistICAgICBjb25zdCBjaGFyICptc2dpZDsKKy0gICAgIGludCBjYXRlZ29yeTsKKytkZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQpCisgeworLSAgcmV0dXJuIGRjZ2V0dGV4dF9fIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOworKyAgcmV0dXJuIGxpYmludGxfZGdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkKTsKKyB9CisgCisgCisrRExMX0VYUE9SVEVECisgY2hhciAqCistZGdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkKQorLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKKy0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOworK2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQsIGludCBjYXRlZ29yeSkKKyB7CistICByZXR1cm4gZGdldHRleHRfXyAoZG9tYWlubmFtZSwgbXNnaWQpOworKyAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOworIH0KKyAKKyAKKytETExfRVhQT1JURUQKKyBjaGFyICoKKy1nZXR0ZXh0IChtc2dpZCkKKy0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOworK25nZXR0ZXh0IChjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKKyB7CistICByZXR1cm4gZ2V0dGV4dF9fIChtc2dpZCk7CisrICByZXR1cm4gbGliaW50bF9uZ2V0dGV4dCAobXNnaWQxLCBtc2dpZDIsIG4pOworIH0KKyAKKyAKKytETExfRVhQT1JURUQKKyBjaGFyICoKKy10ZXh0ZG9tYWluIChkb21haW5uYW1lKQorLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKKytkbmdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisrCSAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQorIHsKKy0gIHJldHVybiB0ZXh0ZG9tYWluX18gKGRvbWFpbm5hbWUpOworKyAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbik7CisrfQorKworKworK0RMTF9FWFBPUlRFRAorK2NoYXIgKgorK2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisrCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKKysJICAgIGludCBjYXRlZ29yeSkKKyt7CisrICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgY2F0ZWdvcnkpOworK30KKysKKysKKytETExfRVhQT1JURUQKKytjaGFyICoKKyt0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpkb21haW5uYW1lKQorK3sKKysgIHJldHVybiBsaWJpbnRsX3RleHRkb21haW4gKGRvbWFpbm5hbWUpOworK30KKysKKysKKytETExfRVhQT1JURUQKKytjaGFyICoKKytiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqZGlybmFtZSkKKyt7CisrICByZXR1cm4gbGliaW50bF9iaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSk7CisrfQorKworKworK0RMTF9FWFBPUlRFRAorK2NoYXIgKgorK2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICpjb2Rlc2V0KQorK3sKKysgIHJldHVybiBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChkb21haW5uYW1lLCBjb2Rlc2V0KTsKKyB9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvbDEwbmZsaXN0LmMJMTk5OC0wNC0yNiAwOToyMjozNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvbDEwbmZsaXN0LmMJMjAwNC0wOS0xMiAxNDo0MDozNC40NTc3MzI1ODQgLTA0MDAKK0BAIC0xLDUyICsxLDQwIEBACistLyogSGFuZGxlIGxpc3Qgb2YgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKKy0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCistICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisrLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisgCistICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICAgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCistICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKy0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKy8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIHN0cGNweSgpLgorKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKysjaWZuZGVmIF9HTlVfU09VUkNFCisrIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorKyNlbmRpZgorIAorICNpZmRlZiBIQVZFX0NPTkZJR19ICisgIyBpbmNsdWRlIDxjb25maWcuaD4KKyAjZW5kaWYKKyAKKy0KKy0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKKy0jIGlmbmRlZiBfR05VX1NPVVJDRQorLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCistIyBlbmRpZgorLSMgaW5jbHVkZSA8c3RyaW5nLmg+CistI2Vsc2UKKy0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KKy0jIGlmbmRlZiBtZW1jcHkKKy0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQorLSMgZW5kaWYKKy0jZW5kaWYKKy0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCistIyBpZm5kZWYgc3RyY2hyCistIyAgZGVmaW5lIHN0cmNociBpbmRleAorLSMgZW5kaWYKKy0jZW5kaWYKKysjaW5jbHVkZSA8c3RyaW5nLmg+CisgCisgI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX0FSR1pfSAorICMgaW5jbHVkZSA8YXJnei5oPgorICNlbmRpZgorICNpbmNsdWRlIDxjdHlwZS5oPgorICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0KKy0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQworLSMgaW5jbHVkZSA8c3RkbGliLmg+CistI2VuZGlmCisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorIAorICNpbmNsdWRlICJsb2FkaW5mby5oIgorIAorQEAgLTY1LDIzICs1MywzOSBAQAorIC8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorICAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKyAgICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCistIyBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQorKyMgaWZuZGVmIHN0cGNweQorKyMgIGRlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBfX3N0cGNweShkZXN0LCBzcmMpCisrIyBlbmRpZgorICNlbHNlCisgIyBpZm5kZWYgSEFWRV9TVFBDUFkKKy1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOworK3N0YXRpYyBjaGFyICpzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7CisgIyBlbmRpZgorICNlbmRpZgorIAorKy8qIFBhdGhuYW1lIHN1cHBvcnQuCisrICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCisrICAgSVNfQUJTT0xVVEVfUEFUSChQKSAgdGVzdHMgd2hldGhlciBQIGlzIGFuIGFic29sdXRlIHBhdGguICBJZiBpdCBpcyBub3QsCisrICAgICAgICAgICAgICAgICAgICAgICAgaXQgbWF5IGJlIGNvbmNhdGVuYXRlZCB0byBhIGRpcmVjdG9yeSBwYXRobmFtZS4KKysgKi8KKysjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCisrICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisrIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKKysjIGRlZmluZSBIQVNfREVWSUNFKFApIFwKKysgICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAorKyAgICAgJiYgKFApWzFdID09ICc6JykKKysjIGRlZmluZSBJU19BQlNPTFVURV9QQVRIKFApIChJU1NMQVNIICgoUClbMF0pIHx8IEhBU19ERVZJQ0UgKFApKQorKyNlbHNlCisrICAvKiBVbml4ICovCisrIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJykKKysjIGRlZmluZSBJU19BQlNPTFVURV9QQVRIKFApIElTU0xBU0ggKChQKVswXSkKKysjZW5kaWYKKysKKyAvKiBEZWZpbmUgZnVuY3Rpb24gd2hpY2ggYXJlIHVzdWFsbHkgbm90IGF2YWlsYWJsZS4gICovCisgCisgI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX0NPVU5UCisgLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCistc3RhdGljIHNpemVfdCBhcmd6X2NvdW50X18gUEFSQU1TICgoY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGxlbikpOworLQorIHN0YXRpYyBzaXplX3QKKy1hcmd6X2NvdW50X18gKGFyZ3osIGxlbikKKy0gICAgIGNvbnN0IGNoYXIgKmFyZ3o7CistICAgICBzaXplX3QgbGVuOworK2FyZ3pfY291bnRfXyAoY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGxlbikKKyB7CisgICBzaXplX3QgY291bnQgPSAwOworICAgd2hpbGUgKGxlbiA+IDApCitAQCAtOTUsMTggKzk5LDE3IEBACisgfQorICMgdW5kZWYgX19hcmd6X2NvdW50CisgIyBkZWZpbmUgX19hcmd6X2NvdW50KGFyZ3osIGxlbikgYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCisrI2Vsc2UKKysjIGlmZGVmIF9MSUJDCisrIyAgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIElOVFVTRShfX2FyZ3pfY291bnQpIChhcmd6LCBsZW4pCisrIyBlbmRpZgorICNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX0NPVU5UICovCisgCisgI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX1NUUklOR0lGWQorIC8qIE1ha2UgJ1wwJyBzZXBhcmF0ZWQgYXJnIHZlY3RvciBBUkdaIHByaW50YWJsZSBieSBjb252ZXJ0aW5nIGFsbCB0aGUgJ1wwJ3MKKyAgICBleGNlcHQgdGhlIGxhc3QgaW50byB0aGUgY2hhcmFjdGVyIFNFUC4gICovCistc3RhdGljIHZvaWQgYXJnel9zdHJpbmdpZnlfXyBQQVJBTVMgKChjaGFyICphcmd6LCBzaXplX3QgbGVuLCBpbnQgc2VwKSk7CistCisgc3RhdGljIHZvaWQKKy1hcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKKy0gICAgIGNoYXIgKmFyZ3o7CistICAgICBzaXplX3QgbGVuOworLSAgICAgaW50IHNlcDsKKythcmd6X3N0cmluZ2lmeV9fIChjaGFyICphcmd6LCBzaXplX3QgbGVuLCBpbnQgc2VwKQorIHsKKyAgIHdoaWxlIChsZW4gPiAwKQorICAgICB7CitAQCAtMTE5LDE3ICsxMjIsMTYgQEAKKyB9CisgIyB1bmRlZiBfX2FyZ3pfc3RyaW5naWZ5CisgIyBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgYXJnel9zdHJpbmdpZnlfXyAoYXJneiwgbGVuLCBzZXApCisrI2Vsc2UKKysjIGlmZGVmIF9MSUJDCisrIyAgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIFwKKysgIElOVFVTRShfX2FyZ3pfc3RyaW5naWZ5KSAoYXJneiwgbGVuLCBzZXApCisrIyBlbmRpZgorICNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX1NUUklOR0lGWSAqLworIAorICNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCistc3RhdGljIGNoYXIgKmFyZ3pfbmV4dF9fIFBBUkFNUyAoKGNoYXIgKmFyZ3osIHNpemVfdCBhcmd6X2xlbiwKKy0JCQkJICBjb25zdCBjaGFyICplbnRyeSkpOworLQorIHN0YXRpYyBjaGFyICoKKy1hcmd6X25leHRfXyAoYXJneiwgYXJnel9sZW4sIGVudHJ5KQorLSAgICAgY2hhciAqYXJnejsKKy0gICAgIHNpemVfdCBhcmd6X2xlbjsKKy0gICAgIGNvbnN0IGNoYXIgKmVudHJ5OworK2FyZ3pfbmV4dF9fIChjaGFyICphcmd6LCBzaXplX3QgYXJnel9sZW4sIGNvbnN0IGNoYXIgKmVudHJ5KQorIHsKKyAgIGlmIChlbnRyeSkKKyAgICAgeworQEAgLTE1MCwxMSArMTUyLDggQEAKKyAKKyAKKyAvKiBSZXR1cm4gbnVtYmVyIG9mIGJpdHMgc2V0IGluIFguICAqLworLXN0YXRpYyBpbnQgcG9wIFBBUkFNUyAoKGludCB4KSk7CistCisgc3RhdGljIGlubGluZSBpbnQKKy1wb3AgKHgpCistICAgICBpbnQgeDsKKytwb3AgKGludCB4KQorIHsKKyAgIC8qIFdlIGFzc3VtZSB0aGF0IG5vIG1vcmUgdGhhbiAxNiBiaXRzIGFyZSB1c2VkLiAgKi8KKyAgIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKK0BAIC0xNjcsMzEgKzE2NiwyNyBAQAorIAorIAwKKyBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKKy1fbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBtYXNrLCBsYW5ndWFnZSwKKy0JCSAgICB0ZXJyaXRvcnksIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCistCQkgICAgc3BvbnNvciwgcmV2aXNpb24sIGZpbGVuYW1lLCBkb19hbGxvY2F0ZSkKKy0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0OworLSAgICAgY29uc3QgY2hhciAqZGlybGlzdDsKKy0gICAgIHNpemVfdCBkaXJsaXN0X2xlbjsKKy0gICAgIGludCBtYXNrOworLSAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7CistICAgICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7CistICAgICBjb25zdCBjaGFyICpjb2Rlc2V0OworLSAgICAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OworLSAgICAgY29uc3QgY2hhciAqbW9kaWZpZXI7CistICAgICBjb25zdCBjaGFyICpzcGVjaWFsOworLSAgICAgY29uc3QgY2hhciAqc3BvbnNvcjsKKy0gICAgIGNvbnN0IGNoYXIgKnJldmlzaW9uOworLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CistICAgICBpbnQgZG9fYWxsb2NhdGU7CisrX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKKysJCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sCisrCQkgICAgaW50IG1hc2ssIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCisrCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAorKwkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLCBjb25zdCBjaGFyICpzcGVjaWFsLAorKwkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAorKwkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpCisgeworICAgY2hhciAqYWJzX2ZpbGVuYW1lOworLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbGFzdCA9IE5VTEw7CisrICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbGFzdHA7CisgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7CisgICBjaGFyICpjcDsKKysgIHNpemVfdCBkaXJsaXN0X2NvdW50OworICAgc2l6ZV90IGVudHJpZXM7CisgICBpbnQgY250OworIAorKyAgLyogSWYgTEFOR1VBR0UgY29udGFpbnMgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24sIHdlIGlnbm9yZQorKyAgICAgRElSTElTVC4gICovCisrICBpZiAoSVNfQUJTT0xVVEVfUEFUSCAobGFuZ3VhZ2UpKQorKyAgICBkaXJsaXN0X2xlbiA9IDA7CisrCisgICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUuICAqLworICAgYWJzX2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJsaXN0X2xlbgorIAkJCQkgICsgc3RybGVuIChsYW5ndWFnZSkKK0BAIC0yMDksNyArMjA0LDcgQEAKKyAJCQkJICArICgoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAorIAkJCQkgICAgICB8fCAobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKKyAJCQkJICAgICA/ICgxICsgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKKy0JCQkJCSAgICAgPyBzdHJsZW4gKHNwb25zb3IpICsgMSA6IDApCisrCQkJCQkgICAgID8gc3RybGVuIChzcG9uc29yKSA6IDApCisgCQkJCQkrICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMAorIAkJCQkJICAgPyBzdHJsZW4gKHJldmlzaW9uKSArIDEgOiAwKSkgOiAwKQorIAkJCQkgICsgMSArIHN0cmxlbiAoZmlsZW5hbWUpICsgMSk7CitAQCAtMjE3LDE0ICsyMTIsMTYgQEAKKyAgIGlmIChhYnNfZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgcmV0dXJuIE5VTEw7CisgCistICByZXR2YWwgPSBOVUxMOworLSAgbGFzdCA9IE5VTEw7CistCisgICAvKiBDb25zdHJ1Y3QgZmlsZSBuYW1lLiAgKi8KKy0gIG1lbWNweSAoYWJzX2ZpbGVuYW1lLCBkaXJsaXN0LCBkaXJsaXN0X2xlbik7CistICBfX2FyZ3pfc3RyaW5naWZ5IChhYnNfZmlsZW5hbWUsIGRpcmxpc3RfbGVuLCAnOicpOworLSAgY3AgPSBhYnNfZmlsZW5hbWUgKyAoZGlybGlzdF9sZW4gLSAxKTsKKy0gICpjcCsrID0gJy8nOworKyAgY3AgPSBhYnNfZmlsZW5hbWU7CisrICBpZiAoZGlybGlzdF9sZW4gPiAwKQorKyAgICB7CisrICAgICAgbWVtY3B5IChjcCwgZGlybGlzdCwgZGlybGlzdF9sZW4pOworKyAgICAgIF9fYXJnel9zdHJpbmdpZnkgKGNwLCBkaXJsaXN0X2xlbiwgUEFUSF9TRVBBUkFUT1IpOworKyAgICAgIGNwICs9IGRpcmxpc3RfbGVuOworKyAgICAgIGNwWy0xXSA9ICcvJzsKKysgICAgfQorKworICAgY3AgPSBzdHBjcHkgKGNwLCBsYW5ndWFnZSk7CisgCisgICBpZiAoKG1hc2sgJiBURVJSSVRPUlkpICE9IDApCitAQCAtMjcxLDcgKzI2OCw3IEBACisgCisgICAvKiBMb29rIGluIGxpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucyB3aGV0aGVyIGl0IGlzIGFscmVhZHkKKyAgICAgIGF2YWlsYWJsZS4gICovCistICBsYXN0ID0gTlVMTDsKKysgIGxhc3RwID0gbDEwbmZpbGVfbGlzdDsKKyAgIGZvciAocmV0dmFsID0gKmwxMG5maWxlX2xpc3Q7IHJldHZhbCAhPSBOVUxMOyByZXR2YWwgPSByZXR2YWwtPm5leHQpCisgICAgIGlmIChyZXR2YWwtPmZpbGVuYW1lICE9IE5VTEwpCisgICAgICAgeworQEAgLTI4Niw3ICsyODMsNyBAQAorIAkgICAgYnJlYWs7CisgCSAgfQorIAorLQlsYXN0ID0gcmV0dmFsOworKwlsYXN0cCA9ICZyZXR2YWwtPm5leHQ7CisgICAgICAgfQorIAorICAgaWYgKHJldHZhbCAhPSBOVUxMIHx8IGRvX2FsbG9jYXRlID09IDApCitAQCAtMjk1LDQ4ICsyOTIsNjYgQEAKKyAgICAgICByZXR1cm4gcmV0dmFsOworICAgICB9CisgCistICByZXR2YWwgPSAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKQorLSAgICBtYWxsb2MgKHNpemVvZiAoKnJldHZhbCkgKyAoX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikKKy0JCQkJKiAoMSA8PCBwb3AgKG1hc2spKQorLQkJCQkqIHNpemVvZiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKSkpOworKyAgZGlybGlzdF9jb3VudCA9IChkaXJsaXN0X2xlbiA+IDAgPyBfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSA6IDEpOworKworKyAgLyogQWxsb2NhdGUgYSBuZXcgbG9hZGVkX2wxMG5maWxlLiAgKi8KKysgIHJldHZhbCA9CisrICAgIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCisrICAgIG1hbGxvYyAoc2l6ZW9mICgqcmV0dmFsKQorKwkgICAgKyAoKChkaXJsaXN0X2NvdW50IDw8IHBvcCAobWFzaykpICsgKGRpcmxpc3RfY291bnQgPiAxID8gMSA6IDApKQorKwkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikpKTsKKyAgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICAgcmV0dXJuIE5VTEw7CisgCisgICByZXR2YWwtPmZpbGVuYW1lID0gYWJzX2ZpbGVuYW1lOworLSAgcmV0dmFsLT5kZWNpZGVkID0gKF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pICE9IDEKKysKKysgIC8qIFdlIHNldCByZXR2YWwtPmRhdGEgdG8gTlVMTCBoZXJlOyBpdCBpcyBmaWxsZWQgaW4gbGF0ZXIuCisrICAgICBTZXR0aW5nIHJldHZhbC0+ZGVjaWRlZCB0byAxIGhlcmUgbWVhbnMgdGhhdCByZXR2YWwgZG9lcyBub3QKKysgICAgIGNvcnJlc3BvbmQgdG8gYSByZWFsIGZpbGUgKGRpcmxpc3RfY291bnQgPiAxKSBvciBpcyBub3Qgd29ydGgKKysgICAgIGxvb2tpbmcgdXAgKGlmIGFuIHVubm9ybWFsaXplZCBjb2Rlc2V0IHdhcyBzcGVjaWZpZWQpLiAgKi8KKysgIHJldHZhbC0+ZGVjaWRlZCA9IChkaXJsaXN0X2NvdW50ID4gMQorIAkJICAgICB8fCAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAorIAkJCSAmJiAobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApKTsKKyAgIHJldHZhbC0+ZGF0YSA9IE5VTEw7CisgCistICBpZiAobGFzdCA9PSBOVUxMKQorLSAgICB7CistICAgICAgcmV0dmFsLT5uZXh0ID0gKmwxMG5maWxlX2xpc3Q7CistICAgICAgKmwxMG5maWxlX2xpc3QgPSByZXR2YWw7CistICAgIH0KKy0gIGVsc2UKKy0gICAgeworLSAgICAgIHJldHZhbC0+bmV4dCA9IGxhc3QtPm5leHQ7CistICAgICAgbGFzdC0+bmV4dCA9IHJldHZhbDsKKy0gICAgfQorKyAgcmV0dmFsLT5uZXh0ID0gKmxhc3RwOworKyAgKmxhc3RwID0gcmV0dmFsOworIAorICAgZW50cmllcyA9IDA7CistICAvKiBJZiB0aGUgRElSTElTVCBpcyBhIHJlYWwgbGlzdCB0aGUgUkVUVkFMIGVudHJ5IGNvcnJlc3BvbmRzIG5vdCB0bworLSAgICAgYSByZWFsIGZpbGUuICBTbyB3ZSBoYXZlIHRvIHVzZSB0aGUgRElSTElTVCBzZXBhcmF0aW9uIG1lY2hhbmlzbQorLSAgICAgb2YgdGhlIGlubmVyIGxvb3AuICAqLworLSAgY250ID0gX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgPT0gMSA/IG1hc2sgLSAxIDogbWFzazsKKy0gIGZvciAoOyBjbnQgPj0gMDsgLS1jbnQpCisrICAvKiBSZWN1cnNlIHRvIGZpbGwgdGhlIGluaGVyaXRhbmNlIGxpc3Qgb2YgUkVUVkFMLgorKyAgICAgSWYgdGhlIERJUkxJU1QgaXMgYSByZWFsIGxpc3QgKGkuZS4gRElSTElTVF9DT1VOVCA+IDEpLCB0aGUgUkVUVkFMCisrICAgICBlbnRyeSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcmVhbCBmaWxlOyByZXR2YWwtPmZpbGVuYW1lIGNvbnRhaW5zCisrICAgICBjb2xvbnMuICBJbiB0aGlzIGNhc2Ugd2UgbG9vcCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIERJUkxJU1QgYW5kCisrICAgICBhY3Jvc3MgYWxsIGJpdCBwYXR0ZXJucyBkb21pbmF0ZWQgYnkgTUFTSy4KKysgICAgIElmIHRoZSBESVJMSVNUIGlzIGEgc2luZ2xlIGRpcmVjdG9yeSBvciBlbnRpcmVseSByZWR1bmRhbnQgKGkuZS4KKysgICAgIERJUkxJU1RfQ09VTlQgPT0gMSksIHdlIGxvb3AgYWNyb3NzIGFsbCBiaXQgcGF0dGVybnMgZG9taW5hdGVkIGJ5CisrICAgICBNQVNLLCBleGNsdWRpbmcgTUFTSyBpdHNlbGYuCisrICAgICBJbiBlaXRoZXIgY2FzZSwgd2UgbG9vcCBkb3duIGZyb20gTUFTSyB0byAwLiAgVGhpcyBoYXMgdGhlIGVmZmVjdAorKyAgICAgdGhhdCB0aGUgZXh0cmEgYml0cyBpbiB0aGUgbG9jYWxlIG5hbWUgYXJlIGRyb3BwZWQgaW4gdGhpcyBvcmRlcjoKKysgICAgIGZpcnN0IHRoZSBtb2RpZmllciwgdGhlbiB0aGUgdGVycml0b3J5LCB0aGVuIHRoZSBjb2Rlc2V0LCB0aGVuIHRoZQorKyAgICAgbm9ybWFsaXplZF9jb2Rlc2V0LiAgKi8KKysgIGZvciAoY250ID0gZGlybGlzdF9jb3VudCA+IDEgPyBtYXNrIDogbWFzayAtIDE7IGNudCA+PSAwOyAtLWNudCkKKyAgICAgaWYgKChjbnQgJiB+bWFzaykgPT0gMAorIAkmJiAoKGNudCAmIENFTl9TUEVDSUZJQykgPT0gMCB8fCAoY250ICYgWFBHX1NQRUNJRklDKSA9PSAwKQorIAkmJiAoKGNudCAmIFhQR19DT0RFU0VUKSA9PSAwIHx8IChjbnQgJiBYUEdfTk9STV9DT0RFU0VUKSA9PSAwKSkKKyAgICAgICB7CistCS8qIEl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgdGhlIERJUkxJU1QuICAqLworLQljaGFyICpkaXIgPSBOVUxMOworKwlpZiAoZGlybGlzdF9jb3VudCA+IDEpCisrCSAgeworKwkgICAgLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCisrCSAgICBjaGFyICpkaXIgPSBOVUxMOworIAorLQl3aGlsZSAoKGRpciA9IF9fYXJnel9uZXh0ICgoY2hhciAqKSBkaXJsaXN0LCBkaXJsaXN0X2xlbiwgZGlyKSkKKy0JICAgICAgICE9IE5VTEwpCisrCSAgICB3aGlsZSAoKGRpciA9IF9fYXJnel9uZXh0ICgoY2hhciAqKSBkaXJsaXN0LCBkaXJsaXN0X2xlbiwgZGlyKSkKKysJCSAgICE9IE5VTEwpCisrCSAgICAgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KKysJCT0gX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXIsIHN0cmxlbiAoZGlyKSArIDEsCisrCQkJCSAgICAgIGNudCwgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKKysJCQkJICAgICAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKKysJCQkJICAgICAgc3BvbnNvciwgcmV2aXNpb24sIGZpbGVuYW1lLCAxKTsKKysJICB9CisrCWVsc2UKKyAJICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzKytdCistCSAgICA9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLCBjbnQsCistCQkJCSAgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKKysJICAgID0gX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXJsaXN0LCBkaXJsaXN0X2xlbiwKKysJCQkJICBjbnQsIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCisgCQkJCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKKyAJCQkJICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIDEpOworICAgICAgIH0KK0BAIC0zNDcsMTEgKzM2MiwxMCBAQAorIAwKKyAvKiBOb3JtYWxpemUgY29kZXNldCBuYW1lLiAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBjb2Rlc2V0CisgICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KKy0gICBuYW1lcy4gICovCisrICAgbmFtZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlCisrICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCisgY29uc3QgY2hhciAqCistX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb2Rlc2V0LCBuYW1lX2xlbikKKy0gICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQ7CistICAgICBzaXplX3QgbmFtZV9sZW47CisrX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb25zdCBjaGFyICpjb2Rlc2V0LCBzaXplX3QgbmFtZV9sZW4pCisgeworICAgaW50IGxlbiA9IDA7CisgICBpbnQgb25seV9kaWdpdCA9IDE7CitAQCAtMzYwLDExICszNzQsMTEgQEAKKyAgIHNpemVfdCBjbnQ7CisgCisgICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKKy0gICAgaWYgKGlzYWxudW0gKGNvZGVzZXRbY250XSkpCisrICAgIGlmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKKyAgICAgICB7CisgCSsrbGVuOworIAorLQlpZiAoaXNhbHBoYSAoY29kZXNldFtjbnRdKSkKKysJaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQorIAkgIG9ubHlfZGlnaXQgPSAwOworICAgICAgIH0KKyAKK0BAIC0zNzgsOSArMzkyLDkgQEAKKyAJd3AgPSByZXR2YWw7CisgCisgICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCistCWlmIChpc2FscGhhIChjb2Rlc2V0W2NudF0pKQorLQkgICp3cCsrID0gdG9sb3dlciAoY29kZXNldFtjbnRdKTsKKy0JZWxzZSBpZiAoaXNkaWdpdCAoY29kZXNldFtjbnRdKSkKKysJaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQorKwkgICp3cCsrID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSk7CisrCWVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQorIAkgICp3cCsrID0gY29kZXNldFtjbnRdOworIAorICAgICAgICp3cCA9ICdcMCc7CitAQCAtMzk4LDkgKzQxMiw3IEBACisgICAgdG8gYmUgZGVmaW5lZC4gICovCisgI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKKyBzdGF0aWMgY2hhciAqCistc3RwY3B5IChkZXN0LCBzcmMpCistICAgICBjaGFyICpkZXN0OworLSAgICAgY29uc3QgY2hhciAqc3JjOworK3N0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQorIHsKKyAgIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKyAgICAgLyogRG8gbm90aGluZy4gKi8gOworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xpYmdldHRleHQuaAkxOTk4LTA0LTI2IDA5OjIyOjM2LjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9saWJnZXR0ZXh0LmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKK0BAIC0xLDE4MiArMCwwIEBACistLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCistICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLQorLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CistICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCistICAgYW55IGxhdGVyIHZlcnNpb24uCistCistICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCistICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy0KKy0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCistICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCistCistLyogQmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgKGUuZy4gU29sYXJpcykgd2Ugc29tZXRpbWVzIGhhdmUgdG8gaW5jbHVkZQorLSAgIHRoZSBzeXN0ZW1zIGxpYmludGwuaCBhcyB3ZWxsIGFzIHRoaXMgZmlsZSB3ZSBoYXZlIG1vcmUgY29tcGxleAorLSAgIGluY2x1ZGUgcHJvdGVjdGlvbiBhYm92ZS4gIEJ1dCB0aGUgc3lzdGVtcyBoZWFkZXIgbWlnaHQgcGVyaGFwcyBhbHNvCistICAgZGVmaW5lIF9MSUJJTlRMX0ggYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIHByb3RlY3QgdGhlIGRlZmluaXRpb24gaGVyZS4gICovCistCistI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKSB8fCAhZGVmaW5lZCAoX0xJQkdFVFRFWFRfSCkKKy0jaWYgIWRlZmluZWQgKF9MSUJJTlRMX0gpCistIyBkZWZpbmUgX0xJQklOVExfSAkxCistI2VuZGlmCistI2RlZmluZSBfTElCR0VUVEVYVF9ICTEKKy0KKy0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKKy0gICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KKy0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKKy0KKy0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CistCistI2lmIEhBVkVfTE9DQUxFX0gKKy0jIGluY2x1ZGUgPGxvY2FsZS5oPgorLSNlbmRpZgorLQorLQorLSNpZmRlZiBfX2NwbHVzcGx1cworLWV4dGVybiAiQyIgeworLSNlbmRpZgorLQorLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKy0KKy0jaWZuZGVmIFBBUkFNUworLSMgaWYgX19TVERDX18KKy0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKKy0jIGVsc2UKKy0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCistIyBlbmRpZgorLSNlbmRpZgorLQorLSNpZm5kZWYgTlVMTAorLSMgaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX0dOVUNfXworLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQorLSMgZWxzZQorLSMgIGRlZmluZSBOVUxMICgwKQorLSMgZW5kaWYKKy0jZW5kaWYKKy0KKy0jaWYgIUhBVkVfTENfTUVTU0FHRVMKKy0vKiBUaGlzIHZhbHVlIGRldGVybWluZXMgdGhlIGJlaGF2aW91ciBvZiB0aGUgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpCistICAgZnVuY3Rpb24uICBCdXQgc29tZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGlzIGRlZmluZWQuICBEZWZpbmUgaXQKKy0gICB0byBhIGRlZmF1bHQgdmFsdWUuICAqLworLSMgZGVmaW5lIExDX01FU1NBR0VTICgtMSkKKy0jZW5kaWYKKy0KKy0KKy0vKiBEZWNsYXJhdGlvbnMgZm9yIGdldHRleHQtdXNpbmctY2F0Z2V0cyBpbnRlcmZhY2UuICBEZXJpdmVkIGZyb20KKy0gICBKaW0gTWV5ZXJpbmcncyBsaWJpbnRsLmguICAqLworLXN0cnVjdCBfbXNnX2VudAorLXsKKy0gIGNvbnN0IGNoYXIgKl9tc2c7CistICBpbnQgX21zZ19udW1iZXI7CistfTsKKy0KKy0KKy0jaWYgSEFWRV9DQVRHRVRTCistLyogVGhlc2UgdHdvIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgYXV0b21hdGljYWxseSBieSBwby10by10Ymwuc2VkCistICAgZ2VuZXJhdGVkIGZpbGUgYGNhdC1pZC10YmwuYycuICAqLworLWV4dGVybiBjb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXTsKKy1leHRlcm4gaW50IF9tc2dfdGJsX2xlbmd0aDsKKy0jZW5kaWYKKy0KKy0KKy0vKiBGb3IgYXV0b21hdGljYWwgZXh0cmFjdGlvbiBvZiBtZXNzYWdlcyBzb21ldGltZXMgbm8gcmVhbAorLSAgIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4gIEluc3RlYWQgdGhlIHN0cmluZyBpdHNlbGYgaXMgdGhlIHJlc3VsdC4gICovCistI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyKSAoU3RyKQorLQorLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CistICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKy0gICB0ZXh0KS4gICovCistZXh0ZXJuIGNoYXIgKmdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOworLWV4dGVybiBjaGFyICpnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOworLQorLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCistZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkpOworLWV4dGVybiBjaGFyICpkZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKy0JCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKKy0KKy0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKKy0gICBsb2NhbGUuICAqLworLWV4dGVybiBjaGFyICpkY2dldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAorLQkJCQlpbnQgX19jYXRlZ29yeSkpOworLWV4dGVybiBjaGFyICpkY2dldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCistCQkJCSAgY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKKy0KKy0KKy0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KKy0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgorLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLworLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOworLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluX18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7CistCistLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCistICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLworLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCistCQkJCSAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7CistZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluX18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorLQkJCQkgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7CistCistI2lmIEVOQUJMRV9OTFMKKy0KKy0vKiBTb2xhcmlzIDIuMyBoYXMgdGhlIGdldHRleHQgZnVuY3Rpb24gYnV0IGRjZ2V0dGV4dCBpcyBtaXNzaW5nLgorLSAgIFNvIHdlIG9taXQgdGhpcyBvcHRpbWl6YXRpb24gZm9yIFNvbGFyaXMgMi4zLiAgQlRXLCBTb2xhcmlzIDIuNAorLSAgIGhhcyBkY2dldHRleHQuICAqLworLSMgaWYgIUhBVkVfQ0FUR0VUUyAmJiAoIUhBVkVfR0VUVEVYVCB8fCBIQVZFX0RDR0VUVEVYVCkKKy0KKy0jICBkZWZpbmUgZ2V0dGV4dChNc2dpZCkJCQkJCQkgICAgICBcCistICAgICBkZ2V0dGV4dCAoTlVMTCwgTXNnaWQpCistCistIyAgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKQkJCQkJICAgICAgXAorLSAgICAgZGNnZXR0ZXh0IChEb21haW5uYW1lLCBNc2dpZCwgTENfTUVTU0FHRVMpCistCistIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcKKy0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGxvYWRtc2djYXQuYy4gIFdlIG5lZWQgYSBzaWduLAorLSAgIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbAorLSAgIHRyYW5zbGF0aW9ucy4gICovCistZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworLQorLSMgICBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkJCQkgICAgICBcCistICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCistICAgKHsJCQkJCQkJCQkgICAgICBcCistICAgICBjaGFyICpfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAorLSAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChNc2dpZCkpCQkJCQkgICAgICBcCistICAgICAgIHsJCQkJCQkJCSAgICAgIFwKKy0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCistCSBzdGF0aWMgaW50IF9fY2F0YWxvZ19jb3VudGVyX187CQkJCSAgICAgIFwKKy0JIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKKy0JICAgewkJCQkJCQkJICAgICAgXAorLQkgICAgIF9fdHJhbnNsYXRpb25fXyA9CQkJCQkJICAgICAgXAorLQkgICAgICAgZGNnZXR0ZXh0X18gKERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSk7CQkgICAgICBcCistCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAorLQkgICB9CQkJCQkJCQkgICAgICBcCistCSBfX3Jlc3VsdCA9IF9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKKy0gICAgICAgfQkJCQkJCQkJICAgICAgXAorLSAgICAgZWxzZQkJCQkJCQkJICAgICAgXAorLSAgICAgICBfX3Jlc3VsdCA9IGRjZ2V0dGV4dF9fIChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpOwkJICAgICAgXAorLSAgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCistICAgIH0pKQorLSMgIGVuZGlmCistIyBlbmRpZgorLQorLSNlbHNlCistCistIyBkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKE1zZ2lkKQorLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKSAoTXNnaWQpCistIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkgKE1zZ2lkKQorLSMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KKy0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW5uYW1lLCBEaXJuYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLworLQorLSNlbmRpZgorLQorLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworLQorLSNpZmRlZiBfX2NwbHVzcGx1cworLX0KKy0jZW5kaWYKKy0KKy0jZW5kaWYKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9saWJnbnVpbnRsLmguaW4JMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvbGliZ251aW50bC5oLmluCTIwMDQtMDktMTIgMTQ6NDA6MzQuNDYyNzMxODI0IC0wNDAwCitAQCAtMCwwICsxLDM4MyBAQAorKy8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKyNpZm5kZWYgX0xJQklOVExfSAorKyNkZWZpbmUgX0xJQklOVExfSAkxCisrCisrI2luY2x1ZGUgPGxvY2FsZS5oPgorKworKy8qIFRoZSBMQ19NRVNTQUdFUyBsb2NhbGUgY2F0ZWdvcnkgaXMgdGhlIGNhdGVnb3J5IHVzZWQgYnkgdGhlIGZ1bmN0aW9ucworKyAgIGdldHRleHQoKSBhbmQgZGdldHRleHQoKS4gIEl0IGlzIHNwZWNpZmllZCBpbiBQT1NJWCwgYnV0IG5vdCBpbiBBTlNJIEMuCisrICAgT24gc3lzdGVtcyB0aGF0IGRvbid0IGRlZmluZSBpdCwgdXNlIGFuIGFyYml0cmFyeSB2YWx1ZSBpbnN0ZWFkLgorKyAgIE9uIFNvbGFyaXMsIDxsb2NhbGUuaD4gZGVmaW5lcyBfX0xPQ0FMRV9IIChvciBfTE9DQUxFX0ggaW4gU29sYXJpcyAyLjUpCisrICAgdGhlbiBpbmNsdWRlcyA8bGliaW50bC5oPiAoaS5lLiB0aGlzIGZpbGUhKSBhbmQgdGhlbiBvbmx5IGRlZmluZXMKKysgICBMQ19NRVNTQUdFUy4gIFRvIGF2b2lkIGEgcmVkZWZpbml0aW9uIHdhcm5pbmcsIGRvbid0IGRlZmluZSBMQ19NRVNTQUdFUworKyAgIGluIHRoaXMgY2FzZS4gICovCisrI2lmICFkZWZpbmVkIExDX01FU1NBR0VTICYmICEoZGVmaW5lZCBfX0xPQ0FMRV9IIHx8IChkZWZpbmVkIF9MT0NBTEVfSCAmJiBkZWZpbmVkIF9fc3VuKSkKKysjIGRlZmluZSBMQ19NRVNTQUdFUyAxNzI5CisrI2VuZGlmCisrCisrLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCisrICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCisrI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCisrCisrLyogUHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwcG9ydGVkIGZpbGUgZm9ybWF0cy4gIFJldHVybnMgdGhlCisrICAgbWF4aW11bSBtaW5vciByZXZpc2lvbiBudW1iZXIgc3VwcG9ydGVkIGZvciBhIGdpdmVuIG1ham9yIHJldmlzaW9uLiAgKi8KKysjZGVmaW5lIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKG1ham9yKSBcCisrICAoKG1ham9yKSA9PSAwID8gMSA6IC0xKQorKworKy8qIFJlc29sdmUgYSBwbGF0Zm9ybSBzcGVjaWZpYyBjb25mbGljdCBvbiBESkdQUC4gIEdOVSBnZXR0ZXh0IHRha2VzCisrICAgcHJlY2VkZW5jZSBvdmVyIF9jb25pb19nZXR0ZXh0LiAgKi8KKysjaWZkZWYgX19ESkdQUF9fCisrIyB1bmRlZiBnZXR0ZXh0CisrI2VuZGlmCisrCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIiB7CisrI2VuZGlmCisrCisrCisrLyogV2UgcmVkaXJlY3QgdGhlIGZ1bmN0aW9ucyB0byB0aG9zZSBwcmVmaXhlZCB3aXRoICJsaWJpbnRsXyIuICBUaGlzIGlzCisrICAgbmVjZXNzYXJ5LCBiZWNhdXNlIHNvbWUgc3lzdGVtcyBkZWZpbmUgZ2V0dGV4dC90ZXh0ZG9tYWluLy4uLiBpbiB0aGUgQworKyAgIGxpYnJhcnkgKG5hbWVseSwgU29sYXJpcyAyLjQgYW5kIG5ld2VyLCBhbmQgR05VIGxpYmMgMi4wIGFuZCBuZXdlcikuCisrICAgSWYgd2UgdXNlZCB0aGUgdW5wcmVmaXhlZCBuYW1lcywgdGhlcmUgd291bGQgYmUgY2FzZXMgd2hlcmUgdGhlCisrICAgZGVmaW5pdGlvbiBpbiB0aGUgQyBsaWJyYXJ5IHdvdWxkIG92ZXJyaWRlIHRoZSBvbmUgaW4gdGhlIGxpYmludGwuc28KKysgICBzaGFyZWQgbGlicmFyeS4gIFJlY2FsbCB0aGF0IG9uIEVMRiBzeXN0ZW1zLCB0aGUgc3ltYm9scyBhcmUgbG9va2VkCisrICAgdXAgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKysgICAgIDEuIGluIHRoZSBleGVjdXRhYmxlLAorKyAgICAgMi4gaW4gdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSwgaW4gb3JkZXIsCisrICAgICAzLiBpbiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNwZWNpZmllZCBvbiB0aGUgbGluaworKyAgICAgICAgY29tbWFuZCBsaW5lLAorKyAgICAgNC4gaW4gdGhlIGRsb3BlbigpZWQgc2hhcmVkIGxpYnJhcmllcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZQorKyAgICAgICAgZGxvcGVuKCllZC4KKysgICBUaGUgZGVmaW5pdGlvbiBpbiB0aGUgQyBsaWJyYXJ5IHdvdWxkIG92ZXJyaWRlIHRoZSBvbmUgaW4gbGliaW50bC5zbyBpZgorKyAgIGVpdGhlcgorKyAgICAgKiAtbGMgaXMgZ2l2ZW4gb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lIGFuZCAtbGludGwgaXNuJ3QsIG9yCisrICAgICAqIC1sYyBpcyBnaXZlbiBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUgYmVmb3JlIC1saW50bCwgb3IKKysgICAgICogbGliaW50bC5zbyBpcyBhIGRlcGVuZGVuY3kgb2YgYSBkbG9wZW4oKWVkIHNoYXJlZCBsaWJyYXJ5IGJ1dCBub3QKKysgICAgICAgbGlua2VkIHRvIHRoZSBleGVjdXRhYmxlIGF0IGxpbmsgdGltZS4KKysgICBTaW5jZSBTb2xhcmlzIGdldHRleHQoKSBiZWhhdmVzIGRpZmZlcmVudGx5IHRoYW4gR05VIGdldHRleHQoKSwgdGhpcworKyAgIHdvdWxkIGJlIHVuYWNjZXB0YWJsZS4KKysKKysgICBUaGUgcmVkaXJlY3Rpb24gaGFwcGVucyBieSBkZWZhdWx0IHRocm91Z2ggbWFjcm9zIGluIEMsIHNvIHRoYXQgJmdldHRleHQKKysgICBpcyBpbmRlcGVuZGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgYnV0IHRocm91Z2ggaW5saW5lIGZ1bmN0aW9ucyBpbgorKyAgIEMrKywgaW4gb3JkZXIgbm90IHRvIGludGVyZmVyZSB3aXRoIHRoZSBuYW1lIG1hbmdsaW5nIG9mIGNsYXNzIGZpZWxkcyBvcgorKyAgIGNsYXNzIG1ldGhvZHMgY2FsbGVkICdnZXR0ZXh0Jy4gICovCisrCisrLyogVGhlIHVzZXIgY2FuIGRlZmluZSBfSU5UTF9SRURJUkVDVF9JTkxJTkUgb3IgX0lOVExfUkVESVJFQ1RfTUFDUk9TLgorKyAgIElmIGhlIGRvZXNuJ3QsIHdlIGNob29zZSB0aGUgbWV0aG9kLiAgQSB0aGlyZCBwb3NzaWJsZSBtZXRob2QgaXMKKysgICBfSU5UTF9SRURJUkVDVF9BU00sIHN1cHBvcnRlZCBvbmx5IGJ5IEdDQy4gICovCisrI2lmICEoZGVmaW5lZCBfSU5UTF9SRURJUkVDVF9JTkxJTkUgfHwgZGVmaW5lZCBfSU5UTF9SRURJUkVDVF9NQUNST1MpCisrIyBpZiBfX0dOVUNfXyA+PSAyICYmICFkZWZpbmVkIF9fQVBQTEVfQ0NfXyAmJiAhZGVmaW5lZCBfX01JTkdXMzJfXyAmJiAhKF9fR05VQ19fID09IDIgJiYgZGVmaW5lZCBfQUlYKSAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzKQorKyMgIGRlZmluZSBfSU5UTF9SRURJUkVDVF9BU00KKysjIGVsc2UKKysjICBpZmRlZiBfX2NwbHVzcGx1cworKyMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisrIyAgZWxzZQorKyMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisrIyAgZW5kaWYKKysjIGVuZGlmCisrI2VuZGlmCisrLyogQXV4aWxpYXJ5IG1hY3Jvcy4gICovCisrI2lmZGVmIF9JTlRMX1JFRElSRUNUX0FTTQorKyMgZGVmaW5lIF9JTlRMX0FTTShjbmFtZSkgX19hc21fXyAoX0lOVExfQVNNTkFNRSAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCAjY25hbWUpKQorKyMgZGVmaW5lIF9JTlRMX0FTTU5BTUUocHJlZml4LGNuYW1lc3RyaW5nKSBfSU5UTF9TVFJJTkdJRlkgKHByZWZpeCkgY25hbWVzdHJpbmcKKysjIGRlZmluZSBfSU5UTF9TVFJJTkdJRlkocHJlZml4KSAjcHJlZml4CisrI2Vsc2UKKysjIGRlZmluZSBfSU5UTF9BU00oY25hbWUpCisrI2VuZGlmCisrCisrLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKysgICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAorKyAgIHRleHQpLiAgKi8KKysjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisrZXh0ZXJuIGNoYXIgKmxpYmludGxfZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCk7Cisrc3RhdGljIGlubGluZSBjaGFyICpnZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQorK3sKKysgIHJldHVybiBsaWJpbnRsX2dldHRleHQgKF9fbXNnaWQpOworK30KKysjZWxzZQorKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKysjIGRlZmluZSBnZXR0ZXh0IGxpYmludGxfZ2V0dGV4dAorKyNlbmRpZgorK2V4dGVybiBjaGFyICpnZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQorKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZ2V0dGV4dCk7CisrI2VuZGlmCisrCisrLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisrICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KKysjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisrZXh0ZXJuIGNoYXIgKmxpYmludGxfZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCk7Cisrc3RhdGljIGlubGluZSBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQorK3sKKysgIHJldHVybiBsaWJpbnRsX2RnZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQpOworK30KKysjZWxzZQorKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKysjIGRlZmluZSBkZ2V0dGV4dCBsaWJpbnRsX2RnZXR0ZXh0CisrI2VuZGlmCisrZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpCisrICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kZ2V0dGV4dCk7CisrI2VuZGlmCisrCisrLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCisrICAgbG9jYWxlLiAgKi8KKysjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisrZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisrCQkJCWludCBfX2NhdGVnb3J5KTsKKytzdGF0aWMgaW5saW5lIGNoYXIgKmRjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAorKwkJCSAgICAgICBpbnQgX19jYXRlZ29yeSkKKyt7CisrICByZXR1cm4gbGliaW50bF9kY2dldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZCwgX19jYXRlZ29yeSk7CisrfQorKyNlbHNlCisrI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworKyMgZGVmaW5lIGRjZ2V0dGV4dCBsaWJpbnRsX2RjZ2V0dGV4dAorKyNlbmRpZgorK2V4dGVybiBjaGFyICpkY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKKysJCQlpbnQgX19jYXRlZ29yeSkKKysgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2RjZ2V0dGV4dCk7CisrI2VuZGlmCisrCisrCisrLyogU2ltaWxhciB0byBgZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKKysgICBudW1iZXIgTi4gICovCisrI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorK2V4dGVybiBjaGFyICpsaWJpbnRsX25nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisrCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7Cisrc3RhdGljIGlubGluZSBjaGFyICpuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKKyt7CisrICByZXR1cm4gbGliaW50bF9uZ2V0dGV4dCAoX19tc2dpZDEsIF9fbXNnaWQyLCBfX24pOworK30KKysjZWxzZQorKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKysjIGRlZmluZSBuZ2V0dGV4dCBsaWJpbnRsX25nZXR0ZXh0CisrI2VuZGlmCisrZXh0ZXJuIGNoYXIgKm5nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisrCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKQorKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfbmdldHRleHQpOworKyNlbmRpZgorKworKy8qIFNpbWlsYXIgdG8gYGRnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorKyAgIG51bWJlciBOLiAgKi8KKysjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisrZXh0ZXJuIGNoYXIgKmxpYmludGxfZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQxLAorKwkJCQljb25zdCBjaGFyICpfX21zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgX19uKTsKKytzdGF0aWMgaW5saW5lIGNoYXIgKmRuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkMSwKKysJCQkgICAgICAgY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKKyt7CisrICByZXR1cm4gbGliaW50bF9kbmdldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZDEsIF9fbXNnaWQyLCBfX24pOworK30KKysjZWxzZQorKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKysjIGRlZmluZSBkbmdldHRleHQgbGliaW50bF9kbmdldHRleHQKKysjZW5kaWYKKytleHRlcm4gY2hhciAqZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisrCQkJY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorKwkJCXVuc2lnbmVkIGxvbmcgaW50IF9fbikKKysgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2RuZ2V0dGV4dCk7CisrI2VuZGlmCisrCisrLyogU2ltaWxhciB0byBgZGNnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorKyAgIG51bWJlciBOLiAgKi8KKysjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisrZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorKwkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorKwkJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSk7Cisrc3RhdGljIGlubGluZSBjaGFyICpkY25nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisrCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKysJCQkJdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSkKKyt7CisrICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uLCBfX2NhdGVnb3J5KTsKKyt9CisrI2Vsc2UKKysjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisrIyBkZWZpbmUgZGNuZ2V0dGV4dCBsaWJpbnRsX2RjbmdldHRleHQKKysjZW5kaWYKKytleHRlcm4gY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorKwkJCSBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisrCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpCisrICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kY25nZXR0ZXh0KTsKKysjZW5kaWYKKysKKysKKysvKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KKysgICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgorKyAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLworKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKKytleHRlcm4gY2hhciAqbGliaW50bF90ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpOworK3N0YXRpYyBpbmxpbmUgY2hhciAqdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKQorK3sKKysgIHJldHVybiBsaWJpbnRsX3RleHRkb21haW4gKF9fZG9tYWlubmFtZSk7CisrfQorKyNlbHNlCisrI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworKyMgZGVmaW5lIHRleHRkb21haW4gbGliaW50bF90ZXh0ZG9tYWluCisrI2VuZGlmCisrZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkKKysgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX3RleHRkb21haW4pOworKyNlbmRpZgorKworKy8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAorKyAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KKysjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisrZXh0ZXJuIGNoYXIgKmxpYmludGxfYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKysJCQkJICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpOworK3N0YXRpYyBpbmxpbmUgY2hhciAqYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKysJCQkJICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkKKyt7CisrICByZXR1cm4gbGliaW50bF9iaW5kdGV4dGRvbWFpbiAoX19kb21haW5uYW1lLCBfX2Rpcm5hbWUpOworK30KKysjZWxzZQorKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKysjIGRlZmluZSBiaW5kdGV4dGRvbWFpbiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluCisrI2VuZGlmCisrZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkKKysgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluKTsKKysjZW5kaWYKKysKKysvKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCisrICAgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSByZXR1cm5lZC4gICovCisrI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorK2V4dGVybiBjaGFyICpsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisrCQkJCQkgICAgICBjb25zdCBjaGFyICpfX2NvZGVzZXQpOworK3N0YXRpYyBpbmxpbmUgY2hhciAqYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKysJCQkJCSAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KQorK3sKKysgIHJldHVybiBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChfX2RvbWFpbm5hbWUsIF9fY29kZXNldCk7CisrfQorKyNlbHNlCisrI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworKyMgZGVmaW5lIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKKysjZW5kaWYKKytleHRlcm4gY2hhciAqYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKysJCQkJICAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KQorKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOworKyNlbmRpZgorKworKworKy8qIFN1cHBvcnQgZm9yIGZvcm1hdCBzdHJpbmdzIHdpdGggcG9zaXRpb25zIGluICpwcmludGYoKSwgZm9sbG93aW5nIHRoZQorKyAgIFBPU0lYL1hTSSBzcGVjaWZpY2F0aW9uLgorKyAgIE5vdGU6IFRoZXNlIHJlcGxhY2VtZW50cyBmb3IgdGhlICpwcmludGYoKSBmdW5jdGlvbnMgYXJlIHZpc2libGUgb25seQorKyAgIGluIHNvdXJjZSBmaWxlcyB0aGF0ICNpbmNsdWRlIDxsaWJpbnRsLmg+IG9yICNpbmNsdWRlICJnZXR0ZXh0LmgiLgorKyAgIFBhY2thZ2VzIHRoYXQgdXNlICpwcmludGYoKSBpbiBzb3VyY2UgZmlsZXMgdGhhdCBkb24ndCByZWZlciB0byBfKCkKKysgICBvciBnZXR0ZXh0KCkgYnV0IGZvciB3aGljaCB0aGUgZm9ybWF0IHN0cmluZyBjb3VsZCBiZSB0aGUgcmV0dXJuIHZhbHVlCisrICAgb2YgXygpIG9yIGdldHRleHQoKSBuZWVkIHRvIGFkZCB0aGlzICNpbmNsdWRlLiAgT2ggd2VsbC4gICovCisrCisrI2lmICFASEFWRV9QT1NJWF9QUklOVEZACisrCisrI2luY2x1ZGUgPHN0ZGlvLmg+CisrI2luY2x1ZGUgPHN0ZGRlZi5oPgorKworKy8qIEdldCB2YV9saXN0LiAgKi8KKysjaWYgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSCisrIyBpbmNsdWRlIDxzdGRhcmcuaD4KKysjZWxzZQorKyMgaW5jbHVkZSA8dmFyYXJncy5oPgorKyNlbmRpZgorKworKyN1bmRlZiBmcHJpbnRmCisrI2RlZmluZSBmcHJpbnRmIGxpYmludGxfZnByaW50ZgorK2V4dGVybiBpbnQgZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7CisrI3VuZGVmIHZmcHJpbnRmCisrI2RlZmluZSB2ZnByaW50ZiBsaWJpbnRsX3ZmcHJpbnRmCisrZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworKworKyN1bmRlZiBwcmludGYKKysjZGVmaW5lIHByaW50ZiBsaWJpbnRsX3ByaW50ZgorK2V4dGVybiBpbnQgcHJpbnRmIChjb25zdCBjaGFyICosIC4uLik7CisrI3VuZGVmIHZwcmludGYKKysjZGVmaW5lIHZwcmludGYgbGliaW50bF92cHJpbnRmCisrZXh0ZXJuIGludCB2cHJpbnRmIChjb25zdCBjaGFyICosIHZhX2xpc3QpOworKworKyN1bmRlZiBzcHJpbnRmCisrI2RlZmluZSBzcHJpbnRmIGxpYmludGxfc3ByaW50ZgorK2V4dGVybiBpbnQgc3ByaW50ZiAoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CisrI3VuZGVmIHZzcHJpbnRmCisrI2RlZmluZSB2c3ByaW50ZiBsaWJpbnRsX3ZzcHJpbnRmCisrZXh0ZXJuIGludCB2c3ByaW50ZiAoY2hhciAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworKworKyNpZiBASEFWRV9TTlBSSU5URkAKKysKKysjdW5kZWYgc25wcmludGYKKysjZGVmaW5lIHNucHJpbnRmIGxpYmludGxfc25wcmludGYKKytleHRlcm4gaW50IHNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworKyN1bmRlZiB2c25wcmludGYKKysjZGVmaW5lIHZzbnByaW50ZiBsaWJpbnRsX3ZzbnByaW50ZgorK2V4dGVybiBpbnQgdnNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKysKKysjZW5kaWYKKysKKysjaWYgQEhBVkVfQVNQUklOVEZACisrCisrI3VuZGVmIGFzcHJpbnRmCisrI2RlZmluZSBhc3ByaW50ZiBsaWJpbnRsX2FzcHJpbnRmCisrZXh0ZXJuIGludCBhc3ByaW50ZiAoY2hhciAqKiwgY29uc3QgY2hhciAqLCAuLi4pOworKyN1bmRlZiB2YXNwcmludGYKKysjZGVmaW5lIHZhc3ByaW50ZiBsaWJpbnRsX3Zhc3ByaW50ZgorK2V4dGVybiBpbnQgdmFzcHJpbnRmIChjaGFyICoqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworKworKyNlbmRpZgorKworKyNpZiBASEFWRV9XUFJJTlRGQAorKworKyN1bmRlZiBmd3ByaW50ZgorKyNkZWZpbmUgZndwcmludGYgbGliaW50bF9md3ByaW50ZgorK2V4dGVybiBpbnQgZndwcmludGYgKEZJTEUgKiwgY29uc3Qgd2NoYXJfdCAqLCAuLi4pOworKyN1bmRlZiB2ZndwcmludGYKKysjZGVmaW5lIHZmd3ByaW50ZiBsaWJpbnRsX3Zmd3ByaW50ZgorK2V4dGVybiBpbnQgdmZ3cHJpbnRmIChGSUxFICosIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7CisrCisrI3VuZGVmIHdwcmludGYKKysjZGVmaW5lIHdwcmludGYgbGliaW50bF93cHJpbnRmCisrZXh0ZXJuIGludCB3cHJpbnRmIChjb25zdCB3Y2hhcl90ICosIC4uLik7CisrI3VuZGVmIHZ3cHJpbnRmCisrI2RlZmluZSB2d3ByaW50ZiBsaWJpbnRsX3Z3cHJpbnRmCisrZXh0ZXJuIGludCB2d3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqLCB2YV9saXN0KTsKKysKKysjdW5kZWYgc3dwcmludGYKKysjZGVmaW5lIHN3cHJpbnRmIGxpYmludGxfc3dwcmludGYKKytleHRlcm4gaW50IHN3cHJpbnRmICh3Y2hhcl90ICosIHNpemVfdCwgY29uc3Qgd2NoYXJfdCAqLCAuLi4pOworKyN1bmRlZiB2c3dwcmludGYKKysjZGVmaW5lIHZzd3ByaW50ZiBsaWJpbnRsX3Zzd3ByaW50ZgorK2V4dGVybiBpbnQgdnN3cHJpbnRmICh3Y2hhcl90ICosIHNpemVfdCwgY29uc3Qgd2NoYXJfdCAqLCB2YV9saXN0KTsKKysKKysjZW5kaWYKKysKKysjZW5kaWYKKysKKysKKysvKiBTdXBwb3J0IGZvciByZWxvY2F0YWJsZSBwYWNrYWdlcy4gICovCisrCisrLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCisrICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKysgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKysgICBpbnN0ZWFkIG9mICIvIikuICAqLworKyNkZWZpbmUgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXgKKytleHRlcm4gdm9pZAorKyAgICAgICBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXgsCisrCQkJCSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4KTsKKysKKysKKysjaWZkZWYgX19jcGx1c3BsdXMKKyt9CisrI2VuZGlmCisrCisrI2VuZGlmIC8qIGxpYmludGwuaCAqLworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xpbnV4LW1zZy5zZWQJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvbGludXgtbXNnLnNlZAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorQEAgLTEsMTAwICswLDAgQEAKKy0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIExpbnV4IHN0eWxlIC5tc2cgZmlsZQorLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorLSMKKy0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CistIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorLSMgYW55IGxhdGVyIHZlcnNpb24uCistIworLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCistIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy0jCistIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCistIworLSMKKy0jIFRoZSBmaXJzdCBkaXJlY3RpdmUgaW4gdGhlIC5tc2cgc2hvdWxkIGJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorLSMgbWVzc2FnZSBzZXQgbnVtYmVyLiAgV2UgdXNlIGFsd2F5cyBzZXQgbnVtYmVyIDEuCistIworLTEgeworLSAgaVwKKy0kc2V0IDEgIyBBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgcG8ybXNnLnNlZAorLSAgaAorLSAgcy8uKi8wLworLSAgeAorLX0KKy0jCistIyBNaXRjaCdzIG9sZCBjYXRhbG9nIGZvcm1hdCBkb2VzIG5vdCBhbGxvdyBjb21tZW50cy4KKy0jCistIyBXZSBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFzIGEgY29tbWVudCBpbnRvIHRoZSAubXNnIGZpbGUuCistIworLS9ebXNnaWQvIHsKKy0gIHMvbXNnaWRbIAldKiIvLworLSMKKy0jIFRoaXMgZG9lcyBub3Qgd29yayBub3cgd2l0aCB0aGUgbmV3IGZvcm1hdC4KKy0jIC8iJC8hIHsKKy0jICAgcy9cXCQvLworLSMgICBzLyQvIC4uLiAobW9yZSBsaW5lcyBmb2xsb3dpbmcpIi8KKy0jIH0KKy0gIHgKKy0jIFRoZSBmb2xsb3dpbmcgbmljZSBzb2x1dGlvbiBpcyBieQorLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+CistICB0ZAorLSMgSW5jcmVtZW50IGEgZGVjaW1hbCBudW1iZXIgaW4gcGF0dGVybiBzcGFjZS4KKy0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KKy0gIDpkCistICBzLzlcKF8qXCkkL19cMS8KKy0gIHRkCistIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KKy0gIHMvXlwoXypcKSQvMFwxLworLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgorLSAgcy84XChfKlwpJC85XDEvCistICBzLzdcKF8qXCkkLzhcMS8KKy0gIHMvNlwoXypcKSQvN1wxLworLSAgcy81XChfKlwpJC82XDEvCistICBzLzRcKF8qXCkkLzVcMS8KKy0gIHMvM1woXypcKSQvNFwxLworLSAgcy8yXChfKlwpJC8zXDEvCistICBzLzFcKF8qXCkkLzJcMS8KKy0gIHMvMFwoXypcKSQvMVwxLworLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KKy0gIHMvXy8wL2cKKy0gIHgKKy0gIEcKKy0gIHMvXCguKlwpIlxuXChbMC05XSpcKS8kICNcMiBPcmlnaW5hbCBNZXNzYWdlOihcMSkvcAorLX0KKy0jCistIyBUaGUgLm1zZyBmaWxlIGNvbnRhaW5zLCBvdGhlciB0aGVuIHRoZSAucG8gZmlsZSwgb25seSB0aGUgdHJhbnNsYXRpb25zCistIyBidXQgZWFjaCBnaXZlbiBhIHVuaXF1ZSBJRC4gIFN0YXJ0aW5nIGZyb20gMSBhbmQgaW5jcmVtZW50aW5nIGJ5IDEgZm9yCistIyBlYWNoIG1lc3NhZ2Ugd2UgYXNzaWduIHRoZW0gdG8gdGhlIG1lc3NhZ2VzLgorLSMgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIC5wbyBmaWxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNhdC1pZC10YmwuYyBmaWxlCistIyAod2l0aCBwby10by10YmwpIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBoZXJlLiAgKEF0IGxlYXN0IHRoZSBvcmRlcgorLSMgb2YgZGVjbGFyYXRpb25zIG11c3Qgbm90IGJlIGNoYW5nZWQuKQorLSMKKy0vXm1zZ3N0ci8geworLSAgcy9tc2dzdHJbIAldKiJcKC4qXCkiLyMgXDEvCistIyBDbGVhciBzdWJzdGl0dXRpb24gZmxhZy4KKy0gIHRiCistIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KKy0gIDpiCistICBOCistIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgY29udGludWF0aW9uIGxpbmUuCistICBzL1woLipcblwpIlwoLipcKSIvXDFcMi8KKy0jIFllcywgdGhlbiBicmFuY2guCistICB0YQorLSAgUAorLSAgRAorLSMgTm90ZSB0aGF0IEQgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCistIyBXZSBmb3VuZCBhIGNvbnRpbnVhdGlvbiBsaW5lLiAgQnV0IGJlZm9yZSBwcmludGluZyBpbnNlcnQgJ1wnLgorLSAgOmEKKy0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLworLSAgUAorLSMgV2UgY2Fubm90IHVzZSBEIGhlcmUuCistICBzLy4qXG5cKC4qXCkvXDEvCistICB0YgorLX0KKy1kCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvbG9hZGluZm8uaAkxOTk4LTA0LTI2IDA5OjIwOjUyLjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2FkaW5mby5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNDY4NzMwOTEyIC0wNDAwCitAQCAtMSw5ICsxLDU0IEBACistI2lmbmRlZiBQQVJBTVMKKy0jIGlmIF9fU1REQ19fCistIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCistIyBlbHNlCistIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQorLSMgZW5kaWYKKysvKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZuZGVmIF9MT0FESU5GT19ICisrI2RlZmluZSBfTE9BRElORk9fSAkxCisrCisrLyogRGVjbGFyYXRpb25zIG9mIGxvY2FsZSBkZXBlbmRlbnQgY2F0YWxvZyBsb29rdXAgZnVuY3Rpb25zLgorKyAgIEltcGxlbWVudGVkIGluCisrCisrICAgICBsb2NhbGVhbGlhcy5jICAgIFBvc3NpYmx5IHJlcGxhY2UgYSBsb2NhbGUgbmFtZSBieSBhbm90aGVyLgorKyAgICAgZXhwbG9kZW5hbWUuYyAgICBTcGxpdCBhIGxvY2FsZSBuYW1lIGludG8gaXRzIHZhcmlvdXMgZmllbGRzLgorKyAgICAgbDEwbmZsaXN0LmMgICAgICBHZW5lcmF0ZSBhIGxpc3Qgb2YgZmlsZW5hbWVzIG9mIHBvc3NpYmxlIG1lc3NhZ2UgY2F0YWxvZ3MuCisrICAgICBmaW5kZG9tYWluLmMgICAgIEZpbmQgYW5kIG9wZW4gdGhlIHJlbGV2YW50IG1lc3NhZ2UgY2F0YWxvZ3MuCisrCisrICAgVGhlIG1haW4gZnVuY3Rpb24gX25sX2ZpbmRfZG9tYWluKCkgaW4gZmluZGRvbWFpbi5jIGlzIGRlY2xhcmVkCisrICAgaW4gZ2V0dGV4dFAuaC4KKysgKi8KKysKKysjaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCisrIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24KKysjZW5kaWYKKysKKysvKiBUZWxsIHRoZSBjb21waWxlciB3aGVuIGEgY29uZGl0aW9uYWwgb3IgaW50ZWdlciBleHByZXNzaW9uIGlzCisrICAgYWxtb3N0IGFsd2F5cyB0cnVlIG9yIGFsbW9zdCBhbHdheXMgZmFsc2UuICAqLworKyNpZm5kZWYgSEFWRV9CVUlMVElOX0VYUEVDVAorKyMgZGVmaW5lIF9fYnVpbHRpbl9leHBlY3QoZXhwciwgdmFsKSAoZXhwcikKKysjZW5kaWYKKysKKysvKiBTZXBhcmF0b3IgaW4gUEFUSCBsaWtlIGxpc3RzIG9mIHBhdGhuYW1lcy4gICovCisrI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc7JworKyNlbHNlCisrICAvKiBVbml4ICovCisrIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCisgI2VuZGlmCisgCisgLyogRW5jb2Rpbmcgb2YgbG9jYWxlIG5hbWUgcGFydHMuICAqLworQEAgLTMyLDI3ICs3Nyw2OSBAQAorIH07CisgCisgCistZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9ub3JtYWxpemVfY29kZXNldCBQQVJBTVMgKChjb25zdCBjaGFyICpjb2Rlc2V0LAorLQkJCQkJCSAgc2l6ZV90IG5hbWVfbGVuKSk7CisrLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAorKyAgIG5hbWVzLiAgTm9ybWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uCisrICAgbmFtZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlCisrICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCisrZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9ub3JtYWxpemVfY29kZXNldCAoY29uc3QgY2hhciAqY29kZXNldCwKKysJCQkJCSAgc2l6ZV90IG5hbWVfbGVuKTsKKyAKKysvKiBMb29rdXAgYSBsb2NhbGUgZGVwZW5kZW50IGZpbGUuCisrICAgKkwxME5GSUxFX0xJU1QgZGVub3RlcyBhIHBvb2wgb2YgbG9va3VwIHJlc3VsdHMgb2YgbG9jYWxlIGRlcGVuZGVudAorKyAgIGZpbGVzIG9mIHRoZSBzYW1lIGtpbmQsIHNvcnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIC0+ZmlsZW5hbWUuCisrICAgRElSTElTVCBhbmQgRElSTElTVF9MRU4gYXJlIGFuIGFyZ3ogbGlzdCBvZiBkaXJlY3RvcmllcyBpbiB3aGljaCB0bworKyAgIGxvb2ssIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGRpcmVjdG9yeSAoaS5lLiBESVJMSVNUX0xFTiA+IDApLgorKyAgIE1BU0ssIExBTkdVQUdFLCBURVJSSVRPUlksIENPREVTRVQsIE5PUk1BTElaRURfQ09ERVNFVCwgTU9ESUZJRVIsCisrICAgU1BFQ0lBTCwgU1BPTlNPUiwgUkVWSVNJT04gYXJlIHRoZSBwaWVjZXMgb2YgdGhlIGxvY2FsZSBuYW1lLCBhcworKyAgIHByb2R1Y2VkIGJ5IF9ubF9leHBsb2RlX25hbWUoKS4gIEZJTEVOQU1FIGlzIHRoZSBmaWxlbmFtZSBzdWZmaXguCisrICAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbG9va3VwIHJlc3VsdCwgZWl0aGVyIGZvdW5kIGluICpMMTBORklMRV9MSVNULAorKyAgIG9yIC0gaWYgRE9fQUxMT0NBVEUgaXMgbm9uemVybyAtIGZyZXNobHkgYWxsb2NhdGVkLCBvciBwb3NzaWJseSBOVUxMLgorKyAgIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLU5VTEwsIGl0IGlzIGFkZGVkIHRvICpMMTBORklMRV9MSVNULCBhbmQKKysgICBpdHMgLT5uZXh0IGZpZWxkIGRlbm90ZXMgdGhlIGNoYWluaW5nIGluc2lkZSAqTDEwTkZJTEVfTElTVCwgYW5kCisrICAgZnVydGhlcm1vcmUgaXRzIC0+c3VjY2Vzc29yW10gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIG90aGVyIGxvb2t1cAorKyAgIHJlc3VsdHMgZnJvbSB3aGljaCB0aGlzIGxvb2t1cCByZXN1bHQgaW5oZXJpdHMuICAqLworIGV4dGVybiBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKKy1fbmxfbWFrZV9sMTBuZmxpc3QgUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3QsCistCQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwgaW50IG1hc2ssCistCQkJICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCistCQkJICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQsCistCQkJICAgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldCwKKy0JCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKnNwZWNpYWwsCistCQkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAorLQkJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKSk7CisrX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKKysJCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sIGludCBtYXNrLAorKwkJICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCisrCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAorKwkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLCBjb25zdCBjaGFyICpzcGVjaWFsLAorKwkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAorKwkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpOworIAorKy8qIExvb2t1cCB0aGUgcmVhbCBsb2NhbGUgbmFtZSBmb3IgYSBsb2NhbGUgYWxpYXMgTkFNRSwgb3IgTlVMTCBpZgorKyAgIE5BTUUgaXMgbm90IGEgbG9jYWxlIGFsaWFzIChidXQgcG9zc2libHkgYSByZWFsIGxvY2FsZSBuYW1lKS4KKysgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBtdXN0IG5vdCBiZSBmcmVlZC4gICovCisrZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKGNvbnN0IGNoYXIgKm5hbWUpOworIAorLWV4dGVybiBjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKKysvKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBpdHMgcGllY2VzOiBsYW5ndWFnZSwgbW9kaWZpZXIsCisrICAgdGVycml0b3J5LCBjb2Rlc2V0LCBzcGVjaWFsLCBzcG9uc29yLCByZXZpc2lvbi4KKysgICBOQU1FIGdldHMgZGVzdHJ1Y3RpdmVseSBtb2RpZmllZDogTlVMIGJ5dGVzIGFyZSBpbnNlcnRlZCBoZXJlIGFuZAorKyAgIHRoZXJlLiAgKkxBTkdVQUdFIGdldHMgYXNzaWduZWQgTkFNRS4gIEVhY2ggb2YgKk1PRElGSUVSLCAqVEVSUklUT1JZLAorKyAgICpDT0RFU0VULCAqU1BFQ0lBTCwgKlNQT05TT1IsICpSRVZJU0lPTiBnZXRzIGFzc2lnbmVkIGVpdGhlciBhCisrICAgcG9pbnRlciBpbnRvIHRoZSBvbGQgTkFNRSBzdHJpbmcsIG9yIE5VTEwuICAqTk9STUFMSVpFRF9DT0RFU0VUCisrICAgZ2V0cyBhc3NpZ25lZCB0aGUgZXhwYW5kZWQgKkNPREVTRVQsIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tICpDT0RFU0VUOworKyAgIHRoaXMgb25lIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisrICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGJpdG1hc2ssIHdoZXJlIGVhY2ggYml0IGNvcnJlc3BvbmRzIHRvIG9uZQorKyAgIGZpbGxlZC1pbiB2YWx1ZToKKysgICAgIFhQR19NT0RJRklFUiwgQ0VOX0FVRElFTkNFICBmb3IgKk1PRElGSUVSLAorKyAgICAgVEVSUklUT1JZICAgICAgICAgICAgICAgICAgIGZvciAqVEVSUklUT1JZLAorKyAgICAgWFBHX0NPREVTRVQgICAgICAgICAgICAgICAgIGZvciAqQ09ERVNFVCwKKysgICAgIFhQR19OT1JNX0NPREVTRVQgICAgICAgICAgICBmb3IgKk5PUk1BTElaRURfQ09ERVNFVCwKKysgICAgIENFTl9TUEVDSUFMICAgICAgICAgICAgICAgICBmb3IgKlNQRUNJQUwsCisrICAgICBDRU5fU1BPTlNPUiAgICAgICAgICAgICAgICAgZm9yICpTUE9OU09SLAorKyAgICAgQ0VOX1JFVklTSU9OICAgICAgICAgICAgICAgIGZvciAqUkVWSVNJT04uCisrICovCisrZXh0ZXJuIGludCBfbmxfZXhwbG9kZV9uYW1lIChjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsCisrCQkJICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksCisrCQkJICAgICBjb25zdCBjaGFyICoqY29kZXNldCwKKysJCQkgICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsCisrCQkJICAgICBjb25zdCBjaGFyICoqc3BlY2lhbCwgY29uc3QgY2hhciAqKnNwb25zb3IsCisrCQkJICAgICBjb25zdCBjaGFyICoqcmV2aXNpb24pOworIAorLWV4dGVybiBpbnQgX25sX2V4cGxvZGVfbmFtZSBQQVJBTVMgKChjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsCistCQkJCSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyLAorLQkJCQkgICAgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksCistCQkJCSAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQsCistCQkJCSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCwKKy0JCQkJICAgICBjb25zdCBjaGFyICoqc3BlY2lhbCwKKy0JCQkJICAgICBjb25zdCBjaGFyICoqc3BvbnNvciwKKy0JCQkJICAgICBjb25zdCBjaGFyICoqcmV2aXNpb24pKTsKKysvKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBhIGxlYWRpbmcgbGFuZ3VhZ2UgcGFydCBhbmQgYWxsIHRoZQorKyAgIHJlc3QuICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhbmd1YWdlLAorKyAgIGkuZS4gdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlc3QuICAqLworK2V4dGVybiBjaGFyICpfbmxfZmluZF9sYW5ndWFnZSAoY29uc3QgY2hhciAqbmFtZSk7CisrCisrI2VuZGlmCS8qIGxvYWRpbmZvLmggKi8KKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2FkbXNnY2F0LmMJMTk5OC0wNC0yNiAwOToyMjozNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvbG9hZG1zZ2NhdC5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNDczNzMwMTUyIC0wNDAwCitAQCAtMSw0MiArMSw0NTUgQEAKKy0vKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCistICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKy8qIExvYWQgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MuCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAKKy0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CistICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCistICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisrCisrLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgbWVtcGNweSgpLgorKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKysjaWZuZGVmIF9HTlVfU09VUkNFCisrIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgMQorKyNlbmRpZgorIAorICNpZmRlZiBIQVZFX0NPTkZJR19ICisgIyBpbmNsdWRlIDxjb25maWcuaD4KKyAjZW5kaWYKKyAKKysjaW5jbHVkZSA8Y3R5cGUuaD4KKysjaW5jbHVkZSA8ZXJybm8uaD4KKyAjaW5jbHVkZSA8ZmNudGwuaD4KKyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisgCistI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKKy0jIGluY2x1ZGUgPHN0ZGxpYi5oPgorKyNpZmRlZiBfX0dOVUNfXworKyMgdW5kZWYgIGFsbG9jYQorKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisrIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorKyNlbHNlCisrIyBpZmRlZiBfTVNDX1ZFUgorKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorKyMgZWxzZQorKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisrIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorKyMgIGVsc2UKKysjICAgaWZkZWYgX0FJWAorKyAjcHJhZ21hIGFsbG9jYQorKyMgICBlbHNlCisrIyAgICBpZm5kZWYgYWxsb2NhCisrY2hhciAqYWxsb2NhICgpOworKyMgICAgZW5kaWYKKysjICAgZW5kaWYKKysjICBlbmRpZgorKyMgZW5kaWYKKyAjZW5kaWYKKyAKKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2luY2x1ZGUgPHN0cmluZy5oPgorKworICNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQworICMgaW5jbHVkZSA8dW5pc3RkLmg+CisgI2VuZGlmCisgCistI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQKSB8fCBkZWZpbmVkIF9MSUJDCisrI2lmZGVmIF9MSUJDCisrIyBpbmNsdWRlIDxsYW5naW5mby5oPgorKyMgaW5jbHVkZSA8bG9jYWxlLmg+CisrI2VuZGlmCisrCisrI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKKysgICAgfHwgKGRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfUE9TSVhfTUFQUEVEX0ZJTEVTKQorICMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKysjIHVuZGVmIEhBVkVfTU1BUAorKyMgZGVmaW5lIEhBVkVfTU1BUAkxCisrI2Vsc2UKKysjIHVuZGVmIEhBVkVfTU1BUAorICNlbmRpZgorIAorLSNpbmNsdWRlICJnZXR0ZXh0LmgiCisrI2lmIGRlZmluZWQgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggfHwgZGVmaW5lZCBfTElCQworKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisrI2VuZGlmCisrI2lmIGRlZmluZWQgSEFWRV9JTlRUWVBFU19IIHx8IGRlZmluZWQgX0xJQkMKKysjIGluY2x1ZGUgPGludHR5cGVzLmg+CisrI2VuZGlmCisrCisrI2luY2x1ZGUgImdtby5oIgorICNpbmNsdWRlICJnZXR0ZXh0UC5oIgorKyNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgorKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisrCisrI2lmZGVmIF9MSUJDCisrIyBpbmNsdWRlICIuLi9sb2NhbGUvbG9jYWxlaW5mby5oIgorKyNlbmRpZgorKworKy8qIFByb3ZpZGUgZmFsbGJhY2sgdmFsdWVzIGZvciBtYWNyb3MgdGhhdCBvdWdodCB0byBiZSBkZWZpbmVkIGluIDxpbnR0eXBlcy5oPi4KKysgICBOb3RlIHRoYXQgb3VyIGZhbGxiYWNrIHZhbHVlcyBuZWVkIG5vdCBiZSBsaXRlcmFsIHN0cmluZ3MsIGJlY2F1c2Ugd2UgZG9uJ3QKKysgICB1c2UgdGhlbSB3aXRoIHByZXByb2Nlc3NvciBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gICovCisrI2lmICFkZWZpbmVkIFBSSWQ4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklkOAorKyMgZGVmaW5lIFBSSWQ4ICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpOCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJaTgKKysjIGRlZmluZSBQUklpOCAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJbzggfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSW84CisrIyBkZWZpbmUgUFJJbzggIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXU4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUkl1OAorKyMgZGVmaW5lIFBSSXU4ICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4OCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJeDgKKysjIGRlZmluZSBQUkl4OCAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSVg4CisrIyBkZWZpbmUgUFJJWDggIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWQxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJZDE2CisrIyBkZWZpbmUgUFJJZDE2ICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWkxNgorKyMgZGVmaW5lIFBSSWkxNiAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJbzE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklvMTYKKysjIGRlZmluZSBQUklvMTYgIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXUxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJdTE2CisrIyBkZWZpbmUgUFJJdTE2ICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4MTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXgxNgorKyMgZGVmaW5lIFBSSXgxNiAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklYMTYKKysjIGRlZmluZSBQUklYMTYgIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWQzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJZDMyCisrIyBkZWZpbmUgUFJJZDMyICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWkzMgorKyMgZGVmaW5lIFBSSWkzMiAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJbzMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklvMzIKKysjIGRlZmluZSBQUklvMzIgIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXUzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJdTMyCisrIyBkZWZpbmUgUFJJdTMyICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4MzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXgzMgorKyMgZGVmaW5lIFBSSXgzMiAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklYMzIKKysjIGRlZmluZSBQUklYMzIgIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWQ2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJZDY0CisrIyBkZWZpbmUgUFJJZDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibGQiIDogImxsZCIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWk2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJaTY0CisrIyBkZWZpbmUgUFJJaTY0IChzaXplb2YgKGxvbmcpID09IDggPyAibGkiIDogImxsaSIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSW82NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJbzY0CisrIyBkZWZpbmUgUFJJbzY0IChzaXplb2YgKGxvbmcpID09IDggPyAibG8iIDogImxsbyIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXU2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJdTY0CisrIyBkZWZpbmUgUFJJdTY0IChzaXplb2YgKGxvbmcpID09IDggPyAibHUiIDogImxsdSIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJeDY0CisrIyBkZWZpbmUgUFJJeDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibHgiIDogImxseCIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSVg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJWDY0CisrIyBkZWZpbmUgUFJJWDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibFgiIDogImxsWCIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWRMRUFTVDgKKysjIGRlZmluZSBQUklkTEVBU1Q4ICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklpTEVBU1Q4CisrIyBkZWZpbmUgUFJJaUxFQVNUOCAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJb0xFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJb0xFQVNUOAorKyMgZGVmaW5lIFBSSW9MRUFTVDggIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVMRUFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXVMRUFTVDgKKysjIGRlZmluZSBQUkl1TEVBU1Q4ICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4TEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUkl4TEVBU1Q4CisrIyBkZWZpbmUgUFJJeExFQVNUOCAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJWExFQVNUOAorKyMgZGVmaW5lIFBSSVhMRUFTVDggIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklkTEVBU1QxNgorKyMgZGVmaW5lIFBSSWRMRUFTVDE2ICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJaUxFQVNUMTYKKysjIGRlZmluZSBQUklpTEVBU1QxNiAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJb0xFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSW9MRUFTVDE2CisrIyBkZWZpbmUgUFJJb0xFQVNUMTYgIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVMRUFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUkl1TEVBU1QxNgorKyMgZGVmaW5lIFBSSXVMRUFTVDE2ICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4TEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJeExFQVNUMTYKKysjIGRlZmluZSBQUkl4TEVBU1QxNiAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSVhMRUFTVDE2CisrIyBkZWZpbmUgUFJJWExFQVNUMTYgIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklkTEVBU1QzMgorKyMgZGVmaW5lIFBSSWRMRUFTVDMyICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJaUxFQVNUMzIKKysjIGRlZmluZSBQUklpTEVBU1QzMiAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJb0xFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSW9MRUFTVDMyCisrIyBkZWZpbmUgUFJJb0xFQVNUMzIgIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVMRUFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUkl1TEVBU1QzMgorKyMgZGVmaW5lIFBSSXVMRUFTVDMyICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4TEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJeExFQVNUMzIKKysjIGRlZmluZSBQUkl4TEVBU1QzMiAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSVhMRUFTVDMyCisrIyBkZWZpbmUgUFJJWExFQVNUMzIgIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklkTEVBU1Q2NAorKyMgZGVmaW5lIFBSSWRMRUFTVDY0IFBSSWQ2NAorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJaUxFQVNUNjQKKysjIGRlZmluZSBQUklpTEVBU1Q2NCBQUklpNjQKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJb0xFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSW9MRUFTVDY0CisrIyBkZWZpbmUgUFJJb0xFQVNUNjQgUFJJbzY0CisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVMRUFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUkl1TEVBU1Q2NAorKyMgZGVmaW5lIFBSSXVMRUFTVDY0IFBSSXU2NAorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4TEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJeExFQVNUNjQKKysjIGRlZmluZSBQUkl4TEVBU1Q2NCBQUkl4NjQKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSVhMRUFTVDY0CisrIyBkZWZpbmUgUFJJWExFQVNUNjQgUFJJWDY0CisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJZEZBU1Q4CisrIyBkZWZpbmUgUFJJZEZBU1Q4ICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWlGQVNUOAorKyMgZGVmaW5lIFBSSWlGQVNUOCAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJb0ZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklvRkFTVDgKKysjIGRlZmluZSBQUklvRkFTVDggIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVGQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJdUZBU1Q4CisrIyBkZWZpbmUgUFJJdUZBU1Q4ICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4RkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXhGQVNUOAorKyMgZGVmaW5lIFBSSXhGQVNUOCAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklYRkFTVDgKKysjIGRlZmluZSBQUklYRkFTVDggIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWRGQVNUMTYKKysjIGRlZmluZSBQUklkRkFTVDE2ICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklpRkFTVDE2CisrIyBkZWZpbmUgUFJJaUZBU1QxNiAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJb0ZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJb0ZBU1QxNgorKyMgZGVmaW5lIFBSSW9GQVNUMTYgIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVGQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXVGQVNUMTYKKysjIGRlZmluZSBQUkl1RkFTVDE2ICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4RkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUkl4RkFTVDE2CisrIyBkZWZpbmUgUFJJeEZBU1QxNiAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJWEZBU1QxNgorKyMgZGVmaW5lIFBSSVhGQVNUMTYgIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWRGQVNUMzIKKysjIGRlZmluZSBQUklkRkFTVDMyICJkIgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklpRkFTVDMyCisrIyBkZWZpbmUgUFJJaUZBU1QzMiAiaSIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJb0ZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJb0ZBU1QzMgorKyMgZGVmaW5lIFBSSW9GQVNUMzIgIm8iCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVGQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXVGQVNUMzIKKysjIGRlZmluZSBQUkl1RkFTVDMyICJ1IgorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4RkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUkl4RkFTVDMyCisrIyBkZWZpbmUgUFJJeEZBU1QzMiAieCIKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJWEZBU1QzMgorKyMgZGVmaW5lIFBSSVhGQVNUMzIgIlgiCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWRGQVNUNjQKKysjIGRlZmluZSBQUklkRkFTVDY0IFBSSWQ2NAorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklpRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklpRkFTVDY0CisrIyBkZWZpbmUgUFJJaUZBU1Q2NCBQUklpNjQKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJb0ZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJb0ZBU1Q2NAorKyMgZGVmaW5lIFBSSW9GQVNUNjQgUFJJbzY0CisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVGQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXVGQVNUNjQKKysjIGRlZmluZSBQUkl1RkFTVDY0IFBSSXU2NAorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUkl4RkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUkl4RkFTVDY0CisrIyBkZWZpbmUgUFJJeEZBU1Q2NCBQUkl4NjQKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJWEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJWEZBU1Q2NAorKyMgZGVmaW5lIFBSSVhGQVNUNjQgUFJJWDY0CisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWRNQVgKKysjIGRlZmluZSBQUklkTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsZCIgOiAibGxkIikKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJaU1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJaU1BWAorKyMgZGVmaW5lIFBSSWlNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxpIiA6ICJsbGkiKQorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklvTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklvTUFYCisrIyBkZWZpbmUgUFJJb01BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibG8iIDogImxsbyIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXVNQVgKKysjIGRlZmluZSBQUkl1TUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsdSIgOiAibGx1IikKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJeE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJeE1BWAorKyMgZGVmaW5lIFBSSXhNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImx4IiA6ICJsbHgiKQorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklYTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklYTUFYCisrIyBkZWZpbmUgUFJJWE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibFgiIDogImxsWCIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSWRQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSWRQVFIKKysjIGRlZmluZSBQUklkUFRSIFwKKysgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsZCIgOiBcCisrICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJkIiA6IFwKKysgICAibGxkIikKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJaVBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJaVBUUgorKyMgZGVmaW5lIFBSSWlQVFIgXAorKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxpIiA6IFwKKysgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gImkiIDogXAorKyAgICJsbGkiKQorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklvUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklvUFRSCisrIyBkZWZpbmUgUFJJb1BUUiBcCisrICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibG8iIDogXAorKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAibyIgOiBcCisrICAgImxsbyIpCisrI2VuZGlmCisrI2lmICFkZWZpbmVkIFBSSXVQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKysjIHVuZGVmIFBSSXVQVFIKKysjIGRlZmluZSBQUkl1UFRSIFwKKysgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsdSIgOiBcCisrICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJ1IiA6IFwKKysgICAibGx1IikKKysjZW5kaWYKKysjaWYgIWRlZmluZWQgUFJJeFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorKyMgdW5kZWYgUFJJeFBUUgorKyMgZGVmaW5lIFBSSXhQVFIgXAorKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImx4IiA6IFwKKysgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIngiIDogXAorKyAgICJsbHgiKQorKyNlbmRpZgorKyNpZiAhZGVmaW5lZCBQUklYUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisrIyB1bmRlZiBQUklYUFRSCisrIyBkZWZpbmUgUFJJWFBUUiBcCisrICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibFgiIDogXAorKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiWCIgOiBcCisrICAgImxsWCIpCisrI2VuZGlmCisgCisgLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworIAorQEAgLTQ0LDcgKzQ1Nyw2IEBACisgLyogUmVuYW1lIHRoZSBub24gSVNPIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKKyAgICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKyAgICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCistIyBkZWZpbmUgZnN0YXQgIF9fZnN0YXQKKyAjIGRlZmluZSBvcGVuICAgX19vcGVuCisgIyBkZWZpbmUgY2xvc2UgIF9fY2xvc2UKKyAjIGRlZmluZSByZWFkICAgX19yZWFkCitAQCAtNTIsMzAgKzQ2NCw0NzEgQEAKKyAjIGRlZmluZSBtdW5tYXAgX19tdW5tYXAKKyAjZW5kaWYKKyAKKysvKiBGb3IgdGhvc2UgbG9zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAorKyAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCisrI2lmZGVmIEhBVkVfQUxMT0NBCisrIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLworKyNlbHNlCisrIyBkZWZpbmUgYWxsb2NhKG4pIG1hbGxvYyAobikKKysjIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQorKyNlbmRpZgorKworKy8qIEZvciBzeXN0ZW1zIHRoYXQgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgSS9PLgorKyAgIE9fQklOQVJZIGlzIHVzdWFsbHkgZGVjbGFyZWQgaW4gPGZjbnRsLmg+LiAqLworKyNpZiAhZGVmaW5lZCBPX0JJTkFSWSAmJiBkZWZpbmVkIF9PX0JJTkFSWQorKyAgLyogRm9yIE1TQy1jb21wYXRpYmxlIGNvbXBpbGVycy4gICovCisrIyBkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCisrIyBkZWZpbmUgT19URVhUIF9PX1RFWFQKKysjZW5kaWYKKysjaWZkZWYgX19CRU9TX18KKysgIC8qIEJlT1MgNSBoYXMgT19CSU5BUlkgYW5kIE9fVEVYVCwgYnV0IHRoZXkgaGF2ZSBubyBlZmZlY3QuICAqLworKyMgdW5kZWYgT19CSU5BUlkKKysjIHVuZGVmIE9fVEVYVAorKyNlbmRpZgorKy8qIE9uIHJlYXNvbmFibGUgc3lzdGVtcywgYmluYXJ5IEkvTyBpcyB0aGUgZGVmYXVsdC4gICovCisrI2lmbmRlZiBPX0JJTkFSWQorKyMgZGVmaW5lIE9fQklOQVJZIDAKKysjZW5kaWYKKysKKysKKyAvKiBXZSBuZWVkIGEgc2lnbiwgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkCisgICAgd2l0aCBhbGwgdHJhbnNsYXRpb25zLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgdGhlIHRyYW5zbGF0aW9ucyBhcmUKKyAgICBjYWNoZWQgYnkgb25lIG9mIEdDQydzIGZlYXR1cmVzLiAgKi8KKy1pbnQgX25sX21zZ19jYXRfY250ciA9IDA7CisraW50IF9ubF9tc2dfY2F0X2NudHI7CisgCisgCisrLyogRXhwYW5kIGEgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcgc2VnbWVudC4gIFJldHVybiBOVUxMIGlmIHVuc3VwcG9ydGVkLiAgKi8KKytzdGF0aWMgY29uc3QgY2hhciAqCisrZ2V0X3N5c2RlcF9zZWdtZW50X3ZhbHVlIChjb25zdCBjaGFyICpuYW1lKQorK3sKKysgIC8qIFRlc3QgZm9yIGFuIElTTyBDIDk5IHNlY3Rpb24gNy44LjEgZm9ybWF0IHN0cmluZyBkaXJlY3RpdmUuCisrICAgICBTeW50YXg6CisrICAgICBQIFIgSSB7IGQgfCBpIHwgbyB8IHUgfCB4IHwgWCB9CisrICAgICB7IHsgfCBMRUFTVCB8IEZBU1QgfSB7IDggfCAxNiB8IDMyIHwgNjQgfSB8IE1BWCB8IFBUUiB9ICAqLworKyAgLyogV2UgZG9uJ3QgdXNlIGEgdGFibGUgb2YgMTQgdGltZXMgNiAnY29uc3QgY2hhciAqJyBzdHJpbmdzIGhlcmUsIGJlY2F1c2UKKysgICAgIGRhdGEgcmVsb2NhdGlvbnMgY29zdCBzdGFydHVwIHRpbWUuICAqLworKyAgaWYgKG5hbWVbMF0gPT0gJ1AnICYmIG5hbWVbMV0gPT0gJ1InICYmIG5hbWVbMl0gPT0gJ0knKQorKyAgICB7CisrICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnIHx8IG5hbWVbM10gPT0gJ2knIHx8IG5hbWVbM10gPT0gJ28nIHx8IG5hbWVbM10gPT0gJ3UnCisrCSAgfHwgbmFtZVszXSA9PSAneCcgfHwgbmFtZVszXSA9PSAnWCcpCisrCXsKKysJICBpZiAobmFtZVs0XSA9PSAnOCcgJiYgbmFtZVs1XSA9PSAnXDAnKQorKwkgICAgeworKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQlyZXR1cm4gUFJJZDg7CisrCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKysJCXJldHVybiBQUklpODsKKysJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorKwkJcmV0dXJuIFBSSW84OworKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisrCQlyZXR1cm4gUFJJdTg7CisrCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKysJCXJldHVybiBQUkl4ODsKKysJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorKwkJcmV0dXJuIFBSSVg4OworKwkgICAgICBhYm9ydCAoKTsKKysJICAgIH0KKysJICBpZiAobmFtZVs0XSA9PSAnMScgJiYgbmFtZVs1XSA9PSAnNicgJiYgbmFtZVs2XSA9PSAnXDAnKQorKwkgICAgeworKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQlyZXR1cm4gUFJJZDE2OworKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisrCQlyZXR1cm4gUFJJaTE2OworKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisrCQlyZXR1cm4gUFJJbzE2OworKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisrCQlyZXR1cm4gUFJJdTE2OworKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisrCQlyZXR1cm4gUFJJeDE2OworKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisrCQlyZXR1cm4gUFJJWDE2OworKwkgICAgICBhYm9ydCAoKTsKKysJICAgIH0KKysJICBpZiAobmFtZVs0XSA9PSAnMycgJiYgbmFtZVs1XSA9PSAnMicgJiYgbmFtZVs2XSA9PSAnXDAnKQorKwkgICAgeworKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQlyZXR1cm4gUFJJZDMyOworKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisrCQlyZXR1cm4gUFJJaTMyOworKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisrCQlyZXR1cm4gUFJJbzMyOworKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisrCQlyZXR1cm4gUFJJdTMyOworKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisrCQlyZXR1cm4gUFJJeDMyOworKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisrCQlyZXR1cm4gUFJJWDMyOworKwkgICAgICBhYm9ydCAoKTsKKysJICAgIH0KKysJICBpZiAobmFtZVs0XSA9PSAnNicgJiYgbmFtZVs1XSA9PSAnNCcgJiYgbmFtZVs2XSA9PSAnXDAnKQorKwkgICAgeworKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQlyZXR1cm4gUFJJZDY0OworKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisrCQlyZXR1cm4gUFJJaTY0OworKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisrCQlyZXR1cm4gUFJJbzY0OworKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisrCQlyZXR1cm4gUFJJdTY0OworKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisrCQlyZXR1cm4gUFJJeDY0OworKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisrCQlyZXR1cm4gUFJJWDY0OworKwkgICAgICBhYm9ydCAoKTsKKysJICAgIH0KKysJICBpZiAobmFtZVs0XSA9PSAnTCcgJiYgbmFtZVs1XSA9PSAnRScgJiYgbmFtZVs2XSA9PSAnQScKKysJICAgICAgJiYgbmFtZVs3XSA9PSAnUycgJiYgbmFtZVs4XSA9PSAnVCcpCisrCSAgICB7CisrCSAgICAgIGlmIChuYW1lWzldID09ICc4JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQorKwkJeworKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQkgICAgcmV0dXJuIFBSSWRMRUFTVDg7CisrCQkgIGlmIChuYW1lWzNdID09ICdpJykKKysJCSAgICByZXR1cm4gUFJJaUxFQVNUODsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorKwkJICAgIHJldHVybiBQUklvTEVBU1Q4OworKwkJICBpZiAobmFtZVszXSA9PSAndScpCisrCQkgICAgcmV0dXJuIFBSSXVMRUFTVDg7CisrCQkgIGlmIChuYW1lWzNdID09ICd4JykKKysJCSAgICByZXR1cm4gUFJJeExFQVNUODsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorKwkJICAgIHJldHVybiBQUklYTEVBU1Q4OworKwkJICBhYm9ydCAoKTsKKysJCX0KKysJICAgICAgaWYgKG5hbWVbOV0gPT0gJzEnICYmIG5hbWVbMTBdID09ICc2JyAmJiBuYW1lWzExXSA9PSAnXDAnKQorKwkJeworKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQkgICAgcmV0dXJuIFBSSWRMRUFTVDE2OworKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisrCQkgICAgcmV0dXJuIFBSSWlMRUFTVDE2OworKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisrCQkgICAgcmV0dXJuIFBSSW9MRUFTVDE2OworKwkJICBpZiAobmFtZVszXSA9PSAndScpCisrCQkgICAgcmV0dXJuIFBSSXVMRUFTVDE2OworKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisrCQkgICAgcmV0dXJuIFBSSXhMRUFTVDE2OworKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisrCQkgICAgcmV0dXJuIFBSSVhMRUFTVDE2OworKwkJICBhYm9ydCAoKTsKKysJCX0KKysJICAgICAgaWYgKG5hbWVbOV0gPT0gJzMnICYmIG5hbWVbMTBdID09ICcyJyAmJiBuYW1lWzExXSA9PSAnXDAnKQorKwkJeworKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQkgICAgcmV0dXJuIFBSSWRMRUFTVDMyOworKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisrCQkgICAgcmV0dXJuIFBSSWlMRUFTVDMyOworKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisrCQkgICAgcmV0dXJuIFBSSW9MRUFTVDMyOworKwkJICBpZiAobmFtZVszXSA9PSAndScpCisrCQkgICAgcmV0dXJuIFBSSXVMRUFTVDMyOworKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisrCQkgICAgcmV0dXJuIFBSSXhMRUFTVDMyOworKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisrCQkgICAgcmV0dXJuIFBSSVhMRUFTVDMyOworKwkJICBhYm9ydCAoKTsKKysJCX0KKysJICAgICAgaWYgKG5hbWVbOV0gPT0gJzYnICYmIG5hbWVbMTBdID09ICc0JyAmJiBuYW1lWzExXSA9PSAnXDAnKQorKwkJeworKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQkgICAgcmV0dXJuIFBSSWRMRUFTVDY0OworKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisrCQkgICAgcmV0dXJuIFBSSWlMRUFTVDY0OworKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisrCQkgICAgcmV0dXJuIFBSSW9MRUFTVDY0OworKwkJICBpZiAobmFtZVszXSA9PSAndScpCisrCQkgICAgcmV0dXJuIFBSSXVMRUFTVDY0OworKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisrCQkgICAgcmV0dXJuIFBSSXhMRUFTVDY0OworKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisrCQkgICAgcmV0dXJuIFBSSVhMRUFTVDY0OworKwkJICBhYm9ydCAoKTsKKysJCX0KKysJICAgIH0KKysJICBpZiAobmFtZVs0XSA9PSAnRicgJiYgbmFtZVs1XSA9PSAnQScgJiYgbmFtZVs2XSA9PSAnUycKKysJICAgICAgJiYgbmFtZVs3XSA9PSAnVCcpCisrCSAgICB7CisrCSAgICAgIGlmIChuYW1lWzhdID09ICc4JyAmJiBuYW1lWzldID09ICdcMCcpCisrCQl7CisrCQkgIGlmIChuYW1lWzNdID09ICdkJykKKysJCSAgICByZXR1cm4gUFJJZEZBU1Q4OworKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisrCQkgICAgcmV0dXJuIFBSSWlGQVNUODsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorKwkJICAgIHJldHVybiBQUklvRkFTVDg7CisrCQkgIGlmIChuYW1lWzNdID09ICd1JykKKysJCSAgICByZXR1cm4gUFJJdUZBU1Q4OworKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisrCQkgICAgcmV0dXJuIFBSSXhGQVNUODsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorKwkJICAgIHJldHVybiBQUklYRkFTVDg7CisrCQkgIGFib3J0ICgpOworKwkJfQorKwkgICAgICBpZiAobmFtZVs4XSA9PSAnMScgJiYgbmFtZVs5XSA9PSAnNicgJiYgbmFtZVsxMF0gPT0gJ1wwJykKKysJCXsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorKwkJICAgIHJldHVybiBQUklkRkFTVDE2OworKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisrCQkgICAgcmV0dXJuIFBSSWlGQVNUMTY7CisrCQkgIGlmIChuYW1lWzNdID09ICdvJykKKysJCSAgICByZXR1cm4gUFJJb0ZBU1QxNjsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorKwkJICAgIHJldHVybiBQUkl1RkFTVDE2OworKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisrCQkgICAgcmV0dXJuIFBSSXhGQVNUMTY7CisrCQkgIGlmIChuYW1lWzNdID09ICdYJykKKysJCSAgICByZXR1cm4gUFJJWEZBU1QxNjsKKysJCSAgYWJvcnQgKCk7CisrCQl9CisrCSAgICAgIGlmIChuYW1lWzhdID09ICczJyAmJiBuYW1lWzldID09ICcyJyAmJiBuYW1lWzEwXSA9PSAnXDAnKQorKwkJeworKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisrCQkgICAgcmV0dXJuIFBSSWRGQVNUMzI7CisrCQkgIGlmIChuYW1lWzNdID09ICdpJykKKysJCSAgICByZXR1cm4gUFJJaUZBU1QzMjsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorKwkJICAgIHJldHVybiBQUklvRkFTVDMyOworKwkJICBpZiAobmFtZVszXSA9PSAndScpCisrCQkgICAgcmV0dXJuIFBSSXVGQVNUMzI7CisrCQkgIGlmIChuYW1lWzNdID09ICd4JykKKysJCSAgICByZXR1cm4gUFJJeEZBU1QzMjsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorKwkJICAgIHJldHVybiBQUklYRkFTVDMyOworKwkJICBhYm9ydCAoKTsKKysJCX0KKysJICAgICAgaWYgKG5hbWVbOF0gPT0gJzYnICYmIG5hbWVbOV0gPT0gJzQnICYmIG5hbWVbMTBdID09ICdcMCcpCisrCQl7CisrCQkgIGlmIChuYW1lWzNdID09ICdkJykKKysJCSAgICByZXR1cm4gUFJJZEZBU1Q2NDsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorKwkJICAgIHJldHVybiBQUklpRkFTVDY0OworKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisrCQkgICAgcmV0dXJuIFBSSW9GQVNUNjQ7CisrCQkgIGlmIChuYW1lWzNdID09ICd1JykKKysJCSAgICByZXR1cm4gUFJJdUZBU1Q2NDsKKysJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorKwkJICAgIHJldHVybiBQUkl4RkFTVDY0OworKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisrCQkgICAgcmV0dXJuIFBSSVhGQVNUNjQ7CisrCQkgIGFib3J0ICgpOworKwkJfQorKwkgICAgfQorKwkgIGlmIChuYW1lWzRdID09ICdNJyAmJiBuYW1lWzVdID09ICdBJyAmJiBuYW1lWzZdID09ICdYJworKwkgICAgICAmJiBuYW1lWzddID09ICdcMCcpCisrCSAgICB7CisrCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKysJCXJldHVybiBQUklkTUFYOworKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisrCQlyZXR1cm4gUFJJaU1BWDsKKysJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorKwkJcmV0dXJuIFBSSW9NQVg7CisrCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKysJCXJldHVybiBQUkl1TUFYOworKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisrCQlyZXR1cm4gUFJJeE1BWDsKKysJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorKwkJcmV0dXJuIFBSSVhNQVg7CisrCSAgICAgIGFib3J0ICgpOworKwkgICAgfQorKwkgIGlmIChuYW1lWzRdID09ICdQJyAmJiBuYW1lWzVdID09ICdUJyAmJiBuYW1lWzZdID09ICdSJworKwkgICAgICAmJiBuYW1lWzddID09ICdcMCcpCisrCSAgICB7CisrCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKysJCXJldHVybiBQUklkUFRSOworKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisrCQlyZXR1cm4gUFJJaVBUUjsKKysJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorKwkJcmV0dXJuIFBSSW9QVFI7CisrCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKysJCXJldHVybiBQUkl1UFRSOworKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisrCQlyZXR1cm4gUFJJeFBUUjsKKysJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorKwkJcmV0dXJuIFBSSVhQVFI7CisrCSAgICAgIGFib3J0ICgpOworKwkgICAgfQorKwl9CisrICAgIH0KKysgIC8qIFRlc3QgZm9yIGEgZ2xpYmMgc3BlY2lmaWMgcHJpbnRmKCkgZm9ybWF0IGRpcmVjdGl2ZSBmbGFnLiAgKi8KKysgIGlmIChuYW1lWzBdID09ICdJJyAmJiBuYW1lWzFdID09ICdcMCcpCisrICAgIHsKKysjaWYgZGVmaW5lZCBfTElCQyB8fCBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMikKKysgICAgICAvKiBUaGUgJ0knIGZsYWcsIGluIG51bWVyaWMgZm9ybWF0IGRpcmVjdGl2ZXMsIHJlcGxhY2VzIEFTQ0lJIGRpZ2l0cworKwkgd2l0aCB0aGUgJ291dGRpZ2l0cycgZGVmaW5lZCBpbiB0aGUgTENfQ1RZUEUgbG9jYWxlIGZhY2V0LiAgVGhpcyBpcworKwkgdXNlZCBmb3IgRmFyc2kgKFBlcnNpYW4pIGFuZCBtYXliZSBBcmFiaWMuICAqLworKyAgICAgIHJldHVybiAiSSI7CisrI2Vsc2UKKysgICAgICByZXR1cm4gIiI7CisrI2VuZGlmCisrICAgIH0KKysgIC8qIE90aGVyIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBhcmUgbm90IHZhbGlkLiAgKi8KKysgIHJldHVybiBOVUxMOworK30KKysKKysvKiBJbml0aWFsaXplIHRoZSBjb2Rlc2V0IGRlcGVuZGVudCBwYXJ0cyBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLgorKyAgIFJldHVybiB0aGUgaGVhZGVyIGVudHJ5LiAgKi8KKytjb25zdCBjaGFyICoKKytpbnRlcm5hbF9mdW5jdGlvbgorK19ubF9pbml0X2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKysJCSAgICAgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW4sCisrCQkgICAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZykKKyt7CisrICAvKiBGaW5kIG91dCBhYm91dCB0aGUgY2hhcmFjdGVyIHNldCB0aGUgZmlsZSBpcyBlbmNvZGVkIHdpdGguCisrICAgICBUaGlzIGNhbiBiZSBmb3VuZCAoaW4gdGV4dHVhbCBmb3JtKSBpbiB0aGUgZW50cnkgIiIuICBJZiB0aGlzCisrICAgICBlbnRyeSBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGBjaGFyc2V0PScKKysgICAgIGluZm9ybWF0aW9uLCB3ZSB3aWxsIGFzc3VtZSB0aGUgY2hhcnNldCBtYXRjaGVzIHRoZSBvbmUgdGhlCisrICAgICBjdXJyZW50IGxvY2FsZSBhbmQgd2UgZG9uJ3QgaGF2ZSB0byBwZXJmb3JtIGFueSBjb252ZXJzaW9uLiAgKi8KKysgIGNoYXIgKm51bGxlbnRyeTsKKysgIHNpemVfdCBudWxsZW50cnlsZW47CisrCisrICAvKiBQcmVpbml0aWFsaXplIGZpZWxkcywgdG8gYXZvaWQgcmVjdXJzaW9uIGR1cmluZyBfbmxfZmluZF9tc2cuICAqLworKyAgZG9tYWluLT5jb2Rlc2V0X2NudHIgPQorKyAgICAoZG9tYWluYmluZGluZyAhPSBOVUxMID8gZG9tYWluYmluZGluZy0+Y29kZXNldF9jbnRyIDogMCk7CisrI2lmZGVmIF9MSUJDCisrICBkb21haW4tPmNvbnYgPSAoX19nY29udl90KSAtMTsKKysjZWxzZQorKyMgaWYgSEFWRV9JQ09OVgorKyAgZG9tYWluLT5jb252ID0gKGljb252X3QpIC0xOworKyMgZW5kaWYKKysjZW5kaWYKKysgIGRvbWFpbi0+Y29udl90YWIgPSBOVUxMOworKworKyAgLyogR2V0IHRoZSBoZWFkZXIgZW50cnkuICAqLworKyAgbnVsbGVudHJ5ID0gX25sX2ZpbmRfbXNnIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZywgIiIsICZudWxsZW50cnlsZW4pOworKworKyAgaWYgKG51bGxlbnRyeSAhPSBOVUxMKQorKyAgICB7CisrI2lmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVgorKyAgICAgIGNvbnN0IGNoYXIgKmNoYXJzZXRzdHI7CisrCisrICAgICAgY2hhcnNldHN0ciA9IHN0cnN0ciAobnVsbGVudHJ5LCAiY2hhcnNldD0iKTsKKysgICAgICBpZiAoY2hhcnNldHN0ciAhPSBOVUxMKQorKwl7CisrCSAgc2l6ZV90IGxlbjsKKysJICBjaGFyICpjaGFyc2V0OworKwkgIGNvbnN0IGNoYXIgKm91dGNoYXJzZXQ7CisrCisrCSAgY2hhcnNldHN0ciArPSBzdHJsZW4gKCJjaGFyc2V0PSIpOworKwkgIGxlbiA9IHN0cmNzcG4gKGNoYXJzZXRzdHIsICIgXHRcbiIpOworKworKwkgIGNoYXJzZXQgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDEpOworKyMgaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX01FTVBDUFkKKysJICAqKChjaGFyICopIG1lbXBjcHkgKGNoYXJzZXQsIGNoYXJzZXRzdHIsIGxlbikpID0gJ1wwJzsKKysjIGVsc2UKKysJICBtZW1jcHkgKGNoYXJzZXQsIGNoYXJzZXRzdHIsIGxlbik7CisrCSAgY2hhcnNldFtsZW5dID0gJ1wwJzsKKysjIGVuZGlmCisrCisrCSAgLyogVGhlIG91dHB1dCBjaGFyc2V0IHNob3VsZCBub3JtYWxseSBiZSBkZXRlcm1pbmVkIGJ5IHRoZQorKwkgICAgIGxvY2FsZS4gIEJ1dCBzb21ldGltZXMgdGhlIGxvY2FsZSBpcyBub3QgdXNlZCBvciBub3QgY29ycmVjdGx5CisrCSAgICAgc2V0IHVwLCBzbyB3ZSBwcm92aWRlIGEgcG9zc2liaWxpdHkgZm9yIHRoZSB1c2VyIHRvIG92ZXJyaWRlCisrCSAgICAgdGhpcy4gIE1vcmVvdmVyLCB0aGUgdmFsdWUgc3BlY2lmaWVkIHRocm91Z2gKKysJICAgICBiaW5kX3RleHRkb21haW5fY29kZXNldCBvdmVycmlkZXMgYm90aC4gICovCisrCSAgaWYgKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCAmJiBkb21haW5iaW5kaW5nLT5jb2Rlc2V0ICE9IE5VTEwpCisrCSAgICBvdXRjaGFyc2V0ID0gZG9tYWluYmluZGluZy0+Y29kZXNldDsKKysJICBlbHNlCisrCSAgICB7CisrCSAgICAgIG91dGNoYXJzZXQgPSBnZXRlbnYgKCJPVVRQVVRfQ0hBUlNFVCIpOworKwkgICAgICBpZiAob3V0Y2hhcnNldCA9PSBOVUxMIHx8IG91dGNoYXJzZXRbMF0gPT0gJ1wwJykKKysJCXsKKysjIGlmZGVmIF9MSUJDCisrCQkgIG91dGNoYXJzZXQgPSBfTkxfQ1VSUkVOVCAoTENfQ1RZUEUsIENPREVTRVQpOworKyMgZWxzZQorKyMgIGlmIEhBVkVfSUNPTlYKKysJCSAgZXh0ZXJuIGNvbnN0IGNoYXIgKmxvY2FsZV9jaGFyc2V0ICh2b2lkKTsKKysJCSAgb3V0Y2hhcnNldCA9IGxvY2FsZV9jaGFyc2V0ICgpOworKyMgIGVuZGlmCisrIyBlbmRpZgorKwkJfQorKwkgICAgfQorKworKyMgaWZkZWYgX0xJQkMKKysJICAvKiBXZSBhbHdheXMgd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0aW9uLiAgKi8KKysJICBvdXRjaGFyc2V0ID0gbm9ybV9hZGRfc2xhc2hlcyAob3V0Y2hhcnNldCwgIlRSQU5TTElUIik7CisrCSAgY2hhcnNldCA9IG5vcm1fYWRkX3NsYXNoZXMgKGNoYXJzZXQsIE5VTEwpOworKwkgIGlmIChfX2djb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQsICZkb21haW4tPmNvbnYsCisrCQkJICAgIEdDT05WX0FWT0lEX05PQ09OVikKKysJICAgICAgIT0gX19HQ09OVl9PSykKKysJICAgIGRvbWFpbi0+Y29udiA9IChfX2djb252X3QpIC0xOworKyMgZWxzZQorKyMgIGlmIEhBVkVfSUNPTlYKKysJICAvKiBXaGVuIHVzaW5nIEdOVSBsaWJjID49IDIuMiBvciBHTlUgbGliaWNvbnYgPj0gMS41LAorKwkgICAgIHdlIHdhbnQgdG8gdXNlIHRyYW5zbGl0ZXJhdGlvbi4gICovCisrIyAgIGlmIChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMikgfHwgX19HTElCQ19fID4gMiBcCisrICAgICAgIHx8IF9MSUJJQ09OVl9WRVJTSU9OID49IDB4MDEwNQorKwkgIGlmIChzdHJjaHIgKG91dGNoYXJzZXQsICcvJykgPT0gTlVMTCkKKysJICAgIHsKKysJICAgICAgY2hhciAqdG1wOworKworKwkgICAgICBsZW4gPSBzdHJsZW4gKG91dGNoYXJzZXQpOworKwkgICAgICB0bXAgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDEwICsgMSk7CisrCSAgICAgIG1lbWNweSAodG1wLCBvdXRjaGFyc2V0LCBsZW4pOworKwkgICAgICBtZW1jcHkgKHRtcCArIGxlbiwgIi8vVFJBTlNMSVQiLCAxMCArIDEpOworKwkgICAgICBvdXRjaGFyc2V0ID0gdG1wOworKworKwkgICAgICBkb21haW4tPmNvbnYgPSBpY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0KTsKKysKKysJICAgICAgZnJlZWEgKG91dGNoYXJzZXQpOworKwkgICAgfQorKwkgIGVsc2UKKysjICAgZW5kaWYKKysJICAgIGRvbWFpbi0+Y29udiA9IGljb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQpOworKyMgIGVuZGlmCisrIyBlbmRpZgorKworKwkgIGZyZWVhIChjaGFyc2V0KTsKKysJfQorKyNlbmRpZiAvKiBfTElCQyB8fCBIQVZFX0lDT05WICovCisrICAgIH0KKysKKysgIHJldHVybiBudWxsZW50cnk7CisrfQorKworKy8qIEZyZWVzIHRoZSBjb2Rlc2V0IGRlcGVuZGVudCBwYXJ0cyBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLiAgKi8KKyt2b2lkCisraW50ZXJuYWxfZnVuY3Rpb24KKytfbmxfZnJlZV9kb21haW5fY29udiAoc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbikKKyt7CisrICBpZiAoZG9tYWluLT5jb252X3RhYiAhPSBOVUxMICYmIGRvbWFpbi0+Y29udl90YWIgIT0gKGNoYXIgKiopIC0xKQorKyAgICBmcmVlIChkb21haW4tPmNvbnZfdGFiKTsKKysKKysjaWZkZWYgX0xJQkMKKysgIGlmIChkb21haW4tPmNvbnYgIT0gKF9fZ2NvbnZfdCkgLTEpCisrICAgIF9fZ2NvbnZfY2xvc2UgKGRvbWFpbi0+Y29udik7CisrI2Vsc2UKKysjIGlmIEhBVkVfSUNPTlYKKysgIGlmIChkb21haW4tPmNvbnYgIT0gKGljb252X3QpIC0xKQorKyAgICBpY29udl9jbG9zZSAoZG9tYWluLT5jb252KTsKKysjIGVuZGlmCisrI2VuZGlmCisrfQorKworIC8qIExvYWQgdGhlIG1lc3NhZ2UgY2F0YWxvZ3Mgc3BlY2lmaWVkIGJ5IEZJTEVOQU1FLiAgSWYgaXQgaXMgbm8gdmFsaWQKKyAgICBtZXNzYWdlIGNhdGFsb2cgZG8gbm90aGluZy4gICovCisgdm9pZAorLV9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUpCistICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZTsKKytpbnRlcm5hbF9mdW5jdGlvbgorK19ubF9sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCisrCQkgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCisgeworICAgaW50IGZkOworKyAgc2l6ZV90IHNpemU7CisrI2lmZGVmIF9MSUJDCisrICBzdHJ1Y3Qgc3RhdDY0IHN0OworKyNlbHNlCisgICBzdHJ1Y3Qgc3RhdCBzdDsKKysjZW5kaWYKKyAgIHN0cnVjdCBtb19maWxlX2hlYWRlciAqZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTE7CistI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKKy0gICAgfHwgZGVmaW5lZCBfTElCQworICAgaW50IHVzZV9tbWFwID0gMDsKKy0jZW5kaWYKKyAgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47CisrICBpbnQgcmV2aXNpb247CisrICBjb25zdCBjaGFyICpudWxsZW50cnk7CisgCisgICBkb21haW5fZmlsZS0+ZGVjaWRlZCA9IDE7CisgICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7CisgCisrICAvKiBOb3RlIHRoYXQgaXQgd291bGQgYmUgdXNlbGVzcyB0byBzdG9yZSBkb21haW5iaW5kaW5nIGluIGRvbWFpbl9maWxlCisrICAgICBiZWNhdXNlIGRvbWFpbmJpbmRpbmcgbWlnaHQgYmUgPT0gTlVMTCBub3cgYnV0ICE9IE5VTEwgbGF0ZXIgKGFmdGVyCisrICAgICBhIGNhbGwgdG8gYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpLiAgKi8KKysKKyAgIC8qIElmIHRoZSByZWNvcmQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgbG9jYWxlIHRoZSBGSUxFTkFNRQorICAgICAgbWlnaHQgYmUgTlVMTC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KKyAgICAgIHNwZWNpZmljYXRpb24gdGhlIGxvY2FsZSBmaWxlIG5hbWUgaXMgZGlmZmVyZW50IGZvciBYUEcgYW5kIENFTgorQEAgLTg0LDI3ICs5MzcsMzIgQEAKKyAgICAgcmV0dXJuOworIAorICAgLyogVHJ5IHRvIG9wZW4gdGhlIGFkZHJlc3NlZCBmaWxlLiAgKi8KKy0gIGZkID0gb3BlbiAoZG9tYWluX2ZpbGUtPmZpbGVuYW1lLCBPX1JET05MWSk7CisrICBmZCA9IG9wZW4gKGRvbWFpbl9maWxlLT5maWxlbmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisgICBpZiAoZmQgPT0gLTEpCisgICAgIHJldHVybjsKKyAKKyAgIC8qIFdlIG11c3Qga25vdyBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gICovCistICBpZiAoZnN0YXQgKGZkLCAmc3QpICE9IDAKKy0gICAgICAmJiBzdC5zdF9zaXplIDwgKG9mZl90KSBzaXplb2YgKHN0cnVjdCBtb19maWxlX2hlYWRlcikpCisrICBpZiAoCisrI2lmZGVmIF9MSUJDCisrICAgICAgX19idWlsdGluX2V4cGVjdCAoZnN0YXQ2NCAoZmQsICZzdCkgIT0gMCwgMCkKKysjZWxzZQorKyAgICAgIF9fYnVpbHRpbl9leHBlY3QgKGZzdGF0IChmZCwgJnN0KSAhPSAwLCAwKQorKyNlbmRpZgorKyAgICAgIHx8IF9fYnVpbHRpbl9leHBlY3QgKChzaXplID0gKHNpemVfdCkgc3Quc3Rfc2l6ZSkgIT0gc3Quc3Rfc2l6ZSwgMCkKKysgICAgICB8fCBfX2J1aWx0aW5fZXhwZWN0IChzaXplIDwgc2l6ZW9mIChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIpLCAwKSkKKyAgICAgeworICAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgKi8KKyAgICAgICBjbG9zZSAoZmQpOworICAgICAgIHJldHVybjsKKyAgICAgfQorIAorLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCistICAgIHx8IGRlZmluZWQgX0xJQkMKKysjaWZkZWYgSEFWRV9NTUFQCisgICAvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIGxvYWQgdGhlIGZpbGUuICBJZiBtbWFwKCkgaXMgYXZhaWxhYmxlIHdlIHRyeQorICAgICAgdGhpcyBmaXJzdC4gIElmIG5vdCBhdmFpbGFibGUgb3IgaXQgZmFpbGVkIHdlIHRyeSB0byBsb2FkIGl0LiAgKi8KKy0gIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwKKysgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCwKKyAJCQkJCSBNQVBfUFJJVkFURSwgZmQsIDApOworIAorLSAgaWYgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKKysgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChkYXRhICE9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEsIDEpKQorICAgICB7CisgICAgICAgLyogbW1hcCgpIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuICAqLworICAgICAgIGNsb3NlIChmZCk7CitAQCAtMTE2LDI0ICs5NzQsMjcgQEAKKyAgICAgIGl0IG1hbnVhbGx5LiAgKi8KKyAgIGlmIChkYXRhID09IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEpCisgICAgIHsKKy0gICAgICBvZmZfdCB0b19yZWFkOworKyAgICAgIHNpemVfdCB0b19yZWFkOworICAgICAgIGNoYXIgKnJlYWRfcHRyOworIAorLSAgICAgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1hbGxvYyAoc3Quc3Rfc2l6ZSk7CisrICAgICAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbWFsbG9jIChzaXplKTsKKyAgICAgICBpZiAoZGF0YSA9PSBOVUxMKQorIAlyZXR1cm47CisgCistICAgICAgdG9fcmVhZCA9IHN0LnN0X3NpemU7CisrICAgICAgdG9fcmVhZCA9IHNpemU7CisgICAgICAgcmVhZF9wdHIgPSAoY2hhciAqKSBkYXRhOworICAgICAgIGRvCisgCXsKKyAJICBsb25nIGludCBuYiA9IChsb25nIGludCkgcmVhZCAoZmQsIHJlYWRfcHRyLCB0b19yZWFkKTsKKy0JICBpZiAobmIgPT0gLTEpCisrCSAgaWYgKG5iIDw9IDApCisgCSAgICB7CisrI2lmZGVmIEVJTlRSCisrCSAgICAgIGlmIChuYiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKKysJCWNvbnRpbnVlOworKyNlbmRpZgorIAkgICAgICBjbG9zZSAoZmQpOworIAkgICAgICByZXR1cm47CisgCSAgICB9CistCisgCSAgcmVhZF9wdHIgKz0gbmI7CisgCSAgdG9fcmVhZCAtPSBuYjsKKyAJfQorQEAgLTE0NCw0NyArMTAwNSwzNzggQEAKKyAKKyAgIC8qIFVzaW5nIHRoZSBtYWdpYyBudW1iZXIgd2UgY2FuIHRlc3Qgd2hldGhlciBpdCByZWFsbHkgaXMgYSBtZXNzYWdlCisgICAgICBjYXRhbG9nIGZpbGUuICAqLworLSAgaWYgKGRhdGEtPm1hZ2ljICE9IF9NQUdJQyAmJiBkYXRhLT5tYWdpYyAhPSBfTUFHSUNfU1dBUFBFRCkKKysgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChkYXRhLT5tYWdpYyAhPSBfTUFHSUMgJiYgZGF0YS0+bWFnaWMgIT0gX01BR0lDX1NXQVBQRUQsCisrCQkJMCkpCisgICAgIHsKKyAgICAgICAvKiBUaGUgbWFnaWMgbnVtYmVyIGlzIHdyb25nOiBub3QgYSBtZXNzYWdlIGNhdGFsb2cgZmlsZS4gICovCistI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKKy0gICAgfHwgZGVmaW5lZCBfTElCQworKyNpZmRlZiBIQVZFX01NQVAKKyAgICAgICBpZiAodXNlX21tYXApCistCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOworKwltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzaXplKTsKKyAgICAgICBlbHNlCisgI2VuZGlmCisgCWZyZWUgKGRhdGEpOworICAgICAgIHJldHVybjsKKyAgICAgfQorIAorLSAgZG9tYWluX2ZpbGUtPmRhdGEKKy0gICAgPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2FkZWRfZG9tYWluKSk7CistICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKKysgIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKKysgIGlmIChkb21haW4gPT0gTlVMTCkKKyAgICAgcmV0dXJuOworKyAgZG9tYWluX2ZpbGUtPmRhdGEgPSBkb21haW47CisgCistICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7CisgICBkb21haW4tPmRhdGEgPSAoY2hhciAqKSBkYXRhOworKyAgZG9tYWluLT51c2VfbW1hcCA9IHVzZV9tbWFwOworKyAgZG9tYWluLT5tbWFwX3NpemUgPSBzaXplOworICAgZG9tYWluLT5tdXN0X3N3YXAgPSBkYXRhLT5tYWdpYyAhPSBfTUFHSUM7CisrICBkb21haW4tPm1hbGxvY2VkID0gTlVMTDsKKyAKKyAgIC8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdmFpbGFibGUgdGFibGVzLiAgKi8KKy0gIHN3aXRjaCAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKSkKKysgIHJldmlzaW9uID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKTsKKysgIC8qIFdlIHN1cHBvcnQgb25seSB0aGUgbWFqb3IgcmV2aXNpb25zIDAgYW5kIDEuICAqLworKyAgc3dpdGNoIChyZXZpc2lvbiA+PiAxNikKKyAgICAgeworICAgICBjYXNlIDA6CisrICAgIGNhc2UgMToKKyAgICAgICBkb21haW4tPm5zdHJpbmdzID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5zdHJpbmdzKTsKKy0gICAgICBkb21haW4tPm9yaWdfdGFiID0gKHN0cnVjdCBzdHJpbmdfZGVzYyAqKQorKyAgICAgIGRvbWFpbi0+b3JpZ190YWIgPSAoY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICopCisgCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm9yaWdfdGFiX29mZnNldCkpOworLSAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKHN0cnVjdCBzdHJpbmdfZGVzYyAqKQorKyAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqKQorIAkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc190YWJfb2Zmc2V0KSk7CisgICAgICAgZG9tYWluLT5oYXNoX3NpemUgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfc2l6ZSk7CistICAgICAgZG9tYWluLT5oYXNoX3RhYiA9IChubHNfdWludDMyICopCistCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX29mZnNldCkpOworKyAgICAgIGRvbWFpbi0+aGFzaF90YWIgPQorKwkoZG9tYWluLT5oYXNoX3NpemUgPiAyCisrCSA/IChjb25zdCBubHNfdWludDMyICopCisrCSAgICgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX29mZnNldCkpCisrCSA6IE5VTEwpOworKyAgICAgIGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiID0gZG9tYWluLT5tdXN0X3N3YXA7CisrCisrICAgICAgLyogTm93IGRpc3BhdGNoIG9uIHRoZSBtaW5vciByZXZpc2lvbi4gICovCisrICAgICAgc3dpdGNoIChyZXZpc2lvbiAmIDB4ZmZmZikKKysJeworKwljYXNlIDA6CisrCSAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKKysJICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7CisrCSAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKKysJICBicmVhazsKKysJY2FzZSAxOgorKwlkZWZhdWx0OgorKwkgIHsKKysJICAgIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKKysKKysJICAgIGlmIChkb21haW4tPmhhc2hfdGFiID09IE5VTEwpCisrCSAgICAgIC8qIFRoaXMgaXMgaW52YWxpZC4gIFRoZXNlIG1pbm9yIHJldmlzaW9ucyBuZWVkIGEgaGFzaCB0YWJsZS4gICovCisrCSAgICAgIGdvdG8gaW52YWxpZDsKKysKKysJICAgIG5fc3lzZGVwX3N0cmluZ3MgPQorKwkgICAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bl9zeXNkZXBfc3RyaW5ncyk7CisrCSAgICBpZiAobl9zeXNkZXBfc3RyaW5ncyA+IDApCisrCSAgICAgIHsKKysJCW5sc191aW50MzIgbl9zeXNkZXBfc2VnbWVudHM7CisrCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQgKnN5c2RlcF9zZWdtZW50czsKKysJCWNvbnN0IGNoYXIgKipzeXNkZXBfc2VnbWVudF92YWx1ZXM7CisrCQljb25zdCBubHNfdWludDMyICpvcmlnX3N5c2RlcF90YWI7CisrCQljb25zdCBubHNfdWludDMyICp0cmFuc19zeXNkZXBfdGFiOworKwkJbmxzX3VpbnQzMiBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOworKwkJc2l6ZV90IG1lbW5lZWQ7CisrCQljaGFyICptZW07CisrCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV9vcmlnX3N5c2RlcF90YWI7CisrCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV90cmFuc19zeXNkZXBfdGFiOworKwkJbmxzX3VpbnQzMiAqaW5tZW1faGFzaF90YWI7CisrCQl1bnNpZ25lZCBpbnQgaSwgajsKKysKKysJCS8qIEdldCB0aGUgdmFsdWVzIG9mIHRoZSBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KKysJCW5fc3lzZGVwX3NlZ21lbnRzID0KKysJCSAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5fc3lzZGVwX3NlZ21lbnRzKTsKKysJCXN5c2RlcF9zZWdtZW50cyA9IChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQgKikKKysJCSAgKChjaGFyICopIGRhdGEKKysJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnN5c2RlcF9zZWdtZW50c19vZmZzZXQpKTsKKysJCXN5c2RlcF9zZWdtZW50X3ZhbHVlcyA9CisrCQkgIGFsbG9jYSAobl9zeXNkZXBfc2VnbWVudHMgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOworKwkJZm9yIChpID0gMDsgaSA8IG5fc3lzZGVwX3NlZ21lbnRzOyBpKyspCisrCQkgIHsKKysJCSAgICBjb25zdCBjaGFyICpuYW1lID0KKysJCSAgICAgIChjaGFyICopIGRhdGEKKysJCSAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHN5c2RlcF9zZWdtZW50c1tpXS5vZmZzZXQpOworKwkJICAgIG5sc191aW50MzIgbmFtZWxlbiA9CisrCQkgICAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgc3lzZGVwX3NlZ21lbnRzW2ldLmxlbmd0aCk7CisrCisrCQkgICAgaWYgKCEobmFtZWxlbiA+IDAgJiYgbmFtZVtuYW1lbGVuIC0gMV0gPT0gJ1wwJykpCisrCQkgICAgICB7CisrCQkJZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7CisrCQkJZ290byBpbnZhbGlkOworKwkJICAgICAgfQorKworKwkJICAgIHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tpXSA9IGdldF9zeXNkZXBfc2VnbWVudF92YWx1ZSAobmFtZSk7CisrCQkgIH0KKysKKysJCW9yaWdfc3lzZGVwX3RhYiA9IChjb25zdCBubHNfdWludDMyICopCisrCQkgICgoY2hhciAqKSBkYXRhCisrCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3N5c2RlcF90YWJfb2Zmc2V0KSk7CisrCQl0cmFuc19zeXNkZXBfdGFiID0gKGNvbnN0IG5sc191aW50MzIgKikKKysJCSAgKChjaGFyICopIGRhdGEKKysJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3N5c2RlcF90YWJfb2Zmc2V0KSk7CisrCisrCQkvKiBDb21wdXRlIHRoZSBhbW91bnQgb2YgYWRkaXRpb25hbCBtZW1vcnkgbmVlZGVkIGZvciB0aGUKKysJCSAgIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBhbmQgdGhlIGF1Z21lbnRlZCBoYXNoIHRhYmxlLgorKwkJICAgQXQgdGhlIHNhbWUgdGltZSwgYWxzbyBkcm9wIHN0cmluZyBwYWlycyB3aGljaCByZWZlciB0bworKwkJICAgYW4gdW5kZWZpbmVkIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudC4gICovCisrCQluX2lubWVtX3N5c2RlcF9zdHJpbmdzID0gMDsKKysJCW1lbW5lZWQgPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7CisrCQlmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc3RyaW5nczsgaSsrKQorKwkJICB7CisrCQkgICAgaW50IHZhbGlkID0gMTsKKysJCSAgICBzaXplX3QgbmVlZHNbMl07CisrCisrCQkgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKysJCSAgICAgIHsKKysJCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9CisrCQkJICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKKysJCQkgICgoY2hhciAqKSBkYXRhCisrCQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKysJCQkJaiA9PSAwCisrCQkJCT8gb3JpZ19zeXNkZXBfdGFiW2ldCisrCQkJCTogdHJhbnNfc3lzZGVwX3RhYltpXSkpOworKwkJCXNpemVfdCBuZWVkID0gMDsKKysJCQljb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7CisrCisrCQkJaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpICE9IFNFR01FTlRTX0VORCkKKysJCQkgIGZvciAocCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOzsgcCsrKQorKwkJCSAgICB7CisrCQkJICAgICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7CisrCisrCQkJICAgICAgbmVlZCArPSBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7CisrCisrCQkJICAgICAgc3lzZGVwcmVmID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7CisrCQkJICAgICAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCisrCQkJCWJyZWFrOworKworKwkJCSAgICAgIGlmIChzeXNkZXByZWYgPj0gbl9zeXNkZXBfc2VnbWVudHMpCisrCQkJCXsKKysJCQkJICAvKiBJbnZhbGlkLiAgKi8KKysJCQkJICBmcmVlYSAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzKTsKKysJCQkJICBnb3RvIGludmFsaWQ7CisrCQkJCX0KKysKKysJCQkgICAgICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKKysJCQkJeworKwkJCQkgIC8qIFRoaXMgcGFydGljdWxhciBzdHJpbmcgcGFpciBpcyBpbnZhbGlkLiAgKi8KKysJCQkJICB2YWxpZCA9IDA7CisrCQkJCSAgYnJlYWs7CisrCQkJCX0KKysKKysJCQkgICAgICBuZWVkICs9IHN0cmxlbiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0pOworKwkJCSAgICB9CisrCisrCQkJbmVlZHNbal0gPSBuZWVkOworKwkJCWlmICghdmFsaWQpCisrCQkJICBicmVhazsKKysJCSAgICAgIH0KKysKKysJCSAgICBpZiAodmFsaWQpCisrCQkgICAgICB7CisrCQkJbl9pbm1lbV9zeXNkZXBfc3RyaW5ncysrOworKwkJCW1lbW5lZWQgKz0gbmVlZHNbMF0gKyBuZWVkc1sxXTsKKysJCSAgICAgIH0KKysJCSAgfQorKwkJbWVtbmVlZCArPSAyICogbl9pbm1lbV9zeXNkZXBfc3RyaW5ncworKwkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKKysKKysJCWlmIChuX2lubWVtX3N5c2RlcF9zdHJpbmdzID4gMCkKKysJCSAgeworKwkJICAgIHVuc2lnbmVkIGludCBrOworKworKwkJICAgIC8qIEFsbG9jYXRlIGFkZGl0aW9uYWwgbWVtb3J5LiAgKi8KKysJCSAgICBtZW0gPSAoY2hhciAqKSBtYWxsb2MgKG1lbW5lZWQpOworKwkJICAgIGlmIChtZW0gPT0gTlVMTCkKKysJCSAgICAgIGdvdG8gaW52YWxpZDsKKysKKysJCSAgICBkb21haW4tPm1hbGxvY2VkID0gbWVtOworKwkJICAgIGlubWVtX29yaWdfc3lzZGVwX3RhYiA9IChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICopIG1lbTsKKysJCSAgICBtZW0gKz0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncworKwkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKKysJCSAgICBpbm1lbV90cmFuc19zeXNkZXBfdGFiID0gKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKikgbWVtOworKwkJICAgIG1lbSArPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzCisrCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOworKwkJICAgIGlubWVtX2hhc2hfdGFiID0gKG5sc191aW50MzIgKikgbWVtOworKwkJICAgIG1lbSArPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7CisrCisrCQkgICAgLyogQ29tcHV0ZSB0aGUgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzLiAgKi8KKysJCSAgICBrID0gMDsKKysJCSAgICBmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc3RyaW5nczsgaSsrKQorKwkJICAgICAgeworKwkJCWludCB2YWxpZCA9IDE7CisrCisrCQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykKKysJCQkgIHsKKysJCQkgICAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQorKwkJCSAgICAgIChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqKQorKwkJCSAgICAgICgoY2hhciAqKSBkYXRhCisrCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisrCQkJCSAgICBqID09IDAKKysJCQkJICAgID8gb3JpZ19zeXNkZXBfdGFiW2ldCisrCQkJCSAgICA6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKKysJCQkgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfcGFpciAqcCA9CisrCQkJICAgICAgc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7CisrCisrCQkJICAgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKQorKwkJCQkhPSBTRUdNRU5UU19FTkQpCisrCQkJICAgICAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCisrCQkJCXsKKysJCQkJICBubHNfdWludDMyIHN5c2RlcHJlZjsKKysKKysJCQkJICBzeXNkZXByZWYgPQorKwkJCQkgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7CisrCQkJCSAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCisrCQkJCSAgICBicmVhazsKKysKKysJCQkJICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKKysJCQkJICAgIHsKKysJCQkJICAgICAgLyogVGhpcyBwYXJ0aWN1bGFyIHN0cmluZyBwYWlyIGlzCisrCQkJCQkgaW52YWxpZC4gICovCisrCQkJCSAgICAgIHZhbGlkID0gMDsKKysJCQkJICAgICAgYnJlYWs7CisrCQkJCSAgICB9CisrCQkJCX0KKysKKysJCQkgICAgaWYgKCF2YWxpZCkKKysJCQkgICAgICBicmVhazsKKysJCQkgIH0KKysKKysJCQlpZiAodmFsaWQpCisrCQkJICB7CisrCQkJICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisrCQkJICAgICAgeworKwkJCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9CisrCQkJCSAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCisrCQkJCSAgKChjaGFyICopIGRhdGEKKysJCQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKysJCQkJCWogPT0gMAorKwkJCQkJPyBvcmlnX3N5c2RlcF90YWJbaV0KKysJCQkJCTogdHJhbnNfc3lzZGVwX3RhYltpXSkpOworKwkJCQljb25zdCBjaGFyICpzdGF0aWNfc2VnbWVudHMgPQorKwkJCQkgIChjaGFyICopIGRhdGEKKysJCQkJICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc3RyaW5nLT5vZmZzZXQpOworKwkJCQljb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0KKysJCQkJICBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czsKKysKKysJCQkJLyogQ29uY2F0ZW5hdGUgdGhlIHNlZ21lbnRzLCBhbmQgZmlsbAorKwkJCQkgICBpbm1lbV9vcmlnX3N5c2RlcF90YWJba10gKGZvciBqID09IDApIGFuZAorKwkJCQkgICBpbm1lbV90cmFuc19zeXNkZXBfdGFiW2tdIChmb3IgaiA9PSAxKS4gICovCisrCisrCQkJCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX3RhYl9lbnRyeSA9CisrCQkJCSAgKGogPT0gMAorKwkJCQkgICA/IGlubWVtX29yaWdfc3lzZGVwX3RhYgorKwkJCQkgICA6IGlubWVtX3RyYW5zX3N5c2RlcF90YWIpCisrCQkJCSAgKyBrOworKworKwkJCQlpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZikKKysJCQkJICAgID09IFNFR01FTlRTX0VORCkKKysJCQkJICB7CisrCQkJCSAgICAvKiBPbmx5IG9uZSBzdGF0aWMgc2VnbWVudC4gICovCisrCQkJCSAgICBpbm1lbV90YWJfZW50cnktPmxlbmd0aCA9CisrCQkJCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKKysJCQkJICAgIGlubWVtX3RhYl9lbnRyeS0+cG9pbnRlciA9IHN0YXRpY19zZWdtZW50czsKKysJCQkJICB9CisrCQkJCWVsc2UKKysJCQkJICB7CisrCQkJCSAgICBpbm1lbV90YWJfZW50cnktPnBvaW50ZXIgPSBtZW07CisrCisrCQkJCSAgICBmb3IgKHAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czs7IHArKykKKysJCQkJICAgICAgeworKwkJCQkJbmxzX3VpbnQzMiBzZWdzaXplID0KKysJCQkJCSAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOworKwkJCQkJbmxzX3VpbnQzMiBzeXNkZXByZWYgPQorKwkJCQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKKysJCQkJCXNpemVfdCBuOworKworKwkJCQkJaWYgKHNlZ3NpemUgPiAwKQorKwkJCQkJICB7CisrCQkJCQkgICAgbWVtY3B5IChtZW0sIHN0YXRpY19zZWdtZW50cywgc2Vnc2l6ZSk7CisrCQkJCQkgICAgbWVtICs9IHNlZ3NpemU7CisrCQkJCQkgICAgc3RhdGljX3NlZ21lbnRzICs9IHNlZ3NpemU7CisrCQkJCQkgIH0KKysKKysJCQkJCWlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQorKwkJCQkJICBicmVhazsKKysKKysJCQkJCW4gPSBzdHJsZW4gKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdKTsKKysJCQkJCW1lbWNweSAobWVtLCBzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSwgbik7CisrCQkJCQltZW0gKz0gbjsKKysJCQkJICAgICAgfQorKworKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQorKwkJCQkgICAgICBtZW0gLSBpbm1lbV90YWJfZW50cnktPnBvaW50ZXI7CisrCQkJCSAgfQorKwkJCSAgICAgIH0KKysKKysJCQkgICAgaysrOworKwkJCSAgfQorKwkJICAgICAgfQorKwkJICAgIGlmIChrICE9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MpCisrCQkgICAgICBhYm9ydCAoKTsKKysKKysJCSAgICAvKiBDb21wdXRlIHRoZSBhdWdtZW50ZWQgaGFzaCB0YWJsZS4gICovCisrCQkgICAgZm9yIChpID0gMDsgaSA8IGRvbWFpbi0+aGFzaF9zaXplOyBpKyspCisrCQkgICAgICBpbm1lbV9oYXNoX3RhYltpXSA9CisrCQkJVyAoZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIsIGRvbWFpbi0+aGFzaF90YWJbaV0pOworKwkJICAgIGZvciAoaSA9IDA7IGkgPCBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOyBpKyspCisrCQkgICAgICB7CisrCQkJY29uc3QgY2hhciAqbXNnaWQgPSBpbm1lbV9vcmlnX3N5c2RlcF90YWJbaV0ucG9pbnRlcjsKKysJCQlubHNfdWludDMyIGhhc2hfdmFsID0gaGFzaF9zdHJpbmcgKG1zZ2lkKTsKKysJCQlubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7CisrCQkJbmxzX3VpbnQzMiBpbmNyID0KKysJCQkgIDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7CisrCisrCQkJZm9yICg7OykKKysJCQkgIHsKKysJCQkgICAgaWYgKGlubWVtX2hhc2hfdGFiW2lkeF0gPT0gMCkKKysJCQkgICAgICB7CisrCQkJCS8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICBVc2UgaXQuICAqLworKwkJCQlpbm1lbV9oYXNoX3RhYltpZHhdID0gMSArIGRvbWFpbi0+bnN0cmluZ3MgKyBpOworKwkJCQlicmVhazsKKysJCQkgICAgICB9CisrCisrCQkJICAgIGlmIChpZHggPj0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyKQorKwkJCSAgICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7CisrCQkJICAgIGVsc2UKKysJCQkgICAgICBpZHggKz0gaW5jcjsKKysJCQkgIH0KKysJCSAgICAgIH0KKysKKysJCSAgICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOworKwkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gaW5tZW1fb3JpZ19zeXNkZXBfdGFiOworKwkJICAgIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IGlubWVtX3RyYW5zX3N5c2RlcF90YWI7CisrCisrCQkgICAgZG9tYWluLT5oYXNoX3RhYiA9IGlubWVtX2hhc2hfdGFiOworKwkJICAgIGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiID0gMDsKKysJCSAgfQorKwkJZWxzZQorKwkJICB7CisrCQkgICAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKKysJCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7CisrCQkgICAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKKysJCSAgfQorKworKwkJZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7CisrCSAgICAgIH0KKysJICAgIGVsc2UKKysJICAgICAgeworKwkJZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKKysJCWRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKKysJCWRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IE5VTEw7CisrCSAgICAgIH0KKysJICB9CisrCSAgYnJlYWs7CisrCX0KKyAgICAgICBicmVhazsKKyAgICAgZGVmYXVsdDoKKy0gICAgICAvKiBUaGlzIGlzIGFuIGlsbGVnYWwgcmV2aXNpb24uICAqLworLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCistICAgIHx8IGRlZmluZWQgX0xJQkMKKysgICAgICAvKiBUaGlzIGlzIGFuIGludmFsaWQgcmV2aXNpb24uICAqLworKyAgICBpbnZhbGlkOgorKyAgICAgIC8qIFRoaXMgaXMgYW4gaW52YWxpZCAubW8gZmlsZS4gICovCisrICAgICAgaWYgKGRvbWFpbi0+bWFsbG9jZWQpCisrCWZyZWUgKGRvbWFpbi0+bWFsbG9jZWQpOworKyNpZmRlZiBIQVZFX01NQVAKKyAgICAgICBpZiAodXNlX21tYXApCistCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOworKwltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzaXplKTsKKyAgICAgICBlbHNlCisgI2VuZGlmCisgCWZyZWUgKGRhdGEpOworQEAgLTE5Myw3ICsxMzg1LDM2IEBACisgICAgICAgcmV0dXJuOworICAgICB9CisgCistICAvKiBTaG93IHRoYXQgb25lIGRvbWFpbiBpcyBjaGFuZ2VkLiAgVGhpcyBtaWdodCBtYWtlIHNvbWUgY2FjaGVkCistICAgICB0cmFuc2xhdGlvbnMgaW52YWxpZC4gICovCistICArK19ubF9tc2dfY2F0X2NudHI7CisrICAvKiBOb3cgaW5pdGlhbGl6ZSB0aGUgY2hhcmFjdGVyIHNldCBjb252ZXJ0ZXIgZnJvbSB0aGUgY2hhcmFjdGVyIHNldAorKyAgICAgdGhlIGZpbGUgaXMgZW5jb2RlZCB3aXRoIChmb3VuZCBpbiB0aGUgaGVhZGVyIGVudHJ5KSB0byB0aGUgZG9tYWluJ3MKKysgICAgIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0IG9yIHRoZSBsb2NhbGUncyBjaGFyYWN0ZXIgc2V0LiAgKi8KKysgIG51bGxlbnRyeSA9IF9ubF9pbml0X2RvbWFpbl9jb252IChkb21haW5fZmlsZSwgZG9tYWluLCBkb21haW5iaW5kaW5nKTsKKysKKysgIC8qIEFsc28gbG9vayBmb3IgYSBwbHVyYWwgc3BlY2lmaWNhdGlvbi4gICovCisrICBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIChudWxsZW50cnksICZkb21haW4tPnBsdXJhbCwgJmRvbWFpbi0+bnBsdXJhbHMpOworIH0KKysKKysKKysjaWZkZWYgX0xJQkMKKyt2b2lkCisraW50ZXJuYWxfZnVuY3Rpb24KKytfbmxfdW5sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbikKKyt7CisrICBpZiAoZG9tYWluLT5wbHVyYWwgIT0gJl9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwpCisrICAgIF9fZ2V0dGV4dF9mcmVlX2V4cCAoZG9tYWluLT5wbHVyYWwpOworKworKyAgX25sX2ZyZWVfZG9tYWluX2NvbnYgKGRvbWFpbik7CisrCisrICBpZiAoZG9tYWluLT5tYWxsb2NlZCkKKysgICAgZnJlZSAoZG9tYWluLT5tYWxsb2NlZCk7CisrCisrIyBpZmRlZiBfUE9TSVhfTUFQUEVEX0ZJTEVTCisrICBpZiAoZG9tYWluLT51c2VfbW1hcCkKKysgICAgbXVubWFwICgoY2FkZHJfdCkgZG9tYWluLT5kYXRhLCBkb21haW4tPm1tYXBfc2l6ZSk7CisrICBlbHNlCisrIyBlbmRpZgkvKiBfUE9TSVhfTUFQUEVEX0ZJTEVTICovCisrICAgIGZyZWUgKCh2b2lkICopIGRvbWFpbi0+ZGF0YSk7CisrCisrICBmcmVlIChkb21haW4pOworK30KKysjZW5kaWYKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2NhbGNoYXJzZXQuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2NhbGNoYXJzZXQuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjQ3ODcyOTM5MiAtMDQwMAorQEAgLTAsMCArMSwzOTggQEAKKysvKiBEZXRlcm1pbmUgYSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nLgorKworKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysvKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCisrCisrI2lmZGVmIEhBVkVfQ09ORklHX0gKKysjIGluY2x1ZGUgPGNvbmZpZy5oPgorKyNlbmRpZgorKworKy8qIFNwZWNpZmljYXRpb24uICAqLworKyNpbmNsdWRlICJsb2NhbGNoYXJzZXQuaCIKKysKKysjaWYgSEFWRV9TVERERUZfSAorKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisrI2VuZGlmCisrCisrI2luY2x1ZGUgPHN0ZGlvLmg+CisrI2lmIEhBVkVfU1RSSU5HX0gKKysjIGluY2x1ZGUgPHN0cmluZy5oPgorKyNlbHNlCisrIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisrI2VuZGlmCisrI2lmIEhBVkVfU1RETElCX0gKKysjIGluY2x1ZGUgPHN0ZGxpYi5oPgorKyNlbmRpZgorKworKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXworKyMgdW5kZWYgV0lOMzIgICAvKiBhdm9pZCB3YXJuaW5nIG9uIG1pbmd3MzIgKi8KKysjIGRlZmluZSBXSU4zMgorKyNlbmRpZgorKworKyNpZiBkZWZpbmVkIF9fRU1YX18KKysvKiBBc3N1bWUgRU1YIHByb2dyYW0gcnVucyBvbiBPUy8yLCBldmVuIGlmIGNvbXBpbGVkIHVuZGVyIERPUy4gICovCisrIyBkZWZpbmUgT1MyCisrI2VuZGlmCisrCisrI2lmICFkZWZpbmVkIFdJTjMyCisrIyBpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKKysjICBpbmNsdWRlIDxsYW5naW5mby5oPgorKyMgZWxzZQorKyMgIGlmIEhBVkVfU0VUTE9DQUxFCisrIyAgIGluY2x1ZGUgPGxvY2FsZS5oPgorKyMgIGVuZGlmCisrIyBlbmRpZgorKyNlbGlmIGRlZmluZWQgV0lOMzIKKysjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisrIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisrI2VuZGlmCisrI2lmIGRlZmluZWQgT1MyCisrIyBkZWZpbmUgSU5DTF9ET1MKKysjIGluY2x1ZGUgPG9zMi5oPgorKyNlbmRpZgorKworKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKysjIGluY2x1ZGUgInJlbG9jYXRhYmxlLmgiCisrI2Vsc2UKKysjIGRlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQorKyNlbmRpZgorKworKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KKysgIC8qIFdpbjMyLCBPUy8yLCBET1MgKi8KKysjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorKyNlbmRpZgorKworKyNpZm5kZWYgRElSRUNUT1JZX1NFUEFSQVRPUgorKyMgZGVmaW5lIERJUkVDVE9SWV9TRVBBUkFUT1IgJy8nCisrI2VuZGlmCisrCisrI2lmbmRlZiBJU1NMQVNICisrIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09IERJUkVDVE9SWV9TRVBBUkFUT1IpCisrI2VuZGlmCisrCisrI2lmIEhBVkVfREVDTF9HRVRDX1VOTE9DS0VECisrIyB1bmRlZiBnZXRjCisrIyBkZWZpbmUgZ2V0YyBnZXRjX3VubG9ja2VkCisrI2VuZGlmCisrCisrLyogVGhlIGZvbGxvd2luZyBzdGF0aWMgdmFyaWFibGUgaXMgZGVjbGFyZWQgJ3ZvbGF0aWxlJyB0byBhdm9pZCBhCisrICAgcG9zc2libGUgbXVsdGl0aHJlYWQgcHJvYmxlbSBpbiB0aGUgZnVuY3Rpb24gZ2V0X2NoYXJzZXRfYWxpYXNlcy4gSWYgd2UKKysgICBhcmUgcnVubmluZyBpbiBhIHRocmVhZGVkIGVudmlyb25tZW50LCBhbmQgaWYgdHdvIHRocmVhZHMgaW5pdGlhbGl6ZQorKyAgICdjaGFyc2V0X2FsaWFzZXMnIHNpbXVsdGFuZW91c2x5LCBib3RoIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSB2YWx1ZSwKKysgICBhbmQgZXZlcnl0aGluZyB3aWxsIGJlIG9rIGlmIHRoZSB0d28gYXNzaWdubWVudHMgdG8gJ2NoYXJzZXRfYWxpYXNlcycKKysgICBhcmUgYXRvbWljLiBCdXQgSSBkb24ndCBrbm93IHdoYXQgd2lsbCBoYXBwZW4gaWYgdGhlIHR3byBhc3NpZ25tZW50cyBtaXguICAqLworKyNpZiBfX1NURENfXyAhPSAxCisrIyBkZWZpbmUgdm9sYXRpbGUgLyogZW1wdHkgKi8KKysjZW5kaWYKKysvKiBQb2ludGVyIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCisrICAgcmVhZCwgZWxzZSBOVUxMLiAgSXRzIGZvcm1hdCBpczoKKysgICBBTElBU18xICdcMCcgQ0FOT05JQ0FMXzEgJ1wwJyAuLi4gQUxJQVNfbiAnXDAnIENBTk9OSUNBTF9uICdcMCcgJ1wwJyAgKi8KKytzdGF0aWMgY29uc3QgY2hhciAqIHZvbGF0aWxlIGNoYXJzZXRfYWxpYXNlczsKKysKKysvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLiAgKi8KKytzdGF0aWMgY29uc3QgY2hhciAqCisrZ2V0X2NoYXJzZXRfYWxpYXNlcyAoKQorK3sKKysgIGNvbnN0IGNoYXIgKmNwOworKworKyAgY3AgPSBjaGFyc2V0X2FsaWFzZXM7CisrICBpZiAoY3AgPT0gTlVMTCkKKysgICAgeworKyNpZiAhKGRlZmluZWQgVk1TIHx8IGRlZmluZWQgV0lOMzIpCisrICAgICAgRklMRSAqZnA7CisrICAgICAgY29uc3QgY2hhciAqZGlyID0gcmVsb2NhdGUgKExJQkRJUik7CisrICAgICAgY29uc3QgY2hhciAqYmFzZSA9ICJjaGFyc2V0LmFsaWFzIjsKKysgICAgICBjaGFyICpmaWxlX25hbWU7CisrCisrICAgICAgLyogQ29uY2F0ZW5hdGUgZGlyIGFuZCBiYXNlIGludG8gZnJlc2hseSBhbGxvY2F0ZWQgZmlsZV9uYW1lLiAgKi8KKysgICAgICB7CisrCXNpemVfdCBkaXJfbGVuID0gc3RybGVuIChkaXIpOworKwlzaXplX3QgYmFzZV9sZW4gPSBzdHJsZW4gKGJhc2UpOworKwlpbnQgYWRkX3NsYXNoID0gKGRpcl9sZW4gPiAwICYmICFJU1NMQVNIIChkaXJbZGlyX2xlbiAtIDFdKSk7CisrCWZpbGVfbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlyX2xlbiArIGFkZF9zbGFzaCArIGJhc2VfbGVuICsgMSk7CisrCWlmIChmaWxlX25hbWUgIT0gTlVMTCkKKysJICB7CisrCSAgICBtZW1jcHkgKGZpbGVfbmFtZSwgZGlyLCBkaXJfbGVuKTsKKysJICAgIGlmIChhZGRfc2xhc2gpCisrCSAgICAgIGZpbGVfbmFtZVtkaXJfbGVuXSA9IERJUkVDVE9SWV9TRVBBUkFUT1I7CisrCSAgICBtZW1jcHkgKGZpbGVfbmFtZSArIGRpcl9sZW4gKyBhZGRfc2xhc2gsIGJhc2UsIGJhc2VfbGVuICsgMSk7CisrCSAgfQorKyAgICAgIH0KKysKKysgICAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwgfHwgKGZwID0gZm9wZW4gKGZpbGVfbmFtZSwgInIiKSkgPT0gTlVMTCkKKysJLyogT3V0IG9mIG1lbW9yeSBvciBmaWxlIG5vdCBmb3VuZCwgdHJlYXQgaXQgYXMgZW1wdHkuICAqLworKwljcCA9ICIiOworKyAgICAgIGVsc2UKKysJeworKwkgIC8qIFBhcnNlIHRoZSBmaWxlJ3MgY29udGVudHMuICAqLworKwkgIGludCBjOworKwkgIGNoYXIgYnVmMVs1MCsxXTsKKysJICBjaGFyIGJ1ZjJbNTArMV07CisrCSAgY2hhciAqcmVzX3B0ciA9IE5VTEw7CisrCSAgc2l6ZV90IHJlc19zaXplID0gMDsKKysJICBzaXplX3QgbDEsIGwyOworKworKwkgIGZvciAoOzspCisrCSAgICB7CisrCSAgICAgIGMgPSBnZXRjIChmcCk7CisrCSAgICAgIGlmIChjID09IEVPRikKKysJCWJyZWFrOworKwkgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKKysJCWNvbnRpbnVlOworKwkgICAgICBpZiAoYyA9PSAnIycpCisrCQl7CisrCQkgIC8qIFNraXAgY29tbWVudCwgdG8gZW5kIG9mIGxpbmUuICAqLworKwkJICBkbworKwkJICAgIGMgPSBnZXRjIChmcCk7CisrCQkgIHdoaWxlICghKGMgPT0gRU9GIHx8IGMgPT0gJ1xuJykpOworKwkJICBpZiAoYyA9PSBFT0YpCisrCQkgICAgYnJlYWs7CisrCQkgIGNvbnRpbnVlOworKwkJfQorKwkgICAgICB1bmdldGMgKGMsIGZwKTsKKysJICAgICAgaWYgKGZzY2FuZiAoZnAsICIlNTBzICU1MHMiLCBidWYxLCBidWYyKSA8IDIpCisrCQlicmVhazsKKysJICAgICAgbDEgPSBzdHJsZW4gKGJ1ZjEpOworKwkgICAgICBsMiA9IHN0cmxlbiAoYnVmMik7CisrCSAgICAgIGlmIChyZXNfc2l6ZSA9PSAwKQorKwkJeworKwkJICByZXNfc2l6ZSA9IGwxICsgMSArIGwyICsgMTsKKysJCSAgcmVzX3B0ciA9IChjaGFyICopIG1hbGxvYyAocmVzX3NpemUgKyAxKTsKKysJCX0KKysJICAgICAgZWxzZQorKwkJeworKwkJICByZXNfc2l6ZSArPSBsMSArIDEgKyBsMiArIDE7CisrCQkgIHJlc19wdHIgPSAoY2hhciAqKSByZWFsbG9jIChyZXNfcHRyLCByZXNfc2l6ZSArIDEpOworKwkJfQorKwkgICAgICBpZiAocmVzX3B0ciA9PSBOVUxMKQorKwkJeworKwkJICAvKiBPdXQgb2YgbWVtb3J5LiAqLworKwkJICByZXNfc2l6ZSA9IDA7CisrCQkgIGJyZWFrOworKwkJfQorKwkgICAgICBzdHJjcHkgKHJlc19wdHIgKyByZXNfc2l6ZSAtIChsMiArIDEpIC0gKGwxICsgMSksIGJ1ZjEpOworKwkgICAgICBzdHJjcHkgKHJlc19wdHIgKyByZXNfc2l6ZSAtIChsMiArIDEpLCBidWYyKTsKKysJICAgIH0KKysJICBmY2xvc2UgKGZwKTsKKysJICBpZiAocmVzX3NpemUgPT0gMCkKKysJICAgIGNwID0gIiI7CisrCSAgZWxzZQorKwkgICAgeworKwkgICAgICAqKHJlc19wdHIgKyByZXNfc2l6ZSkgPSAnXDAnOworKwkgICAgICBjcCA9IHJlc19wdHI7CisrCSAgICB9CisrCX0KKysKKysgICAgICBpZiAoZmlsZV9uYW1lICE9IE5VTEwpCisrCWZyZWUgKGZpbGVfbmFtZSk7CisrCisrI2Vsc2UKKysKKysjIGlmIGRlZmluZWQgVk1TCisrICAgICAgLyogVG8gYXZvaWQgdGhlIHRyb3VibGVzIG9mIGFuIGV4dHJhIGZpbGUgY2hhcnNldC5hbGlhc192bXMgaW4gdGhlCisrCSBzb3VyY2VzIG9mIG1hbnkgR05VIHBhY2thZ2VzLCBzaW1wbHkgaW5saW5lIHRoZSBhbGlhc2VzIGhlcmUuICAqLworKyAgICAgIC8qIFRoZSBsaXN0IG9mIGVuY29kaW5ncyBpcyB0YWtlbiBmcm9tIHRoZSBPcGVuVk1TIDcuMy0xIGRvY3VtZW50YXRpb24KKysJICJDb21wYXEgQyBSdW4tVGltZSBMaWJyYXJ5IFJlZmVyZW5jZSBNYW51YWwgZm9yIE9wZW5WTVMgc3lzdGVtcyIKKysJIHNlY3Rpb24gMTAuNyAiSGFuZGxpbmcgRGlmZmVyZW50IENoYXJhY3RlciBTZXRzIi4gICovCisrICAgICAgY3AgPSAiSVNPODg1OS0xIiAiXDAiICJJU08tODg1OS0xIiAiXDAiCisrCSAgICJJU084ODU5LTIiICJcMCIgIklTTy04ODU5LTIiICJcMCIKKysJICAgIklTTzg4NTktNSIgIlwwIiAiSVNPLTg4NTktNSIgIlwwIgorKwkgICAiSVNPODg1OS03IiAiXDAiICJJU08tODg1OS03IiAiXDAiCisrCSAgICJJU084ODU5LTgiICJcMCIgIklTTy04ODU5LTgiICJcMCIKKysJICAgIklTTzg4NTktOSIgIlwwIiAiSVNPLTg4NTktOSIgIlwwIgorKwkgICAvKiBKYXBhbmVzZSAqLworKwkgICAiZXVjSlAiICJcMCIgIkVVQy1KUCIgIlwwIgorKwkgICAiU0pJUyIgIlwwIiAiU0hJRlRfSklTIiAiXDAiCisrCSAgICJERUNLQU5KSSIgIlwwIiAiREVDLUtBTkpJIiAiXDAiCisrCSAgICJTREVDS0FOSkkiICJcMCIgIkVVQy1KUCIgIlwwIgorKwkgICAvKiBDaGluZXNlICovCisrCSAgICJldWNUVyIgIlwwIiAiRVVDLVRXIiAiXDAiCisrCSAgICJERUNIQU5ZVSIgIlwwIiAiREVDLUhBTllVIiAiXDAiCisrCSAgICJERUNIQU5aSSIgIlwwIiAiR0IyMzEyIiAiXDAiCisrCSAgIC8qIEtvcmVhbiAqLworKwkgICAiREVDS09SRUFOIiAiXDAiICJFVUMtS1IiICJcMCI7CisrIyBlbmRpZgorKworKyMgaWYgZGVmaW5lZCBXSU4zMgorKyAgICAgIC8qIFRvIGF2b2lkIHRoZSB0cm91YmxlcyBvZiBpbnN0YWxsaW5nIGEgc2VwYXJhdGUgZmlsZSBpbiB0aGUgc2FtZQorKwkgZGlyZWN0b3J5IGFzIHRoZSBETEwgYW5kIG9mIHJldHJpZXZpbmcgdGhlIERMTCdzIGRpcmVjdG9yeSBhdAorKwkgcnVudGltZSwgc2ltcGx5IGlubGluZSB0aGUgYWxpYXNlcyBoZXJlLiAgKi8KKysKKysgICAgICBjcCA9ICJDUDkzNiIgIlwwIiAiR0JLIiAiXDAiCisrCSAgICJDUDEzNjEiICJcMCIgIkpPSEFCIiAiXDAiCisrCSAgICJDUDIwMTI3IiAiXDAiICJBU0NJSSIgIlwwIgorKwkgICAiQ1AyMDg2NiIgIlwwIiAiS09JOC1SIiAiXDAiCisrCSAgICJDUDIxODY2IiAiXDAiICJLT0k4LVJVIiAiXDAiCisrCSAgICJDUDI4NTkxIiAiXDAiICJJU08tODg1OS0xIiAiXDAiCisrCSAgICJDUDI4NTkyIiAiXDAiICJJU08tODg1OS0yIiAiXDAiCisrCSAgICJDUDI4NTkzIiAiXDAiICJJU08tODg1OS0zIiAiXDAiCisrCSAgICJDUDI4NTk0IiAiXDAiICJJU08tODg1OS00IiAiXDAiCisrCSAgICJDUDI4NTk1IiAiXDAiICJJU08tODg1OS01IiAiXDAiCisrCSAgICJDUDI4NTk2IiAiXDAiICJJU08tODg1OS02IiAiXDAiCisrCSAgICJDUDI4NTk3IiAiXDAiICJJU08tODg1OS03IiAiXDAiCisrCSAgICJDUDI4NTk4IiAiXDAiICJJU08tODg1OS04IiAiXDAiCisrCSAgICJDUDI4NTk5IiAiXDAiICJJU08tODg1OS05IiAiXDAiCisrCSAgICJDUDI4NjA1IiAiXDAiICJJU08tODg1OS0xNSIgIlwwIjsKKysjIGVuZGlmCisrI2VuZGlmCisrCisrICAgICAgY2hhcnNldF9hbGlhc2VzID0gY3A7CisrICAgIH0KKysKKysgIHJldHVybiBjcDsKKyt9CisrCisrLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZywgYW5kIGNhbm9uaWNhbGl6ZSBpdAorKyAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgorKyAgIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQ7IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLgorKyAgIElmIHRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHJlc3VsdCBpcyBhIG5vbi1jYW5vbmljYWwKKysgICBuYW1lLiAgKi8KKysKKysjaWZkZWYgU1RBVElDCisrU1RBVElDCisrI2VuZGlmCisrY29uc3QgY2hhciAqCisrbG9jYWxlX2NoYXJzZXQgKCkKKyt7CisrICBjb25zdCBjaGFyICpjb2Rlc2V0OworKyAgY29uc3QgY2hhciAqYWxpYXNlczsKKysKKysjaWYgIShkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgT1MyKQorKworKyMgaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCisrCisrICAvKiBNb3N0IHN5c3RlbXMgc3VwcG9ydCBubF9sYW5naW5mbyAoQ09ERVNFVCkgbm93YWRheXMuICAqLworKyAgY29kZXNldCA9IG5sX2xhbmdpbmZvIChDT0RFU0VUKTsKKysKKysjIGVsc2UKKysKKysgIC8qIE9uIG9sZCBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQsIHVzZSBzZXRsb2NhbGUgb3IgZ2V0ZW52LiAgKi8KKysgIGNvbnN0IGNoYXIgKmxvY2FsZSA9IE5VTEw7CisrCisrICAvKiBCdXQgbW9zdCBvbGQgc3lzdGVtcyBkb24ndCBoYXZlIGEgY29tcGxldGUgc2V0IG9mIGxvY2FsZXMuICBTb21lCisrICAgICAobGlrZSBTdW5PUyA0IG9yIERKR1BQKSBoYXZlIG9ubHkgdGhlIEMgbG9jYWxlLiAgVGhlcmVmb3JlIHdlIGRvbid0CisrICAgICB1c2Ugc2V0bG9jYWxlIGhlcmU7IGl0IHdvdWxkIHJldHVybiAiQyIgd2hlbiBpdCBkb2Vzbid0IHN1cHBvcnQgdGhlCisrICAgICBsb2NhbGUgbmFtZSB0aGUgdXNlciBoYXMgc2V0LiAgKi8KKysjICBpZiBIQVZFX1NFVExPQ0FMRSAmJiAwCisrICBsb2NhbGUgPSBzZXRsb2NhbGUgKExDX0NUWVBFLCBOVUxMKTsKKysjICBlbmRpZgorKyAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorKyAgICB7CisrICAgICAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQUxMIik7CisrICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorKwl7CisrCSAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQ1RZUEUiKTsKKysJICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisrCSAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQU5HIik7CisrCX0KKysgICAgfQorKworKyAgLyogT24gc29tZSBvbGQgc3lzdGVtcywgb25lIHVzZWQgdG8gc2V0IGxvY2FsZSA9ICJpc284ODU5XzEiLiBPbiBvdGhlcnMsCisrICAgICB5b3Ugc2V0IGl0IHRvICJsYW5ndWFnZV9DT1VOVFJZLmNoYXJzZXQiLiBJbiBhbnkgY2FzZSwgd2UgcmVzb2x2ZSBpdAorKyAgICAgdGhyb3VnaCB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLiAgKi8KKysgIGNvZGVzZXQgPSBsb2NhbGU7CisrCisrIyBlbmRpZgorKworKyNlbGlmIGRlZmluZWQgV0lOMzIKKysKKysgIHN0YXRpYyBjaGFyIGJ1ZlsyICsgMTAgKyAxXTsKKysKKysgIC8qIFdvZTMyIGhhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbG9jYWxlJ3MgY29kZXBhZ2UgYXMgYSBudW1iZXIuICAqLworKyAgc3ByaW50ZiAoYnVmLCAiQ1AldSIsIEdldEFDUCAoKSk7CisrICBjb2Rlc2V0ID0gYnVmOworKworKyNlbGlmIGRlZmluZWQgT1MyCisrCisrICBjb25zdCBjaGFyICpsb2NhbGU7CisrICBzdGF0aWMgY2hhciBidWZbMiArIDEwICsgMV07CisrICBVTE9ORyBjcFszXTsKKysgIFVMT05HIGNwbGVuOworKworKyAgLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSB0aGUgY29kZXNldCwgYXMgc2V0IGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtLAorKyAgICAgd2l0aCBzdGFuZGFyZCBsYW5ndWFnZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLworKyAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQUxMIik7CisrICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisrICAgIHsKKysgICAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19DVFlQRSIpOworKyAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKKysJbG9jYWxlID0gZ2V0ZW52ICgiTEFORyIpOworKyAgICB9CisrICBpZiAobG9jYWxlICE9IE5VTEwgJiYgbG9jYWxlWzBdICE9ICdcMCcpCisrICAgIHsKKysgICAgICAvKiBJZiB0aGUgbG9jYWxlIG5hbWUgY29udGFpbnMgYW4gZW5jb2RpbmcgYWZ0ZXIgdGhlIGRvdCwgcmV0dXJuIGl0LiAgKi8KKysgICAgICBjb25zdCBjaGFyICpkb3QgPSBzdHJjaHIgKGxvY2FsZSwgJy4nKTsKKysKKysgICAgICBpZiAoZG90ICE9IE5VTEwpCisrCXsKKysJICBjb25zdCBjaGFyICptb2RpZmllcjsKKysKKysJICBkb3QrKzsKKysJICAvKiBMb29rIGZvciB0aGUgcG9zc2libGUgQC4uLiB0cmFpbGVyIGFuZCByZW1vdmUgaXQsIGlmIGFueS4gICovCisrCSAgbW9kaWZpZXIgPSBzdHJjaHIgKGRvdCwgJ0AnKTsKKysJICBpZiAobW9kaWZpZXIgPT0gTlVMTCkKKysJICAgIHJldHVybiBkb3Q7CisrCSAgaWYgKG1vZGlmaWVyIC0gZG90IDwgc2l6ZW9mIChidWYpKQorKwkgICAgeworKwkgICAgICBtZW1jcHkgKGJ1ZiwgZG90LCBtb2RpZmllciAtIGRvdCk7CisrCSAgICAgIGJ1ZiBbbW9kaWZpZXIgLSBkb3RdID0gJ1wwJzsKKysJICAgICAgcmV0dXJuIGJ1ZjsKKysJICAgIH0KKysJfQorKworKyAgICAgIC8qIFJlc29sdmUgdGhyb3VnaCB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLiAgKi8KKysgICAgICBjb2Rlc2V0ID0gbG9jYWxlOworKyAgICB9CisrICBlbHNlCisrICAgIHsKKysgICAgICAvKiBPUy8yIGhhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbG9jYWxlJ3MgY29kZXBhZ2UgYXMgYSBudW1iZXIuICAqLworKyAgICAgIGlmIChEb3NRdWVyeUNwIChzaXplb2YgKGNwKSwgY3AsICZjcGxlbikpCisrCWNvZGVzZXQgPSAiIjsKKysgICAgICBlbHNlCisrCXsKKysJICBzcHJpbnRmIChidWYsICJDUCV1IiwgY3BbMF0pOworKwkgIGNvZGVzZXQgPSBidWY7CisrCX0KKysgICAgfQorKworKyNlbmRpZgorKworKyAgaWYgKGNvZGVzZXQgPT0gTlVMTCkKKysgICAgLyogVGhlIGNhbm9uaWNhbCBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgKi8KKysgICAgY29kZXNldCA9ICIiOworKworKyAgLyogUmVzb2x2ZSBhbGlhcy4gKi8KKysgIGZvciAoYWxpYXNlcyA9IGdldF9jaGFyc2V0X2FsaWFzZXMgKCk7CisrICAgICAgICphbGlhc2VzICE9ICdcMCc7CisrICAgICAgIGFsaWFzZXMgKz0gc3RybGVuIChhbGlhc2VzKSArIDEsIGFsaWFzZXMgKz0gc3RybGVuIChhbGlhc2VzKSArIDEpCisrICAgIGlmIChzdHJjbXAgKGNvZGVzZXQsIGFsaWFzZXMpID09IDAKKysJfHwgKGFsaWFzZXNbMF0gPT0gJyonICYmIGFsaWFzZXNbMV0gPT0gJ1wwJykpCisrICAgICAgeworKwljb2Rlc2V0ID0gYWxpYXNlcyArIHN0cmxlbiAoYWxpYXNlcykgKyAxOworKwlicmVhazsKKysgICAgICB9CisrCisrICAvKiBEb24ndCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLiAgR05VIGxpYmMgYW5kIEdOVSBsaWJpY29udiBpbnRlcnByZXQKKysgICAgIHRoZSBlbXB0eSBzdHJpbmcgYXMgZGVub3RpbmcgInRoZSBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmciLAorKyAgICAgdGh1cyBHTlUgbGliaWNvbnYgd291bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGEgc2Vjb25kIHRpbWUuICAqLworKyAgaWYgKGNvZGVzZXRbMF0gPT0gJ1wwJykKKysgICAgY29kZXNldCA9ICJBU0NJSSI7CisrCisrICByZXR1cm4gY29kZXNldDsKKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvbG9jYWxjaGFyc2V0LmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvbG9jYWxjaGFyc2V0LmgJMjAwNC0wOS0xMiAxNDo0MDozNC40ODM3Mjg2MzIgLTA0MDAKK0BAIC0wLDAgKzEsNDIgQEAKKysvKiBEZXRlcm1pbmUgYSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nLgorKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQ0hBUlNFVCBMaWJyYXJ5LgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZuZGVmIF9MT0NBTENIQVJTRVRfSAorKyNkZWZpbmUgX0xPQ0FMQ0hBUlNFVF9ICisrCisrCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIiB7CisrI2VuZGlmCisrCisrCisrLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZywgYW5kIGNhbm9uaWNhbGl6ZSBpdAorKyAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgorKyAgIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQ7IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLgorKyAgIElmIHRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHJlc3VsdCBpcyBhIG5vbi1jYW5vbmljYWwKKysgICBuYW1lLiAgKi8KKytleHRlcm4gY29uc3QgY2hhciAqIGxvY2FsZV9jaGFyc2V0ICh2b2lkKTsKKysKKysKKysjaWZkZWYgX19jcGx1c3BsdXMKKyt9CisrI2VuZGlmCisrCisrCisrI2VuZGlmIC8qIF9MT0NBTENIQVJTRVRfSCAqLworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xvY2FsZS5hbGlhcwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2NhbGUuYWxpYXMJMjAwNC0wOS0xMiAxNDo0MDozNC40OTk3MjYyMDAgLTA0MDAKK0BAIC0wLDAgKzEsNzggQEAKKysjIExvY2FsZSBuYW1lIGFsaWFzIGRhdGEgYmFzZS4KKysjIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxLDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrIworKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysjIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysjIGFueSBsYXRlciB2ZXJzaW9uLgorKyMKKysjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrIyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysjCisrIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrIyBVU0EuCisrCisrIyBUaGUgZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBvZgorKyMgdGhlIFggV2luZG93IFN5c3RlbSwgd2hpY2ggbm9ybWFsbHkgY2FuIGJlIGZvdW5kIGluCisrIwkvdXNyL2xpYi9YMTEvbG9jYWxlL2xvY2FsZS5hbGlhcworKyMgQSBzaW5nbGUgbGluZSBjb250YWlucyB0d28gZmllbGRzOiBhbiBhbGlhcyBhbmQgYSBzdWJzdGl0dXRpb24gdmFsdWUuCisrIyBBbGwgZW50cmllcyBhcmUgY2FzZSBpbmRlcGVuZGVudC4KKysKKysjIE5vdGU6IFRoaXMgZmlsZSBpcyBmYXIgZnJvbSBiZWluZyBjb21wbGV0ZS4gIElmIHlvdSBoYXZlIGEgdmFsdWUgZm9yCisrIyB5b3VyIG93biBzaXRlIHdoaWNoIHlvdSB0aGluayBtaWdodCBiZSB1c2VmdWwgZm9yIG90aGVycyB0b28sIHNoYXJlCisrIyBpdCB3aXRoIHRoZSByZXN0IG9mIHVzLiAgU2VuZCBpdCB1c2luZyB0aGUgYGdsaWJjYnVnJyBzY3JpcHQgdG8KKysjIGJ1Z3NAZ251Lm9yZy4KKysKKysjIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogCisrCisrYm9rbWFsCQluYl9OTy5JU08tODg1OS0xCisrYm9rbeVsCQluYl9OTy5JU08tODg1OS0xCisrY2F0YWxhbgkJY2FfRVMuSVNPLTg4NTktMQorK2Nyb2F0aWFuCWhyX0hSLklTTy04ODU5LTIKKytjemVjaAkJY3NfQ1ouSVNPLTg4NTktMgorK2RhbmlzaCAgICAgICAgICBkYV9ESy5JU08tODg1OS0xCisrZGFuc2sJCWRhX0RLLklTTy04ODU5LTEKKytkZXV0c2NoCQlkZV9ERS5JU08tODg1OS0xCisrZHV0Y2gJCW5sX05MLklTTy04ODU5LTEKKytlZXN0aQkJZXRfRUUuSVNPLTg4NTktMQorK2VzdG9uaWFuCWV0X0VFLklTTy04ODU5LTEKKytmaW5uaXNoICAgICAgICAgZmlfRkkuSVNPLTg4NTktMQorK2ZyYW7nYWlzCWZyX0ZSLklTTy04ODU5LTEKKytmcmVuY2gJCWZyX0ZSLklTTy04ODU5LTEKKytnYWxlZ28JCWdsX0VTLklTTy04ODU5LTEKKytnYWxpY2lhbglnbF9FUy5JU08tODg1OS0xCisrZ2VybWFuCQlkZV9ERS5JU08tODg1OS0xCisrZ3JlZWsgICAgICAgICAgIGVsX0dSLklTTy04ODU5LTcKKytoZWJyZXcgICAgICAgICAgaGVfSUwuSVNPLTg4NTktOAorK2hydmF0c2tpCWhyX0hSLklTTy04ODU5LTIKKytodW5nYXJpYW4gICAgICAgaHVfSFUuSVNPLTg4NTktMgorK2ljZWxhbmRpYyAgICAgICBpc19JUy5JU08tODg1OS0xCisraXRhbGlhbiAgICAgICAgIGl0X0lULklTTy04ODU5LTEKKytqYXBhbmVzZQlqYV9KUC5ldWNKUAorK2phcGFuZXNlLmV1YwlqYV9KUC5ldWNKUAorK2phX0pQCQlqYV9KUC5ldWNKUAorK2phX0pQLnVqaXMJamFfSlAuZXVjSlAKKytqYXBhbmVzZS5zamlzCWphX0pQLlNKSVMKKytrb3JlYW4JCWtvX0tSLmV1Y0tSCisra29yZWFuLmV1YyAJa29fS1IuZXVjS1IKKytrb19LUgkJa29fS1IuZXVjS1IKKytsaXRodWFuaWFuICAgICAgbHRfTFQuSVNPLTg4NTktMTMKKytub19OTwkJbmJfTk8uSVNPLTg4NTktMQorK25vX05PLklTTy04ODU5LTEgbmJfTk8uSVNPLTg4NTktMQorK25vcndlZ2lhbiAgICAgICBuYl9OTy5JU08tODg1OS0xCisrbnlub3JzawkJbm5fTk8uSVNPLTg4NTktMQorK3BvbGlzaCAgICAgICAgICBwbF9QTC5JU08tODg1OS0yCisrcG9ydHVndWVzZSAgICAgIHB0X1BULklTTy04ODU5LTEKKytyb21hbmlhbiAgICAgICAgcm9fUk8uSVNPLTg4NTktMgorK3J1c3NpYW4gICAgICAgICBydV9SVS5JU08tODg1OS01Cisrc2xvdmFrICAgICAgICAgIHNrX1NLLklTTy04ODU5LTIKKytzbG92ZW5lICAgICAgICAgc2xfU0kuSVNPLTg4NTktMgorK3Nsb3ZlbmlhbiAgICAgICBzbF9TSS5JU08tODg1OS0yCisrc3BhbmlzaCAgICAgICAgIGVzX0VTLklTTy04ODU5LTEKKytzd2VkaXNoICAgICAgICAgc3ZfU0UuSVNPLTg4NTktMQorK3RoYWkJCXRoX1RILlRJUy02MjAKKyt0dXJraXNoICAgICAgICAgdHJfVFIuSVNPLTg4NTktOQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xvY2FsZWFsaWFzLmMJMTk5OC0wNC0yNiAwOToyMjozNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvbG9jYWxlYWxpYXMuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjUwNTcyNTI4OCAtMDQwMAorQEAgLTEsMjAgKzEsMjcgQEAKKy0vKiBIYW5kbGUgYWxpYXNlcyBmb3IgbG9jYWxlIG5hbWVzCistICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorKy8qIEhhbmRsZSBhbGlhc2VzIGZvciBsb2NhbGUgbmFtZXMuCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAKKy0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CistICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCistICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisrCisrLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgbWVtcGNweSgpLgorKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKysjaWZuZGVmIF9HTlVfU09VUkNFCisrIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgMQorKyNlbmRpZgorIAorICNpZmRlZiBIQVZFX0NPTkZJR19ICisgIyBpbmNsdWRlIDxjb25maWcuaD4KK0BAIC0yMiw1NiArMjksNDUgQEAKKyAKKyAjaW5jbHVkZSA8Y3R5cGUuaD4KKyAjaW5jbHVkZSA8c3RkaW8uaD4KKysjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfX19GU0VUTE9DS0lORworKyMgaW5jbHVkZSA8c3RkaW9fZXh0Lmg+CisrI2VuZGlmCisgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorIAorICNpZmRlZiBfX0dOVUNfXworKyMgdW5kZWYgYWxsb2NhCisgIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyAjIGRlZmluZSBIQVZFX0FMTE9DQSAxCisgI2Vsc2UKKy0jIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCistIyAgaW5jbHVkZSA8YWxsb2NhLmg+CisrIyBpZmRlZiBfTVNDX1ZFUgorKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorICMgZWxzZQorLSMgIGlmZGVmIF9BSVgKKy0gI3ByYWdtYSBhbGxvY2EKKysjICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQworKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyAjICBlbHNlCistIyAgIGlmbmRlZiBhbGxvY2EKKysjICAgaWZkZWYgX0FJWAorKyAjcHJhZ21hIGFsbG9jYQorKyMgICBlbHNlCisrIyAgICBpZm5kZWYgYWxsb2NhCisgY2hhciAqYWxsb2NhICgpOworKyMgICAgZW5kaWYKKyAjICAgZW5kaWYKKyAjICBlbmRpZgorICMgZW5kaWYKKyAjZW5kaWYKKyAKKy0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQworLSMgaW5jbHVkZSA8c3RkbGliLmg+CistI2Vsc2UKKy1jaGFyICpnZXRlbnYgKCk7CistIyBpZmRlZiBIQVZFX01BTExPQ19ICistIyAgaW5jbHVkZSA8bWFsbG9jLmg+CistIyBlbHNlCistdm9pZCBmcmVlICgpOworLSMgZW5kaWYKKy0jZW5kaWYKKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2luY2x1ZGUgPHN0cmluZy5oPgorIAorLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQworLSMgaWZuZGVmIF9HTlVfU09VUkNFCistIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKKy0jIGVuZGlmCistIyBpbmNsdWRlIDxzdHJpbmcuaD4KKysjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKysKKysjaWYgRU5BQkxFX1JFTE9DQVRBQkxFCisrIyBpbmNsdWRlICJyZWxvY2F0YWJsZS5oIgorICNlbHNlCistIyBpbmNsdWRlIDxzdHJpbmdzLmg+CistIyBpZm5kZWYgbWVtY3B5CistIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKKy0jIGVuZGlmCistI2VuZGlmCistI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQworLSMgaWZuZGVmIHN0cmNocgorLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKKy0jIGVuZGlmCisrIyBkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKKyAjZW5kaWYKKyAKKy0jaW5jbHVkZSAiZ2V0dGV4dC5oIgorLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgorLQorIC8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKyAKKyAjaWZkZWYgX0xJQkMKK0BAIC03OSw0MyArNzUsNDkgQEAKKyAgICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0CisgICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLworICMgZGVmaW5lIHN0cmNhc2VjbXAgX19zdHJjYXNlY21wCisrCisrIyBpZm5kZWYgbWVtcGNweQorKyMgIGRlZmluZSBtZW1wY3B5IF9fbWVtcGNweQorKyMgZW5kaWYKKysjIGRlZmluZSBIQVZFX01FTVBDUFkJMQorKyMgZGVmaW5lIEhBVkVfX19GU0VUTE9DS0lORwkxCisrCisrLyogV2UgbmVlZCBsb2NraW5nIGhlcmUgc2luY2Ugd2UgY2FuIGJlIGNhbGxlZCBmcm9tIGRpZmZlcmVudCBwbGFjZXMuICAqLworKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKysKKytfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgbG9jayk7CisrI2VuZGlmCisrCisrI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgorKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisgI2VuZGlmCisgCisrLyogU29tZSBvcHRpbWl6YXRpb25zIGZvciBnbGliYy4gICovCisrI2lmZGVmIF9MSUJDCisrIyBkZWZpbmUgRkVPRihmcCkJCWZlb2ZfdW5sb2NrZWQgKGZwKQorKyMgZGVmaW5lIEZHRVRTKGJ1ZiwgbiwgZnApCWZnZXRzX3VubG9ja2VkIChidWYsIG4sIGZwKQorKyNlbHNlCisrIyBkZWZpbmUgRkVPRihmcCkJCWZlb2YgKGZwKQorKyMgZGVmaW5lIEZHRVRTKGJ1ZiwgbiwgZnApCWZnZXRzIChidWYsIG4sIGZwKQorKyNlbmRpZgorIAorLS8qIEZvciB0aG9zZSBsb29zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAorKy8qIEZvciB0aG9zZSBsb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCisgICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KKyAjaWZkZWYgSEFWRV9BTExPQ0EKKy0vKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KKy0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLworLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KKysjIGRlZmluZSBmcmVlYShwKSAvKiBub3RoaW5nICovCisgI2Vsc2UKKy1zdHJ1Y3QgYmxvY2tfbGlzdAorLXsKKy0gIHZvaWQgKmFkZHJlc3M7CistICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKKy19OworLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKKy0gIGRvIHsJCQkJCQkJCQkgICAgICBcCistICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAorLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCistICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAorLSAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKKy0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKKy0gICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKKy0gICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCistICAgIH0JCQkJCQkJCQkgICAgICBcCistICB9IHdoaWxlICgwKQorLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAorLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKKy0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKKy0gICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKKy0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCistICAgICAgZnJlZSAob2xkKTsJCQkJCQkJICAgICAgXAorLSAgICB9CQkJCQkJCQkJICAgICAgXAorLSAgfSB3aGlsZSAoMCkKKy0jIHVuZGVmIGFsbG9jYQorLSMgZGVmaW5lIGFsbG9jYShzaXplKSAobWFsbG9jIChzaXplKSkKKy0jZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KKysjIGRlZmluZSBhbGxvY2EobikgbWFsbG9jIChuKQorKyMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCisrI2VuZGlmCisrCisrI2lmIGRlZmluZWQgX0xJQkNfUkVFTlRSQU5UIHx8IEhBVkVfREVDTF9GR0VUU19VTkxPQ0tFRAorKyMgdW5kZWYgZmdldHMKKysjIGRlZmluZSBmZ2V0cyhidWYsIGxlbiwgcykgZmdldHNfdW5sb2NrZWQgKGJ1ZiwgbGVuLCBzKQorKyNlbmRpZgorKyNpZiBkZWZpbmVkIF9MSUJDX1JFRU5UUkFOVCB8fCBIQVZFX0RFQ0xfRkVPRl9VTkxPQ0tFRAorKyMgdW5kZWYgZmVvZgorKyMgZGVmaW5lIGZlb2YocykgZmVvZl91bmxvY2tlZCAocykKKysjZW5kaWYKKyAKKyAKKyBzdHJ1Y3QgYWxpYXNfbWFwCitAQCAtMTI1LDI2ICsxMjcsNDEgQEAKKyB9OworIAorIAorLXN0YXRpYyBzdHJ1Y3QgYWxpYXNfbWFwICptYXA7Cistc3RhdGljIHNpemVfdCBubWFwID0gMDsKKy1zdGF0aWMgc2l6ZV90IG1heG1hcCA9IDA7CisrI2lmbmRlZiBfTElCQworKyMgZGVmaW5lIGxpYmNfZnJlZXJlc19wdHIoZGVjbCkgZGVjbAorKyNlbmRpZgorKworK2xpYmNfZnJlZXJlc19wdHIgKHN0YXRpYyBjaGFyICpzdHJpbmdfc3BhY2UpOworK3N0YXRpYyBzaXplX3Qgc3RyaW5nX3NwYWNlX2FjdDsKKytzdGF0aWMgc2l6ZV90IHN0cmluZ19zcGFjZV9tYXg7CisrbGliY19mcmVlcmVzX3B0ciAoc3RhdGljIHN0cnVjdCBhbGlhc19tYXAgKm1hcCk7Cisrc3RhdGljIHNpemVfdCBubWFwOworK3N0YXRpYyBzaXplX3QgbWF4bWFwOworIAorIAorIC8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCistc3RhdGljIHNpemVfdCByZWFkX2FsaWFzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbmFtZV9sZW4pKTsKKy1zdGF0aWMgdm9pZCBleHRlbmRfYWxpYXNfdGFibGUgUEFSQU1TICgodm9pZCkpOworLXN0YXRpYyBpbnQgYWxpYXNfY29tcGFyZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLAorLQkJCQkgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpKTsKKytzdGF0aWMgc2l6ZV90IHJlYWRfYWxpYXNfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbmFtZV9sZW4pCisrICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKytzdGF0aWMgaW50IGV4dGVuZF9hbGlhc190YWJsZSAodm9pZCk7Cisrc3RhdGljIGludCBhbGlhc19jb21wYXJlIChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLAorKwkJCSAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMik7CisgCisgCisgY29uc3QgY2hhciAqCistX25sX2V4cGFuZF9hbGlhcyAobmFtZSkKKy0gICAgY29uc3QgY2hhciAqbmFtZTsKKytfbmxfZXhwYW5kX2FsaWFzIChjb25zdCBjaGFyICpuYW1lKQorIHsKKy0gIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhbGVfYWxpYXNfcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOworKyAgc3RhdGljIGNvbnN0IGNoYXIgKmxvY2FsZV9hbGlhc19wYXRoOworICAgc3RydWN0IGFsaWFzX21hcCAqcmV0dmFsOworKyAgY29uc3QgY2hhciAqcmVzdWx0ID0gTlVMTDsKKyAgIHNpemVfdCBhZGRlZDsKKyAKKysjaWZkZWYgX0xJQkMKKysgIF9fbGliY19sb2NrX2xvY2sgKGxvY2spOworKyNlbmRpZgorKworKyAgaWYgKGxvY2FsZV9hbGlhc19wYXRoID09IE5VTEwpCisrICAgIGxvY2FsZV9hbGlhc19wYXRoID0gTE9DQUxFX0FMSUFTX1BBVEg7CisrCisgICBkbworICAgICB7CisgICAgICAgc3RydWN0IGFsaWFzX21hcCBpdGVtOworQEAgLTE1NCwxNSArMTcxLDE4IEBACisgICAgICAgaWYgKG5tYXAgPiAwKQorIAlyZXR2YWwgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBic2VhcmNoICgmaXRlbSwgbWFwLCBubWFwLAorIAkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCistCQkJCQkgICAgICAgKGludCAoKikgUEFSQU1TICgoY29uc3Qgdm9pZCAqLAorLQkJCQkJCQkJIGNvbnN0IHZvaWQgKikpCisrCQkJCQkgICAgICAgKGludCAoKikgKGNvbnN0IHZvaWQgKiwKKysJCQkJCQkJIGNvbnN0IHZvaWQgKikKKyAJCQkJCQkpIGFsaWFzX2NvbXBhcmUpOworICAgICAgIGVsc2UKKyAJcmV0dmFsID0gTlVMTDsKKyAKKyAgICAgICAvKiBXZSByZWFsbHkgZm91bmQgYW4gYWxpYXMuICBSZXR1cm4gdGhlIHZhbHVlLiAgKi8KKyAgICAgICBpZiAocmV0dmFsICE9IE5VTEwpCistCXJldHVybiByZXR2YWwtPnZhbHVlOworKwl7CisrCSAgcmVzdWx0ID0gcmV0dmFsLT52YWx1ZTsKKysJICBicmVhazsKKysJfQorIAorICAgICAgIC8qIFBlcmhhcHMgd2UgY2FuIGZpbmQgYW5vdGhlciBhbGlhcyBmaWxlLiAgKi8KKyAgICAgICBhZGRlZCA9IDA7CitAQCAtMTcwLDExICsxOTAsMTIgQEAKKyAJeworIAkgIGNvbnN0IGNoYXIgKnN0YXJ0OworIAorLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSA9PSAnOicpCisrCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdID09IFBBVEhfU0VQQVJBVE9SKQorIAkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKKyAJICBzdGFydCA9IGxvY2FsZV9hbGlhc19wYXRoOworIAorLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICc6JykKKysJICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJ1wwJworKwkJICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9IFBBVEhfU0VQQVJBVE9SKQorIAkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKKyAKKyAJICBpZiAoc3RhcnQgPCBsb2NhbGVfYWxpYXNfcGF0aCkKK0BAIC0xODMsNzggKzIwNCw4NyBAQAorICAgICB9CisgICB3aGlsZSAoYWRkZWQgIT0gMCk7CisgCistICByZXR1cm4gTlVMTDsKKysjaWZkZWYgX0xJQkMKKysgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisrI2VuZGlmCisrCisrICByZXR1cm4gcmVzdWx0OworIH0KKyAKKyAKKyBzdGF0aWMgc2l6ZV90CistcmVhZF9hbGlhc19maWxlIChmbmFtZSwgZm5hbWVfbGVuKQorLSAgICAgY29uc3QgY2hhciAqZm5hbWU7CistICAgICBpbnQgZm5hbWVfbGVuOworK2ludGVybmFsX2Z1bmN0aW9uCisrcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKKyB7CistI2lmbmRlZiBIQVZFX0FMTE9DQQorLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOworLSNlbmRpZgorICAgRklMRSAqZnA7CisgICBjaGFyICpmdWxsX2ZuYW1lOworICAgc2l6ZV90IGFkZGVkOworICAgc3RhdGljIGNvbnN0IGNoYXIgYWxpYXNmaWxlW10gPSAiL2xvY2FsZS5hbGlhcyI7CisgCisgICBmdWxsX2ZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChmbmFtZV9sZW4gKyBzaXplb2YgYWxpYXNmaWxlKTsKKy0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZnVsbF9mbmFtZSk7CisrI2lmZGVmIEhBVkVfTUVNUENQWQorKyAgbWVtcGNweSAobWVtcGNweSAoZnVsbF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbiksCisrCSAgIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7CisrI2Vsc2UKKyAgIG1lbWNweSAoZnVsbF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbik7CisgICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7CisrI2VuZGlmCisgCistICBmcCA9IGZvcGVuIChmdWxsX2ZuYW1lLCAiciIpOworKyAgZnAgPSBmb3BlbiAocmVsb2NhdGUgKGZ1bGxfZm5hbWUpLCAiciIpOworKyAgZnJlZWEgKGZ1bGxfZm5hbWUpOworICAgaWYgKGZwID09IE5VTEwpCistICAgIHsKKy0gICAgICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CistICAgICAgcmV0dXJuIDA7CistICAgIH0KKysgICAgcmV0dXJuIDA7CisrCisrI2lmZGVmIEhBVkVfX19GU0VUTE9DS0lORworKyAgLyogTm8gdGhyZWFkcyBwcmVzZW50LiAgKi8KKysgIF9fZnNldGxvY2tpbmcgKGZwLCBGU0VUTE9DS0lOR19CWUNBTExFUik7CisrI2VuZGlmCisgCisgICBhZGRlZCA9IDA7CistICB3aGlsZSAoIWZlb2YgKGZwKSkKKysgIHdoaWxlICghRkVPRiAoZnApKQorICAgICB7CisgICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCisgCSBhKSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCB0d28gZmllbGRzCisgCSBiKSB0aGVzZSBmaWVsZHMgbXVzdCBiZSB1c2FibGUgYXMgZmlsZSBuYW1lcyBhbmQgc28gbXVzdCBub3QKKyAJICAgIGJlIHRoYXQgbG9uZworLSAgICAgICAqLworLSAgICAgIGNoYXIgYnVmW0JVRlNJWl07CisrCSBXZSBhdm9pZCBhIG11bHRpLWtpbG9ieXRlIGJ1ZmZlciBoZXJlIHNpbmNlIHRoaXMgd291bGQgdXNlIHVwCisrCSBzdGFjayBzcGFjZSB3aGljaCB3ZSBtaWdodCBub3QgaGF2ZSBpZiB0aGUgcHJvZ3JhbSByYW4gb3V0IG9mCisrCSBtZW1vcnkuICAqLworKyAgICAgIGNoYXIgYnVmWzQwMF07CisgICAgICAgY2hhciAqYWxpYXM7CisgICAgICAgY2hhciAqdmFsdWU7CisgICAgICAgY2hhciAqY3A7CisgCistICAgICAgaWYgKGZnZXRzIChidWYsIEJVRlNJWiwgZnApID09IE5VTEwpCisrICAgICAgaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQorIAkvKiBFT0YgcmVhY2hlZC4gICovCisgCWJyZWFrOworIAorICAgICAgIGNwID0gYnVmOworICAgICAgIC8qIElnbm9yZSBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KKy0gICAgICB3aGlsZSAoaXNzcGFjZSAoY3BbMF0pKQorKyAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQorIAkrK2NwOworIAorICAgICAgIC8qIEEgbGVhZGluZyAnIycgc2lnbmFscyBhIGNvbW1lbnQgbGluZS4gICovCisgICAgICAgaWYgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJyMnKQorIAl7CisgCSAgYWxpYXMgPSBjcCsrOworLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCisrCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCisgCSAgICArK2NwOworIAkgIC8qIFRlcm1pbmF0ZSBhbGlhcyBuYW1lLiAgKi8KKyAJICBpZiAoY3BbMF0gIT0gJ1wwJykKKyAJICAgICpjcCsrID0gJ1wwJzsKKyAKKyAJICAvKiBOb3cgbG9vayBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmFsdWUuICAqLworLQkgIHdoaWxlIChpc3NwYWNlIChjcFswXSkpCisrCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCisgCSAgICArK2NwOworIAorIAkgIGlmIChjcFswXSAhPSAnXDAnKQorIAkgICAgeworLQkgICAgICBjaGFyICp0cDsKKy0JICAgICAgc2l6ZV90IGxlbjsKKysJICAgICAgc2l6ZV90IGFsaWFzX2xlbjsKKysJICAgICAgc2l6ZV90IHZhbHVlX2xlbjsKKyAKKyAJICAgICAgdmFsdWUgPSBjcCsrOworLQkgICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoY3BbMF0pKQorKwkgICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKKyAJCSsrY3A7CisgCSAgICAgIC8qIFRlcm1pbmF0ZSB2YWx1ZS4gICovCisgCSAgICAgIGlmIChjcFswXSA9PSAnXG4nKQorQEAgLTI2OSwyOCArMjk5LDQ0IEBACisgCQkqY3ArKyA9ICdcMCc7CisgCisgCSAgICAgIGlmIChubWFwID49IG1heG1hcCkKKy0JCWV4dGVuZF9hbGlhc190YWJsZSAoKTsKKy0KKy0JICAgICAgLyogV2UgY2Fubm90IGRlcGVuZCBvbiBzdHJkdXAgYXZhaWxhYmxlIGluIHRoZSBsaWJjLiAgU2lnaCEgICovCistCSAgICAgIGxlbiA9IHN0cmxlbiAoYWxpYXMpICsgMTsKKy0JICAgICAgdHAgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CistCSAgICAgIGlmICh0cCA9PSBOVUxMKQorLQkJeworLQkJICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CisrCQlpZiAoX19idWlsdGluX2V4cGVjdCAoZXh0ZW5kX2FsaWFzX3RhYmxlICgpLCAwKSkKKyAJCSAgcmV0dXJuIGFkZGVkOworLQkJfQorLQkgICAgICBtZW1jcHkgKHRwLCBhbGlhcywgbGVuKTsKKy0JICAgICAgbWFwW25tYXBdLmFsaWFzID0gdHA7CisgCistCSAgICAgIGxlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKKy0JICAgICAgdHAgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CistCSAgICAgIGlmICh0cCA9PSBOVUxMKQorKwkgICAgICBhbGlhc19sZW4gPSBzdHJsZW4gKGFsaWFzKSArIDE7CisrCSAgICAgIHZhbHVlX2xlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKKysKKysJICAgICAgaWYgKHN0cmluZ19zcGFjZV9hY3QgKyBhbGlhc19sZW4gKyB2YWx1ZV9sZW4gPiBzdHJpbmdfc3BhY2VfbWF4KQorIAkJeworLQkJICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CistCQkgIHJldHVybiBhZGRlZDsKKysJCSAgLyogSW5jcmVhc2Ugc2l6ZSBvZiBtZW1vcnkgcG9vbC4gICovCisrCQkgIHNpemVfdCBuZXdfc2l6ZSA9IChzdHJpbmdfc3BhY2VfbWF4CisrCQkJCSAgICAgKyAoYWxpYXNfbGVuICsgdmFsdWVfbGVuID4gMTAyNAorKwkJCQkJPyBhbGlhc19sZW4gKyB2YWx1ZV9sZW4gOiAxMDI0KSk7CisrCQkgIGNoYXIgKm5ld19wb29sID0gKGNoYXIgKikgcmVhbGxvYyAoc3RyaW5nX3NwYWNlLCBuZXdfc2l6ZSk7CisrCQkgIGlmIChuZXdfcG9vbCA9PSBOVUxMKQorKwkJICAgIHJldHVybiBhZGRlZDsKKysKKysJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHN0cmluZ19zcGFjZSAhPSBuZXdfcG9vbCwgMCkpCisrCQkgICAgeworKwkJICAgICAgc2l6ZV90IGk7CisrCisrCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgbm1hcDsgaSsrKQorKwkJCXsKKysJCQkgIG1hcFtpXS5hbGlhcyArPSBuZXdfcG9vbCAtIHN0cmluZ19zcGFjZTsKKysJCQkgIG1hcFtpXS52YWx1ZSArPSBuZXdfcG9vbCAtIHN0cmluZ19zcGFjZTsKKysJCQl9CisrCQkgICAgfQorKworKwkJICBzdHJpbmdfc3BhY2UgPSBuZXdfcG9vbDsKKysJCSAgc3RyaW5nX3NwYWNlX21heCA9IG5ld19zaXplOworIAkJfQorLQkgICAgICBtZW1jcHkgKHRwLCB2YWx1ZSwgbGVuKTsKKy0JICAgICAgbWFwW25tYXBdLnZhbHVlID0gdHA7CisrCisrCSAgICAgIG1hcFtubWFwXS5hbGlhcyA9IG1lbWNweSAoJnN0cmluZ19zcGFjZVtzdHJpbmdfc3BhY2VfYWN0XSwKKysJCQkJCWFsaWFzLCBhbGlhc19sZW4pOworKwkgICAgICBzdHJpbmdfc3BhY2VfYWN0ICs9IGFsaWFzX2xlbjsKKysKKysJICAgICAgbWFwW25tYXBdLnZhbHVlID0gbWVtY3B5ICgmc3RyaW5nX3NwYWNlW3N0cmluZ19zcGFjZV9hY3RdLAorKwkJCQkJdmFsdWUsIHZhbHVlX2xlbik7CisrCSAgICAgIHN0cmluZ19zcGFjZV9hY3QgKz0gdmFsdWVfbGVuOworIAorIAkgICAgICArK25tYXA7CisgCSAgICAgICsrYWRkZWQ7CitAQCAtMjk5LDE0ICszNDUsMTEgQEAKKyAKKyAgICAgICAvKiBQb3NzaWJseSBub3QgdGhlIHdob2xlIGxpbmUgZml0cyBpbnRvIHRoZSBidWZmZXIuICBJZ25vcmUKKyAJIHRoZSByZXN0IG9mIHRoZSBsaW5lLiAgKi8KKy0gICAgICB3aGlsZSAoc3RyY2hyIChjcCwgJ1xuJykgPT0gTlVMTCkKKy0JeworLQkgIGNwID0gYnVmOworLQkgIGlmIChmZ2V0cyAoYnVmLCBCVUZTSVosIGZwKSA9PSBOVUxMKQorLQkgICAgLyogTWFrZSBzdXJlIHRoZSBpbm5lciBsb29wIHdpbGwgYmUgbGVmdC4gIFRoZSBvdXRlciBsb29wCistCSAgICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KKy0JICAgICpjcCA9ICdcbic7CistCX0KKysgICAgICB3aGlsZSAoc3RyY2hyIChidWYsICdcbicpID09IE5VTEwpCisrCWlmIChGR0VUUyAoYnVmLCBzaXplb2YgYnVmLCBmcCkgPT0gTlVMTCkKKysJICAvKiBNYWtlIHN1cmUgdGhlIGlubmVyIGxvb3Agd2lsbCBiZSBsZWZ0LiAgVGhlIG91dGVyIGxvb3AKKysJICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KKysJICBicmVhazsKKyAgICAgfQorIAorICAgLyogU2hvdWxkIHdlIHRlc3QgZm9yIGZlcnJvcigpPyAgSSB0aGluayB3ZSBoYXZlIHRvIHNpbGVudGx5IGlnbm9yZQorQEAgLTMxNSw0MCArMzU4LDMzIEBACisgCisgICBpZiAoYWRkZWQgPiAwKQorICAgICBxc29ydCAobWFwLCBubWFwLCBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAorLQkgICAoaW50ICgqKSBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpKSBhbGlhc19jb21wYXJlKTsKKysJICAgKGludCAoKikgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgYWxpYXNfY29tcGFyZSk7CisgCistICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CisgICByZXR1cm4gYWRkZWQ7CisgfQorIAorIAorLXN0YXRpYyB2b2lkCisrc3RhdGljIGludAorIGV4dGVuZF9hbGlhc190YWJsZSAoKQorIHsKKyAgIHNpemVfdCBuZXdfc2l6ZTsKKyAgIHN0cnVjdCBhbGlhc19tYXAgKm5ld19tYXA7CisgCisgICBuZXdfc2l6ZSA9IG1heG1hcCA9PSAwID8gMTAwIDogMiAqIG1heG1hcDsKKy0gIG5ld19tYXAgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBtYWxsb2MgKG5ld19zaXplCistCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKKysgIG5ld19tYXAgPSAoc3RydWN0IGFsaWFzX21hcCAqKSByZWFsbG9jIChtYXAsIChuZXdfc2l6ZQorKwkJCQkJCSogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSkpOworICAgaWYgKG5ld19tYXAgPT0gTlVMTCkKKyAgICAgLyogU2ltcGx5IGRvbid0IGV4dGVuZDogd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBjb3JlLiAgKi8KKy0gICAgcmV0dXJuOworLQorLSAgbWVtY3B5IChuZXdfbWFwLCBtYXAsIG5tYXAgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKKy0KKy0gIGlmIChtYXhtYXAgIT0gMCkKKy0gICAgZnJlZSAobWFwKTsKKysgICAgcmV0dXJuIC0xOworIAorICAgbWFwID0gbmV3X21hcDsKKyAgIG1heG1hcCA9IG5ld19zaXplOworKyAgcmV0dXJuIDA7CisgfQorIAorIAorIHN0YXRpYyBpbnQKKy1hbGlhc19jb21wYXJlIChtYXAxLCBtYXAyKQorLSAgICAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMTsKKy0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDI7CisrYWxpYXNfY29tcGFyZSAoY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMSwgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMikKKyB7CisgI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkNBU0VDTVAKKyAgIHJldHVybiBzdHJjYXNlY21wIChtYXAxLT5hbGlhcywgbWFwMi0+YWxpYXMpOworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xvY2FsZW5hbWUuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2NhbGVuYW1lLmMJMjAwNC0wOS0xMiAxNDo0MDozNC41MTA3MjQ1MjggLTA0MDAKK0BAIC0wLDAgKzEsMTE0MiBAQAorKy8qIERldGVybWluZSB0aGUgY3VycmVudCBzZWxlY3RlZCBsb2NhbGUuCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgYW55IGxhdGVyIHZlcnNpb24uCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisrCisrLyogV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUub3JnPiwgMTk5NS4gICovCisrLyogV2luMzIgY29kZSB3cml0dGVuIGJ5IFRvciBMaWxscXZpc3QgPHRtbEBpa2kuZmk+LiAgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisrI2VuZGlmCisrCisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxsb2NhbGUuaD4KKysKKysjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KKysjIHVuZGVmIFdJTjMyICAgLyogYXZvaWQgd2FybmluZyBvbiBtaW5ndzMyICovCisrIyBkZWZpbmUgV0lOMzIKKysjZW5kaWYKKysKKysjaWZkZWYgV0lOMzIKKysjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisrIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisrLyogTGlzdCBvZiBsYW5ndWFnZSBjb2Rlcywgc29ydGVkIGJ5IHZhbHVlOgorKyAgIDB4MDEgTEFOR19BUkFCSUMKKysgICAweDAyIExBTkdfQlVMR0FSSUFOCisrICAgMHgwMyBMQU5HX0NBVEFMQU4KKysgICAweDA0IExBTkdfQ0hJTkVTRQorKyAgIDB4MDUgTEFOR19DWkVDSAorKyAgIDB4MDYgTEFOR19EQU5JU0gKKysgICAweDA3IExBTkdfR0VSTUFOCisrICAgMHgwOCBMQU5HX0dSRUVLCisrICAgMHgwOSBMQU5HX0VOR0xJU0gKKysgICAweDBhIExBTkdfU1BBTklTSAorKyAgIDB4MGIgTEFOR19GSU5OSVNICisrICAgMHgwYyBMQU5HX0ZSRU5DSAorKyAgIDB4MGQgTEFOR19IRUJSRVcKKysgICAweDBlIExBTkdfSFVOR0FSSUFOCisrICAgMHgwZiBMQU5HX0lDRUxBTkRJQworKyAgIDB4MTAgTEFOR19JVEFMSUFOCisrICAgMHgxMSBMQU5HX0pBUEFORVNFCisrICAgMHgxMiBMQU5HX0tPUkVBTgorKyAgIDB4MTMgTEFOR19EVVRDSAorKyAgIDB4MTQgTEFOR19OT1JXRUdJQU4KKysgICAweDE1IExBTkdfUE9MSVNICisrICAgMHgxNiBMQU5HX1BPUlRVR1VFU0UKKysgICAweDE3IExBTkdfUkhBRVRPX1JPTUFOQ0UKKysgICAweDE4IExBTkdfUk9NQU5JQU4KKysgICAweDE5IExBTkdfUlVTU0lBTgorKyAgIDB4MWEgTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KKysgICAweDFiIExBTkdfU0xPVkFLCisrICAgMHgxYyBMQU5HX0FMQkFOSUFOCisrICAgMHgxZCBMQU5HX1NXRURJU0gKKysgICAweDFlIExBTkdfVEhBSQorKyAgIDB4MWYgTEFOR19UVVJLSVNICisrICAgMHgyMCBMQU5HX1VSRFUKKysgICAweDIxIExBTkdfSU5ET05FU0lBTgorKyAgIDB4MjIgTEFOR19VS1JBSU5JQU4KKysgICAweDIzIExBTkdfQkVMQVJVU0lBTgorKyAgIDB4MjQgTEFOR19TTE9WRU5JQU4KKysgICAweDI1IExBTkdfRVNUT05JQU4KKysgICAweDI2IExBTkdfTEFUVklBTgorKyAgIDB4MjcgTEFOR19MSVRIVUFOSUFOCisrICAgMHgyOCBMQU5HX1RBSklLCisrICAgMHgyOSBMQU5HX0ZBUlNJCisrICAgMHgyYSBMQU5HX1ZJRVROQU1FU0UKKysgICAweDJiIExBTkdfQVJNRU5JQU4KKysgICAweDJjIExBTkdfQVpFUkkKKysgICAweDJkIExBTkdfQkFTUVVFCisrICAgMHgyZSBMQU5HX1NPUkJJQU4KKysgICAweDJmIExBTkdfTUFDRURPTklBTgorKyAgIDB4MzAgTEFOR19TVVRVCisrICAgMHgzMSBMQU5HX1RTT05HQQorKyAgIDB4MzIgTEFOR19UU1dBTkEKKysgICAweDMzIExBTkdfVkVOREEKKysgICAweDM0IExBTkdfWEhPU0EKKysgICAweDM1IExBTkdfWlVMVQorKyAgIDB4MzYgTEFOR19BRlJJS0FBTlMKKysgICAweDM3IExBTkdfR0VPUkdJQU4KKysgICAweDM4IExBTkdfRkFFUk9FU0UKKysgICAweDM5IExBTkdfSElOREkKKysgICAweDNhIExBTkdfTUFMVEVTRQorKyAgIDB4M2IgTEFOR19TQUFNSQorKyAgIDB4M2MgTEFOR19HQUVMSUMKKysgICAweDNkIExBTkdfWUlERElTSAorKyAgIDB4M2UgTEFOR19NQUxBWQorKyAgIDB4M2YgTEFOR19LQVpBSworKyAgIDB4NDAgTEFOR19LWVJHWVoKKysgICAweDQxIExBTkdfU1dBSElMSQorKyAgIDB4NDIgTEFOR19UVVJLTUVOCisrICAgMHg0MyBMQU5HX1VaQkVLCisrICAgMHg0NCBMQU5HX1RBVEFSCisrICAgMHg0NSBMQU5HX0JFTkdBTEkKKysgICAweDQ2IExBTkdfUFVOSkFCSQorKyAgIDB4NDcgTEFOR19HVUpBUkFUSQorKyAgIDB4NDggTEFOR19PUklZQQorKyAgIDB4NDkgTEFOR19UQU1JTAorKyAgIDB4NGEgTEFOR19URUxVR1UKKysgICAweDRiIExBTkdfS0FOTkFEQQorKyAgIDB4NGMgTEFOR19NQUxBWUFMQU0KKysgICAweDRkIExBTkdfQVNTQU1FU0UKKysgICAweDRlIExBTkdfTUFSQVRISQorKyAgIDB4NGYgTEFOR19TQU5TS1JJVAorKyAgIDB4NTAgTEFOR19NT05HT0xJQU4KKysgICAweDUxIExBTkdfVElCRVRBTgorKyAgIDB4NTIgTEFOR19XRUxTSAorKyAgIDB4NTMgTEFOR19DQU1CT0RJQU4KKysgICAweDU0IExBTkdfTEFPCisrICAgMHg1NSBMQU5HX0JVUk1FU0UKKysgICAweDU2IExBTkdfR0FMSUNJQU4KKysgICAweDU3IExBTkdfS09OS0FOSQorKyAgIDB4NTggTEFOR19NQU5JUFVSSQorKyAgIDB4NTkgTEFOR19TSU5ESEkKKysgICAweDVhIExBTkdfU1lSSUFDCisrICAgMHg1YiBMQU5HX1NJTkhBTEVTRQorKyAgIDB4NWMgTEFOR19DSEVST0tFRQorKyAgIDB4NWQgTEFOR19JTlVLVElUVVQKKysgICAweDVlIExBTkdfQU1IQVJJQworKyAgIDB4NWYgTEFOR19UQU1BWklHSFQKKysgICAweDYwIExBTkdfS0FTSE1JUkkKKysgICAweDYxIExBTkdfTkVQQUxJCisrICAgMHg2MiBMQU5HX0ZSSVNJQU4KKysgICAweDYzIExBTkdfUEFTSFRPCisrICAgMHg2NCBMQU5HX1RBR0FMT0cKKysgICAweDY1IExBTkdfRElWRUhJCisrICAgMHg2NiBMQU5HX0VETworKyAgIDB4NjcgTEFOR19GVUxGVUxERQorKyAgIDB4NjggTEFOR19IQVVTQQorKyAgIDB4NjkgTEFOR19JQklCSU8KKysgICAweDZhIExBTkdfWU9SVUJBCisrICAgMHg3MCBMQU5HX0lHQk8KKysgICAweDcxIExBTkdfS0FOVVJJCisrICAgMHg3MiBMQU5HX09ST01PCisrICAgMHg3MyBMQU5HX1RJR1JJTllBCisrICAgMHg3NCBMQU5HX0dVQVJBTkkKKysgICAweDc1IExBTkdfSEFXQUlJQU4KKysgICAweDc2IExBTkdfTEFUSU4KKysgICAweDc3IExBTkdfU09NQUxJCisrICAgMHg3OCBMQU5HX1lJCisrICAgMHg3OSBMQU5HX1BBUElBTUVOVFUKKysqLworKy8qIE1pbmd3IGhlYWRlcnMgZG9uJ3QgaGF2ZSBsYXRlc3QgbGFuZ3VhZ2UgYW5kIHN1Ymxhbmd1YWdlIGNvZGVzLiAgKi8KKysjIGlmbmRlZiBMQU5HX0FGUklLQUFOUworKyMgZGVmaW5lIExBTkdfQUZSSUtBQU5TIDB4MzYKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19BTEJBTklBTgorKyMgZGVmaW5lIExBTkdfQUxCQU5JQU4gMHgxYworKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0FNSEFSSUMKKysjIGRlZmluZSBMQU5HX0FNSEFSSUMgMHg1ZQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0FSQUJJQworKyMgZGVmaW5lIExBTkdfQVJBQklDIDB4MDEKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19BUk1FTklBTgorKyMgZGVmaW5lIExBTkdfQVJNRU5JQU4gMHgyYgorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0FTU0FNRVNFCisrIyBkZWZpbmUgTEFOR19BU1NBTUVTRSAweDRkCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfQVpFUkkKKysjIGRlZmluZSBMQU5HX0FaRVJJIDB4MmMKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19CQVNRVUUKKysjIGRlZmluZSBMQU5HX0JBU1FVRSAweDJkCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfQkVMQVJVU0lBTgorKyMgZGVmaW5lIExBTkdfQkVMQVJVU0lBTiAweDIzCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfQkVOR0FMSQorKyMgZGVmaW5lIExBTkdfQkVOR0FMSSAweDQ1CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfQlVSTUVTRQorKyMgZGVmaW5lIExBTkdfQlVSTUVTRSAweDU1CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfQ0FNQk9ESUFOCisrIyBkZWZpbmUgTEFOR19DQU1CT0RJQU4gMHg1MworKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0NBVEFMQU4KKysjIGRlZmluZSBMQU5HX0NBVEFMQU4gMHgwMworKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0NIRVJPS0VFCisrIyBkZWZpbmUgTEFOR19DSEVST0tFRSAweDVjCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfRElWRUhJCisrIyBkZWZpbmUgTEFOR19ESVZFSEkgMHg2NQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0VETworKyMgZGVmaW5lIExBTkdfRURPIDB4NjYKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19FU1RPTklBTgorKyMgZGVmaW5lIExBTkdfRVNUT05JQU4gMHgyNQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0ZBRVJPRVNFCisrIyBkZWZpbmUgTEFOR19GQUVST0VTRSAweDM4CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfRkFSU0kKKysjIGRlZmluZSBMQU5HX0ZBUlNJIDB4MjkKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19GUklTSUFOCisrIyBkZWZpbmUgTEFOR19GUklTSUFOIDB4NjIKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19GVUxGVUxERQorKyMgZGVmaW5lIExBTkdfRlVMRlVMREUgMHg2NworKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0dBRUxJQworKyMgZGVmaW5lIExBTkdfR0FFTElDIDB4M2MKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19HQUxJQ0lBTgorKyMgZGVmaW5lIExBTkdfR0FMSUNJQU4gMHg1NgorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0dFT1JHSUFOCisrIyBkZWZpbmUgTEFOR19HRU9SR0lBTiAweDM3CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfR1VBUkFOSQorKyMgZGVmaW5lIExBTkdfR1VBUkFOSSAweDc0CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfR1VKQVJBVEkKKysjIGRlZmluZSBMQU5HX0dVSkFSQVRJIDB4NDcKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19IQVVTQQorKyMgZGVmaW5lIExBTkdfSEFVU0EgMHg2OAorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0hBV0FJSUFOCisrIyBkZWZpbmUgTEFOR19IQVdBSUlBTiAweDc1CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfSEVCUkVXCisrIyBkZWZpbmUgTEFOR19IRUJSRVcgMHgwZAorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0hJTkRJCisrIyBkZWZpbmUgTEFOR19ISU5ESSAweDM5CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfSUJJQklPCisrIyBkZWZpbmUgTEFOR19JQklCSU8gMHg2OQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0lHQk8KKysjIGRlZmluZSBMQU5HX0lHQk8gMHg3MAorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0lORE9ORVNJQU4KKysjIGRlZmluZSBMQU5HX0lORE9ORVNJQU4gMHgyMQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0lOVUtUSVRVVAorKyMgZGVmaW5lIExBTkdfSU5VS1RJVFVUIDB4NWQKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19LQU5OQURBCisrIyBkZWZpbmUgTEFOR19LQU5OQURBIDB4NGIKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19LQU5VUkkKKysjIGRlZmluZSBMQU5HX0tBTlVSSSAweDcxCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfS0FTSE1JUkkKKysjIGRlZmluZSBMQU5HX0tBU0hNSVJJIDB4NjAKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19LQVpBSworKyMgZGVmaW5lIExBTkdfS0FaQUsgMHgzZgorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0tPTktBTkkKKysjIGRlZmluZSBMQU5HX0tPTktBTkkgMHg1NworKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX0tZUkdZWgorKyMgZGVmaW5lIExBTkdfS1lSR1laIDB4NDAKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19MQU8KKysjIGRlZmluZSBMQU5HX0xBTyAweDU0CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfTEFUSU4KKysjIGRlZmluZSBMQU5HX0xBVElOIDB4NzYKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19MQVRWSUFOCisrIyBkZWZpbmUgTEFOR19MQVRWSUFOIDB4MjYKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19MSVRIVUFOSUFOCisrIyBkZWZpbmUgTEFOR19MSVRIVUFOSUFOIDB4MjcKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19NQUNFRE9OSUFOCisrIyBkZWZpbmUgTEFOR19NQUNFRE9OSUFOIDB4MmYKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19NQUxBWQorKyMgZGVmaW5lIExBTkdfTUFMQVkgMHgzZQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX01BTEFZQUxBTQorKyMgZGVmaW5lIExBTkdfTUFMQVlBTEFNIDB4NGMKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19NQUxURVNFCisrIyBkZWZpbmUgTEFOR19NQUxURVNFIDB4M2EKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19NQU5JUFVSSQorKyMgZGVmaW5lIExBTkdfTUFOSVBVUkkgMHg1OAorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX01BUkFUSEkKKysjIGRlZmluZSBMQU5HX01BUkFUSEkgMHg0ZQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX01PTkdPTElBTgorKyMgZGVmaW5lIExBTkdfTU9OR09MSUFOIDB4NTAKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19ORVBBTEkKKysjIGRlZmluZSBMQU5HX05FUEFMSSAweDYxCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfT1JJWUEKKysjIGRlZmluZSBMQU5HX09SSVlBIDB4NDgKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19PUk9NTworKyMgZGVmaW5lIExBTkdfT1JPTU8gMHg3MgorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1BBUElBTUVOVFUKKysjIGRlZmluZSBMQU5HX1BBUElBTUVOVFUgMHg3OQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1BBU0hUTworKyMgZGVmaW5lIExBTkdfUEFTSFRPIDB4NjMKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19QVU5KQUJJCisrIyBkZWZpbmUgTEFOR19QVU5KQUJJIDB4NDYKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19SSEFFVE9fUk9NQU5DRQorKyMgZGVmaW5lIExBTkdfUkhBRVRPX1JPTUFOQ0UgMHgxNworKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1NBQU1JCisrIyBkZWZpbmUgTEFOR19TQUFNSSAweDNiCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfU0FOU0tSSVQKKysjIGRlZmluZSBMQU5HX1NBTlNLUklUIDB4NGYKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19TRVJCSUFOCisrIyBkZWZpbmUgTEFOR19TRVJCSUFOIDB4MWEKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19TSU5ESEkKKysjIGRlZmluZSBMQU5HX1NJTkRISSAweDU5CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfU0lOSEFMRVNFCisrIyBkZWZpbmUgTEFOR19TSU5IQUxFU0UgMHg1YgorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1NMT1ZBSworKyMgZGVmaW5lIExBTkdfU0xPVkFLIDB4MWIKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19TT01BTEkKKysjIGRlZmluZSBMQU5HX1NPTUFMSSAweDc3CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfU09SQklBTgorKyMgZGVmaW5lIExBTkdfU09SQklBTiAweDJlCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfU1VUVQorKyMgZGVmaW5lIExBTkdfU1VUVSAweDMwCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfU1dBSElMSQorKyMgZGVmaW5lIExBTkdfU1dBSElMSSAweDQxCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfU1lSSUFDCisrIyBkZWZpbmUgTEFOR19TWVJJQUMgMHg1YQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1RBR0FMT0cKKysjIGRlZmluZSBMQU5HX1RBR0FMT0cgMHg2NAorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1RBSklLCisrIyBkZWZpbmUgTEFOR19UQUpJSyAweDI4CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfVEFNQVpJR0hUCisrIyBkZWZpbmUgTEFOR19UQU1BWklHSFQgMHg1ZgorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1RBTUlMCisrIyBkZWZpbmUgTEFOR19UQU1JTCAweDQ5CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfVEFUQVIKKysjIGRlZmluZSBMQU5HX1RBVEFSIDB4NDQKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19URUxVR1UKKysjIGRlZmluZSBMQU5HX1RFTFVHVSAweDRhCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfVEhBSQorKyMgZGVmaW5lIExBTkdfVEhBSSAweDFlCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfVElCRVRBTgorKyMgZGVmaW5lIExBTkdfVElCRVRBTiAweDUxCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfVElHUklOWUEKKysjIGRlZmluZSBMQU5HX1RJR1JJTllBIDB4NzMKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19UU09OR0EKKysjIGRlZmluZSBMQU5HX1RTT05HQSAweDMxCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfVFNXQU5BCisrIyBkZWZpbmUgTEFOR19UU1dBTkEgMHgzMgorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1RVUktNRU4KKysjIGRlZmluZSBMQU5HX1RVUktNRU4gMHg0MgorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1VLUkFJTklBTgorKyMgZGVmaW5lIExBTkdfVUtSQUlOSUFOIDB4MjIKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19VUkRVCisrIyBkZWZpbmUgTEFOR19VUkRVIDB4MjAKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19VWkJFSworKyMgZGVmaW5lIExBTkdfVVpCRUsgMHg0MworKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1ZFTkRBCisrIyBkZWZpbmUgTEFOR19WRU5EQSAweDMzCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfVklFVE5BTUVTRQorKyMgZGVmaW5lIExBTkdfVklFVE5BTUVTRSAweDJhCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfV0VMU0gKKysjIGRlZmluZSBMQU5HX1dFTFNIIDB4NTIKKysjIGVuZGlmCisrIyBpZm5kZWYgTEFOR19YSE9TQQorKyMgZGVmaW5lIExBTkdfWEhPU0EgMHgzNAorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1lJCisrIyBkZWZpbmUgTEFOR19ZSSAweDc4CisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfWUlERElTSAorKyMgZGVmaW5lIExBTkdfWUlERElTSCAweDNkCisrIyBlbmRpZgorKyMgaWZuZGVmIExBTkdfWU9SVUJBCisrIyBkZWZpbmUgTEFOR19ZT1JVQkEgMHg2YQorKyMgZW5kaWYKKysjIGlmbmRlZiBMQU5HX1pVTFUKKysjIGRlZmluZSBMQU5HX1pVTFUgMHgzNQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUEKKysjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUEgMHgwMQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19JUkFRCisrIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfSVJBUSAweDAyCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0VHWVBUCisrIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfRUdZUFQgMHgwMworKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19MSUJZQQorKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0xJQllBIDB4MDQKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfQUxHRVJJQQorKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0FMR0VSSUEgMHgwNQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19NT1JPQ0NPCisrIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTU9ST0NDTyAweDA2CisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1RVTklTSUEKKysjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBIDB4MDcKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfT01BTgorKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX09NQU4gMHgwOAorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19ZRU1FTgorKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1lFTUVOIDB4MDkKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfU1lSSUEKKysjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19TWVJJQSAweDBhCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0pPUkRBTgorKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0pPUkRBTiAweDBiCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0xFQkFOT04KKysjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OIDB4MGMKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfS1VXQUlUCisrIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfS1VXQUlUIDB4MGQKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfVUFFCisrIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfVUFFIDB4MGUKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfQkFIUkFJTgorKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0JBSFJBSU4gMHgwZgorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19RQVRBUgorKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1FBVEFSIDB4MTAKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19BWkVSSV9MQVRJTgorKyMgZGVmaW5lIFNVQkxBTkdfQVpFUklfTEFUSU4gMHgwMQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0FaRVJJX0NZUklMTElDCisrIyBkZWZpbmUgU1VCTEFOR19BWkVSSV9DWVJJTExJQyAweDAyCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfQkVOR0FMSV9JTkRJQQorKyMgZGVmaW5lIFNVQkxBTkdfQkVOR0FMSV9JTkRJQSAweDAwCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNICisrIyBkZWZpbmUgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0ggMHgwMQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0NISU5FU0VfTUFDQVUKKysjIGRlZmluZSBTVUJMQU5HX0NISU5FU0VfTUFDQVUgMHgwNQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfU09VVEhfQUZSSUNBCisrIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1NPVVRIX0FGUklDQSAweDA3CisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBCisrIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EgMHgwOAorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOCisrIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0NBUklCQkVBTiAweDA5CisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUKKysjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfQkVMSVpFIDB4MGEKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFECisrIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEIDB4MGIKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1pJTUJBQldFCisrIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1pJTUJBQldFIDB4MGMKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTCisrIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTIDB4MGQKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQQorKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9JTkRPTkVTSUEgMHgwZQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkcKKysjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkcgMHgwZgorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSU5ESUEKKysjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSU5ESUEgMHgxMAorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfTUFMQVlTSUEKKysjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfTUFMQVlTSUEgMHgxMQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFCisrIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1NJTkdBUE9SRSAweDEyCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0xVWEVNQk9VUkcKKysjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHIDB4MDUKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTU9OQUNPCisrIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTU9OQUNPIDB4MDYKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUworKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1dFU1RJTkRJRVMgMHgwNworKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9SRVVOSU9OCisrIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfUkVVTklPTiAweDA4CisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NPTkdPCisrIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfQ09OR08gMHgwOQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMCisrIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfU0VORUdBTCAweDBhCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OCisrIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfQ0FNRVJPT04gMHgwYgorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRQorKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFIDB4MGMKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTUFMSQorKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01BTEkgMHgwZAorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NT1JPQ0NPCisrIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTU9ST0NDTyAweDBlCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0hBSVRJCisrIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfSEFJVEkgMHgwZgorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHCisrIyBkZWZpbmUgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRyAweDA0CisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU4KKysjIGRlZmluZSBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOIDB4MDUKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19LQVNITUlSSV9JTkRJQQorKyMgZGVmaW5lIFNVQkxBTkdfS0FTSE1JUklfSU5ESUEgMHgwMgorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX01BTEFZX01BTEFZU0lBCisrIyBkZWZpbmUgU1VCTEFOR19NQUxBWV9NQUxBWVNJQSAweDAxCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0KKysjIGRlZmluZSBTVUJMQU5HX01BTEFZX0JSVU5FSV9EQVJVU1NBTEFNIDB4MDIKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19ORVBBTElfSU5ESUEKKysjIGRlZmluZSBTVUJMQU5HX05FUEFMSV9JTkRJQSAweDAyCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfUFVOSkFCSV9JTkRJQQorKyMgZGVmaW5lIFNVQkxBTkdfUFVOSkFCSV9JTkRJQSAweDAwCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTgorKyMgZGVmaW5lIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTiAweDAxCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQQorKyMgZGVmaW5lIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQSAweDAwCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfUk9NQU5JQU5fTU9MRE9WQQorKyMgZGVmaW5lIFNVQkxBTkdfUk9NQU5JQU5fTU9MRE9WQSAweDAxCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfU0VSQklBTl9MQVRJTgorKyMgZGVmaW5lIFNVQkxBTkdfU0VSQklBTl9MQVRJTiAweDAyCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQworKyMgZGVmaW5lIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAweDAzCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfU0lOREhJX0lORElBCisrIyBkZWZpbmUgU1VCTEFOR19TSU5ESElfSU5ESUEgMHgwMAorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTgorKyMgZGVmaW5lIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOIDB4MDEKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQQorKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9HVUFURU1BTEEgMHgwNAorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQQorKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT1NUQV9SSUNBIDB4MDUKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BBTkFNQQorKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QQU5BTUEgMHgwNgorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDCisrIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTl9SRVBVQkxJQyAweDA3CisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEEKKysjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBIDB4MDgKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBCisrIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBIDB4MDkKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BFUlUKKysjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEVSVSAweDBhCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEKKysjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQVJHRU5USU5BIDB4MGIKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IKKysjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUiAweDBjCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DSElMRQorKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DSElMRSAweDBkCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZCisrIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkgMHgwZQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkKKysjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkgMHgwZgorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQQorKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBIDB4MTAKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SCisrIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SIDB4MTEKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTCisrIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTIDB4MTIKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQQorKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9OSUNBUkFHVUEgMHgxMworKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08KKysjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08gMHgxNAorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX1NXRURJU0hfRklOTEFORAorKyMgZGVmaW5lIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5EIDB4MDIKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19UQU1BWklHSFRfQVJBQklDCisrIyBkZWZpbmUgU1VCTEFOR19UQU1BWklHSFRfQVJBQklDIDB4MDEKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19UQU1BWklHSFRfTEFUSU4KKysjIGRlZmluZSBTVUJMQU5HX1RBTUFaSUdIVF9MQVRJTiAweDAyCisrIyBlbmRpZgorKyMgaWZuZGVmIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUEKKysjIGRlZmluZSBTVUJMQU5HX1RJR1JJTllBX0VUSElPUElBIDB4MDAKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBCisrIyBkZWZpbmUgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBIDB4MDEKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19VUkRVX1BBS0lTVEFOCisrIyBkZWZpbmUgU1VCTEFOR19VUkRVX1BBS0lTVEFOIDB4MDEKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19VUkRVX0lORElBCisrIyBkZWZpbmUgU1VCTEFOR19VUkRVX0lORElBIDB4MDIKKysjIGVuZGlmCisrIyBpZm5kZWYgU1VCTEFOR19VWkJFS19MQVRJTgorKyMgZGVmaW5lIFNVQkxBTkdfVVpCRUtfTEFUSU4gMHgwMQorKyMgZW5kaWYKKysjIGlmbmRlZiBTVUJMQU5HX1VaQkVLX0NZUklMTElDCisrIyBkZWZpbmUgU1VCTEFOR19VWkJFS19DWVJJTExJQyAweDAyCisrIyBlbmRpZgorKyNlbmRpZgorKworKy8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mICdzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6CisrICAgIkRpcmVjdHMgJ3NldGxvY2FsZSgpJyB0byBxdWVyeSAnY2F0ZWdvcnknIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQKKysgICAgc2V0dGluZyBvZiAnbG9jYWwnLiIKKysgICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIE5laXRoZXIgZG8gU1VTVjIgYW5kCisrICAgSVNPIEMgOTkuICBTbyB3ZSBjYW4gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IG9uIHNlbGVjdGVkIHN5c3RlbXMgKGUuZy4KKysgICB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCisrI2lmIGRlZmluZWQgX0xJQkMgfHwgKGRlZmluZWQgX19HTlVfTElCUkFSWV9fICYmIF9fR05VX0xJQlJBUllfXyA+PSAyKQorKyMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKKysjZW5kaWYKKysKKysvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgbmFtZSwgYW5kIGNhbm9uaWNhbGl6ZSBpdCBpbnRvIFhQRyBzeW50YXgKKysgICAgIGxhbmd1YWdlW190ZXJyaXRvcnlbLmNvZGVzZXRdXVtAbW9kaWZpZXJdCisrICAgVGhlIGNvZGVzZXQgcGFydCBpbiB0aGUgcmVzdWx0IGlzIG5vdCByZWxpYWJsZTsgdGhlIGxvY2FsZV9jaGFyc2V0KCkKKysgICBzaG91bGQgYmUgdXNlZCBmb3IgY29kZXNldCBpbmZvcm1hdGlvbiBpbnN0ZWFkLgorKyAgIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQ7IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLiAgKi8KKysKKytjb25zdCBjaGFyICoKKytfbmxfbG9jYWxlX25hbWUgKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKQorK3sKKysgIGNvbnN0IGNoYXIgKnJldHZhbDsKKysKKysjaWZuZGVmIFdJTjMyCisrCisrICAvKiBVc2UgdGhlIFBPU0lYIG1ldGhvZHMgb2YgbG9va2luZyB0byAnTENfQUxMJywgJ0xDX3h4eCcsIGFuZCAnTEFORycuCisrICAgICBPbiBzb21lIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUgJ3NldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KKysjIGlmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAorKyAgcmV0dmFsID0gc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCk7CisrIyBlbHNlCisrICAvKiBTZXR0aW5nIG9mIExDX0FMTCBvdmVyd3JpdGVzIGFsbCBvdGhlci4gICovCisrICByZXR2YWwgPSBnZXRlbnYgKCJMQ19BTEwiKTsKKysgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKKysgICAgeworKyAgICAgIC8qIE5leHQgY29tZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgY2F0ZWdvcnkuICAqLworKyAgICAgIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKKysgICAgICBpZiAocmV0dmFsID09IE5VTEwgfHwgcmV0dmFsWzBdID09ICdcMCcpCisrCXsKKysJICAvKiBMYXN0IHBvc3NpYmlsaXR5IGlzIHRoZSBMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KKysJICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HIik7CisrCSAgaWYgKHJldHZhbCA9PSBOVUxMIHx8IHJldHZhbFswXSA9PSAnXDAnKQorKwkgICAgLyogV2UgdXNlIEMgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiAgUE9TSVggc2F5cyB0aGlzIGlzCisrCSAgICAgICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgKi8KKysJICAgIHJldHZhbCA9ICJDIjsKKysJfQorKyAgICB9CisrIyBlbmRpZgorKworKyAgcmV0dXJuIHJldHZhbDsKKysKKysjZWxzZSAvKiBXSU4zMiAqLworKworKyAgLyogUmV0dXJuIGFuIFhQRyBzdHlsZSBsb2NhbGUgbmFtZSBsYW5ndWFnZVtfdGVycml0b3J5XVtAbW9kaWZpZXJdLgorKyAgICAgRG9uJ3QgZXZlbiBib3RoZXIgZGV0ZXJtaW5pbmcgdGhlIGNvZGVzZXQ7IGl0J3Mgbm90IHVzZWZ1bCBpbiB0aGlzCisrICAgICBjb250ZXh0LCBiZWNhdXNlIG1lc3NhZ2UgY2F0YWxvZ3MgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHNpbmdsZQorKyAgICAgY29kZXNldC4gICovCisrCisrICBMQ0lEIGxjaWQ7CisrICBMQU5HSUQgbGFuZ2lkOworKyAgaW50IHByaW1hcnksIHN1YjsKKysKKysgIC8qIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgc3lzdGVtIHNldHRpbmdzIHRocm91Z2ggZW52aXJvbm1lbnQKKysgICAgIHZhcmlhYmxlcywgYXMgb24gUE9TSVggc3lzdGVtcy4gICovCisrICByZXR2YWwgPSBnZXRlbnYgKCJMQ19BTEwiKTsKKysgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKKysgICAgcmV0dXJuIHJldHZhbDsKKysgIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKKysgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKKysgICAgcmV0dXJuIHJldHZhbDsKKysgIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKKysgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKKysgICAgcmV0dXJuIHJldHZhbDsKKysKKysgIC8qIFVzZSBuYXRpdmUgV2luMzIgQVBJIGxvY2FsZSBJRC4gICovCisrICBsY2lkID0gR2V0VGhyZWFkTG9jYWxlICgpOworKworKyAgLyogU3RyaXAgb2ZmIHRoZSBzb3J0aW5nIHJ1bGVzLCBrZWVwIG9ubHkgdGhlIGxhbmd1YWdlIHBhcnQuICAqLworKyAgbGFuZ2lkID0gTEFOR0lERlJPTUxDSUQgKGxjaWQpOworKworKyAgLyogU3BsaXQgaW50byBsYW5ndWFnZSBhbmQgdGVycml0b3J5IHBhcnQuICAqLworKyAgcHJpbWFyeSA9IFBSSU1BUllMQU5HSUQgKGxhbmdpZCk7CisrICBzdWIgPSBTVUJMQU5HSUQgKGxhbmdpZCk7CisrCisrICAvKiBEaXNwYXRjaCBvbiBsYW5ndWFnZS4KKysgICAgIFNlZSBhbHNvIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9vbmxpbmVkYXQvbGFuZ3VhZ2VzLmh0bWwgLgorKyAgICAgRm9yIGRldGFpbHMgYWJvdXQgbGFuZ3VhZ2VzLCBzZWUgaHR0cDovL3d3dy5ldGhub2xvZ3VlLmNvbS8gLiAgKi8KKysgIHN3aXRjaCAocHJpbWFyeSkKKysgICAgeworKyAgICBjYXNlIExBTkdfQUZSSUtBQU5TOiByZXR1cm4gImFmX1pBIjsKKysgICAgY2FzZSBMQU5HX0FMQkFOSUFOOiByZXR1cm4gInNxX0FMIjsKKysgICAgY2FzZSBMQU5HX0FNSEFSSUM6IHJldHVybiAiYW1fRVQiOworKyAgICBjYXNlIExBTkdfQVJBQklDOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19BUkFCSUNfU0FVRElfQVJBQklBOiByZXR1cm4gImFyX1NBIjsKKysJY2FzZSBTVUJMQU5HX0FSQUJJQ19JUkFROiByZXR1cm4gImFyX0lRIjsKKysJY2FzZSBTVUJMQU5HX0FSQUJJQ19FR1lQVDogcmV0dXJuICJhcl9FRyI7CisrCWNhc2UgU1VCTEFOR19BUkFCSUNfTElCWUE6IHJldHVybiAiYXJfTFkiOworKwljYXNlIFNVQkxBTkdfQVJBQklDX0FMR0VSSUE6IHJldHVybiAiYXJfRFoiOworKwljYXNlIFNVQkxBTkdfQVJBQklDX01PUk9DQ086IHJldHVybiAiYXJfTUEiOworKwljYXNlIFNVQkxBTkdfQVJBQklDX1RVTklTSUE6IHJldHVybiAiYXJfVE4iOworKwljYXNlIFNVQkxBTkdfQVJBQklDX09NQU46IHJldHVybiAiYXJfT00iOworKwljYXNlIFNVQkxBTkdfQVJBQklDX1lFTUVOOiByZXR1cm4gImFyX1lFIjsKKysJY2FzZSBTVUJMQU5HX0FSQUJJQ19TWVJJQTogcmV0dXJuICJhcl9TWSI7CisrCWNhc2UgU1VCTEFOR19BUkFCSUNfSk9SREFOOiByZXR1cm4gImFyX0pPIjsKKysJY2FzZSBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OOiByZXR1cm4gImFyX0xCIjsKKysJY2FzZSBTVUJMQU5HX0FSQUJJQ19LVVdBSVQ6IHJldHVybiAiYXJfS1ciOworKwljYXNlIFNVQkxBTkdfQVJBQklDX1VBRTogcmV0dXJuICJhcl9BRSI7CisrCWNhc2UgU1VCTEFOR19BUkFCSUNfQkFIUkFJTjogcmV0dXJuICJhcl9CSCI7CisrCWNhc2UgU1VCTEFOR19BUkFCSUNfUUFUQVI6IHJldHVybiAiYXJfUUEiOworKwl9CisrICAgICAgcmV0dXJuICJhciI7CisrICAgIGNhc2UgTEFOR19BUk1FTklBTjogcmV0dXJuICJoeV9BTSI7CisrICAgIGNhc2UgTEFOR19BU1NBTUVTRTogcmV0dXJuICJhc19JTiI7CisrICAgIGNhc2UgTEFOR19BWkVSSToKKysgICAgICBzd2l0Y2ggKHN1YikKKysJeworKwkvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBBemVyYmFpamFuaSBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKysJY2FzZSBTVUJMQU5HX0FaRVJJX0xBVElOOiByZXR1cm4gImF6X0FaQGxhdGluIjsKKysJY2FzZSBTVUJMQU5HX0FaRVJJX0NZUklMTElDOiByZXR1cm4gImF6X0FaQGN5cmlsbGljIjsKKysJfQorKyAgICAgIHJldHVybiAiYXoiOworKyAgICBjYXNlIExBTkdfQkFTUVVFOgorKyAgICAgIHJldHVybiAiZXUiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJldV9FUyIgb3IgImV1X0ZSIi4gICovCisrICAgIGNhc2UgTEFOR19CRUxBUlVTSUFOOiByZXR1cm4gImJlX0JZIjsKKysgICAgY2FzZSBMQU5HX0JFTkdBTEk6CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJY2FzZSBTVUJMQU5HX0JFTkdBTElfSU5ESUE6IHJldHVybiAiYm5fSU4iOworKwljYXNlIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIOiByZXR1cm4gImJuX0JEIjsKKysJfQorKyAgICAgIHJldHVybiAiYm4iOworKyAgICBjYXNlIExBTkdfQlVMR0FSSUFOOiByZXR1cm4gImJnX0JHIjsKKysgICAgY2FzZSBMQU5HX0JVUk1FU0U6IHJldHVybiAibXlfTU0iOworKyAgICBjYXNlIExBTkdfQ0FNQk9ESUFOOiByZXR1cm4gImttX0tIIjsKKysgICAgY2FzZSBMQU5HX0NBVEFMQU46IHJldHVybiAiY2FfRVMiOworKyAgICBjYXNlIExBTkdfQ0hFUk9LRUU6IHJldHVybiAiY2hyX1VTIjsKKysgICAgY2FzZSBMQU5HX0NISU5FU0U6CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJY2FzZSBTVUJMQU5HX0NISU5FU0VfVFJBRElUSU9OQUw6IHJldHVybiAiemhfVFciOworKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9TSU1QTElGSUVEOiByZXR1cm4gInpoX0NOIjsKKysJY2FzZSBTVUJMQU5HX0NISU5FU0VfSE9OR0tPTkc6IHJldHVybiAiemhfSEsiOworKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9TSU5HQVBPUkU6IHJldHVybiAiemhfU0ciOworKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVTogcmV0dXJuICJ6aF9NTyI7CisrCX0KKysgICAgICByZXR1cm4gInpoIjsKKysgICAgY2FzZSBMQU5HX0NST0FUSUFOOgkJLyogTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KKysJCQkJICogV2hhdCB1c2VkIHRvIGJlIGNhbGxlZCBTZXJiby1Dcm9hdGlhbgorKwkJCQkgKiBzaG91bGQgcmVhbGx5IG5vdyBiZSB0d28gc2VwYXJhdGUKKysJCQkJICogbGFuZ3VhZ2VzIGJlY2F1c2Ugb2YgcG9saXRpY2FsIHJlYXNvbnMuCisrCQkJCSAqIChTYXlzIHRtbCwgd2hvIGtub3dzIG5vdGhpbmcgYWJvdXQgU2VyYmlhbgorKwkJCQkgKiBvciBDcm9hdGlhbi4pCisrCQkJCSAqIChJIGNhbiBmZWVsIHRob3NlIGZsYW1lcyBjb21pbmcgYWxyZWFkeS4pCisrCQkJCSAqLworKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gImhyX0hSIjsKKysJY2FzZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU46IHJldHVybiAic3JfQ1MiOworKwljYXNlIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQzogcmV0dXJuICJzcl9DU0BjeXJpbGxpYyI7CisrCX0KKysgICAgICByZXR1cm4gImhyIjsKKysgICAgY2FzZSBMQU5HX0NaRUNIOiByZXR1cm4gImNzX0NaIjsKKysgICAgY2FzZSBMQU5HX0RBTklTSDogcmV0dXJuICJkYV9ESyI7CisrICAgIGNhc2UgTEFOR19ESVZFSEk6IHJldHVybiAiZHZfTVYiOworKyAgICBjYXNlIExBTkdfRFVUQ0g6CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJY2FzZSBTVUJMQU5HX0RVVENIOiByZXR1cm4gIm5sX05MIjsKKysJY2FzZSBTVUJMQU5HX0RVVENIX0JFTEdJQU46IC8qIEZMRU1JU0gsIFZMQUFNUyAqLyByZXR1cm4gIm5sX0JFIjsKKysJfQorKyAgICAgIHJldHVybiAibmwiOworKyAgICBjYXNlIExBTkdfRURPOiByZXR1cm4gImJpbl9ORyI7CisrICAgIGNhc2UgTEFOR19FTkdMSVNIOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCS8qIFNVQkxBTkdfRU5HTElTSF9VUyA9PSBTVUJMQU5HX0RFRkFVTFQuIEhlaC4gSSB0aG91Z2h0CisrCSAqIEVuZ2xpc2ggd2FzIHRoZSBsYW5ndWFnZSBzcG9rZW4gaW4gRW5nbGFuZC4KKysJICogT2ggd2VsbC4KKysJICovCisrCWNhc2UgU1VCTEFOR19FTkdMSVNIX1VTOiByZXR1cm4gImVuX1VTIjsKKysJY2FzZSBTVUJMQU5HX0VOR0xJU0hfVUs6IHJldHVybiAiZW5fR0IiOworKwljYXNlIFNVQkxBTkdfRU5HTElTSF9BVVM6IHJldHVybiAiZW5fQVUiOworKwljYXNlIFNVQkxBTkdfRU5HTElTSF9DQU46IHJldHVybiAiZW5fQ0EiOworKwljYXNlIFNVQkxBTkdfRU5HTElTSF9OWjogcmV0dXJuICJlbl9OWiI7CisrCWNhc2UgU1VCTEFOR19FTkdMSVNIX0VJUkU6IHJldHVybiAiZW5fSUUiOworKwljYXNlIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0E6IHJldHVybiAiZW5fWkEiOworKwljYXNlIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBOiByZXR1cm4gImVuX0pNIjsKKysJY2FzZSBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOOiByZXR1cm4gImVuX0dEIjsgLyogR3JlbmFkYT8gKi8KKysJY2FzZSBTVUJMQU5HX0VOR0xJU0hfQkVMSVpFOiByZXR1cm4gImVuX0JaIjsKKysJY2FzZSBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQ6IHJldHVybiAiZW5fVFQiOworKwljYXNlIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRTogcmV0dXJuICJlbl9aVyI7CisrCWNhc2UgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTOiByZXR1cm4gImVuX1BIIjsKKysJY2FzZSBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBOiByZXR1cm4gImVuX0lEIjsKKysJY2FzZSBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkc6IHJldHVybiAiZW5fSEsiOworKwljYXNlIFNVQkxBTkdfRU5HTElTSF9JTkRJQTogcmV0dXJuICJlbl9JTiI7CisrCWNhc2UgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBOiByZXR1cm4gImVuX01ZIjsKKysJY2FzZSBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFOiByZXR1cm4gImVuX1NHIjsKKysJfQorKyAgICAgIHJldHVybiAiZW4iOworKyAgICBjYXNlIExBTkdfRVNUT05JQU46IHJldHVybiAiZXRfRUUiOworKyAgICBjYXNlIExBTkdfRkFFUk9FU0U6IHJldHVybiAiZm9fRk8iOworKyAgICBjYXNlIExBTkdfRkFSU0k6IHJldHVybiAiZmFfSVIiOworKyAgICBjYXNlIExBTkdfRklOTklTSDogcmV0dXJuICJmaV9GSSI7CisrICAgIGNhc2UgTEFOR19GUkVOQ0g6CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJY2FzZSBTVUJMQU5HX0ZSRU5DSDogcmV0dXJuICJmcl9GUiI7CisrCWNhc2UgU1VCTEFOR19GUkVOQ0hfQkVMR0lBTjogLyogV0FMTE9PTiAqLyByZXR1cm4gImZyX0JFIjsKKysJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTjogcmV0dXJuICJmcl9DQSI7CisrCWNhc2UgU1VCTEFOR19GUkVOQ0hfU1dJU1M6IHJldHVybiAiZnJfQ0giOworKwljYXNlIFNVQkxBTkdfRlJFTkNIX0xVWEVNQk9VUkc6IHJldHVybiAiZnJfTFUiOworKwljYXNlIFNVQkxBTkdfRlJFTkNIX01PTkFDTzogcmV0dXJuICJmcl9NQyI7CisrCWNhc2UgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUzogcmV0dXJuICJmciI7IC8qIENhcmliYmVhbj8gKi8KKysJY2FzZSBTVUJMQU5HX0ZSRU5DSF9SRVVOSU9OOiByZXR1cm4gImZyX1JFIjsKKysJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DT05HTzogcmV0dXJuICJmcl9DRyI7CisrCWNhc2UgU1VCTEFOR19GUkVOQ0hfU0VORUdBTDogcmV0dXJuICJmcl9TTiI7CisrCWNhc2UgU1VCTEFOR19GUkVOQ0hfQ0FNRVJPT046IHJldHVybiAiZnJfQ00iOworKwljYXNlIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFOiByZXR1cm4gImZyX0NJIjsKKysJY2FzZSBTVUJMQU5HX0ZSRU5DSF9NQUxJOiByZXR1cm4gImZyX01MIjsKKysJY2FzZSBTVUJMQU5HX0ZSRU5DSF9NT1JPQ0NPOiByZXR1cm4gImZyX01BIjsKKysJY2FzZSBTVUJMQU5HX0ZSRU5DSF9IQUlUSTogcmV0dXJuICJmcl9IVCI7CisrCX0KKysgICAgICByZXR1cm4gImZyIjsKKysgICAgY2FzZSBMQU5HX0ZSSVNJQU46IHJldHVybiAiZnlfTkwiOworKyAgICBjYXNlIExBTkdfRlVMRlVMREU6CisrICAgICAgLyogU3Bva2VuIGluIE5pZ2VyaWEsIEd1aW5lYSwgU2VuZWdhbCwgTWFsaSwgTmlnZXIsIENhbWVyb29uLCBCZW5pbi4gKi8KKysgICAgICByZXR1cm4gImZmX05HIjsKKysgICAgY2FzZSBMQU5HX0dBRUxJQzoKKysgICAgICBzd2l0Y2ggKHN1YikKKysJeworKwljYXNlIDB4MDE6IC8qIFNDT1RUSVNIICovIHJldHVybiAiZ2RfR0IiOworKwljYXNlIDB4MDI6IC8qIElSSVNIICovIHJldHVybiAiZ2FfSUUiOworKwl9CisrICAgICAgcmV0dXJuICJDIjsKKysgICAgY2FzZSBMQU5HX0dBTElDSUFOOiByZXR1cm4gImdsX0VTIjsKKysgICAgY2FzZSBMQU5HX0dFT1JHSUFOOiByZXR1cm4gImthX0dFIjsKKysgICAgY2FzZSBMQU5HX0dFUk1BTjoKKysgICAgICBzd2l0Y2ggKHN1YikKKysJeworKwljYXNlIFNVQkxBTkdfR0VSTUFOOiByZXR1cm4gImRlX0RFIjsKKysJY2FzZSBTVUJMQU5HX0dFUk1BTl9TV0lTUzogcmV0dXJuICJkZV9DSCI7CisrCWNhc2UgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU46IHJldHVybiAiZGVfQVQiOworKwljYXNlIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkc6IHJldHVybiAiZGVfTFUiOworKwljYXNlIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU46IHJldHVybiAiZGVfTEkiOworKwl9CisrICAgICAgcmV0dXJuICJkZSI7CisrICAgIGNhc2UgTEFOR19HUkVFSzogcmV0dXJuICJlbF9HUiI7CisrICAgIGNhc2UgTEFOR19HVUFSQU5JOiByZXR1cm4gImduX1BZIjsKKysgICAgY2FzZSBMQU5HX0dVSkFSQVRJOiByZXR1cm4gImd1X0lOIjsKKysgICAgY2FzZSBMQU5HX0hBVVNBOiByZXR1cm4gImhhX05HIjsKKysgICAgY2FzZSBMQU5HX0hBV0FJSUFOOgorKyAgICAgIC8qIEZJWE1FOiBEbyB0aGV5IG1lYW4gSGF3YWlpYW4gKCJoYXdfVVMiLCAxMDAwIHNwZWFrZXJzKQorKwkgb3IgSGF3YWlpIENyZW9sZSBFbmdsaXNoICgiY3BlX1VTIiwgNjAwMDAwIHNwZWFrZXJzKT8gICovCisrICAgICAgcmV0dXJuICJjcGVfVVMiOworKyAgICBjYXNlIExBTkdfSEVCUkVXOiByZXR1cm4gImhlX0lMIjsKKysgICAgY2FzZSBMQU5HX0hJTkRJOiByZXR1cm4gImhpX0lOIjsKKysgICAgY2FzZSBMQU5HX0hVTkdBUklBTjogcmV0dXJuICJodV9IVSI7CisrICAgIGNhc2UgTEFOR19JQklCSU86IHJldHVybiAibmljX05HIjsKKysgICAgY2FzZSBMQU5HX0lDRUxBTkRJQzogcmV0dXJuICJpc19JUyI7CisrICAgIGNhc2UgTEFOR19JR0JPOiByZXR1cm4gImlnX05HIjsKKysgICAgY2FzZSBMQU5HX0lORE9ORVNJQU46IHJldHVybiAiaWRfSUQiOworKyAgICBjYXNlIExBTkdfSU5VS1RJVFVUOiByZXR1cm4gIml1X0NBIjsKKysgICAgY2FzZSBMQU5HX0lUQUxJQU46CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJY2FzZSBTVUJMQU5HX0lUQUxJQU46IHJldHVybiAiaXRfSVQiOworKwljYXNlIFNVQkxBTkdfSVRBTElBTl9TV0lTUzogcmV0dXJuICJpdF9DSCI7CisrCX0KKysgICAgICByZXR1cm4gIml0IjsKKysgICAgY2FzZSBMQU5HX0pBUEFORVNFOiByZXR1cm4gImphX0pQIjsKKysgICAgY2FzZSBMQU5HX0tBTk5BREE6IHJldHVybiAia25fSU4iOworKyAgICBjYXNlIExBTkdfS0FOVVJJOiByZXR1cm4gImtyX05HIjsKKysgICAgY2FzZSBMQU5HX0tBU0hNSVJJOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gImtzX1BLIjsKKysJY2FzZSBTVUJMQU5HX0tBU0hNSVJJX0lORElBOiByZXR1cm4gImtzX0lOIjsKKysJfQorKyAgICAgIHJldHVybiAia3MiOworKyAgICBjYXNlIExBTkdfS0FaQUs6IHJldHVybiAia2tfS1oiOworKyAgICBjYXNlIExBTkdfS09OS0FOSToKKysgICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworKyAgICAgIHJldHVybiAia29rX0lOIjsKKysgICAgY2FzZSBMQU5HX0tPUkVBTjogcmV0dXJuICJrb19LUiI7CisrICAgIGNhc2UgTEFOR19LWVJHWVo6IHJldHVybiAia3lfS0ciOworKyAgICBjYXNlIExBTkdfTEFPOiByZXR1cm4gImxvX0xBIjsKKysgICAgY2FzZSBMQU5HX0xBVElOOiByZXR1cm4gImxhX1ZBIjsKKysgICAgY2FzZSBMQU5HX0xBVFZJQU46IHJldHVybiAibHZfTFYiOworKyAgICBjYXNlIExBTkdfTElUSFVBTklBTjogcmV0dXJuICJsdF9MVCI7CisrICAgIGNhc2UgTEFOR19NQUNFRE9OSUFOOiByZXR1cm4gIm1rX01LIjsKKysgICAgY2FzZSBMQU5HX01BTEFZOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19NQUxBWV9NQUxBWVNJQTogcmV0dXJuICJtc19NWSI7CisrCWNhc2UgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTTogcmV0dXJuICJtc19CTiI7CisrCX0KKysgICAgICByZXR1cm4gIm1zIjsKKysgICAgY2FzZSBMQU5HX01BTEFZQUxBTTogcmV0dXJuICJtbF9JTiI7CisrICAgIGNhc2UgTEFOR19NQUxURVNFOiByZXR1cm4gIm10X01UIjsKKysgICAgY2FzZSBMQU5HX01BTklQVVJJOgorKyAgICAgIC8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIHN1Y2ggbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCisrICAgICAgcmV0dXJuICJtbmlfSU4iOworKyAgICBjYXNlIExBTkdfTUFSQVRISTogcmV0dXJuICJtcl9JTiI7CisrICAgIGNhc2UgTEFOR19NT05HT0xJQU46CisrICAgICAgcmV0dXJuICJtbiI7IC8qIEFtYmlndW91czogY291bGQgYmUgIm1uX0NOIiBvciAibW5fTU4iLiAgKi8KKysgICAgY2FzZSBMQU5HX05FUEFMSToKKysgICAgICBzd2l0Y2ggKHN1YikKKysJeworKwljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJuZV9OUCI7CisrCWNhc2UgU1VCTEFOR19ORVBBTElfSU5ESUE6IHJldHVybiAibmVfSU4iOworKwl9CisrICAgICAgcmV0dXJuICJuZSI7CisrICAgIGNhc2UgTEFOR19OT1JXRUdJQU46CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJY2FzZSBTVUJMQU5HX05PUldFR0lBTl9CT0tNQUw6IHJldHVybiAibm9fTk8iOworKwljYXNlIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0s6IHJldHVybiAibm5fTk8iOworKwl9CisrICAgICAgcmV0dXJuICJubyI7CisrICAgIGNhc2UgTEFOR19PUklZQTogcmV0dXJuICJvcl9JTiI7CisrICAgIGNhc2UgTEFOR19PUk9NTzogcmV0dXJuICJvbV9FVCI7CisrICAgIGNhc2UgTEFOR19QQVBJQU1FTlRVOiByZXR1cm4gInBhcF9BTiI7CisrICAgIGNhc2UgTEFOR19QQVNIVE86CisrICAgICAgcmV0dXJuICJwcyI7IC8qIEFtYmlndW91czogY291bGQgYmUgInBzX1BLIiBvciAicHNfQUYiLiAgKi8KKysgICAgY2FzZSBMQU5HX1BPTElTSDogcmV0dXJuICJwbF9QTCI7CisrICAgIGNhc2UgTEFOR19QT1JUVUdVRVNFOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19QT1JUVUdVRVNFOiByZXR1cm4gInB0X1BUIjsKKysJLyogSG1tLiBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOID09IFNVQkxBTkdfREVGQVVMVC4KKysJICAgU2FtZSBwaGVub21lbm9uIGFzIFNVQkxBTkdfRU5HTElTSF9VUyA9PSBTVUJMQU5HX0RFRkFVTFQuICovCisrCWNhc2UgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTjogcmV0dXJuICJwdF9CUiI7CisrCX0KKysgICAgICByZXR1cm4gInB0IjsKKysgICAgY2FzZSBMQU5HX1BVTkpBQkk6CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJY2FzZSBTVUJMQU5HX1BVTkpBQklfSU5ESUE6IHJldHVybiAicGFfSU4iOyAvKiBHdXJtdWtoaSBzY3JpcHQgKi8KKysJY2FzZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU46IHJldHVybiAicGFfUEsiOyAvKiBBcmFiaWMgc2NyaXB0ICovCisrCX0KKysgICAgICByZXR1cm4gInBhIjsKKysgICAgY2FzZSBMQU5HX1JIQUVUT19ST01BTkNFOiByZXR1cm4gInJtX0NIIjsKKysgICAgY2FzZSBMQU5HX1JPTUFOSUFOOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19ST01BTklBTl9ST01BTklBOiByZXR1cm4gInJvX1JPIjsKKysJY2FzZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkE6IHJldHVybiAicm9fTUQiOworKwl9CisrICAgICAgcmV0dXJuICJybyI7CisrICAgIGNhc2UgTEFOR19SVVNTSUFOOgorKyAgICAgIHJldHVybiAicnUiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJydV9SVSIgb3IgInJ1X1VBIiBvciAicnVfTUQiLiAgKi8KKysgICAgY2FzZSBMQU5HX1NBQU1JOiAvKiBhY3R1YWxseSBOb3J0aGVybiBTYW1pICovIHJldHVybiAic2VfTk8iOworKyAgICBjYXNlIExBTkdfU0FOU0tSSVQ6IHJldHVybiAic2FfSU4iOworKyAgICBjYXNlIExBTkdfU0lOREhJOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19TSU5ESElfSU5ESUE6IHJldHVybiAic2RfSU4iOworKwljYXNlIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOOiByZXR1cm4gInNkX1BLIjsKKysJfQorKyAgICAgIHJldHVybiAic2QiOworKyAgICBjYXNlIExBTkdfU0lOSEFMRVNFOiByZXR1cm4gInNpX0xLIjsKKysgICAgY2FzZSBMQU5HX1NMT1ZBSzogcmV0dXJuICJza19TSyI7CisrICAgIGNhc2UgTEFOR19TTE9WRU5JQU46IHJldHVybiAic2xfU0kiOworKyAgICBjYXNlIExBTkdfU09NQUxJOiByZXR1cm4gInNvX1NPIjsKKysgICAgY2FzZSBMQU5HX1NPUkJJQU46CisrICAgICAgLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKysgICAgICByZXR1cm4gIndlbl9ERSI7CisrICAgIGNhc2UgTEFOR19TUEFOSVNIOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIOiByZXR1cm4gImVzX0VTIjsKKysJY2FzZSBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTjogcmV0dXJuICJlc19NWCI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX01PREVSTjoKKysJICByZXR1cm4gImVzX0VTQG1vZGVybiI7CS8qIG5vdCBzZWVuIG9uIFVuaXggKi8KKysJY2FzZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBOiByZXR1cm4gImVzX0dUIjsKKysJY2FzZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQTogcmV0dXJuICJlc19DUiI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX1BBTkFNQTogcmV0dXJuICJlc19QQSI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTl9SRVBVQkxJQzogcmV0dXJuICJlc19ETyI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQTogcmV0dXJuICJlc19WRSI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBOiByZXR1cm4gImVzX0NPIjsKKysJY2FzZSBTVUJMQU5HX1NQQU5JU0hfUEVSVTogcmV0dXJuICJlc19QRSI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQTogcmV0dXJuICJlc19BUiI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX0VDVUFET1I6IHJldHVybiAiZXNfRUMiOworKwljYXNlIFNVQkxBTkdfU1BBTklTSF9DSElMRTogcmV0dXJuICJlc19DTCI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVk6IHJldHVybiAiZXNfVVkiOworKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWTogcmV0dXJuICJlc19QWSI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX0JPTElWSUE6IHJldHVybiAiZXNfQk8iOworKwljYXNlIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUjogcmV0dXJuICJlc19TViI7CisrCWNhc2UgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTOiByZXR1cm4gImVzX0hOIjsKKysJY2FzZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBOiByZXR1cm4gImVzX05JIjsKKysJY2FzZSBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ086IHJldHVybiAiZXNfUFIiOworKwl9CisrICAgICAgcmV0dXJuICJlcyI7CisrICAgIGNhc2UgTEFOR19TVVRVOiByZXR1cm4gImJudF9UWiI7IC8qIG9yICJzdF9MUyIgb3IgIm5zb19aQSI/ICovCisrICAgIGNhc2UgTEFOR19TV0FISUxJOiByZXR1cm4gInN3X0tFIjsKKysgICAgY2FzZSBMQU5HX1NXRURJU0g6CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAic3ZfU0UiOworKwljYXNlIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5EOiByZXR1cm4gInN2X0ZJIjsKKysJfQorKyAgICAgIHJldHVybiAic3YiOworKyAgICBjYXNlIExBTkdfU1lSSUFDOiByZXR1cm4gInN5cl9UUiI7IC8qIEFuIGV4dGluY3QgbGFuZ3VhZ2UuICAqLworKyAgICBjYXNlIExBTkdfVEFHQUxPRzogcmV0dXJuICJ0bF9QSCI7CisrICAgIGNhc2UgTEFOR19UQUpJSzogcmV0dXJuICJ0Z19USiI7CisrICAgIGNhc2UgTEFOR19UQU1BWklHSFQ6CisrICAgICAgc3dpdGNoIChzdWIpCisrCXsKKysJLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gVGFtYXppZ2h0IGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworKwljYXNlIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQzogcmV0dXJuICJiZXJfTUFAYXJhYmljIjsKKysJY2FzZSBTVUJMQU5HX1RBTUFaSUdIVF9MQVRJTjogcmV0dXJuICJiZXJfTUFAbGF0aW4iOworKwl9CisrICAgICAgcmV0dXJuICJiZXJfTUEiOworKyAgICBjYXNlIExBTkdfVEFNSUw6CisrICAgICAgcmV0dXJuICJ0YSI7IC8qIEFtYmlndW91czogY291bGQgYmUgInRhX0lOIiBvciAidGFfTEsiIG9yICJ0YV9TRyIuICAqLworKyAgICBjYXNlIExBTkdfVEFUQVI6IHJldHVybiAidHRfUlUiOworKyAgICBjYXNlIExBTkdfVEVMVUdVOiByZXR1cm4gInRlX0lOIjsKKysgICAgY2FzZSBMQU5HX1RIQUk6IHJldHVybiAidGhfVEgiOworKyAgICBjYXNlIExBTkdfVElCRVRBTjogcmV0dXJuICJib19DTiI7CisrICAgIGNhc2UgTEFOR19USUdSSU5ZQToKKysgICAgICBzd2l0Y2ggKHN1YikKKysJeworKwljYXNlIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUE6IHJldHVybiAidGlfRVQiOworKwljYXNlIFNVQkxBTkdfVElHUklOWUFfRVJJVFJFQTogcmV0dXJuICJ0aV9FUiI7CisrCX0KKysgICAgICByZXR1cm4gInRpIjsKKysgICAgY2FzZSBMQU5HX1RTT05HQTogcmV0dXJuICJ0c19aQSI7CisrICAgIGNhc2UgTEFOR19UU1dBTkE6IHJldHVybiAidG5fQlciOworKyAgICBjYXNlIExBTkdfVFVSS0lTSDogcmV0dXJuICJ0cl9UUiI7CisrICAgIGNhc2UgTEFOR19UVVJLTUVOOiByZXR1cm4gInRrX1RNIjsKKysgICAgY2FzZSBMQU5HX1VLUkFJTklBTjogcmV0dXJuICJ1a19VQSI7CisrICAgIGNhc2UgTEFOR19VUkRVOgorKyAgICAgIHN3aXRjaCAoc3ViKQorKwl7CisrCWNhc2UgU1VCTEFOR19VUkRVX1BBS0lTVEFOOiByZXR1cm4gInVyX1BLIjsKKysJY2FzZSBTVUJMQU5HX1VSRFVfSU5ESUE6IHJldHVybiAidXJfSU4iOworKwl9CisrICAgICAgcmV0dXJuICJ1ciI7CisrICAgIGNhc2UgTEFOR19VWkJFSzoKKysgICAgICBzd2l0Y2ggKHN1YikKKysJeworKwljYXNlIFNVQkxBTkdfVVpCRUtfTEFUSU46IHJldHVybiAidXpfVVoiOworKwljYXNlIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUM6IHJldHVybiAidXpfVVpAY3lyaWxsaWMiOworKwl9CisrICAgICAgcmV0dXJuICJ1eiI7CisrICAgIGNhc2UgTEFOR19WRU5EQTogcmV0dXJuICJ2ZV9aQSI7CisrICAgIGNhc2UgTEFOR19WSUVUTkFNRVNFOiByZXR1cm4gInZpX1ZOIjsKKysgICAgY2FzZSBMQU5HX1dFTFNIOiByZXR1cm4gImN5X0dCIjsKKysgICAgY2FzZSBMQU5HX1hIT1NBOiByZXR1cm4gInhoX1pBIjsKKysgICAgY2FzZSBMQU5HX1lJOiByZXR1cm4gInNpdF9DTiI7CisrICAgIGNhc2UgTEFOR19ZSURESVNIOiByZXR1cm4gInlpX0lMIjsKKysgICAgY2FzZSBMQU5HX1lPUlVCQTogcmV0dXJuICJ5b19ORyI7CisrICAgIGNhc2UgTEFOR19aVUxVOiByZXR1cm4gInp1X1pBIjsKKysgICAgZGVmYXVsdDogcmV0dXJuICJDIjsKKysgICAgfQorKworKyNlbmRpZgorK30KKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2cuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2cuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjUxNTcyMzc2OCAtMDQwMAorQEAgLTAsMCArMSw5OCBAQAorKy8qIExvZyBmaWxlIG91dHB1dC4KKysgICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKy8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisrI2VuZGlmCisrCisrI2luY2x1ZGUgPHN0ZGlvLmg+CisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxzdHJpbmcuaD4KKysKKysvKiBQcmludCBhbiBBU0NJSSBzdHJpbmcgd2l0aCBxdW90ZXMgYW5kIGVzY2FwZSBzZXF1ZW5jZXMgd2hlcmUgbmVlZGVkLiAgKi8KKytzdGF0aWMgdm9pZAorK3ByaW50X2VzY2FwZWQgKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3RyKQorK3sKKysgIHB1dGMgKCciJywgc3RyZWFtKTsKKysgIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKQorKyAgICBpZiAoKnN0ciA9PSAnXG4nKQorKyAgICAgIHsKKysJZnB1dHMgKCJcXG5cIiIsIHN0cmVhbSk7CisrCWlmIChzdHJbMV0gPT0gJ1wwJykKKysJICByZXR1cm47CisrCWZwdXRzICgiXG5cIiIsIHN0cmVhbSk7CisrICAgICAgfQorKyAgICBlbHNlCisrICAgICAgeworKwlpZiAoKnN0ciA9PSAnIicgfHwgKnN0ciA9PSAnXFwnKQorKwkgIHB1dGMgKCdcXCcsIHN0cmVhbSk7CisrCXB1dGMgKCpzdHIsIHN0cmVhbSk7CisrICAgICAgfQorKyAgcHV0YyAoJyInLCBzdHJlYW0pOworK30KKysKKysvKiBBZGQgdG8gdGhlIGxvZyBmaWxlIGFuIGVudHJ5IGRlbm90aW5nIGEgZmFpbGVkIHRyYW5zbGF0aW9uLiAgKi8KKyt2b2lkCisrX25sX2xvZ191bnRyYW5zbGF0ZWQgKGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lLCBjb25zdCBjaGFyICpkb21haW5uYW1lLAorKwkJICAgICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIGludCBwbHVyYWwpCisreworKyAgc3RhdGljIGNoYXIgKmxhc3RfbG9nZmlsZW5hbWUgPSBOVUxMOworKyAgc3RhdGljIEZJTEUgKmxhc3RfbG9nZmlsZSA9IE5VTEw7CisrICBGSUxFICpsb2dmaWxlOworKworKyAgLyogQ2FuIHdlIHJldXNlIHRoZSBsYXN0IG9wZW5lZCBsb2dmaWxlPyAgKi8KKysgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lID09IE5VTEwgfHwgc3RyY21wIChsb2dmaWxlbmFtZSwgbGFzdF9sb2dmaWxlbmFtZSkgIT0gMCkKKysgICAgeworKyAgICAgIC8qIENsb3NlIHRoZSBsYXN0IHVzZWQgbG9nZmlsZS4gICovCisrICAgICAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgIT0gTlVMTCkKKysJeworKwkgIGlmIChsYXN0X2xvZ2ZpbGUgIT0gTlVMTCkKKysJICAgIHsKKysJICAgICAgZmNsb3NlIChsYXN0X2xvZ2ZpbGUpOworKwkgICAgICBsYXN0X2xvZ2ZpbGUgPSBOVUxMOworKwkgICAgfQorKwkgIGZyZWUgKGxhc3RfbG9nZmlsZW5hbWUpOworKwkgIGxhc3RfbG9nZmlsZW5hbWUgPSBOVUxMOworKwl9CisrICAgICAgLyogT3BlbiB0aGUgbG9nZmlsZS4gICovCisrICAgICAgbGFzdF9sb2dmaWxlbmFtZSA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChsb2dmaWxlbmFtZSkgKyAxKTsKKysgICAgICBpZiAobGFzdF9sb2dmaWxlbmFtZSA9PSBOVUxMKQorKwlyZXR1cm47CisrICAgICAgc3RyY3B5IChsYXN0X2xvZ2ZpbGVuYW1lLCBsb2dmaWxlbmFtZSk7CisrICAgICAgbGFzdF9sb2dmaWxlID0gZm9wZW4gKGxvZ2ZpbGVuYW1lLCAiYSIpOworKyAgICAgIGlmIChsYXN0X2xvZ2ZpbGUgPT0gTlVMTCkKKysJcmV0dXJuOworKyAgICB9CisrICBsb2dmaWxlID0gbGFzdF9sb2dmaWxlOworKworKyAgZnByaW50ZiAobG9nZmlsZSwgImRvbWFpbiAiKTsKKysgIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIGRvbWFpbm5hbWUpOworKyAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnaWQgIik7CisrICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBtc2dpZDEpOworKyAgaWYgKHBsdXJhbCkKKysgICAgeworKyAgICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ2lkX3BsdXJhbCAiKTsKKysgICAgICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBtc2dpZDIpOworKyAgICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ3N0clswXSBcIlwiXG4iKTsKKysgICAgfQorKyAgZWxzZQorKyAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dzdHIgXCJcIlxuIik7CisrICBwdXRjICgnXG4nLCBsb2dmaWxlKTsKKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvTWFrZWZpbGUuaW4JMTk5OC0wNC0yNiAwOToyMjozNS4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvTWFrZWZpbGUuaW4JMjAwNC0wOS0xMiAxNDo0MDozNC41MjE3MjI4NTYgLTA0MDAKK0BAIC0xLDE5ICsxLDIwIEBACistIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggbWVzc2FnZSBjYXRhbG9nIGhhbmRsaW5nIGluIEdOVSBOTFMgVXRpbGl0aWVzLgorLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIG1lc3NhZ2UgY2F0YWxvZyBoYW5kbGluZyBsaWJyYXJ5IG9mIEdOVSBnZXR0ZXh0CisrIyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICMKKy0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CistIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysjIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAjIGFueSBsYXRlciB2ZXJzaW9uLgorICMKKyAjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgIworLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCistIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyMgVVNBLgorIAorIFBBQ0tBR0UgPSBAUEFDS0FHRUAKKyBWRVJTSU9OID0gQFZFUlNJT05ACitAQCAtMjMsMTE4ICsyNCwzNDEgQEAKKyBzcmNkaXIgPSBAc3JjZGlyQAorIHRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKyB0b3BfYnVpbGRkaXIgPSAuLgorLVZQQVRIID0gQHNyY2RpckAKKysjVlBBVEggPSAkKHNyY2RpcikKKyAKKyBwcmVmaXggPSBAcHJlZml4QAorIGV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorIHRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorLWxpYmRpciA9ICQoZXhlY19wcmVmaXgpL2xpYgorLWluY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQorLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAorK2xpYmRpciA9IEBsaWJkaXJACisraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorK2RhdGFkaXIgPSBAZGF0YWRpckAKKyBsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKKy1nZXR0ZXh0c3JjZGlyID0gQGRhdGFkaXJAL2dldHRleHQvaW50bAorLWFsaWFzcGF0aCA9ICQobG9jYWxlZGlyKTouCisrZ2V0dGV4dHNyY2RpciA9ICQoZGF0YWRpcikvZ2V0dGV4dC9pbnRsCisrYWxpYXNwYXRoID0gJChsb2NhbGVkaXIpCisgc3ViZGlyID0gaW50bAorIAorIElOU1RBTEwgPSBASU5TVEFMTEAKKyBJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorIE1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKKytta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJChNS0lOU1RBTExESVJTKQorIAorLWwgPSBAbEAKKytsID0gQElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYQAorIAorIEFSID0gYXIKKyBDQyA9IEBDQ0AKKyBMSUJUT09MID0gQExJQlRPT0xACisgUkFOTElCID0gQFJBTkxJQkAKKytZQUNDID0gQElOVExCSVNPTkAgLXkgLWQKKytZRkxBR1MgPSAtLW5hbWUtcHJlZml4PV9fZ2V0dGV4dAorIAorLURFRlMgPSAtRExPQ0FMRURJUj1cIiQobG9jYWxlZGlyKVwiIC1ER05VTE9DQUxFRElSPVwiJChnbnVsb2NhbGVkaXIpXCIgXAorLS1ETE9DQUxFX0FMSUFTX1BBVEg9XCIkKGFsaWFzcGF0aClcIiBAREVGU0AKKytERUZTID0gLURMT0NBTEVESVI9XCIkKGxvY2FsZWRpcilcIiAtRExPQ0FMRV9BTElBU19QQVRIPVwiJChhbGlhc3BhdGgpXCIgXAorKy1ETElCRElSPVwiJChsaWJkaXIpXCIgLURJTl9MSUJJTlRMIFwKKystREVOQUJMRV9SRUxPQ0FUQUJMRT0xIC1ESU5fTElCUkFSWSAtRElOU1RBTExESVI9XCIkKGxpYmRpcilcIiAtRE5PX1hNQUxMT0MgXAorKy1Ec2V0X3JlbG9jYXRpb25fcHJlZml4PWxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4IFwKKystRHJlbG9jYXRlPWxpYmludGxfcmVsb2NhdGUgXAorKy1EREVQRU5EU19PTl9MSUJJQ09OVj0xIEBERUZTQAorIENQUEZMQUdTID0gQENQUEZMQUdTQAorIENGTEFHUyA9IEBDRkxBR1NACisgTERGTEFHUyA9IEBMREZMQUdTQAorK0xJQlMgPSBATElCU0AKKyAKKyBDT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQorIAorLUhFQURFUlMgPSAkKENPTUhEUlMpIGxpYmdldHRleHQuaCBsb2FkaW5mby5oCistQ09NSERSUyA9IGdldHRleHQuaCBnZXR0ZXh0UC5oIGhhc2gtc3RyaW5nLmgKKy1TT1VSQ0VTID0gJChDT01TUkNTKSBpbnRsLWNvbXBhdC5jIGNhdC1jb21wYXQuYworLUNPTVNSQ1MgPSBiaW5kdGV4dGRvbS5jIGRjZ2V0dGV4dC5jIGRnZXR0ZXh0LmMgZ2V0dGV4dC5jIFwKKy1maW5kZG9tYWluLmMgbG9hZG1zZ2NhdC5jIGxvY2FsZWFsaWFzLmMgdGV4dGRvbWFpbi5jIGwxMG5mbGlzdC5jIFwKKy1leHBsb2RlbmFtZS5jCistT0JKRUNUUyA9IEBJTlRMT0JKU0AgYmluZHRleHRkb20uJGxvIGRjZ2V0dGV4dC4kbG8gZGdldHRleHQuJGxvIGdldHRleHQuJGxvIFwKKy1maW5kZG9tYWluLiRsbyBsb2FkbXNnY2F0LiRsbyBsb2NhbGVhbGlhcy4kbG8gdGV4dGRvbWFpbi4kbG8gbDEwbmZsaXN0LiRsbyBcCistZXhwbG9kZW5hbWUuJGxvCistQ0FUT0JKUyA9IGNhdC1jb21wYXQuJGxvIC4uL3BvL2NhdC1pZC10YmwuJGxvCistR0VUVE9CSlMgPSBpbnRsLWNvbXBhdC4kbG8KKy1ESVNURklMRVMuY29tbW9uID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluIGxpbnV4LW1zZy5zZWQgcG8ydGJsLnNlZC5pbiBcCisteG9wZW4tbXNnLnNlZCAkKEhFQURFUlMpICQoU09VUkNFUykKKytIRUFERVJTID0gXAorKyAgZ21vLmggXAorKyAgZ2V0dGV4dFAuaCBcCisrICBoYXNoLXN0cmluZy5oIFwKKysgIGxvYWRpbmZvLmggXAorKyAgcGx1cmFsLWV4cC5oIFwKKysgIGV2YWwtcGx1cmFsLmggXAorKyAgbG9jYWxjaGFyc2V0LmggXAorKyAgcmVsb2NhdGFibGUuaCBcCisrICB4c2l6ZS5oIFwKKysgIHByaW50Zi1hcmdzLmggcHJpbnRmLWFyZ3MuYyBcCisrICBwcmludGYtcGFyc2UuaCB3cHJpbnRmLXBhcnNlLmggcHJpbnRmLXBhcnNlLmMgXAorKyAgdmFzbnByaW50Zi5oIHZhc253cHJpbnRmLmggdmFzbnByaW50Zi5jIFwKKysgIG9zMmNvbXBhdC5oIFwKKysgIGxpYmdudWludGwuaC5pbgorK1NPVVJDRVMgPSBcCisrICBiaW5kdGV4dGRvbS5jIFwKKysgIGRjZ2V0dGV4dC5jIFwKKysgIGRnZXR0ZXh0LmMgXAorKyAgZ2V0dGV4dC5jIFwKKysgIGZpbmRkb21haW4uYyBcCisrICBsb2FkbXNnY2F0LmMgXAorKyAgbG9jYWxlYWxpYXMuYyBcCisrICB0ZXh0ZG9tYWluLmMgXAorKyAgbDEwbmZsaXN0LmMgXAorKyAgZXhwbG9kZW5hbWUuYyBcCisrICBkY2lnZXR0ZXh0LmMgXAorKyAgZGNuZ2V0dGV4dC5jIFwKKysgIGRuZ2V0dGV4dC5jIFwKKysgIG5nZXR0ZXh0LmMgXAorKyAgcGx1cmFsLnkgXAorKyAgcGx1cmFsLWV4cC5jIFwKKysgIGxvY2FsY2hhcnNldC5jIFwKKysgIHJlbG9jYXRhYmxlLmMgXAorKyAgbG9jYWxlbmFtZS5jIFwKKysgIGxvZy5jIFwKKysgIHByaW50Zi5jIFwKKysgIG9zZGVwLmMgXAorKyAgb3MyY29tcGF0LmMgXAorKyAgaW50bC1jb21wYXQuYworK09CSkVDVFMgPSBcCisrICBiaW5kdGV4dGRvbS4kbG8gXAorKyAgZGNnZXR0ZXh0LiRsbyBcCisrICBkZ2V0dGV4dC4kbG8gXAorKyAgZ2V0dGV4dC4kbG8gXAorKyAgZmluZGRvbWFpbi4kbG8gXAorKyAgbG9hZG1zZ2NhdC4kbG8gXAorKyAgbG9jYWxlYWxpYXMuJGxvIFwKKysgIHRleHRkb21haW4uJGxvIFwKKysgIGwxMG5mbGlzdC4kbG8gXAorKyAgZXhwbG9kZW5hbWUuJGxvIFwKKysgIGRjaWdldHRleHQuJGxvIFwKKysgIGRjbmdldHRleHQuJGxvIFwKKysgIGRuZ2V0dGV4dC4kbG8gXAorKyAgbmdldHRleHQuJGxvIFwKKysgIHBsdXJhbC4kbG8gXAorKyAgcGx1cmFsLWV4cC4kbG8gXAorKyAgbG9jYWxjaGFyc2V0LiRsbyBcCisrICByZWxvY2F0YWJsZS4kbG8gXAorKyAgbG9jYWxlbmFtZS4kbG8gXAorKyAgbG9nLiRsbyBcCisrICBwcmludGYuJGxvIFwKKysgIG9zZGVwLiRsbyBcCisrICBpbnRsLWNvbXBhdC4kbG8KKytESVNURklMRVMuY29tbW9uID0gTWFrZWZpbGUuaW4gXAorK2NvbmZpZy5jaGFyc2V0IGxvY2FsZS5hbGlhcyByZWYtYWRkLnNpbiByZWYtZGVsLnNpbiAkKEhFQURFUlMpICQoU09VUkNFUykKKytESVNURklMRVMuZ2VuZXJhdGVkID0gcGx1cmFsLmMKKyBESVNURklMRVMubm9ybWFsID0gVkVSU0lPTgorLURJU1RGSUxFUy5nZXR0ZXh0ID0gbGliaW50bC5nbGliYyBpbnRsaC5pbnN0LmluCisrRElTVEZJTEVTLmdldHRleHQgPSBDT1BZSU5HLkxJQi0yLjAgQ09QWUlORy5MSUItMi4xIGxpYmludGwuZ2xpYmMgXAorK2xpYmdudWludGwuaF92bXMgTWFrZWZpbGUudm1zIFwKKytsaWJnbnVpbnRsLmgubXN2Yy1zdGF0aWMgbGliZ251aW50bC5oLm1zdmMtc2hhcmVkIFJFQURNRS53b2UzMiBNYWtlZmlsZS5tc3ZjCisrRElTVEZJTEVTLm9ic29sZXRlID0geG9wZW4tbXNnLnNlZCBsaW51eC1tc2cuc2VkIHBvMnRibC5zZWQuaW4gY2F0LWNvbXBhdC5jIFwKKytDT1BZSU5HLkxJQi0yIGdldHRleHQuaCBsaWJnZXR0ZXh0LmggcGx1cmFsLWV2YWwuYyBsaWJnbnVpbnRsLmgKKysKKythbGw6IGFsbC1AVVNFX0lOQ0xVREVEX0xJQklOVExACisrYWxsLXllczogbGliaW50bC4kbGEgbGliaW50bC5oIGNoYXJzZXQuYWxpYXMgcmVmLWFkZC5zZWQgcmVmLWRlbC5zZWQKKythbGwtbm86IGFsbC1uby1AQlVJTERfSU5DTFVERURfTElCSU5UTEAKKythbGwtbm8teWVzOiBsaWJnbnVpbnRsLiRsYQorK2FsbC1uby1ubzoKKysKKytsaWJpbnRsLmEgbGliZ251aW50bC5hOiAkKE9CSkVDVFMpCisrCXJtIC1mICRACisrCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCisrCSQoUkFOTElCKSAkQAorKworK2xpYmludGwubGEgbGliZ251aW50bC5sYTogJChPQkpFQ1RTKQorKwkkKExJQlRPT0wpIC0tbW9kZT1saW5rIFwKKysJICAkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIFwKKysJICAkKE9CSkVDVFMpIEBMVExJQklDT05WQCAkKExJQlMpIC1sYyBcCisrCSAgLXZlcnNpb24taW5mbyAkKExUVl9DVVJSRU5UKTokKExUVl9SRVZJU0lPTik6JChMVFZfQUdFKSBcCisrCSAgLXJwYXRoICQobGliZGlyKSBcCisrCSAgLW5vLXVuZGVmaW5lZAorKworKyMgTGlidG9vbCdzIGxpYnJhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgbGliaW50bC4KKysjIEJlZm9yZSBtYWtpbmcgYSBnZXR0ZXh0IHJlbGVhc2UsIHRoZSBnZXR0ZXh0IG1haW50YWluZXIgbXVzdCBjaGFuZ2UgdGhpcworKyMgYWNjb3JkaW5nIHRvIHRoZSBsaWJ0b29sIGRvY3VtZW50YXRpb24sIHNlY3Rpb24gIkxpYnJhcnkgaW50ZXJmYWNlIHZlcnNpb25zIi4KKysjIE1haW50YWluZXJzIG9mIG90aGVyIHBhY2thZ2VzIHRoYXQgaW5jbHVkZSB0aGUgaW50bCBkaXJlY3RvcnkgbXVzdCAqbm90KgorKyMgY2hhbmdlIHRoZXNlIHZhbHVlcy4KKytMVFZfQ1VSUkVOVD03CisrTFRWX1JFVklTSU9OPTAKKytMVFZfQUdFPTQKKyAKKyAuU1VGRklYRVM6CistLlNVRkZJWEVTOiAuYyAubyAubG8KKysuU1VGRklYRVM6IC5jIC55IC5vIC5sbyAuc2luIC5zZWQKKysKKyAuYy5vOgorIAkkKENPTVBJTEUpICQ8CistLmMubG86CistCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkPAorIAorLUlOQ0xVREVTID0gLUkuLiAtSS4gLUkkKHRvcF9zcmNkaXIpL2ludGwgLUkkKHRvcF9zcmNkaXIpL2xpYgorKy55LmM6CisrCSQoWUFDQykgJChZRkxBR1MpIC0tb3V0cHV0ICRAICQ8CisrCXJtIC1mICQqLmgKKyAKKy1hbGw6IGFsbC1AVVNFX0lOQ0xVREVEX0xJQklOVExACisrYmluZHRleHRkb20ubG86ICQoc3JjZGlyKS9iaW5kdGV4dGRvbS5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvYmluZHRleHRkb20uYworK2RjZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjZ2V0dGV4dC5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNnZXR0ZXh0LmMKKytkZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RnZXR0ZXh0LmMKKysJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kZ2V0dGV4dC5jCisrZ2V0dGV4dC5sbzogJChzcmNkaXIpL2dldHRleHQuYworKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2dldHRleHQuYworK2ZpbmRkb21haW4ubG86ICQoc3JjZGlyKS9maW5kZG9tYWluLmMKKysJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9maW5kZG9tYWluLmMKKytsb2FkbXNnY2F0LmxvOiAkKHNyY2RpcikvbG9hZG1zZ2NhdC5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9hZG1zZ2NhdC5jCisrbG9jYWxlYWxpYXMubG86ICQoc3JjZGlyKS9sb2NhbGVhbGlhcy5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYworK3RleHRkb21haW4ubG86ICQoc3JjZGlyKS90ZXh0ZG9tYWluLmMKKysJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS90ZXh0ZG9tYWluLmMKKytsMTBuZmxpc3QubG86ICQoc3JjZGlyKS9sMTBuZmxpc3QuYworKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2wxMG5mbGlzdC5jCisrZXhwbG9kZW5hbWUubG86ICQoc3JjZGlyKS9leHBsb2RlbmFtZS5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYworK2RjaWdldHRleHQubG86ICQoc3JjZGlyKS9kY2lnZXR0ZXh0LmMKKysJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY2lnZXR0ZXh0LmMKKytkY25nZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNuZ2V0dGV4dC5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNuZ2V0dGV4dC5jCisrZG5nZXR0ZXh0LmxvOiAkKHNyY2RpcikvZG5nZXR0ZXh0LmMKKysJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kbmdldHRleHQuYworK25nZXR0ZXh0LmxvOiAkKHNyY2RpcikvbmdldHRleHQuYworKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL25nZXR0ZXh0LmMKKytwbHVyYWwubG86ICQoc3JjZGlyKS9wbHVyYWwuYworKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3BsdXJhbC5jCisrcGx1cmFsLWV4cC5sbzogJChzcmNkaXIpL3BsdXJhbC1leHAuYworKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3BsdXJhbC1leHAuYworK2xvY2FsY2hhcnNldC5sbzogJChzcmNkaXIpL2xvY2FsY2hhcnNldC5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmMKKytyZWxvY2F0YWJsZS5sbzogJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKKysJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9yZWxvY2F0YWJsZS5jCisrbG9jYWxlbmFtZS5sbzogJChzcmNkaXIpL2xvY2FsZW5hbWUuYworKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsZW5hbWUuYworK2xvZy5sbzogJChzcmNkaXIpL2xvZy5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9nLmMKKytwcmludGYubG86ICQoc3JjZGlyKS9wcmludGYuYworKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3ByaW50Zi5jCisrb3NkZXAubG86ICQoc3JjZGlyKS9vc2RlcC5jCisrCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2Rpcikvb3NkZXAuYworK2ludGwtY29tcGF0LmxvOiAkKHNyY2RpcikvaW50bC1jb21wYXQuYworKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2ludGwtY29tcGF0LmMKKyAKKy1hbGwteWVzOiBsaWJpbnRsLiRsYSBpbnRsaC5pbnN0CistYWxsLW5vOgorK3JlZi1hZGQuc2VkOiAkKHNyY2RpcikvcmVmLWFkZC5zaW4KKysJc2VkIC1lICcvXiMvZCcgLWUgJ3MvQCcnUEFDS0FHRScnQC9AUEFDS0FHRUAvZycgJChzcmNkaXIpL3JlZi1hZGQuc2luID4gdC1yZWYtYWRkLnNlZAorKwltdiB0LXJlZi1hZGQuc2VkIHJlZi1hZGQuc2VkCisrcmVmLWRlbC5zZWQ6ICQoc3JjZGlyKS9yZWYtZGVsLnNpbgorKwlzZWQgLWUgJy9eIy9kJyAtZSAncy9AJydQQUNLQUdFJydAL0BQQUNLQUdFQC9nJyAkKHNyY2RpcikvcmVmLWRlbC5zaW4gPiB0LXJlZi1kZWwuc2VkCisrCW12IHQtcmVmLWRlbC5zZWQgcmVmLWRlbC5zZWQKKyAKKy1saWJpbnRsLmE6ICQoT0JKRUNUUykKKy0Jcm0gLWYgJEAKKy0JJChBUikgY3J1ICRAICQoT0JKRUNUUykKKy0JJChSQU5MSUIpICRACisrSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkuLgorIAorLWxpYmludGwubGE6ICQoT0JKRUNUUykKKy0JJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKSAkKExERkxBR1MpIC1vICRAICQoT0JKRUNUUykgXAorLQkJICAgLXZlcnNpb24taW5mbyAxOjAgLXJwYXRoICQobGliZGlyKQorK2xpYmdudWludGwuaDogJChzcmNkaXIpL2xpYmdudWludGwuaC5pbgorKwlzZWQgLWUgJ3MsQCcnSEFWRV9QT1NJWF9QUklOVEYnJ0AsQEhBVkVfUE9TSVhfUFJJTlRGQCxnJyBcCisrCSAgICAtZSAncyxAJydIQVZFX0FTUFJJTlRGJydALEBIQVZFX0FTUFJJTlRGQCxnJyBcCisrCSAgICAtZSAncyxAJydIQVZFX1NOUFJJTlRGJydALEBIQVZFX1NOUFJJTlRGQCxnJyBcCisrCSAgICAtZSAncyxAJydIQVZFX1dQUklOVEYnJ0AsQEhBVkVfV1BSSU5URkAsZycgXAorKwkgIDwgJChzcmNkaXIpL2xpYmdudWludGwuaC5pbiA+IGxpYmdudWludGwuaAorIAorLS4uL3BvL2NhdC1pZC10YmwuJGxvOiAuLi9wby9jYXQtaWQtdGJsLmMgJCh0b3Bfc3JjZGlyKS9wby8kKFBBQ0tBR0UpLnBvdAorLQljZCAuLi9wbyAmJiAkKE1BS0UpIGNhdC1pZC10YmwuJGxvCisrbGliaW50bC5oOiBsaWJnbnVpbnRsLmgKKysJY3AgbGliZ251aW50bC5oIGxpYmludGwuaAorIAorLWNoZWNrOiBhbGwKKytjaGFyc2V0LmFsaWFzOiAkKHNyY2RpcikvY29uZmlnLmNoYXJzZXQKKysJJChTSEVMTCkgJChzcmNkaXIpL2NvbmZpZy5jaGFyc2V0ICdAaG9zdEAnID4gdC0kQAorKwltdiB0LSRAICRACisgCistIyBUaGlzIGluc3RhbGxhdGlvbiBnb2FsIGlzIG9ubHkgdXNlZCBpbiBHTlUgZ2V0dGV4dC4gIFBhY2thZ2VzIHdoaWNoCistIyBvbmx5IHVzZSB0aGUgbGlicmFyeSBzaG91bGQgdXNlIGluc3RhbGwgaW5zdGVhZC4KKytjaGVjazogYWxsCisgCisgIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCistIyBzeXN0ZW0gd2hpY2ggaGFzIHRoZSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCistIyBzZXBhcmF0ZSBsaWJyYXJ5IG9yIHVzZSB0aGUgY2F0Z2V0cyBpbnRlcmZhY2UuICBBIHNwZWNpYWwgY2FzZSBpcworLSMgd2hlcmUgY29uZmlndXJlIGZvdW5kIGEgcHJldmlvdXNseSBpbnN0YWxsZWQgR05VIGdldHRleHQgbGlicmFyeS4KKysjIHN5c3RlbSB3aGljaCBoYXMgdGhlIEdOVSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCisrIyBzZXBhcmF0ZSBsaWJyYXJ5LgorICMgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBvbmUgd2hpY2ggY29tZXMgd2l0aCB0aGlzIHZlcnNpb24gb2YgdGhlCisgIyBwYWNrYWdlLCB5b3UgaGF2ZSB0byB1c2UgYGNvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCcuCisgaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQorIGluc3RhbGwtZXhlYzogYWxsCistCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiIFwKKy0JICAgJiYgdGVzdCAnQElOVExPQkpTQCcgPSAnJChHRVRUT0JKUyknOyB0aGVuIFwKKy0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAorLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGxpYmRpcikgJChpbmNsdWRlZGlyKTsgXAorLQkgIGVsc2UgXAorLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQobGliZGlyKSAkKGluY2x1ZGVkaXIpOyBcCisrCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCisrCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKKysJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikgJChERVNURElSKSQoaW5jbHVkZWRpcik7IFwKKysJICAkKElOU1RBTExfREFUQSkgbGliaW50bC5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2xpYmludGwuaDsgXAorKwkgICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgXAorKwkgICAgJChJTlNUQUxMX0RBVEEpIGxpYmludGwuJGxhICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC4kbGE7IFwKKysJICBpZiB0ZXN0ICJAUkVMT0NBVEFCTEVAIiA9IHllczsgdGhlbiBcCisrCSAgICBkZXBlbmRlbmNpZXM9YHNlZCAtbiAtZSAncyxeZGVwZW5kZW5jeV9saWJzPVwoLipcKSxcMSxwJyA8ICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC5sYSB8IHNlZCAtZSAicyxeJywsIiAtZSAicywnXCQkLCwiYDsgXAorKwkgICAgaWYgdGVzdCAtbiAiJCRkZXBlbmRlbmNpZXMiOyB0aGVuIFwKKysJICAgICAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLmxhOyBcCisrCSAgICBmaTsgXAorIAkgIGZpOyBcCistCSAgJChJTlNUQUxMX0RBVEEpIGludGxoLmluc3QgJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKKy0JICAkKElOU1RBTExfREFUQSkgbGliaW50bC5hICQobGliZGlyKS9saWJpbnRsLmE7IFwKKyAJZWxzZSBcCisgCSAgOiA7IFwKKyAJZmkKKy1pbnN0YWxsLWRhdGE6IGFsbAorLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCistCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKy0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAorKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCisrCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAorKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKTsgXAorKwkgICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgXAorKwkgICAgJChJTlNUQUxMX0RBVEEpIGxpYmdudWludGwuJGxhICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC4kbGE7IFwKKysJICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKKysJICAkKElOU1RBTExfREFUQSkgJChERVNURElSKSQobGliZGlyKS9saWJnbnVpbnRsLnNvICQoREVTVERJUikkKGxpYmRpcikvcHJlbG9hZGFibGVfbGliaW50bC5zbzsgXAorKwkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBcCisrCSAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuJGxhOyBcCisrCWVsc2UgXAorKwkgIDogOyBcCisrCWZpCisrCWlmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKKysJICB0ZXN0IEBHTElCQzIxQCAhPSBubyB8fCAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcik7IFwKKysJICB0ZW1wPSQoREVTVERJUikkKGxpYmRpcikvdC1jaGFyc2V0LmFsaWFzOyBcCisrCSAgZGVzdD0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKKysJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgdGhlbiBcCisrCSAgICBvcmlnPSQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgXAorKwkgICAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAorKwkgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKysJICAgIHJtIC1mICQkdGVtcDsgXAorIAkgIGVsc2UgXAorLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKKysJICAgIGlmIHRlc3QgQEdMSUJDMjFAID0gbm87IHRoZW4gXAorKwkgICAgICBvcmlnPWNoYXJzZXQuYWxpYXM7IFwKKysJICAgICAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAorKwkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorKwkgICAgICBybSAtZiAkJHRlbXA7IFwKKysJICAgIGZpOyBcCisgCSAgZmk7IFwKKy0JICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKGdldHRleHRzcmNkaXIpL1ZFUlNJT047IFwKKy0JICBkaXN0cz0iJChESVNURklMRVMuY29tbW9uKSI7IFwKKysJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxvY2FsZWRpcik7IFwKKysJICB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzIFwKKysJICAgICYmIG9yaWc9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXMgXAorKwkgICAgfHwgb3JpZz0kKHNyY2RpcikvbG9jYWxlLmFsaWFzOyBcCisrCSAgdGVtcD0kKERFU1RESVIpJChsb2NhbGVkaXIpL3QtbG9jYWxlLmFsaWFzOyBcCisrCSAgZGVzdD0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgXAorKwkgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKKysJICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorKwkgIHJtIC1mICQkdGVtcDsgXAorKwllbHNlIFwKKysJICA6IDsgXAorKwlmaQorK2luc3RhbGwtZGF0YTogYWxsCisrCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKKysJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCisrCSAgJChJTlNUQUxMX0RBVEEpIFZFUlNJT04gJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvVkVSU0lPTjsgXAorKwkgICQoSU5TVEFMTF9EQVRBKSBDaGFuZ2VMb2cuaW5zdCAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9DaGFuZ2VMb2c7IFwKKysJICBkaXN0cz0iQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pIjsgXAorIAkgIGZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKKy0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlICQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCisrCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSBcCisrCQkJICAgICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorIAkgIGRvbmU7IFwKKysJICBjaG1vZCBhK3ggJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvY29uZmlnLmNoYXJzZXQ7IFwKKysJICBkaXN0cz0iJChESVNURklMRVMuZ2VuZXJhdGVkKSI7IFwKKysJICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisrCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAorKwkgICAgJChJTlNUQUxMX0RBVEEpICQkZGlyLyQkZmlsZSBcCisrCQkJICAgICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorKwkgIGRvbmU7IFwKKysJICBkaXN0cz0iJChESVNURklMRVMub2Jzb2xldGUpIjsgXAorKwkgIGZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKKysJICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorKwkgIGRvbmU7IFwKKysJZWxzZSBcCisrCSAgOiA7IFwKKysJZmkKKysKKytpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisrCisraW5zdGFsbGRpcnM6CisrCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCisrCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKKysJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikgJChERVNURElSKSQoaW5jbHVkZWRpcik7IFwKKysJZWxzZSBcCisrCSAgOiA7IFwKKysJZmkKKysJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAorKwkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IG5vOyB0aGVuIFwKKysJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcik7IFwKKysJZWxzZSBcCisrCSAgOiA7IFwKKysJZmkKKysJaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorKwkgIHRlc3QgQEdMSUJDMjFAICE9IG5vIHx8ICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKTsgXAorKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobG9jYWxlZGlyKTsgXAorKwllbHNlIFwKKysJICA6IDsgXAorKwlmaQorKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisrCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKTsgXAorIAllbHNlIFwKKyAJICA6IDsgXAorIAlmaQorQEAgLTE0MywyMiArMzY3LDc2IEBACisgaW5zdGFsbGNoZWNrOgorIAorIHVuaW5zdGFsbDoKKy0JZGlzdHM9IiQoRElTVEZJTEVTLmNvbW1vbikiOyBcCistCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKKy0JICBybSAtZiAkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorLQlkb25lCisrCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCisrCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKKysJICBybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKKysJICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgXAorKwkgICAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLiRsYTsgXAorKwllbHNlIFwKKysJICA6IDsgXAorKwlmaQorKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCisrCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAorKwkgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvcHJlbG9hZGFibGVfbGliaW50bC5zbzsgXAorKwllbHNlIFwKKysJICA6IDsgXAorKwlmaQorKwlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisrCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IHRoZW4gXAorKwkgICAgdGVtcD0kKERFU1RESVIpJChsaWJkaXIpL3QtY2hhcnNldC5hbGlhczsgXAorKwkgICAgZGVzdD0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKKysJICAgIHNlZCAtZiByZWYtZGVsLnNlZCAkJGRlc3QgPiAkJHRlbXA7IFwKKysJICAgIGlmIGdyZXAgJ14jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogJCQnICQkdGVtcCA+IC9kZXYvbnVsbDsgdGhlbiBcCisrCSAgICAgIHJtIC1mICQkZGVzdDsgXAorKwkgICAgZWxzZSBcCisrCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCisrCSAgICBmaTsgXAorKwkgICAgcm0gLWYgJCR0ZW1wOyBcCisrCSAgZmk7IFwKKysJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyB0aGVuIFwKKysJICAgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAorKwkgICAgZGVzdD0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgXAorKwkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAorKwkgICAgaWYgZ3JlcCAnXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAkJCcgJCR0ZW1wID4gL2Rldi9udWxsOyB0aGVuIFwKKysJICAgICAgcm0gLWYgJCRkZXN0OyBcCisrCSAgICBlbHNlIFwKKysJICAgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKysJICAgIGZpOyBcCisrCSAgICBybSAtZiAkJHRlbXA7IFwKKysJICBmaTsgXAorKwllbHNlIFwKKysJICA6IDsgXAorKwlmaQorKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisrCSAgZm9yIGZpbGUgaW4gVkVSU0lPTiBDaGFuZ2VMb2cgQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCk7IGRvIFwKKysJICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorKwkgIGRvbmU7IFwKKysJZWxzZSBcCisrCSAgOiA7IFwKKysJZmkKKyAKKy1pbmZvIGR2aToKKytpbmZvIGR2aSBwcyBwZGYgaHRtbDoKKyAKKy0kKE9CSkVDVFMpOiAuLi9jb25maWcuaCBsaWJnZXR0ZXh0LmgKKy1iaW5kdGV4dGRvbS4kbG8gZmluZGRvbWFpbi4kbG8gbG9hZG1zZ2NhdC4kbG86IGdldHRleHRQLmggZ2V0dGV4dC5oIGxvYWRpbmZvLmgKKy1kY2dldHRleHQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBoYXNoLXN0cmluZy5oIGxvYWRpbmZvLmgKKyskKE9CSkVDVFMpOiAuLi9jb25maWcuaCBsaWJnbnVpbnRsLmgKKytiaW5kdGV4dGRvbS4kbG8gZGNnZXR0ZXh0LiRsbyBkY2lnZXR0ZXh0LiRsbyBkY25nZXR0ZXh0LiRsbyBkZ2V0dGV4dC4kbG8gZG5nZXR0ZXh0LiRsbyBmaW5kZG9tYWluLiRsbyBnZXR0ZXh0LiRsbyBpbnRsLWNvbXBhdC4kbG8gbG9hZG1zZ2NhdC4kbG8gbG9jYWxlYWxpYXMuJGxvIG5nZXR0ZXh0LiRsbyB0ZXh0ZG9tYWluLiRsbzogJChzcmNkaXIpL2dldHRleHRQLmggJChzcmNkaXIpL2dtby5oICQoc3JjZGlyKS9sb2FkaW5mby5oCisrZGNpZ2V0dGV4dC4kbG8gbG9hZG1zZ2NhdC4kbG86ICQoc3JjZGlyKS9oYXNoLXN0cmluZy5oCisrZXhwbG9kZW5hbWUuJGxvIGwxMG5mbGlzdC4kbG86ICQoc3JjZGlyKS9sb2FkaW5mby5oCisrZGNpZ2V0dGV4dC4kbG8gbG9hZG1zZ2NhdC4kbG8gcGx1cmFsLiRsbyBwbHVyYWwtZXhwLiRsbzogJChzcmNkaXIpL3BsdXJhbC1leHAuaAorK2RjaWdldHRleHQuJGxvOiAkKHNyY2RpcikvZXZhbC1wbHVyYWwuaAorK2xvY2FsY2hhcnNldC4kbG86ICQoc3JjZGlyKS9sb2NhbGNoYXJzZXQuaAorK2xvY2FsZWFsaWFzLiRsbyBsb2NhbGNoYXJzZXQuJGxvIHJlbG9jYXRhYmxlLiRsbzogJChzcmNkaXIpL3JlbG9jYXRhYmxlLmgKKytwcmludGYuJGxvOiAkKHNyY2RpcikvcHJpbnRmLWFyZ3MuaCAkKHNyY2RpcikvcHJpbnRmLWFyZ3MuYyAkKHNyY2RpcikvcHJpbnRmLXBhcnNlLmggJChzcmNkaXIpL3dwcmludGYtcGFyc2UuaCAkKHNyY2RpcikveHNpemUuaCAkKHNyY2RpcikvcHJpbnRmLXBhcnNlLmMgJChzcmNkaXIpL3Zhc25wcmludGYuaCAkKHNyY2RpcikvdmFzbndwcmludGYuaCAkKHNyY2RpcikvdmFzbnByaW50Zi5jCisgCisgdGFnczogVEFHUworIAorIFRBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQorIAloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgZXRhZ3MgLW8gJCRoZXJlL1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCisgCisrY3RhZ3M6IENUQUdTCisrCisrQ1RBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQorKwloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgY3RhZ3MgLW8gJCRoZXJlL0NUQUdTICQoSEVBREVSUykgJChTT1VSQ0VTKQorKworIGlkOiBJRAorIAorIElEOiAkKEhFQURFUlMpICQoU09VUkNFUykKK0BAIC0xNjYsMTIgKzQ0NCwxOSBAQAorIAorIAorIG1vc3RseWNsZWFuOgorLQlybSAtZiAqLmEgKi5vICoubG8gY29yZSBjb3JlLioKKysJcm0gLWYgKi5hICoubGEgKi5vICoub2JqICoubG8gY29yZSBjb3JlLioKKysJcm0gLWYgbGliZ251aW50bC5oIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCisrCXJtIC1mIC1yIC5saWJzIF9saWJzCisgCisgY2xlYW46IG1vc3RseWNsZWFuCisgCisgZGlzdGNsZWFuOiBjbGVhbgorLQlybSAtZiBNYWtlZmlsZSBJRCBUQUdTIHBvMm1zZy5zZWQgcG8ydGJsLnNlZCBsaWJpbnRsLmgKKysJcm0gLWYgTWFrZWZpbGUgSUQgVEFHUworKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKKysJICBybSAtZiBDaGFuZ2VMb2cuaW5zdCAkKERJU1RGSUxFUy5ub3JtYWwpOyBcCisrCWVsc2UgXAorKwkgIDogOyBcCisrCWZpCisgCisgbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCisgCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCitAQCAtMTgxLDMzICs0NjYsMjcgQEAKKyAjIEdOVSBnZXR0ZXh0IG5lZWRzIG5vdCBjb250YWluIHRoZSBmaWxlIGBWRVJTSU9OJyBidXQgY29udGFpbnMgc29tZQorICMgb3RoZXIgZmlsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXN0cmlidXRlZCBpbiBvdGhlciBwYWNrYWdlcy4KKyBkaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQorLWRpc3QgZGlzdGRpcjogTWFrZWZpbGUgJChESVNURklMRVMpCistCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gZ2V0dGV4dDsgdGhlbiBcCistCSAgYWRkaXRpb25hbD0iJChESVNURklMRVMuZ2V0dGV4dCkiOyBcCisrZGlzdCBkaXN0ZGlyOiBNYWtlZmlsZQorKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisrCSAgOiA7IFwKKyAJZWxzZSBcCistCSAgYWRkaXRpb25hbD0iJChESVNURklMRVMubm9ybWFsKSI7IFwKKy0JZmk7IFwKKy0JZm9yIGZpbGUgaW4gJChESVNURklMRVMuY29tbW9uKSAkJGFkZGl0aW9uYWw7IGRvIFwKKy0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKKy0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAorLQlkb25lCistCistZGlzdC1saWJjOgorLQl0YXIgemN2ZiBpbnRsLWdsaWJjLnRhci5neiAkKENPTVNSQ1MpICQoQ09NSERSUykgbGliaW50bC5oLmdsaWJjCistCistTWFrZWZpbGU6IE1ha2VmaWxlLmluIC4uL2NvbmZpZy5zdGF0dXMKKy0JY2QgLi4gXAorLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworKwkgIGlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSI7IHRoZW4gXAorKwkgICAgYWRkaXRpb25hbD0iJChESVNURklMRVMuZ2V0dGV4dCkiOyBcCisrCSAgZWxzZSBcCisrCSAgICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5ub3JtYWwpIjsgXAorKwkgIGZpOyBcCisrCSAgJChNQUtFKSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCkgJCRhZGRpdGlvbmFsOyBcCisrCSAgZm9yIGZpbGUgaW4gQ2hhbmdlTG9nICQoRElTVEZJTEVTLmNvbW1vbikgJChESVNURklMRVMuZ2VuZXJhdGVkKSAkJGFkZGl0aW9uYWw7IGRvIFwKKysJICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGRpcj0uOyBlbHNlIGRpcj0kKHNyY2Rpcik7IGZpOyBcCisrCSAgICBjcCAtcCAkJGRpci8kJGZpbGUgJChkaXN0ZGlyKTsgXAorKwkgIGRvbmU7IFwKKysJZmkKKyAKKy0jIFRoZSBkZXBlbmRlbmN5IGZvciBpbnRsaC5pbnN0IGlzIGRpZmZlcmVudCBpbiBnZXR0ZXh0IGFuZCBhbGwgb3RoZXIKKy0jIHBhY2thZ2VzLiAgQmVjYXVzZSB3ZSBjYW5ub3QgeW91IEdOVSBtYWtlIGZlYXR1cmVzIHdlIGhhdmUgdG8gc29sdmUKKy0jIHRoZSBwcm9ibGVtIHdoaWxlIHJld3JpdGluZyBNYWtlZmlsZS5pbi4KKy1AR1RfWUVTQGludGxoLmluc3Q6IGludGxoLmluc3QuaW4gLi4vY29uZmlnLnN0YXR1cworLUBHVF9ZRVNACWNkIC4uIFwKKy1AR1RfWUVTQAkmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSBcCistQEdUX1lFU0AJICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKy1AR1RfTk9ALlBIT05ZOiBpbnRsaC5pbnN0CistQEdUX05PQGludGxoLmluc3Q6CisrTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisrIyBUaGlzIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgZG9lc24ndCB3b3JrIGFueSBtb3JlIHdpdGggYXV0b2NvbmYtMi41NywKKysjIHdoZW4gQUNfQ09ORklHX0ZJTEVTKFtpbnRsL01ha2VmaWxlOnNvbWVkaXIvTWFrZWZpbGUuaW5dKSBpcyB1c2VkLgorKyMJY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworIAorICMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisgIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvbmdldHRleHQuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9uZ2V0dGV4dC5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNTMzNzIxMDMyIC0wNDAwCitAQCAtMCwwICsxLDY1IEBACisrLyogSW1wbGVtZW50YXRpb24gb2YgbmdldHRleHQoMykgZnVuY3Rpb24uCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrIyBpbmNsdWRlIDxjb25maWcuaD4KKysjZW5kaWYKKysKKysjaWZkZWYgX0xJQkMKKysjIGRlZmluZSBfX25lZWRfTlVMTAorKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCisrI2VuZGlmCisrCisrI2luY2x1ZGUgImdldHRleHRQLmgiCisrI2lmZGVmIF9MSUJDCisrIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKysjZW5kaWYKKysKKysjaW5jbHVkZSA8bG9jYWxlLmg+CisrCisrLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworKworKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKysgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisrICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisrICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKysjaWZkZWYgX0xJQkMKKysjIGRlZmluZSBOR0VUVEVYVCBfX25nZXR0ZXh0CisrIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKKysjZWxzZQorKyMgZGVmaW5lIE5HRVRURVhUIGxpYmludGxfbmdldHRleHQKKysjIGRlZmluZSBEQ05HRVRURVhUIGxpYmludGxfZGNuZ2V0dGV4dAorKyNlbmRpZgorKworKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisrICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKysgICB0ZXh0KS4gICovCisrY2hhciAqCisrTkdFVFRFWFQgKGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQorK3sKKysgIHJldHVybiBEQ05HRVRURVhUIChOVUxMLCBtc2dpZDEsIG1zZ2lkMiwgbiwgTENfTUVTU0FHRVMpOworK30KKysKKysjaWZkZWYgX0xJQkMKKysvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KKyt3ZWFrX2FsaWFzIChfX25nZXR0ZXh0LCBuZ2V0dGV4dCk7CisrI2VuZGlmCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvb3MyY29tcGF0LmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvb3MyY29tcGF0LmMJMjAwNC0wOS0xMiAxNDo0MDozNC41Mzk3MjAxMjAgLTA0MDAKK0BAIC0wLDAgKzEsOTggQEAKKysvKiBPUy8yIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zLgorKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjZGVmaW5lIE9TMl9BV0FSRQorKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrI2luY2x1ZGUgPGNvbmZpZy5oPgorKyNlbmRpZgorKworKyNpbmNsdWRlIDxzdGRsaWIuaD4KKysjaW5jbHVkZSA8c3RyaW5nLmg+CisrI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorKworKy8qIEEgdmVyc2lvbiBvZiBnZXRlbnYoKSB0aGF0IHdvcmtzIGZyb20gRExMcyAqLworK2V4dGVybiB1bnNpZ25lZCBsb25nIERvc1NjYW5FbnYgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBzek5hbWUsIHVuc2lnbmVkIGNoYXIgKipwcHN6VmFsdWUpOworKworK2NoYXIgKgorK19ubF9nZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCisreworKyAgdW5zaWduZWQgY2hhciAqdmFsdWU7CisrICBpZiAoRG9zU2NhbkVudiAobmFtZSwgJnZhbHVlKSkKKysgICAgcmV0dXJuIE5VTEw7CisrICBlbHNlCisrICAgIHJldHVybiB2YWx1ZTsKKyt9CisrCisrLyogQSBmaXhlZCBzaXplIGJ1ZmZlci4gICovCisrY2hhciBsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZVtNQVhQQVRITEVOKzFdOworKworK2NoYXIgKl9ubG9zMl9saWJkaXIgPSBOVUxMOworK2NoYXIgKl9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBOVUxMOworK2NoYXIgKl9ubG9zMl9sb2NhbGVkaXIgPSBOVUxMOworKworK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQKKytubG9zMl9pbml0aWFsaXplICgpCisreworKyAgY2hhciAqcm9vdCA9IGdldGVudiAoIlVOSVhST09UIik7CisrICBjaGFyICpnbnVsb2NhbGVkaXIgPSBnZXRlbnYgKCJHTlVMT0NBTEVESVIiKTsKKysKKysgIF9ubG9zMl9saWJkaXIgPSBnbnVsb2NhbGVkaXI7CisrICBpZiAoIV9ubG9zMl9saWJkaXIpCisrICAgIHsKKysgICAgICBpZiAocm9vdCkKKysgICAgICAgIHsKKysgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKysgICAgICAgICAgX25sb3MyX2xpYmRpciA9IChjaGFyICopIG1hbGxvYyAoc2wgKyBzdHJsZW4gKExJQkRJUikgKyAxKTsKKysgICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyLCByb290LCBzbCk7CisrICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xpYmRpciArIHNsLCBMSUJESVIsIHN0cmxlbiAoTElCRElSKSArIDEpOworKyAgICAgICAgfQorKyAgICAgIGVsc2UKKysgICAgICAgIF9ubG9zMl9saWJkaXIgPSBMSUJESVI7CisrICAgIH0KKysKKysgIF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBnbnVsb2NhbGVkaXI7CisrICBpZiAoIV9ubG9zMl9sb2NhbGVhbGlhc3BhdGgpCisrICAgIHsKKysgICAgICBpZiAocm9vdCkKKysgICAgICAgIHsKKysgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKysgICAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IChjaGFyICopIG1hbGxvYyAoc2wgKyBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOworKyAgICAgICAgICBtZW1jcHkgKF9ubG9zMl9sb2NhbGVhbGlhc3BhdGgsIHJvb3QsIHNsKTsKKysgICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlYWxpYXNwYXRoICsgc2wsIExPQ0FMRV9BTElBU19QQVRILCBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOworKyAgICAgICAgfQorKyAgICAgZWxzZQorKyAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOworKyAgICB9CisrCisrICBfbmxvczJfbG9jYWxlZGlyID0gZ251bG9jYWxlZGlyOworKyAgaWYgKCFfbmxvczJfbG9jYWxlZGlyKQorKyAgICB7CisrICAgICAgaWYgKHJvb3QpCisrICAgICAgICB7CisrICAgICAgICAgIHNpemVfdCBzbCA9IHN0cmxlbiAocm9vdCk7CisrICAgICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHNsICsgc3RybGVuIChMT0NBTEVESVIpICsgMSk7CisrICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciwgcm9vdCwgc2wpOworKyAgICAgICAgICBtZW1jcHkgKF9ubG9zMl9sb2NhbGVkaXIgKyBzbCwgTE9DQUxFRElSLCBzdHJsZW4gKExPQ0FMRURJUikgKyAxKTsKKysgICAgICAgIH0KKysgICAgICBlbHNlCisrICAgICAgICBfbmxvczJfbG9jYWxlZGlyID0gTE9DQUxFRElSOworKyAgICB9CisrCisrICBpZiAoc3RybGVuIChfbmxvczJfbG9jYWxlZGlyKSA8PSBNQVhQQVRITEVOKQorKyAgICBzdHJjcHkgKGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lLCBfbmxvczJfbG9jYWxlZGlyKTsKKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvb3MyY29tcGF0LmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvb3MyY29tcGF0LmgJMjAwNC0wOS0xMiAxNDo0MDozNC41NDQ3MTkzNjAgLTA0MDAKK0BAIC0wLDAgKzEsNDYgQEAKKysvKiBPUy8yIGNvbXBhdGliaWxpdHkgZGVmaW5lcy4KKysgICBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgZnJvbSBjb25maWcuaAorKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysvKiBXaGVuIGluY2x1ZGVkIGZyb20gb3MyY29tcGF0Lmggd2UgbmVlZCBhbGwgdGhlIG9yaWdpbmFsIGRlZmluaXRpb25zICovCisrI2lmbmRlZiBPUzJfQVdBUkUKKysKKysjdW5kZWYgTElCRElSCisrI2RlZmluZSBMSUJESVIJCQlfbmxvczJfbGliZGlyCisrZXh0ZXJuIGNoYXIgKl9ubG9zMl9saWJkaXI7CisrCisrI3VuZGVmIExPQ0FMRURJUgorKyNkZWZpbmUgTE9DQUxFRElSCQlfbmxvczJfbG9jYWxlZGlyCisrZXh0ZXJuIGNoYXIgKl9ubG9zMl9sb2NhbGVkaXI7CisrCisrI3VuZGVmIExPQ0FMRV9BTElBU19QQVRICisrI2RlZmluZSBMT0NBTEVfQUxJQVNfUEFUSAlfbmxvczJfbG9jYWxlYWxpYXNwYXRoCisrZXh0ZXJuIGNoYXIgKl9ubG9zMl9sb2NhbGVhbGlhc3BhdGg7CisrCisrI2VuZGlmCisrCisrI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorKyNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKKysjZGVmaW5lIHN0cmNhc2VjbXAgc3RyaWNtcAorKyNkZWZpbmUgc3RybmNhc2VjbXAgc3RybmljbXAKKysKKysvKiBXZSBoYXZlIG91ciBvd24gZ2V0ZW52KCkgd2hpY2ggd29ya3MgZXZlbiBpZiBsaWJyYXJ5IGlzIGNvbXBpbGVkIGFzIERMTCAqLworKyNkZWZpbmUgZ2V0ZW52IF9ubF9nZXRlbnYKKysKKysvKiBPbGRlciB2ZXJzaW9ucyBvZiBnZXR0ZXh0IHVzZWQgLTEgYXMgdGhlIHZhbHVlIG9mIExDX01FU1NBR0VTICovCisrI2RlZmluZSBMQ19NRVNTQUdFU19DT01QQVQgKC0xKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL29zZGVwLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvb3NkZXAuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjU1MDcxODQ0OCAtMDQwMAorQEAgLTAsMCArMSwyNCBAQAorKy8qIE9TIGRlcGVuZGVudCBwYXJ0cyBvZiBsaWJpbnRsLgorKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWYgZGVmaW5lZCBfX0VNWF9fCisrIyBpbmNsdWRlICJvczJjb21wYXQuYyIKKysjZWxzZQorKy8qIEF2b2lkIEFJWCBjb21waWxlciB3YXJuaW5nLiAgKi8KKyt0eXBlZGVmIGludCBkdW1teTsKKysjZW5kaWYKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9wbHVyYWwuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9wbHVyYWwuYwkyMDA0LTA5LTEyIDE0OjQwOjM2LjU3MTQxMTI1NiAtMDQwMAorQEAgLTAsMCArMSwxNDkwIEBACisrLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSBwbHVyYWwueQorKyAgIGJ5IEdOVSBiaXNvbiAxLjM1LiAgKi8KKysKKysjZGVmaW5lIFlZQklTT04gMSAgLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KKysKKysjZGVmaW5lIHl5cGFyc2UgX19nZXR0ZXh0cGFyc2UKKysjZGVmaW5lIHl5bGV4IF9fZ2V0dGV4dGxleAorKyNkZWZpbmUgeXllcnJvciBfX2dldHRleHRlcnJvcgorKyNkZWZpbmUgeXlsdmFsIF9fZ2V0dGV4dGx2YWwKKysjZGVmaW5lIHl5Y2hhciBfX2dldHRleHRjaGFyCisrI2RlZmluZSB5eWRlYnVnIF9fZ2V0dGV4dGRlYnVnCisrI2RlZmluZSB5eW5lcnJzIF9fZ2V0dGV4dG5lcnJzCisrIyBkZWZpbmUJRVFVT1AyCTI1NworKyMgZGVmaW5lCUNNUE9QMgkyNTgKKysjIGRlZmluZQlBRERPUDIJMjU5CisrIyBkZWZpbmUJTVVMT1AyCTI2MAorKyMgZGVmaW5lCU5VTUJFUgkyNjEKKysKKysjbGluZSAxICJwbHVyYWwueSIKKysKKysvKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKysgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysvKiBUaGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNlciB1c2VzIGFsbG9jYS4gIEFJWCAzIGZvcmNlcyB1cyB0byBwdXQgdGhpcworKyAgIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4gYmlzb24ncworKyAgIHNrZWxldG9uIGZpbGUgY29tZXMgdG9vIGxhdGUuICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPgorKyAgIGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZSBhcmJpdHJhcnkgc3lzdGVtIGhlYWRlcnMuICAqLworKyNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgX19HTlVDX18KKysgI3ByYWdtYSBhbGxvY2EKKysjZW5kaWYKKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisrI2VuZGlmCisrCisrI2luY2x1ZGUgPHN0ZGRlZi5oPgorKyNpbmNsdWRlIDxzdGRsaWIuaD4KKysjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorKworKy8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKKysgICBidXQgd2Ugd2FudCBpdCB0byBiZSBjYWxsZWQgUExVUkFMX1BBUlNFLiAgKi8KKysjaWZuZGVmIF9MSUJDCisrIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCisrI2VuZGlmCisrCisrI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAorKyNkZWZpbmUgWVlQQVJTRV9QQVJBTQlhcmcKKysKKysjbGluZSA0OSAicGx1cmFsLnkiCisrI2lmbmRlZiBZWVNUWVBFCisrdHlwZWRlZiB1bmlvbiB7CisrICB1bnNpZ25lZCBsb25nIGludCBudW07CisrICBlbnVtIG9wZXJhdG9yIG9wOworKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKKyt9IHl5c3R5cGU7CisrIyBkZWZpbmUgWVlTVFlQRSB5eXN0eXBlCisrIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKKysjZW5kaWYKKysjbGluZSA1NSAicGx1cmFsLnkiCisrCisrLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KKytzdGF0aWMgaW50IHl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCk7Cisrc3RhdGljIHZvaWQgeXllcnJvciAoY29uc3QgY2hhciAqc3RyKTsKKysKKysvKiBBbGxvY2F0aW9uIG9mIGV4cHJlc3Npb25zLiAgKi8KKysKKytzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgorK25ld19leHAgKGludCBuYXJncywgZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKiBjb25zdCAqYXJncykKKyt7CisrICBpbnQgaTsKKysgIHN0cnVjdCBleHByZXNzaW9uICpuZXdwOworKworKyAgLyogSWYgYW55IG9mIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgbWFsbG9jJ2VkLCBqdXN0IHJldHVybiBOVUxMLiAgKi8KKysgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisrICAgIGlmIChhcmdzW2ldID09IE5VTEwpCisrICAgICAgZ290byBmYWlsOworKworKyAgLyogQWxsb2NhdGUgYSBuZXcgZXhwcmVzc2lvbi4gICovCisrICBuZXdwID0gKHN0cnVjdCBleHByZXNzaW9uICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOworKyAgaWYgKG5ld3AgIT0gTlVMTCkKKysgICAgeworKyAgICAgIG5ld3AtPm5hcmdzID0gbmFyZ3M7CisrICAgICAgbmV3cC0+b3BlcmF0aW9uID0gb3A7CisrICAgICAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKysJbmV3cC0+dmFsLmFyZ3NbaV0gPSBhcmdzW2ldOworKyAgICAgIHJldHVybiBuZXdwOworKyAgICB9CisrCisrIGZhaWw6CisrICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorKyAgICBGUkVFX0VYUFJFU1NJT04gKGFyZ3NbaV0pOworKworKyAgcmV0dXJuIE5VTEw7CisrfQorKworK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorK25ld19leHBfMCAoZW51bSBvcGVyYXRvciBvcCkKKyt7CisrICByZXR1cm4gbmV3X2V4cCAoMCwgb3AsIE5VTEwpOworK30KKysKKytzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKKytuZXdfZXhwXzEgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKKyt7CisrICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1sxXTsKKysKKysgIGFyZ3NbMF0gPSByaWdodDsKKysgIHJldHVybiBuZXdfZXhwICgxLCBvcCwgYXJncyk7CisrfQorKworK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCisrbmV3X2V4cF8yIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqbGVmdCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQorK3sKKysgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzJdOworKworKyAgYXJnc1swXSA9IGxlZnQ7CisrICBhcmdzWzFdID0gcmlnaHQ7CisrICByZXR1cm4gbmV3X2V4cCAoMiwgb3AsIGFyZ3MpOworK30KKysKKytzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKKytuZXdfZXhwXzMgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpiZXhwLAorKwkgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqdGJyYW5jaCwgc3RydWN0IGV4cHJlc3Npb24gKmZicmFuY2gpCisreworKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107CisrCisrICBhcmdzWzBdID0gYmV4cDsKKysgIGFyZ3NbMV0gPSB0YnJhbmNoOworKyAgYXJnc1syXSA9IGZicmFuY2g7CisrICByZXR1cm4gbmV3X2V4cCAoMywgb3AsIGFyZ3MpOworK30KKysKKysjaWZuZGVmIFlZREVCVUcKKysjIGRlZmluZSBZWURFQlVHIDAKKysjZW5kaWYKKysKKysKKysKKysjZGVmaW5lCVlZRklOQUwJCTI3CisrI2RlZmluZQlZWUZMQUcJCS0zMjc2OAorKyNkZWZpbmUJWVlOVEJBU0UJMTYKKysKKysvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gdG9rZW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICovCisrI2RlZmluZSBZWVRSQU5TTEFURSh4KSAoKHVuc2lnbmVkKSh4KSA8PSAyNjEgPyB5eXRyYW5zbGF0ZVt4XSA6IDE4KQorKworKy8qIFlZVFJBTlNMQVRFW1lZTEVYXSAtLSBCaXNvbiB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gKi8KKytzdGF0aWMgY29uc3QgY2hhciB5eXRyYW5zbGF0ZVtdID0KKyt7CisrICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNSwgICAgIDIsCisrICAgICAgMTQsICAgIDE1LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAxMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgMTMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisrICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICA2LCAgICAgNywgICAgIDgsCisrICAgICAgIDksICAgIDExCisrfTsKKysKKysjaWYgWVlERUJVRworK3N0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9CisreworKyAgICAgICAwLCAgICAgMCwgICAgIDIsICAgICA4LCAgICAxMiwgICAgMTYsICAgIDIwLCAgICAyNCwgICAgMjgsICAgIDMyLAorKyAgICAgIDM1LCAgICAzNywgICAgMzkKKyt9OworK3N0YXRpYyBjb25zdCBzaG9ydCB5eXJoc1tdID0KKyt7CisrICAgICAgMTcsICAgICAwLCAgICAxNywgICAgIDMsICAgIDE3LCAgICAxMiwgICAgMTcsICAgICAwLCAgICAxNywgICAgIDQsCisrICAgICAgMTcsICAgICAwLCAgICAxNywgICAgIDUsICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA2LCAgICAxNywgICAgIDAsCisrICAgICAgMTcsICAgICA3LCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgOCwgICAgMTcsICAgICAwLCAgICAxNywgICAgIDksCisrICAgICAgMTcsICAgICAwLCAgICAxMCwgICAgMTcsICAgICAwLCAgICAxMywgICAgIDAsICAgIDExLCAgICAgMCwgICAgMTQsCisrICAgICAgMTcsICAgIDE1LCAgICAgMAorK307CisrCisrI2VuZGlmCisrCisrI2lmIFlZREVCVUcKKysvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAqLworK3N0YXRpYyBjb25zdCBzaG9ydCB5eXJsaW5lW10gPQorK3sKKysgICAgICAgMCwgICAxNTAsICAgMTU4LCAgIDE2MiwgICAxNjYsICAgMTcwLCAgIDE3NCwgICAxNzgsICAgMTgyLCAgIDE4NiwKKysgICAgIDE5MCwgICAxOTQsICAgMTk5CisrfTsKKysjZW5kaWYKKysKKysKKysjaWYgKFlZREVCVUcpIHx8IGRlZmluZWQgWVlFUlJPUl9WRVJCT1NFCisrCisrLyogWVlUTkFNRVtUT0tFTl9OVU1dIC0tIFN0cmluZyBuYW1lIG9mIHRoZSB0b2tlbiBUT0tFTl9OVU0uICovCisrc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHl5dG5hbWVbXSA9CisreworKyAgIiQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZC4iLCAiJz8nIiwgIid8JyIsICInJiciLCAiRVFVT1AyIiwgIkNNUE9QMiIsIAorKyAgIkFERE9QMiIsICJNVUxPUDIiLCAiJyEnIiwgIk5VTUJFUiIsICInOiciLCAiJ24nIiwgIicoJyIsICInKSciLCAKKysgICJzdGFydCIsICJleHAiLCAwCisrfTsKKysjZW5kaWYKKysKKysvKiBZWVIxW1lZTl0gLS0gU3ltYm9sIG51bWJlciBvZiBzeW1ib2wgdGhhdCBydWxlIFlZTiBkZXJpdmVzLiAqLworK3N0YXRpYyBjb25zdCBzaG9ydCB5eXIxW10gPQorK3sKKysgICAgICAgMCwgICAgMTYsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywKKysgICAgICAxNywgICAgMTcsICAgIDE3CisrfTsKKysKKysvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gKi8KKytzdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0KKyt7CisrICAgICAgIDAsICAgICAxLCAgICAgNSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsCisrICAgICAgIDEsICAgICAxLCAgICAgMworK307CisrCisrLyogWVlERUZBQ1RbU10gLS0gZGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlIFMgd2hlbiBZWVRBQkxFCisrICAgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybyBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbgorKyAgIGVycm9yLiAqLworK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0KKyt7CisrICAgICAgIDAsICAgICAwLCAgICAxMSwgICAgMTAsICAgICAwLCAgICAgMSwgICAgIDksICAgICAwLCAgICAgMCwgICAgIDAsCisrICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxMiwgICAgIDAsICAgICAzLCAgICAgNCwgICAgIDUsCisrICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDAsICAgICAyLCAgICAgMCwgICAgIDAsICAgICAwCisrfTsKKysKKytzdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZnb3RvW10gPQorK3sKKysgICAgICAyNSwgICAgIDUKKyt9OworKworK3N0YXRpYyBjb25zdCBzaG9ydCB5eXBhY3RbXSA9CisreworKyAgICAgIC05LCAgICAtOSwtMzI3NjgsLTMyNzY4LCAgICAtOSwgICAgMzQsLTMyNzY4LCAgICAxMSwgICAgLTksICAgIC05LAorKyAgICAgIC05LCAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwtMzI3NjgsICAgIDI0LCAgICAzOSwgICAgNDMsICAgIDE2LAorKyAgICAgIDI2LCAgICAtMywtMzI3NjgsICAgIC05LCAgICAzNCwgICAgMjEsICAgIDUzLC0zMjc2OAorK307CisrCisrc3RhdGljIGNvbnN0IHNob3J0IHl5cGdvdG9bXSA9CisreworKyAgLTMyNzY4LCAgICAtMQorK307CisrCisrCisrI2RlZmluZQlZWUxBU1QJCTUzCisrCisrCisrc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9CisreworKyAgICAgICA2LCAgICAgMSwgICAgIDIsICAgICA3LCAgICAgMywgICAgIDQsICAgIDE0LCAgICAxNiwgICAgMTcsICAgIDE4LAorKyAgICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAorKyAgICAgIDE0LCAgICAyNiwgICAgMjQsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAgOCwgICAgIDksICAgIDEwLAorKyAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxMywgICAgMTQsICAgIDIzLCAgICAgOCwgICAgIDksICAgIDEwLAorKyAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDExLAorKyAgICAgIDEyLCAgICAxMywgICAgMTQsICAgIDI3CisrfTsKKysKKytzdGF0aWMgY29uc3Qgc2hvcnQgeXljaGVja1tdID0KKyt7CisrICAgICAgIDEsICAgIDEwLCAgICAxMSwgICAgIDQsICAgIDEzLCAgICAxNCwgICAgIDksICAgICA4LCAgICAgOSwgICAgMTAsCisrICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsCisrICAgICAgIDksICAgICAwLCAgICAyMywgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTUsICAgICAzLCAgICAgNCwgICAgIDUsCisrICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICA4LCAgICAgOSwgICAgMTIsICAgICAzLCAgICAgNCwgICAgIDUsCisrICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDYsCisrICAgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDAKKyt9OworKyNkZWZpbmUgWVlQVVJFIDEKKysKKysvKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLworKyNsaW5lIDMgIi91c3IvbG9jYWwvc2hhcmUvYmlzb24vYmlzb24uc2ltcGxlIgorKworKy8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAorKworKyAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisrICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKysgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgYW55IGxhdGVyIHZlcnNpb24uCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisrICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKysKKysvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCisrICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KKysgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisrICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KKysKKysvKiBUaGlzIGlzIHRoZSBwYXJzZXIgY29kZSB0aGF0IGlzIHdyaXR0ZW4gaW50byBlYWNoIGJpc29uIHBhcnNlciB3aGVuCisrICAgdGhlICVzZW1hbnRpY19wYXJzZXIgZGVjbGFyYXRpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZ3JhbW1hci4KKysgICBJdCB3YXMgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBoYWlyeSBwYXJzZXIKKysgICB1c2VkIHdoZW4gJXNlbWFudGljX3BhcnNlciBpcyBzcGVjaWZpZWQuICAqLworKworKy8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCisrICAgaW5mcmluZ2luZyBvbiB1c2VyIG5hbWUgc3BhY2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGV2ZW4gZm9yIGxvY2FsCisrICAgdmFyaWFibGVzLCBhcyB0aGV5IG1pZ2h0IG90aGVyd2lzZSBiZSBleHBhbmRlZCBieSB1c2VyIG1hY3Jvcy4KKysgICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCisrICAgZGVmaW5lIG5lY2Vzc2FyeSBsaWJyYXJ5IHN5bWJvbHM7IHRoZXkgYXJlIG5vdGVkICJJTkZSSU5HRVMgT04KKysgICBVU0VSIE5BTUUgU1BBQ0UiIGJlbG93LiAgKi8KKysKKysjaWYgISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpCisrCisrLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLworKworKyMgaWYgWVlTVEFDS19VU0VfQUxMT0NBCisrIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisrIyBlbHNlCisrIyAgaWZuZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQorKyMgICBpZiBkZWZpbmVkIChhbGxvY2EpIHx8IGRlZmluZWQgKF9BTExPQ0FfSCkKKysjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorKyMgICBlbHNlCisrIyAgICBpZmRlZiBfX0dOVUNfXworKyMgICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIF9fYnVpbHRpbl9hbGxvY2EKKysjICAgIGVuZGlmCisrIyAgIGVuZGlmCisrIyAgZW5kaWYKKysjIGVuZGlmCisrCisrIyBpZmRlZiBZWVNUQUNLX0FMTE9DCisrICAgLyogUGFjaWZ5IEdDQydzIGBlbXB0eSBpZi1ib2R5JyB3YXJuaW5nLiAqLworKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUoUHRyKSBkbyB7IC8qIGVtcHR5ICovOyB9IHdoaWxlICgwKQorKyMgZWxzZQorKyMgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKysjICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKysjICAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorKyMgIGVuZGlmCisrIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgbWFsbG9jCisrIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBmcmVlCisrIyBlbmRpZgorKyNlbmRpZiAvKiAhIGRlZmluZWQgKHl5b3ZlcmZsb3cpIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkgKi8KKysKKysKKysjaWYgKCEgZGVmaW5lZCAoeXlvdmVyZmxvdykgXAorKyAgICAgJiYgKCEgZGVmaW5lZCAoX19jcGx1c3BsdXMpIFwKKysJIHx8IChZWUxUWVBFX0lTX1RSSVZJQUwgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisrCisrLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCisrdW5pb24geXlhbGxvYworK3sKKysgIHNob3J0IHl5c3M7CisrICBZWVNUWVBFIHl5dnM7CisrIyBpZiBZWUxTUF9ORUVERUQKKysgIFlZTFRZUEUgeXlsczsKKysjIGVuZGlmCisrfTsKKysKKysvKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLworKyMgZGVmaW5lIFlZU1RBQ0tfR0FQX01BWCAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCisrCisrLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCisrICAgTiBlbGVtZW50cy4gICovCisrIyBpZiBZWUxTUF9ORUVERUQKKysjICBkZWZpbmUgWVlTVEFDS19CWVRFUyhOKSBcCisrICAgICAoKE4pICogKHNpemVvZiAoc2hvcnQpICsgc2l6ZW9mIChZWVNUWVBFKSArIHNpemVvZiAoWVlMVFlQRSkpCVwKKysgICAgICArIDIgKiBZWVNUQUNLX0dBUF9NQVgpCisrIyBlbHNlCisrIyAgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAorKyAgICAgKChOKSAqIChzaXplb2YgKHNob3J0KSArIHNpemVvZiAoWVlTVFlQRSkpCQkJCVwKKysgICAgICArIFlZU1RBQ0tfR0FQX01BWCkKKysjIGVuZGlmCisrCisrLyogQ29weSBDT1VOVCBvYmplY3RzIGZyb20gRlJPTSB0byBUTy4gIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvCisrICAgbm90IG92ZXJsYXAuICAqLworKyMgaWZuZGVmIFlZQ09QWQorKyMgIGlmIDEgPCBfX0dOVUNfXworKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAorKyAgICAgIF9fYnVpbHRpbl9tZW1jcHkgKFRvLCBGcm9tLCAoQ291bnQpICogc2l6ZW9mICgqKEZyb20pKSkKKysjICBlbHNlCisrIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAorKyAgICAgIGRvCQkJCQlcCisrCXsJCQkJCVwKKysJICByZWdpc3RlciBZWVNJWkVfVCB5eWk7CQlcCisrCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAorKwkgICAgKFRvKVt5eWldID0gKEZyb20pW3l5aV07CQlcCisrCX0JCQkJCVwKKysgICAgICB3aGlsZSAoMCkKKysjICBlbmRpZgorKyMgZW5kaWYKKysKKysvKiBSZWxvY2F0ZSBTVEFDSyBmcm9tIGl0cyBvbGQgbG9jYXRpb24gdG8gdGhlIG5ldyBvbmUuICBUaGUKKysgICBsb2NhbCB2YXJpYWJsZXMgWVlTSVpFIGFuZCBZWVNUQUNLU0laRSBnaXZlIHRoZSBvbGQgYW5kIG5ldyBudW1iZXIgb2YKKysgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQorKyAgIHN0YWNrLiAgQWR2YW5jZSBZWVBUUiB0byBhIHByb3Blcmx5IGFsaWduZWQgbG9jYXRpb24gZm9yIHRoZSBuZXh0CisrICAgc3RhY2suICAqLworKyMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2spCQkJCQlcCisrICAgIGRvCQkJCQkJCQkJXAorKyAgICAgIHsJCQkJCQkJCQlcCisrCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAorKwlZWUNPUFkgKCZ5eXB0ci0+U3RhY2ssIFN0YWNrLCB5eXNpemUpOwkJCQlcCisrCVN0YWNrID0gJnl5cHRyLT5TdGFjazsJCQkJCQlcCisrCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWDsJXAorKwl5eXB0ciArPSB5eW5ld2J5dGVzIC8gc2l6ZW9mICgqeXlwdHIpOwkJCQlcCisrICAgICAgfQkJCQkJCQkJCVwKKysgICAgd2hpbGUgKDApCisrCisrI2VuZGlmCisrCisrCisrI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKF9fU0laRV9UWVBFX18pCisrIyBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXworKyNlbmRpZgorKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChzaXplX3QpCisrIyBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisrI2VuZGlmCisrI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpCisrIyBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisrIyAgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKysjICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisrIyBlbmRpZgorKyNlbmRpZgorKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQorKyMgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAorKyNlbmRpZgorKworKyNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKKysjZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKKysjZGVmaW5lIFlZRU1QVFkJCS0yCisrI2RlZmluZSBZWUVPRgkJMAorKyNkZWZpbmUgWVlBQ0NFUFQJZ290byB5eWFjY2VwdGxhYgorKyNkZWZpbmUgWVlBQk9SVCAJZ290byB5eWFib3J0bGFiCisrI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQorKy8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLiAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkKKysgICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgorKyAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KKysjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorKyNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQorKyNkZWZpbmUgWVlCQUNLVVAoVG9rZW4sIFZhbHVlKQkJCQkJXAorK2RvCQkJCQkJCQlcCisrICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAorKyAgICB7CQkJCQkJCQlcCisrICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCisrICAgICAgeXlsdmFsID0gKFZhbHVlKTsJCQkJCQlcCisrICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCisrICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCisrICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCisrICAgIH0JCQkJCQkJCVwKKysgIGVsc2UJCQkJCQkJCVwKKysgICAgeyAJCQkJCQkJCVwKKysgICAgICB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpOwkJCVwKKysgICAgICBZWUVSUk9SOwkJCQkJCQlcCisrICAgIH0JCQkJCQkJCVwKKyt3aGlsZSAoMCkKKysKKysjZGVmaW5lIFlZVEVSUk9SCTEKKysjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKysKKysKKysvKiBZWUxMT0NfREVGQVVMVCAtLSBDb21wdXRlIHRoZSBkZWZhdWx0IGxvY2F0aW9uIChiZWZvcmUgdGhlIGFjdGlvbnMKKysgICBhcmUgcnVuKS4KKysKKysgICBXaGVuIFlZTExPQ19ERUZBVUxUIGlzIHJ1biwgQ1VSUkVOVCBpcyBzZXQgdGhlIGxvY2F0aW9uIG9mIHRoZQorKyAgIGZpcnN0IHRva2VuLiAgQnkgZGVmYXVsdCwgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIHJhbmdlcywgZXh0ZW5kCisrICAgaXRzIHJhbmdlIHRvIHRoZSBsYXN0IHN5bWJvbC4gICovCisrCisrI2lmbmRlZiBZWUxMT0NfREVGQVVMVAorKyMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikgICAgICAgCVwKKysgICBDdXJyZW50Lmxhc3RfbGluZSAgID0gUmhzW05dLmxhc3RfbGluZTsJXAorKyAgIEN1cnJlbnQubGFzdF9jb2x1bW4gPSBSaHNbTl0ubGFzdF9jb2x1bW47CisrI2VuZGlmCisrCisrCisrLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCisrCisrI2lmIFlZUFVSRQorKyMgaWYgWVlMU1BfTkVFREVECisrIyAgaWZkZWYgWVlMRVhfUEFSQU0KKysjICAgZGVmaW5lIFlZTEVYCQl5eWxleCAoJnl5bHZhbCwgJnl5bGxvYywgWVlMRVhfUEFSQU0pCisrIyAgZWxzZQorKyMgICBkZWZpbmUgWVlMRVgJCXl5bGV4ICgmeXlsdmFsLCAmeXlsbG9jKQorKyMgIGVuZGlmCisrIyBlbHNlIC8qICFZWUxTUF9ORUVERUQgKi8KKysjICBpZmRlZiBZWUxFWF9QQVJBTQorKyMgICBkZWZpbmUgWVlMRVgJCXl5bGV4ICgmeXlsdmFsLCBZWUxFWF9QQVJBTSkKKysjICBlbHNlCisrIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwpCisrIyAgZW5kaWYKKysjIGVuZGlmIC8qICFZWUxTUF9ORUVERUQgKi8KKysjZWxzZSAvKiAhWVlQVVJFICovCisrIyBkZWZpbmUgWVlMRVgJCQl5eWxleCAoKQorKyNlbmRpZiAvKiAhWVlQVVJFICovCisrCisrCisrLyogRW5hYmxlIGRlYnVnZ2luZyBpZiByZXF1ZXN0ZWQuICAqLworKyNpZiBZWURFQlVHCisrCisrIyBpZm5kZWYgWVlGUFJJTlRGCisrIyAgaW5jbHVkZSA8c3RkaW8uaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworKyMgIGRlZmluZSBZWUZQUklOVEYgZnByaW50ZgorKyMgZW5kaWYKKysKKysjIGRlZmluZSBZWURQUklOVEYoQXJncykJCQlcCisrZG8gewkJCQkJCVwKKysgIGlmICh5eWRlYnVnKQkJCQkJXAorKyAgICBZWUZQUklOVEYgQXJnczsJCQkJXAorK30gd2hpbGUgKDApCisrLyogTm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZS4gIEl0IGlzIGxlZnQgdW5pbml0aWFsaXplZCBzbyB0aGF0CisrICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCisraW50IHl5ZGVidWc7CisrI2Vsc2UgLyogIVlZREVCVUcgKi8KKysjIGRlZmluZSBZWURQUklOVEYoQXJncykKKysjZW5kaWYgLyogIVlZREVCVUcgKi8KKysKKysvKiBZWUlOSVRERVBUSCAtLSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcy4gICovCisrI2lmbmRlZglZWUlOSVRERVBUSAorKyMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAorKyNlbmRpZgorKworKy8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5CisrICAgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuCisrCisrICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKKysgICBTSVpFX01BWCA8IFlZU1RBQ0tfQllURVMgKFlZTUFYREVQVEgpCisrICAgZXZhbHVhdGVkIHdpdGggaW5maW5pdGUtcHJlY2lzaW9uIGludGVnZXIgYXJpdGhtZXRpYy4gICovCisrCisrI2lmIFlZTUFYREVQVEggPT0gMAorKyMgdW5kZWYgWVlNQVhERVBUSAorKyNlbmRpZgorKworKyNpZm5kZWYgWVlNQVhERVBUSAorKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKKysjZW5kaWYKKysMCisrI2lmZGVmIFlZRVJST1JfVkVSQk9TRQorKworKyMgaWZuZGVmIHl5c3RybGVuCisrIyAgaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfU1RSSU5HX0gpCisrIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KKysjICBlbHNlCisrLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgWVlTVFIuICAqLworK3N0YXRpYyBZWVNJWkVfVAorKyMgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisreXlzdHJsZW4gKGNvbnN0IGNoYXIgKnl5c3RyKQorKyMgICBlbHNlCisreXlzdHJsZW4gKHl5c3RyKQorKyAgICAgY29uc3QgY2hhciAqeXlzdHI7CisrIyAgIGVuZGlmCisreworKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqeXlzID0geXlzdHI7CisrCisrICB3aGlsZSAoKnl5cysrICE9ICdcMCcpCisrICAgIGNvbnRpbnVlOworKworKyAgcmV0dXJuIHl5cyAtIHl5c3RyIC0gMTsKKyt9CisrIyAgZW5kaWYKKysjIGVuZGlmCisrCisrIyBpZm5kZWYgeXlzdHBjcHkKKysjICBpZiBkZWZpbmVkIChfX0dMSUJDX18pICYmIGRlZmluZWQgKF9TVFJJTkdfSCkgJiYgZGVmaW5lZCAoX0dOVV9TT1VSQ0UpCisrIyAgIGRlZmluZSB5eXN0cGNweSBzdHBjcHkKKysjICBlbHNlCisrLyogQ29weSBZWVNSQyB0byBZWURFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbgorKyAgIFlZREVTVC4gICovCisrc3RhdGljIGNoYXIgKgorKyMgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisreXlzdHBjcHkgKGNoYXIgKnl5ZGVzdCwgY29uc3QgY2hhciAqeXlzcmMpCisrIyAgIGVsc2UKKyt5eXN0cGNweSAoeXlkZXN0LCB5eXNyYykKKysgICAgIGNoYXIgKnl5ZGVzdDsKKysgICAgIGNvbnN0IGNoYXIgKnl5c3JjOworKyMgICBlbmRpZgorK3sKKysgIHJlZ2lzdGVyIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKKysgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3JjOworKworKyAgd2hpbGUgKCgqeXlkKysgPSAqeXlzKyspICE9ICdcMCcpCisrICAgIGNvbnRpbnVlOworKworKyAgcmV0dXJuIHl5ZCAtIDE7CisrfQorKyMgIGVuZGlmCisrIyBlbmRpZgorKyNlbmRpZgorKwwKKysjbGluZSAzMTUgIi91c3IvbG9jYWwvc2hhcmUvYmlzb24vYmlzb24uc2ltcGxlIgorKworKworKy8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKKysgICBpbnRvIHl5cGFyc2UuICBUaGUgYXJndW1lbnQgc2hvdWxkIGhhdmUgdHlwZSB2b2lkICouCisrICAgSXQgc2hvdWxkIGFjdHVhbGx5IHBvaW50IHRvIGFuIG9iamVjdC4KKysgICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAorKyAgIHRvIHRoZSBwcm9wZXIgcG9pbnRlciB0eXBlLiAgKi8KKysKKysjaWZkZWYgWVlQQVJTRV9QQVJBTQorKyMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorKyMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCisrIyAgZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorKyMgZWxzZQorKyMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyBZWVBBUlNFX1BBUkFNCisrIyAgZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTCB2b2lkICpZWVBBUlNFX1BBUkFNOworKyMgZW5kaWYKKysjZWxzZSAvKiAhWVlQQVJTRV9QQVJBTSAqLworKyMgZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCisrIyBkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCisrI2VuZGlmIC8qICFZWVBBUlNFX1BBUkFNICovCisrCisrLyogUHJldmVudCB3YXJuaW5nIGlmIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLworKyNpZmRlZiBfX0dOVUNfXworKyMgaWZkZWYgWVlQQVJTRV9QQVJBTQorK2ludCB5eXBhcnNlICh2b2lkICopOworKyMgZWxzZQorK2ludCB5eXBhcnNlICh2b2lkKTsKKysjIGVuZGlmCisrI2VuZGlmCisrCisrLyogWVlfREVDTF9WQVJJQUJMRVMgLS0gZGVwZW5kaW5nIHdoZXRoZXIgd2UgdXNlIGEgcHVyZSBwYXJzZXIsCisrICAgdmFyaWFibGVzIGFyZSBnbG9iYWwsIG9yIGxvY2FsIHRvIFlZUEFSU0UuICAqLworKworKyNkZWZpbmUgWVlfREVDTF9OT05fTFNQX1ZBUklBQkxFUwkJCVwKKysvKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCQkJCVwKKytpbnQgeXljaGFyOwkJCQkJCVwKKysJCQkJCQkJXAorKy8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9va2FoZWFkIHN5bWJvbC4gKi8JXAorK1lZU1RZUEUgeXlsdmFsOwkJCQkJCVwKKysJCQkJCQkJXAorKy8qIE51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyLiAgKi8JCQlcCisraW50IHl5bmVycnM7CisrCisrI2lmIFlZTFNQX05FRURFRAorKyMgZGVmaW5lIFlZX0RFQ0xfVkFSSUFCTEVTCQkJXAorK1lZX0RFQ0xfTk9OX0xTUF9WQVJJQUJMRVMJCQlcCisrCQkJCQkJXAorKy8qIExvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8JXAorK1lZTFRZUEUgeXlsbG9jOworKyNlbHNlCisrIyBkZWZpbmUgWVlfREVDTF9WQVJJQUJMRVMJCQlcCisrWVlfREVDTF9OT05fTFNQX1ZBUklBQkxFUworKyNlbmRpZgorKworKworKy8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlLiAqLworKworKyNpZiAhWVlQVVJFCisrWVlfREVDTF9WQVJJQUJMRVMKKysjZW5kaWYgIC8qICFZWVBVUkUgKi8KKysKKytpbnQKKyt5eXBhcnNlIChZWVBBUlNFX1BBUkFNX0FSRykKKysgICAgIFlZUEFSU0VfUEFSQU1fREVDTAorK3sKKysgIC8qIElmIHJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlLiAqLworKyNpZiBZWVBVUkUKKysgIFlZX0RFQ0xfVkFSSUFCTEVTCisrI2VuZGlmICAvKiAhWVlQVVJFICovCisrCisrICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKKysgIHJlZ2lzdGVyIGludCB5eW47CisrICBpbnQgeXlyZXN1bHQ7CisrICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KKysgIGludCB5eWVycnN0YXR1czsKKysgIC8qIExvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KKysgIGludCB5eWNoYXIxID0gMDsKKysKKysgIC8qIFRocmVlIHN0YWNrcyBhbmQgdGhlaXIgdG9vbHM6CisrICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLAorKyAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcywKKysgICAgIGB5eWxzJzogcmVsYXRlZCB0byBsb2NhdGlvbnMuCisrCisrICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKKysgICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLworKworKyAgLyogVGhlIHN0YXRlIHN0YWNrLiAqLworKyAgc2hvcnQJeXlzc2FbWVlJTklUREVQVEhdOworKyAgc2hvcnQgKnl5c3MgPSB5eXNzYTsKKysgIHJlZ2lzdGVyIHNob3J0ICp5eXNzcDsKKysKKysgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCisrICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKKysgIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsKKysgIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOworKworKyNpZiBZWUxTUF9ORUVERUQKKysgIC8qIFRoZSBsb2NhdGlvbiBzdGFjay4gICovCisrICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsKKysgIFlZTFRZUEUgKnl5bHMgPSB5eWxzYTsKKysgIFlZTFRZUEUgKnl5bHNwOworKyNlbmRpZgorKworKyNpZiBZWUxTUF9ORUVERUQKKysjIGRlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCisrI2Vsc2UKKysjIGRlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisrI2VuZGlmCisrCisrICBZWVNJWkVfVCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworKworKworKyAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKKysgICAgIGFjdGlvbiByb3V0aW5lcy4gICovCisrICBZWVNUWVBFIHl5dmFsOworKyNpZiBZWUxTUF9ORUVERUQKKysgIFlZTFRZUEUgeXlsb2M7CisrI2VuZGlmCisrCisrICAvKiBXaGVuIHJlZHVjaW5nLCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZAorKyAgICAgcnVsZS4gKi8KKysgIGludCB5eWxlbjsKKysKKysgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7CisrCisrICB5eXN0YXRlID0gMDsKKysgIHl5ZXJyc3RhdHVzID0gMDsKKysgIHl5bmVycnMgPSAwOworKyAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCisrCisrICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgorKyAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCisrICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCisrICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCisrCisrICB5eXNzcCA9IHl5c3M7CisrICB5eXZzcCA9IHl5dnM7CisrI2lmIFlZTFNQX05FRURFRAorKyAgeXlsc3AgPSB5eWxzOworKyNlbmRpZgorKyAgZ290byB5eXNldHN0YXRlOworKworKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorK3wgeXluZXdzdGF0ZSAtLSBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiB5eXN0YXRlLiAgfAorK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworKyB5eW5ld3N0YXRlOgorKyAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKKysgICAgIGhhdmUganVzdCBiZWVuIHB1c2hlZC4gc28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4KKysgICAgICovCisrICB5eXNzcCsrOworKworKyB5eXNldHN0YXRlOgorKyAgKnl5c3NwID0geXlzdGF0ZTsKKysKKysgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQorKyAgICB7CisrICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCisrICAgICAgWVlTSVpFX1QgeXlzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKysKKysjaWZkZWYgeXlvdmVyZmxvdworKyAgICAgIHsKKysJLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrLiBVc2UgY29waWVzIG9mCisrCSAgIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8KKysJICAgbWVtb3J5LiAgKi8KKysJWVlTVFlQRSAqeXl2czEgPSB5eXZzOworKwlzaG9ydCAqeXlzczEgPSB5eXNzOworKworKwkvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZiB0aGUKKysJICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICAqLworKyMgaWYgWVlMU1BfTkVFREVECisrCVlZTFRZUEUgKnl5bHMxID0geXlsczsKKysJLyogVGhpcyB1c2VkIHRvIGJlIGEgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLAorKwkgICBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKysJeXlvdmVyZmxvdyAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCisrCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCisrCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCisrCQkgICAgJnl5bHMxLCB5eXNpemUgKiBzaXplb2YgKCp5eWxzcCksCisrCQkgICAgJnl5c3RhY2tzaXplKTsKKysJeXlscyA9IHl5bHMxOworKyMgZWxzZQorKwl5eW92ZXJmbG93ICgicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKysJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKysJCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKysJCSAgICAmeXlzdGFja3NpemUpOworKyMgZW5kaWYKKysJeXlzcyA9IHl5c3MxOworKwl5eXZzID0geXl2czE7CisrICAgICAgfQorKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKysjIGlmbmRlZiBZWVNUQUNLX1JFTE9DQVRFCisrICAgICAgZ290byB5eW92ZXJmbG93bGFiOworKyMgZWxzZQorKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworKyAgICAgIGlmICh5eXN0YWNrc2l6ZSA+PSBZWU1BWERFUFRIKQorKwlnb3RvIHl5b3ZlcmZsb3dsYWI7CisrICAgICAgeXlzdGFja3NpemUgKj0gMjsKKysgICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQorKwl5eXN0YWNrc2l6ZSA9IFlZTUFYREVQVEg7CisrCisrICAgICAgeworKwlzaG9ydCAqeXlzczEgPSB5eXNzOworKwl1bmlvbiB5eWFsbG9jICp5eXB0ciA9CisrCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKKysJaWYgKCEgeXlwdHIpCisrCSAgZ290byB5eW92ZXJmbG93bGFiOworKwlZWVNUQUNLX1JFTE9DQVRFICh5eXNzKTsKKysJWVlTVEFDS19SRUxPQ0FURSAoeXl2cyk7CisrIyBpZiBZWUxTUF9ORUVERUQKKysJWVlTVEFDS19SRUxPQ0FURSAoeXlscyk7CisrIyBlbmRpZgorKyMgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQorKwlpZiAoeXlzczEgIT0geXlzc2EpCisrCSAgWVlTVEFDS19GUkVFICh5eXNzMSk7CisrICAgICAgfQorKyMgZW5kaWYKKysjZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLworKworKyAgICAgIHl5c3NwID0geXlzcyArIHl5c2l6ZSAtIDE7CisrICAgICAgeXl2c3AgPSB5eXZzICsgeXlzaXplIC0gMTsKKysjaWYgWVlMU1BfTkVFREVECisrICAgICAgeXlsc3AgPSB5eWxzICsgeXlzaXplIC0gMTsKKysjZW5kaWYKKysKKysgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCisrCQkgICh1bnNpZ25lZCBsb25nIGludCkgeXlzdGFja3NpemUpKTsKKysKKysgICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKysJWVlBQk9SVDsKKysgICAgfQorKworKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpKTsKKysKKysgIGdvdG8geXliYWNrdXA7CisrCisrCisrLyotLS0tLS0tLS0tLS4KKyt8IHl5YmFja3VwLiAgfAorK2AtLS0tLS0tLS0tLSovCisreXliYWNrdXA6CisrCisrLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCisrLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisrLyogeXlyZXN1bWU6ICovCisrCisrICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKysKKysgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKysgIGlmICh5eW4gPT0gWVlGTEFHKQorKyAgICBnb3RvIHl5ZGVmYXVsdDsKKysKKysgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisrCisrICAvKiB5eWNoYXIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0YKKysgICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCisrCisrICBpZiAoeXljaGFyID09IFlZRU1QVFkpCisrICAgIHsKKysgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpKTsKKysgICAgICB5eWNoYXIgPSBZWUxFWDsKKysgICAgfQorKworKyAgLyogQ29udmVydCB0b2tlbiB0byBpbnRlcm5hbCBmb3JtIChpbiB5eWNoYXIxKSBmb3IgaW5kZXhpbmcgdGFibGVzIHdpdGggKi8KKysKKysgIGlmICh5eWNoYXIgPD0gMCkJCS8qIFRoaXMgbWVhbnMgZW5kIG9mIGlucHV0LiAqLworKyAgICB7CisrICAgICAgeXljaGFyMSA9IDA7CisrICAgICAgeXljaGFyID0gWVlFT0Y7CQkvKiBEb24ndCBjYWxsIFlZTEVYIGFueSBtb3JlICovCisrCisrICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKKysgICAgfQorKyAgZWxzZQorKyAgICB7CisrICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOworKworKyNpZiBZWURFQlVHCisrICAgICAvKiBXZSBoYXZlIHRvIGtlZXAgdGhpcyBgI2lmIFlZREVCVUcnLCBzaW5jZSB3ZSB1c2UgdmFyaWFibGVzCisrCXdoaWNoIGFyZSBkZWZpbmVkIG9ubHkgaWYgYFlZREVCVUcnIGlzIHNldC4gICovCisrICAgICAgaWYgKHl5ZGVidWcpCisrCXsKKysJICBZWUZQUklOVEYgKHN0ZGVyciwgIk5leHQgdG9rZW4gaXMgJWQgKCVzIiwKKysJCSAgICAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKysJICAvKiBHaXZlIHRoZSBpbmRpdmlkdWFsIHBhcnNlciBhIHdheSB0byBwcmludCB0aGUgcHJlY2lzZQorKwkgICAgIG1lYW5pbmcgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLworKyMgaWZkZWYgWVlQUklOVAorKwkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOworKyMgZW5kaWYKKysJICBZWUZQUklOVEYgKHN0ZGVyciwgIilcbiIpOworKwl9CisrI2VuZGlmCisrICAgIH0KKysKKysgIHl5biArPSB5eWNoYXIxOworKyAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSB5eWNoYXIxKQorKyAgICBnb3RvIHl5ZGVmYXVsdDsKKysKKysgIHl5biA9IHl5dGFibGVbeXluXTsKKysKKysgIC8qIHl5biBpcyB3aGF0IHRvIGRvIGZvciB0aGlzIHRva2VuIHR5cGUgaW4gdGhpcyBzdGF0ZS4KKysgICAgIE5lZ2F0aXZlID0+IHJlZHVjZSwgLXl5biBpcyBydWxlIG51bWJlci4KKysgICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgorKyAgICAgICBOZXcgc3RhdGUgaXMgZmluYWwgc3RhdGUgPT4gZG9uJ3QgYm90aGVyIHRvIHNoaWZ0LAorKyAgICAgICBqdXN0IHJldHVybiBzdWNjZXNzLgorKyAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLworKworKyAgaWYgKHl5biA8IDApCisrICAgIHsKKysgICAgICBpZiAoeXluID09IFlZRkxBRykKKysJZ290byB5eWVycmxhYjsKKysgICAgICB5eW4gPSAteXluOworKyAgICAgIGdvdG8geXlyZWR1Y2U7CisrICAgIH0KKysgIGVsc2UgaWYgKHl5biA9PSAwKQorKyAgICBnb3RvIHl5ZXJybGFiOworKworKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorKyAgICBZWUFDQ0VQVDsKKysKKysgIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLworKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwKKysJICAgICAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKSk7CisrCisrICAvKiBEaXNjYXJkIHRoZSB0b2tlbiBiZWluZyBzaGlmdGVkIHVubGVzcyBpdCBpcyBlb2YuICAqLworKyAgaWYgKHl5Y2hhciAhPSBZWUVPRikKKysgICAgeXljaGFyID0gWVlFTVBUWTsKKysKKysgICorK3l5dnNwID0geXlsdmFsOworKyNpZiBZWUxTUF9ORUVERUQKKysgICorK3l5bHNwID0geXlsbG9jOworKyNlbmRpZgorKworKyAgLyogQ291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvcgorKyAgICAgc3RhdHVzLiAgKi8KKysgIGlmICh5eWVycnN0YXR1cykKKysgICAgeXllcnJzdGF0dXMtLTsKKysKKysgIHl5c3RhdGUgPSB5eW47CisrICBnb3RvIHl5bmV3c3RhdGU7CisrCisrCisrLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyt8IHl5ZGVmYXVsdCAtLSBkbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgfAorK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisreXlkZWZhdWx0OgorKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisrICBpZiAoeXluID09IDApCisrICAgIGdvdG8geXllcnJsYWI7CisrICBnb3RvIHl5cmVkdWNlOworKworKworKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisrfCB5eXJlZHVjZSAtLSBEbyBhIHJlZHVjdGlvbi4gIHwKKytgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworK3l5cmVkdWNlOgorKyAgLyogeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KKysgIHl5bGVuID0geXlyMlt5eW5dOworKworKyAgLyogSWYgWVlMRU4gaXMgbm9uemVybywgaW1wbGVtZW50IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb246CisrICAgICBgJCQgPSAkMScuCisrCisrICAgICBPdGhlcndpc2UsIHRoZSBmb2xsb3dpbmcgbGluZSBzZXRzIFlZVkFMIHRvIHRoZSBzZW1hbnRpYyB2YWx1ZSBvZgorKyAgICAgdGhlIGxvb2thaGVhZCB0b2tlbi4gIFRoaXMgYmVoYXZpb3IgaXMgdW5kb2N1bWVudGVkIGFuZCBCaXNvbgorKyAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKKysgICAgIHVuY29uZGl0aW9uYWxseSBtYWtlcyB0aGUgcGFyc2VyIGEgYml0IHNtYWxsZXIsIGFuZCBpdCBhdm9pZHMgYQorKyAgICAgR0NDIHdhcm5pbmcgdGhhdCBZWVZBTCBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkLiAgKi8KKysgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CisrCisrI2lmIFlZTFNQX05FRURFRAorKyAgLyogU2ltaWxhcmx5IGZvciB0aGUgZGVmYXVsdCBsb2NhdGlvbi4gIExldCB0aGUgdXNlciBydW4gYWRkaXRpb25hbAorKyAgICAgY29tbWFuZHMgaWYgZm9yIGluc3RhbmNlIGxvY2F0aW9ucyBhcmUgcmFuZ2VzLiAgKi8KKysgIHl5bG9jID0geXlsc3BbMS15eWxlbl07CisrICBZWUxMT0NfREVGQVVMVCAoeXlsb2MsICh5eWxzcCAtIHl5bGVuKSwgeXlsZW4pOworKyNlbmRpZgorKworKyNpZiBZWURFQlVHCisrICAvKiBXZSBoYXZlIHRvIGtlZXAgdGhpcyBgI2lmIFlZREVCVUcnLCBzaW5jZSB3ZSB1c2UgdmFyaWFibGVzIHdoaWNoCisrICAgICBhcmUgZGVmaW5lZCBvbmx5IGlmIGBZWURFQlVHJyBpcyBzZXQuICAqLworKyAgaWYgKHl5ZGVidWcpCisrICAgIHsKKysgICAgICBpbnQgeXlpOworKworKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAorKwkJIHl5biwgeXlybGluZVt5eW5dKTsKKysKKysgICAgICAvKiBQcmludCB0aGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLCBhbmQgdGhlaXIgcmVzdWx0LiAgKi8KKysgICAgICBmb3IgKHl5aSA9IHl5cHJoc1t5eW5dOyB5eXJoc1t5eWldID4gMDsgeXlpKyspCisrCVlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1t5eWldXSk7CisrICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgLT4gJXNcbiIsIHl5dG5hbWVbeXlyMVt5eW5dXSk7CisrICAgIH0KKysjZW5kaWYKKysKKysgIHN3aXRjaCAoeXluKSB7CisrCisrY2FzZSAxOgorKyNsaW5lIDE1MSAicGx1cmFsLnkiCisreworKwkgICAgaWYgKHl5dnNwWzBdLmV4cCA9PSBOVUxMKQorKwkgICAgICBZWUFCT1JUOworKwkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSB5eXZzcFswXS5leHA7CisrCSAgfQorKyAgICBicmVhazsKKytjYXNlIDI6CisrI2xpbmUgMTU5ICJwbHVyYWwueSIKKyt7CisrCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzMgKHFtb3AsIHl5dnNwWy00XS5leHAsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisrCSAgfQorKyAgICBicmVhazsKKytjYXNlIDM6CisrI2xpbmUgMTYzICJwbHVyYWwueSIKKyt7CisrCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKGxvciwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKysJICB9CisrICAgIGJyZWFrOworK2Nhc2UgNDoKKysjbGluZSAxNjcgInBsdXJhbC55IgorK3sKKysJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAobGFuZCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKysJICB9CisrICAgIGJyZWFrOworK2Nhc2UgNToKKysjbGluZSAxNzEgInBsdXJhbC55IgorK3sKKysJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworKwkgIH0KKysgICAgYnJlYWs7CisrY2FzZSA2OgorKyNsaW5lIDE3NSAicGx1cmFsLnkiCisreworKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yICh5eXZzcFstMV0ub3AsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisrCSAgfQorKyAgICBicmVhazsKKytjYXNlIDc6CisrI2xpbmUgMTc5ICJwbHVyYWwueSIKKyt7CisrCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKHl5dnNwWy0xXS5vcCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKysJICB9CisrICAgIGJyZWFrOworK2Nhc2UgODoKKysjbGluZSAxODMgInBsdXJhbC55IgorK3sKKysJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworKwkgIH0KKysgICAgYnJlYWs7CisrY2FzZSA5OgorKyNsaW5lIDE4NyAicGx1cmFsLnkiCisreworKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8xIChsbm90LCB5eXZzcFswXS5leHApOworKwkgIH0KKysgICAgYnJlYWs7CisrY2FzZSAxMDoKKysjbGluZSAxOTEgInBsdXJhbC55IgorK3sKKysJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMCAodmFyKTsKKysJICB9CisrICAgIGJyZWFrOworK2Nhc2UgMTE6CisrI2xpbmUgMTk1ICJwbHVyYWwueSIKKyt7CisrCSAgICBpZiAoKHl5dmFsLmV4cCA9IG5ld19leHBfMCAobnVtKSkgIT0gTlVMTCkKKysJICAgICAgeXl2YWwuZXhwLT52YWwubnVtID0geXl2c3BbMF0ubnVtOworKwkgIH0KKysgICAgYnJlYWs7CisrY2FzZSAxMjoKKysjbGluZSAyMDAgInBsdXJhbC55IgorK3sKKysJICAgIHl5dmFsLmV4cCA9IHl5dnNwWy0xXS5leHA7CisrCSAgfQorKyAgICBicmVhazsKKyt9CisrCisrI2xpbmUgNzA1ICIvdXNyL2xvY2FsL3NoYXJlL2Jpc29uL2Jpc29uLnNpbXBsZSIKKysKKysMCisrICB5eXZzcCAtPSB5eWxlbjsKKysgIHl5c3NwIC09IHl5bGVuOworKyNpZiBZWUxTUF9ORUVERUQKKysgIHl5bHNwIC09IHl5bGVuOworKyNlbmRpZgorKworKyNpZiBZWURFQlVHCisrICBpZiAoeXlkZWJ1ZykKKysgICAgeworKyAgICAgIHNob3J0ICp5eXNzcDEgPSB5eXNzIC0gMTsKKysgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgInN0YXRlIHN0YWNrIG5vdyIpOworKyAgICAgIHdoaWxlICh5eXNzcDEgIT0geXlzc3ApCisrCVlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKisreXlzc3AxKTsKKysgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CisrICAgIH0KKysjZW5kaWYKKysKKysgICorK3l5dnNwID0geXl2YWw7CisrI2lmIFlZTFNQX05FRURFRAorKyAgKisreXlsc3AgPSB5eWxvYzsKKysjZW5kaWYKKysKKysgIC8qIE5vdyBgc2hpZnQnIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4gIERldGVybWluZSB3aGF0IHN0YXRlCisrICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKKysgICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKysKKysgIHl5biA9IHl5cjFbeXluXTsKKysKKysgIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKKysgIGlmICh5eXN0YXRlID49IDAgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCisrICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOworKyAgZWxzZQorKyAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRCQVNFXTsKKysKKysgIGdvdG8geXluZXdzdGF0ZTsKKysKKysKKysvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyt8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKKytgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyt5eWVycmxhYjoKKysgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLworKyAgaWYgKCF5eWVycnN0YXR1cykKKysgICAgeworKyAgICAgICsreXluZXJyczsKKysKKysjaWZkZWYgWVlFUlJPUl9WRVJCT1NFCisrICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOworKworKyAgICAgIGlmICh5eW4gPiBZWUZMQUcgJiYgeXluIDwgWVlMQVNUKQorKwl7CisrCSAgWVlTSVpFX1QgeXlzaXplID0gMDsKKysJICBjaGFyICp5eW1zZzsKKysJICBpbnQgeXl4LCB5eWNvdW50OworKworKwkgIHl5Y291bnQgPSAwOworKwkgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KKysJICAgICBZWUNIRUNLLiAgKi8KKysJICBmb3IgKHl5eCA9IHl5biA8IDAgPyAteXluIDogMDsKKysJICAgICAgIHl5eCA8IChpbnQpIChzaXplb2YgKHl5dG5hbWUpIC8gc2l6ZW9mIChjaGFyICopKTsgeXl4KyspCisrCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCkKKysJICAgICAgeXlzaXplICs9IHl5c3RybGVuICh5eXRuYW1lW3l5eF0pICsgMTUsIHl5Y291bnQrKzsKKysJICB5eXNpemUgKz0geXlzdHJsZW4gKCJwYXJzZSBlcnJvciwgdW5leHBlY3RlZCAiKSArIDE7CisrCSAgeXlzaXplICs9IHl5c3RybGVuICh5eXRuYW1lW1lZVFJBTlNMQVRFICh5eWNoYXIpXSk7CisrCSAgeXltc2cgPSAoY2hhciAqKSBZWVNUQUNLX0FMTE9DICh5eXNpemUpOworKwkgIGlmICh5eW1zZyAhPSAwKQorKwkgICAgeworKwkgICAgICBjaGFyICp5eXAgPSB5eXN0cGNweSAoeXltc2csICJwYXJzZSBlcnJvciwgdW5leHBlY3RlZCAiKTsKKysJICAgICAgeXlwID0geXlzdHBjcHkgKHl5cCwgeXl0bmFtZVtZWVRSQU5TTEFURSAoeXljaGFyKV0pOworKworKwkgICAgICBpZiAoeXljb3VudCA8IDUpCisrCQl7CisrCQkgIHl5Y291bnQgPSAwOworKwkJICBmb3IgKHl5eCA9IHl5biA8IDAgPyAteXluIDogMDsKKysJCSAgICAgICB5eXggPCAoaW50KSAoc2l6ZW9mICh5eXRuYW1lKSAvIHNpemVvZiAoY2hhciAqKSk7CisrCQkgICAgICAgeXl4KyspCisrCQkgICAgaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXgpCisrCQkgICAgICB7CisrCQkJY29uc3QgY2hhciAqeXlxID0gISB5eWNvdW50ID8gIiwgZXhwZWN0aW5nICIgOiAiIG9yICI7CisrCQkJeXlwID0geXlzdHBjcHkgKHl5cCwgeXlxKTsKKysJCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW3l5eF0pOworKwkJCXl5Y291bnQrKzsKKysJCSAgICAgIH0KKysJCX0KKysJICAgICAgeXllcnJvciAoeXltc2cpOworKwkgICAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKKysJICAgIH0KKysJICBlbHNlCisrCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7CisrCX0KKysgICAgICBlbHNlCisrI2VuZGlmIC8qIGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkgKi8KKysJeXllcnJvciAoInBhcnNlIGVycm9yIik7CisrICAgIH0KKysgIGdvdG8geXllcnJsYWIxOworKworKworKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisrfCB5eWVycmxhYjEgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgYW4gYWN0aW9uIHwKKytgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworK3l5ZXJybGFiMToKKysgIGlmICh5eWVycnN0YXR1cyA9PSAzKQorKyAgICB7CisrICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbgorKwkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLworKworKyAgICAgIC8qIHJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dCAqLworKyAgICAgIGlmICh5eWNoYXIgPT0gWVlFT0YpCisrCVlZQUJPUlQ7CisrICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwKKysJCSAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKSk7CisrICAgICAgeXljaGFyID0gWVlFTVBUWTsKKysgICAgfQorKworKyAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisrICAgICB0b2tlbi4gICovCisrCisrICB5eWVycnN0YXR1cyA9IDM7CQkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMgKi8KKysKKysgIGdvdG8geXllcnJoYW5kbGU7CisrCisrCisrLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorK3wgeXllcnJkZWZhdWx0IC0tIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIHwKKyt8IGVycm9yIHRva2VuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworK3l5ZXJyZGVmYXVsdDoKKysjaWYgMAorKyAgLyogVGhpcyBpcyB3cm9uZzsgb25seSBzdGF0ZXMgdGhhdCBleHBsaWNpdGx5IHdhbnQgZXJyb3IgdG9rZW5zCisrICAgICBzaG91bGQgc2hpZnQgdGhlbS4gICovCisrCisrICAvKiBJZiBpdHMgZGVmYXVsdCBpcyB0byBhY2NlcHQgYW55IHRva2VuLCBvay4gIE90aGVyd2lzZSBwb3AgaXQuICAqLworKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisrICBpZiAoeXluKQorKyAgICBnb3RvIHl5ZGVmYXVsdDsKKysjZW5kaWYKKysKKysKKysvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyt8IHl5ZXJycG9wIC0tIHBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIHwKKyt8IGVycm9yIHRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKytgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyt5eWVycnBvcDoKKysgIGlmICh5eXNzcCA9PSB5eXNzKQorKyAgICBZWUFCT1JUOworKyAgeXl2c3AtLTsKKysgIHl5c3RhdGUgPSAqLS15eXNzcDsKKysjaWYgWVlMU1BfTkVFREVECisrICB5eWxzcC0tOworKyNlbmRpZgorKworKyNpZiBZWURFQlVHCisrICBpZiAoeXlkZWJ1ZykKKysgICAgeworKyAgICAgIHNob3J0ICp5eXNzcDEgPSB5eXNzIC0gMTsKKysgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIkVycm9yOiBzdGF0ZSBzdGFjayBub3ciKTsKKysgICAgICB3aGlsZSAoeXlzc3AxICE9IHl5c3NwKQorKwlZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsICorK3l5c3NwMSk7CisrICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOworKyAgICB9CisrI2VuZGlmCisrCisrLyotLS0tLS0tLS0tLS0tLS4KKyt8IHl5ZXJyaGFuZGxlLiAgfAorK2AtLS0tLS0tLS0tLS0tLSovCisreXllcnJoYW5kbGU6CisrICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisrICBpZiAoeXluID09IFlZRkxBRykKKysgICAgZ290byB5eWVycmRlZmF1bHQ7CisrCisrICB5eW4gKz0gWVlURVJST1I7CisrICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IFlZVEVSUk9SKQorKyAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKKysKKysgIHl5biA9IHl5dGFibGVbeXluXTsKKysgIGlmICh5eW4gPCAwKQorKyAgICB7CisrICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCisrCWdvdG8geXllcnJwb3A7CisrICAgICAgeXluID0gLXl5bjsKKysgICAgICBnb3RvIHl5cmVkdWNlOworKyAgICB9CisrICBlbHNlIGlmICh5eW4gPT0gMCkKKysgICAgZ290byB5eWVycnBvcDsKKysKKysgIGlmICh5eW4gPT0gWVlGSU5BTCkKKysgICAgWVlBQ0NFUFQ7CisrCisrICBZWURQUklOVEYgKChzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIikpOworKworKyAgKisreXl2c3AgPSB5eWx2YWw7CisrI2lmIFlZTFNQX05FRURFRAorKyAgKisreXlsc3AgPSB5eWxsb2M7CisrI2VuZGlmCisrCisrICB5eXN0YXRlID0geXluOworKyAgZ290byB5eW5ld3N0YXRlOworKworKworKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyt8IHl5YWNjZXB0bGFiIC0tIFlZQUNDRVBUIGNvbWVzIGhlcmUuICB8CisrYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworK3l5YWNjZXB0bGFiOgorKyAgeXlyZXN1bHQgPSAwOworKyAgZ290byB5eXJldHVybjsKKysKKysvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorK3wgeXlhYm9ydGxhYiAtLSBZWUFCT1JUIGNvbWVzIGhlcmUuICB8CisrYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyt5eWFib3J0bGFiOgorKyAgeXlyZXN1bHQgPSAxOworKyAgZ290byB5eXJldHVybjsKKysKKysvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyt8IHl5b3ZlcmZsb3dhYiAtLSBwYXJzZXIgb3ZlcmZsb3cgY29tZXMgaGVyZS4gIHwKKytgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyt5eW92ZXJmbG93bGFiOgorKyAgeXllcnJvciAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIpOworKyAgeXlyZXN1bHQgPSAyOworKyAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKysKKyt5eXJldHVybjoKKysjaWZuZGVmIHl5b3ZlcmZsb3cKKysgIGlmICh5eXNzICE9IHl5c3NhKQorKyAgICBZWVNUQUNLX0ZSRUUgKHl5c3MpOworKyNlbmRpZgorKyAgcmV0dXJuIHl5cmVzdWx0OworK30KKysjbGluZSAyMDUgInBsdXJhbC55IgorKworKworK3ZvaWQKKytpbnRlcm5hbF9mdW5jdGlvbgorK0ZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKKyt7CisrICBpZiAoZXhwID09IE5VTEwpCisrICAgIHJldHVybjsKKysKKysgIC8qIEhhbmRsZSB0aGUgcmVjdXJzaXZlIGNhc2UuICAqLworKyAgc3dpdGNoIChleHAtPm5hcmdzKQorKyAgICB7CisrICAgIGNhc2UgMzoKKysgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMl0pOworKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisrICAgIGNhc2UgMjoKKysgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMV0pOworKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisrICAgIGNhc2UgMToKKysgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMF0pOworKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisrICAgIGRlZmF1bHQ6CisrICAgICAgYnJlYWs7CisrICAgIH0KKysKKysgIGZyZWUgKGV4cCk7CisrfQorKworKworK3N0YXRpYyBpbnQKKyt5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApCisreworKyAgY29uc3QgY2hhciAqZXhwID0gKnBleHA7CisrICBpbnQgcmVzdWx0OworKworKyAgd2hpbGUgKDEpCisrICAgIHsKKysgICAgICBpZiAoZXhwWzBdID09ICdcMCcpCisrCXsKKysJICAqcGV4cCA9IGV4cDsKKysJICByZXR1cm4gWVlFT0Y7CisrCX0KKysKKysgICAgICBpZiAoZXhwWzBdICE9ICcgJyAmJiBleHBbMF0gIT0gJ1x0JykKKysJYnJlYWs7CisrCisrICAgICAgKytleHA7CisrICAgIH0KKysKKysgIHJlc3VsdCA9ICpleHArKzsKKysgIHN3aXRjaCAocmVzdWx0KQorKyAgICB7CisrICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKysgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorKyAgICAgIHsKKysJdW5zaWduZWQgbG9uZyBpbnQgbiA9IHJlc3VsdCAtICcwJzsKKysJd2hpbGUgKGV4cFswXSA+PSAnMCcgJiYgZXhwWzBdIDw9ICc5JykKKysJICB7CisrCSAgICBuICo9IDEwOworKwkgICAgbiArPSBleHBbMF0gLSAnMCc7CisrCSAgICArK2V4cDsKKysJICB9CisrCWx2YWwtPm51bSA9IG47CisrCXJlc3VsdCA9IE5VTUJFUjsKKysgICAgICB9CisrICAgICAgYnJlYWs7CisrCisrICAgIGNhc2UgJz0nOgorKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorKwl7CisrCSAgKytleHA7CisrCSAgbHZhbC0+b3AgPSBlcXVhbDsKKysJICByZXN1bHQgPSBFUVVPUDI7CisrCX0KKysgICAgICBlbHNlCisrCXJlc3VsdCA9IFlZRVJSQ09ERTsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnISc6CisrICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisrCXsKKysJICArK2V4cDsKKysJICBsdmFsLT5vcCA9IG5vdF9lcXVhbDsKKysJICByZXN1bHQgPSBFUVVPUDI7CisrCX0KKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnJic6CisrICAgIGNhc2UgJ3wnOgorKyAgICAgIGlmIChleHBbMF0gPT0gcmVzdWx0KQorKwkrK2V4cDsKKysgICAgICBlbHNlCisrCXJlc3VsdCA9IFlZRVJSQ09ERTsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnPCc6CisrICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisrCXsKKysJICArK2V4cDsKKysJICBsdmFsLT5vcCA9IGxlc3Nfb3JfZXF1YWw7CisrCX0KKysgICAgICBlbHNlCisrCWx2YWwtPm9wID0gbGVzc190aGFuOworKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnPic6CisrICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisrCXsKKysJICArK2V4cDsKKysJICBsdmFsLT5vcCA9IGdyZWF0ZXJfb3JfZXF1YWw7CisrCX0KKysgICAgICBlbHNlCisrCWx2YWwtPm9wID0gZ3JlYXRlcl90aGFuOworKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnKic6CisrICAgICAgbHZhbC0+b3AgPSBtdWx0OworKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnLyc6CisrICAgICAgbHZhbC0+b3AgPSBkaXZpZGU7CisrICAgICAgcmVzdWx0ID0gTVVMT1AyOworKyAgICAgIGJyZWFrOworKworKyAgICBjYXNlICclJzoKKysgICAgICBsdmFsLT5vcCA9IG1vZHVsZTsKKysgICAgICByZXN1bHQgPSBNVUxPUDI7CisrICAgICAgYnJlYWs7CisrCisrICAgIGNhc2UgJysnOgorKyAgICAgIGx2YWwtPm9wID0gcGx1czsKKysgICAgICByZXN1bHQgPSBBRERPUDI7CisrICAgICAgYnJlYWs7CisrCisrICAgIGNhc2UgJy0nOgorKyAgICAgIGx2YWwtPm9wID0gbWludXM7CisrICAgICAgcmVzdWx0ID0gQURET1AyOworKyAgICAgIGJyZWFrOworKworKyAgICBjYXNlICduJzoKKysgICAgY2FzZSAnPyc6CisrICAgIGNhc2UgJzonOgorKyAgICBjYXNlICcoJzoKKysgICAgY2FzZSAnKSc6CisrICAgICAgLyogTm90aGluZywganVzdCByZXR1cm4gdGhlIGNoYXJhY3Rlci4gICovCisrICAgICAgYnJlYWs7CisrCisrICAgIGNhc2UgJzsnOgorKyAgICBjYXNlICdcbic6CisrICAgIGNhc2UgJ1wwJzoKKysgICAgICAvKiBCZSBzYWZlIGFuZCBsZXQgdGhlIHVzZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLiAgKi8KKysgICAgICAtLWV4cDsKKysgICAgICByZXN1bHQgPSBZWUVPRjsKKysgICAgICBicmVhazsKKysKKysgICAgZGVmYXVsdDoKKysgICAgICByZXN1bHQgPSBZWUVSUkNPREU7CisrI2lmIFlZREVCVUcgIT0gMAorKyAgICAgIC0tZXhwOworKyNlbmRpZgorKyAgICAgIGJyZWFrOworKyAgICB9CisrCisrICAqcGV4cCA9IGV4cDsKKysKKysgIHJldHVybiByZXN1bHQ7CisrfQorKworKworK3N0YXRpYyB2b2lkCisreXllcnJvciAoY29uc3QgY2hhciAqc3RyKQorK3sKKysgIC8qIERvIG5vdGhpbmcuICBXZSBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlLiAgKi8KKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcGx1cmFsLWV4cC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL3BsdXJhbC1leHAuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjU3ODcxNDE5MiAtMDQwMAorQEAgLTAsMCArMSwxNTQgQEAKKysvKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKysgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisrI2VuZGlmCisrCisrI2luY2x1ZGUgPGN0eXBlLmg+CisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxzdHJpbmcuaD4KKysKKysjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorKworKyNpZiAoZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfX0FQUExFX0NDX18pIFwKKysgICAgfHwgKGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisrCisrLyogVGhlc2Ugc3RydWN0cyBhcmUgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIHRoZSBnZXJtYW5pYyBwbHVyYWwKKysgICBmb3JtIGRldGVybWluYXRpb24uICBJdCByZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICAibiAhPSAxIi4gICovCisrc3RhdGljIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uIHBsdmFyID0KKyt7CisrICAubmFyZ3MgPSAwLAorKyAgLm9wZXJhdGlvbiA9IHZhciwKKyt9OworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZSA9CisreworKyAgLm5hcmdzID0gMCwKKysgIC5vcGVyYXRpb24gPSBudW0sCisrICAudmFsID0KKysgIHsKKysgICAgLm51bSA9IDEKKysgIH0KKyt9OworK3N0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTCA9CisreworKyAgLm5hcmdzID0gMiwKKysgIC5vcGVyYXRpb24gPSBub3RfZXF1YWwsCisrICAudmFsID0KKysgIHsKKysgICAgLmFyZ3MgPQorKyAgICB7CisrICAgICAgWzBdID0gKHN0cnVjdCBleHByZXNzaW9uICopICZwbHZhciwKKysgICAgICBbMV0gPSAoc3RydWN0IGV4cHJlc3Npb24gKikgJnBsb25lCisrICAgIH0KKysgIH0KKyt9OworKworKyMgZGVmaW5lIElOSVRfR0VSTUFOSUNfUExVUkFMKCkKKysKKysjZWxzZQorKworKy8qIEZvciBjb21waWxlcnMgd2l0aG91dCBzdXBwb3J0IGZvciBJU08gQyA5OSBzdHJ1Y3QvdW5pb24gaW5pdGlhbGl6ZXJzOgorKyAgIEluaXRpYWxpemF0aW9uIGF0IHJ1bi10aW1lLiAgKi8KKysKKytzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gcGx2YXI7Cisrc3RhdGljIHN0cnVjdCBleHByZXNzaW9uIHBsb25lOworK3N0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTDsKKysKKytzdGF0aWMgdm9pZAorK2luaXRfZ2VybWFuaWNfcGx1cmFsICgpCisreworKyAgaWYgKHBsb25lLnZhbC5udW0gPT0gMCkKKysgICAgeworKyAgICAgIHBsdmFyLm5hcmdzID0gMDsKKysgICAgICBwbHZhci5vcGVyYXRpb24gPSB2YXI7CisrCisrICAgICAgcGxvbmUubmFyZ3MgPSAwOworKyAgICAgIHBsb25lLm9wZXJhdGlvbiA9IG51bTsKKysgICAgICBwbG9uZS52YWwubnVtID0gMTsKKysKKysgICAgICBHRVJNQU5JQ19QTFVSQUwubmFyZ3MgPSAyOworKyAgICAgIEdFUk1BTklDX1BMVVJBTC5vcGVyYXRpb24gPSBub3RfZXF1YWw7CisrICAgICAgR0VSTUFOSUNfUExVUkFMLnZhbC5hcmdzWzBdID0gJnBsdmFyOworKyAgICAgIEdFUk1BTklDX1BMVVJBTC52YWwuYXJnc1sxXSA9ICZwbG9uZTsKKysgICAgfQorK30KKysKKysjIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpIGluaXRfZ2VybWFuaWNfcGx1cmFsICgpCisrCisrI2VuZGlmCisrCisrdm9pZAorK2ludGVybmFsX2Z1bmN0aW9uCisrRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAoY29uc3QgY2hhciAqbnVsbGVudHJ5LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqKnBsdXJhbHAsCisrCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKKyt7CisrICBpZiAobnVsbGVudHJ5ICE9IE5VTEwpCisrICAgIHsKKysgICAgICBjb25zdCBjaGFyICpwbHVyYWw7CisrICAgICAgY29uc3QgY2hhciAqbnBsdXJhbHM7CisrCisrICAgICAgcGx1cmFsID0gc3Ryc3RyIChudWxsZW50cnksICJwbHVyYWw9Iik7CisrICAgICAgbnBsdXJhbHMgPSBzdHJzdHIgKG51bGxlbnRyeSwgIm5wbHVyYWxzPSIpOworKyAgICAgIGlmIChwbHVyYWwgPT0gTlVMTCB8fCBucGx1cmFscyA9PSBOVUxMKQorKwlnb3RvIG5vX3BsdXJhbDsKKysgICAgICBlbHNlCisrCXsKKysJICBjaGFyICplbmRwOworKwkgIHVuc2lnbmVkIGxvbmcgaW50IG47CisrCSAgc3RydWN0IHBhcnNlX2FyZ3MgYXJnczsKKysKKysJICAvKiBGaXJzdCBnZXQgdGhlIG51bWJlci4gICovCisrCSAgbnBsdXJhbHMgKz0gOTsKKysJICB3aGlsZSAoKm5wbHVyYWxzICE9ICdcMCcgJiYgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpucGx1cmFscykpCisrCSAgICArK25wbHVyYWxzOworKwkgIGlmICghKCpucGx1cmFscyA+PSAnMCcgJiYgKm5wbHVyYWxzIDw9ICc5JykpCisrCSAgICBnb3RvIG5vX3BsdXJhbDsKKysjaWYgZGVmaW5lZCBIQVZFX1NUUlRPVUwgfHwgZGVmaW5lZCBfTElCQworKwkgIG4gPSBzdHJ0b3VsIChucGx1cmFscywgJmVuZHAsIDEwKTsKKysjZWxzZQorKwkgIGZvciAoZW5kcCA9IG5wbHVyYWxzLCBuID0gMDsgKmVuZHAgPj0gJzAnICYmICplbmRwIDw9ICc5JzsgZW5kcCsrKQorKwkgICAgbiA9IG4gKiAxMCArICgqZW5kcCAtICcwJyk7CisrI2VuZGlmCisrCSAgaWYgKG5wbHVyYWxzID09IGVuZHApCisrCSAgICBnb3RvIG5vX3BsdXJhbDsKKysJICAqbnBsdXJhbHNwID0gbjsKKysKKysJICAvKiBEdWUgdG8gdGhlIHJlc3RyaWN0aW9ucyBiaXNvbiBpbXBvc2VzIG9udG8gdGhlIGludGVyZmFjZSBvZiB0aGUKKysJICAgICBzY2FubmVyIGZ1bmN0aW9uIHdlIGhhdmUgdG8gcHV0IHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZSByZXN1bHQKKysJICAgICBwYXNzZWQgdXAgZnJvbSB0aGUgcGFyc2VyIGludG8gdGhlIHNhbWUgc3RydWN0dXJlIHdoaWNoIGFkZHJlc3MKKysJICAgICBpcyBwYXNzZWQgZG93biB0byB0aGUgcGFyc2VyLiAgKi8KKysJICBwbHVyYWwgKz0gNzsKKysJICBhcmdzLmNwID0gcGx1cmFsOworKwkgIGlmIChQTFVSQUxfUEFSU0UgKCZhcmdzKSAhPSAwKQorKwkgICAgZ290byBub19wbHVyYWw7CisrCSAgKnBsdXJhbHAgPSBhcmdzLnJlczsKKysJfQorKyAgICB9CisrICBlbHNlCisrICAgIHsKKysgICAgICAvKiBCeSBkZWZhdWx0IHdlIGFyZSB1c2luZyB0aGUgR2VybWFuaWMgZm9ybTogc2luZ3VsYXIgZm9ybSBvbmx5CisrICAgICAgICAgZm9yIGBvbmUnLCB0aGUgcGx1cmFsIGZvcm0gb3RoZXJ3aXNlLiAgWWVzLCB0aGlzIGlzIGFsc28gd2hhdAorKyAgICAgICAgIEVuZ2xpc2ggaXMgdXNpbmcgc2luY2UgRW5nbGlzaCBpcyBhIEdlcm1hbmljIGxhbmd1YWdlLiAgKi8KKysgICAgbm9fcGx1cmFsOgorKyAgICAgIElOSVRfR0VSTUFOSUNfUExVUkFMICgpOworKyAgICAgICpwbHVyYWxwID0gJkdFUk1BTklDX1BMVVJBTDsKKysgICAgICAqbnBsdXJhbHNwID0gMjsKKysgICAgfQorK30KKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9wbHVyYWwtZXhwLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvcGx1cmFsLWV4cC5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNTg0NzEzMjgwIC0wNDAwCitAQCAtMCwwICsxLDExOCBAQAorKy8qIEV4cHJlc3Npb24gcGFyc2luZyBhbmQgZXZhbHVhdGlvbiBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDIwMDAuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKyNpZm5kZWYgX1BMVVJBTF9FWFBfSAorKyNkZWZpbmUgX1BMVVJBTF9FWFBfSAorKworKyNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KKysjIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgorKyNlbmRpZgorKworKyNpZm5kZWYgYXR0cmlidXRlX2hpZGRlbgorKyMgZGVmaW5lIGF0dHJpYnV0ZV9oaWRkZW4KKysjZW5kaWYKKysKKysKKysvKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHRoZQorKyAgIHBsdXJhbCBmb3JtLiAgKi8KKytzdHJ1Y3QgZXhwcmVzc2lvbgorK3sKKysgIGludCBuYXJnczsJCQkvKiBOdW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KKysgIGVudW0gb3BlcmF0b3IKKysgIHsKKysgICAgLyogV2l0aG91dCBhcmd1bWVudHM6ICAqLworKyAgICB2YXIsCQkJLyogVGhlIHZhcmlhYmxlICJuIi4gICovCisrICAgIG51bSwJCQkvKiBEZWNpbWFsIG51bWJlci4gICovCisrICAgIC8qIFVuYXJ5IG9wZXJhdG9yczogICovCisrICAgIGxub3QsCQkJLyogTG9naWNhbCBOT1QuICAqLworKyAgICAvKiBCaW5hcnkgb3BlcmF0b3JzOiAgKi8KKysgICAgbXVsdCwJCQkvKiBNdWx0aXBsaWNhdGlvbi4gICovCisrICAgIGRpdmlkZSwJCQkvKiBEaXZpc2lvbi4gICovCisrICAgIG1vZHVsZSwJCQkvKiBNb2R1bG8gb3BlcmF0aW9uLiAgKi8KKysgICAgcGx1cywJCQkvKiBBZGRpdGlvbi4gICovCisrICAgIG1pbnVzLAkJCS8qIFN1YnRyYWN0aW9uLiAgKi8KKysgICAgbGVzc190aGFuLAkJCS8qIENvbXBhcmlzb24uICAqLworKyAgICBncmVhdGVyX3RoYW4sCQkvKiBDb21wYXJpc29uLiAgKi8KKysgICAgbGVzc19vcl9lcXVhbCwJCS8qIENvbXBhcmlzb24uICAqLworKyAgICBncmVhdGVyX29yX2VxdWFsLAkJLyogQ29tcGFyaXNvbi4gICovCisrICAgIGVxdWFsLAkJCS8qIENvbXBhcmlzb24gZm9yIGVxdWFsaXR5LiAgKi8KKysgICAgbm90X2VxdWFsLAkJCS8qIENvbXBhcmlzb24gZm9yIGluZXF1YWxpdHkuICAqLworKyAgICBsYW5kLAkJCS8qIExvZ2ljYWwgQU5ELiAgKi8KKysgICAgbG9yLAkJCS8qIExvZ2ljYWwgT1IuICAqLworKyAgICAvKiBUZXJuYXJ5IG9wZXJhdG9yczogICovCisrICAgIHFtb3AJCQkvKiBRdWVzdGlvbiBtYXJrIG9wZXJhdG9yLiAgKi8KKysgIH0gb3BlcmF0aW9uOworKyAgdW5pb24KKysgIHsKKysgICAgdW5zaWduZWQgbG9uZyBpbnQgbnVtOwkvKiBOdW1iZXIgdmFsdWUgZm9yIGBudW0nLiAgKi8KKysgICAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107CS8qIFVwIHRvIHRocmVlIGFyZ3VtZW50cy4gICovCisrICB9IHZhbDsKKyt9OworKworKy8qIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIHBhcnNlciBhbmQgZ2V0CisrICAgdGhlIHJlc3VsdCBpbiBhIHRocmVhZC1zYWZlIHdheS4gICovCisrc3RydWN0IHBhcnNlX2FyZ3MKKyt7CisrICBjb25zdCBjaGFyICpjcDsKKysgIHN0cnVjdCBleHByZXNzaW9uICpyZXM7CisrfTsKKysKKysKKysvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGlzIHNvdXJjZSBjb2RlIGlzIHVzZWQKKysgICAxLiBpbiB0aGUgR05VIEMgTGlicmFyeSBsaWJyYXJ5LAorKyAgIDIuIGluIHRoZSBHTlUgbGliaW50bCBsaWJyYXJ5LAorKyAgIDMuIGluIHRoZSBHTlUgZ2V0dGV4dCB0b29scy4KKysgICBUaGUgZnVuY3Rpb24gbmFtZXMgaW4gZWFjaCBzaXR1YXRpb24gbXVzdCBiZSBkaWZmZXJlbnQsIHRvIGFsbG93IGZvcgorKyAgIGJpbmFyeSBpbmNvbXBhdGlibGUgY2hhbmdlcyBpbiAnc3RydWN0IGV4cHJlc3Npb24nLiAgRnVydGhlcm1vcmUsCisrICAgMS4gaW4gdGhlIEdOVSBDIExpYnJhcnkgbGlicmFyeSwgdGhlIG5hbWVzIGhhdmUgYSBfXyBwcmVmaXgsCisrICAgMi4rMy4gaW4gdGhlIEdOVSBsaWJpbnRsIGxpYnJhcnkgYW5kIGluIHRoZSBHTlUgZ2V0dGV4dCB0b29scywgdGhlIG5hbWVzCisrICAgICAgICAgbXVzdCBmb2xsb3cgQU5TSSBDIGFuZCBub3Qgc3RhcnQgd2l0aCBfXy4KKysgICBTbyB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIHRoZSB0aHJlZSBjYXNlcy4gICovCisrI2lmZGVmIF9MSUJDCisrIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIF9fZ2V0dGV4dF9mcmVlX2V4cAorKyMgZGVmaW5lIFBMVVJBTF9QQVJTRSBfX2dldHRleHRwYXJzZQorKyMgZGVmaW5lIEdFUk1BTklDX1BMVVJBTCBfX2dldHRleHRfZ2VybWFuaWNfcGx1cmFsCisrIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBfX2dldHRleHRfZXh0cmFjdF9wbHVyYWwKKysjZWxpZiBkZWZpbmVkIChJTl9MSUJJTlRMKQorKyMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBsaWJpbnRsX2dldHRleHRfZnJlZV9leHAKKysjIGRlZmluZSBQTFVSQUxfUEFSU0UgbGliaW50bF9nZXR0ZXh0cGFyc2UKKysjIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgbGliaW50bF9nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbAorKyMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gbGliaW50bF9nZXR0ZXh0X2V4dHJhY3RfcGx1cmFsCisrI2Vsc2UKKysjIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gZnJlZV9wbHVyYWxfZXhwcmVzc2lvbgorKyMgZGVmaW5lIFBMVVJBTF9QQVJTRSBwYXJzZV9wbHVyYWxfZXhwcmVzc2lvbgorKyMgZGVmaW5lIEdFUk1BTklDX1BMVVJBTCBnZXJtYW5pY19wbHVyYWwKKysjIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIGV4dHJhY3RfcGx1cmFsX2V4cHJlc3Npb24KKysjZW5kaWYKKysKKytleHRlcm4gdm9pZCBGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCisrICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKytleHRlcm4gaW50IFBMVVJBTF9QQVJTRSAodm9pZCAqYXJnKTsKKytleHRlcm4gc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMIGF0dHJpYnV0ZV9oaWRkZW47CisrZXh0ZXJuIHZvaWQgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAoY29uc3QgY2hhciAqbnVsbGVudHJ5LAorKwkJCQkgICAgICAgc3RydWN0IGV4cHJlc3Npb24gKipwbHVyYWxwLAorKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKKysgICAgIGludGVybmFsX2Z1bmN0aW9uOworKworKyNpZiAhZGVmaW5lZCAoX0xJQkMpICYmICFkZWZpbmVkIChJTl9MSUJJTlRMKQorK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBwbHVyYWxfZXZhbCAoc3RydWN0IGV4cHJlc3Npb24gKnBleHAsCisrCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IG4pOworKyNlbmRpZgorKworKyNlbmRpZiAvKiBfUExVUkFMX0VYUF9IICovCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcGx1cmFsLnkJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvcGx1cmFsLnkJMjAwNC0wOS0xMiAxNDo0MDozNC41ODk3MTI1MjAgLTA0MDAKK0BAIC0wLDAgKzEsMzgxIEBACisrJXsKKysvKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKysgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysvKiBUaGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNlciB1c2VzIGFsbG9jYS4gIEFJWCAzIGZvcmNlcyB1cyB0byBwdXQgdGhpcworKyAgIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4gYmlzb24ncworKyAgIHNrZWxldG9uIGZpbGUgY29tZXMgdG9vIGxhdGUuICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPgorKyAgIGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZSBhcmJpdHJhcnkgc3lzdGVtIGhlYWRlcnMuICAqLworKyNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgX19HTlVDX18KKysgI3ByYWdtYSBhbGxvY2EKKysjZW5kaWYKKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisrI2VuZGlmCisrCisrI2luY2x1ZGUgPHN0ZGRlZi5oPgorKyNpbmNsdWRlIDxzdGRsaWIuaD4KKysjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorKworKy8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKKysgICBidXQgd2Ugd2FudCBpdCB0byBiZSBjYWxsZWQgUExVUkFMX1BBUlNFLiAgKi8KKysjaWZuZGVmIF9MSUJDCisrIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCisrI2VuZGlmCisrCisrI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAorKyNkZWZpbmUgWVlQQVJTRV9QQVJBTQlhcmcKKyslfQorKyVwdXJlX3BhcnNlcgorKyVleHBlY3QgNworKworKyV1bmlvbiB7CisrICB1bnNpZ25lZCBsb25nIGludCBudW07CisrICBlbnVtIG9wZXJhdG9yIG9wOworKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKKyt9CisrCisrJXsKKysvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLworK3N0YXRpYyBpbnQgeXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKTsKKytzdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzdHIpOworKworKy8qIEFsbG9jYXRpb24gb2YgZXhwcmVzc2lvbnMuICAqLworKworK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCisrbmV3X2V4cCAoaW50IG5hcmdzLCBlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqIGNvbnN0ICphcmdzKQorK3sKKysgIGludCBpOworKyAgc3RydWN0IGV4cHJlc3Npb24gKm5ld3A7CisrCisrICAvKiBJZiBhbnkgb2YgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBtYWxsb2MnZWQsIGp1c3QgcmV0dXJuIE5VTEwuICAqLworKyAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKysgICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKKysgICAgICBnb3RvIGZhaWw7CisrCisrICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KKysgIG5ld3AgPSAoc3RydWN0IGV4cHJlc3Npb24gKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7CisrICBpZiAobmV3cCAhPSBOVUxMKQorKyAgICB7CisrICAgICAgbmV3cC0+bmFyZ3MgPSBuYXJnczsKKysgICAgICBuZXdwLT5vcGVyYXRpb24gPSBvcDsKKysgICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorKwluZXdwLT52YWwuYXJnc1tpXSA9IGFyZ3NbaV07CisrICAgICAgcmV0dXJuIG5ld3A7CisrICAgIH0KKysKKysgZmFpbDoKKysgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisrICAgIEZSRUVfRVhQUkVTU0lPTiAoYXJnc1tpXSk7CisrCisrICByZXR1cm4gTlVMTDsKKyt9CisrCisrc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCisrbmV3X2V4cF8wIChlbnVtIG9wZXJhdG9yIG9wKQorK3sKKysgIHJldHVybiBuZXdfZXhwICgwLCBvcCwgTlVMTCk7CisrfQorKworK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorK25ld19leHBfMSAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQorK3sKKysgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzFdOworKworKyAgYXJnc1swXSA9IHJpZ2h0OworKyAgcmV0dXJuIG5ld19leHAgKDEsIG9wLCBhcmdzKTsKKyt9CisrCisrc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKKytuZXdfZXhwXzIgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpsZWZ0LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCisreworKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07CisrCisrICBhcmdzWzBdID0gbGVmdDsKKysgIGFyZ3NbMV0gPSByaWdodDsKKysgIHJldHVybiBuZXdfZXhwICgyLCBvcCwgYXJncyk7CisrfQorKworK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorK25ld19leHBfMyAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmJleHAsCisrCSAgIHN0cnVjdCBleHByZXNzaW9uICp0YnJhbmNoLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqZmJyYW5jaCkKKyt7CisrICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1szXTsKKysKKysgIGFyZ3NbMF0gPSBiZXhwOworKyAgYXJnc1sxXSA9IHRicmFuY2g7CisrICBhcmdzWzJdID0gZmJyYW5jaDsKKysgIHJldHVybiBuZXdfZXhwICgzLCBvcCwgYXJncyk7CisrfQorKworKyV9CisrCisrLyogVGhpcyBkZWNsYXJlcyB0aGF0IGFsbCBvcGVyYXRvcnMgaGF2ZSB0aGUgc2FtZSBhc3NvY2lhdGl2aXR5IGFuZCB0aGUKKysgICBwcmVjZWRlbmNlIG9yZGVyIGFzIGluIEMuICBTZWUgW0hhcmJpc29uLCBTdGVlbGU6IEMsIEEgUmVmZXJlbmNlIE1hbnVhbF0uCisrICAgVGhlcmUgaXMgbm8gdW5hcnkgbWludXMgYW5kIG5vIGJpdHdpc2Ugb3BlcmF0b3JzLgorKyAgIE9wZXJhdG9ycyB3aXRoIHRoZSBzYW1lIHN5bnRhY3RpYyBiZWhhdmlvdXIgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIGEgc2luZ2xlCisrICAgdG9rZW4sIHRvIHNhdmUgc3BhY2UgaW4gdGhlIGFycmF5IGdlbmVyYXRlZCBieSBiaXNvbi4gICovCisrJXJpZ2h0ICc/JwkJLyogICA/CQkqLworKyVsZWZ0ICd8JwkJLyogICB8fAkJKi8KKyslbGVmdCAnJicJCS8qICAgJiYJCSovCisrJWxlZnQgRVFVT1AyCQkvKiAgID09ICE9CSovCisrJWxlZnQgQ01QT1AyCQkvKiAgIDwgPiA8PSA+PQkqLworKyVsZWZ0IEFERE9QMgkJLyogICArIC0JKi8KKyslbGVmdCBNVUxPUDIJCS8qICAgKiAvICUJKi8KKyslcmlnaHQgJyEnCQkvKiAgICEJCSovCisrCisrJXRva2VuIDxvcD4gRVFVT1AyIENNUE9QMiBBRERPUDIgTVVMT1AyCisrJXRva2VuIDxudW0+IE5VTUJFUgorKyV0eXBlIDxleHA+IGV4cAorKworKyUlCisrCisrc3RhcnQ6CSAgZXhwCisrCSAgeworKwkgICAgaWYgKCQxID09IE5VTEwpCisrCSAgICAgIFlZQUJPUlQ7CisrCSAgICAoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPnJlcyA9ICQxOworKwkgIH0KKysJOworKworK2V4cDoJICBleHAgJz8nIGV4cCAnOicgZXhwCisrCSAgeworKwkgICAgJCQgPSBuZXdfZXhwXzMgKHFtb3AsICQxLCAkMywgJDUpOworKwkgIH0KKysJfCBleHAgJ3wnIGV4cAorKwkgIHsKKysJICAgICQkID0gbmV3X2V4cF8yIChsb3IsICQxLCAkMyk7CisrCSAgfQorKwl8IGV4cCAnJicgZXhwCisrCSAgeworKwkgICAgJCQgPSBuZXdfZXhwXzIgKGxhbmQsICQxLCAkMyk7CisrCSAgfQorKwl8IGV4cCBFUVVPUDIgZXhwCisrCSAgeworKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworKwkgIH0KKysJfCBleHAgQ01QT1AyIGV4cAorKwkgIHsKKysJICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKKysJICB9CisrCXwgZXhwIEFERE9QMiBleHAKKysJICB7CisrCSAgICAkJCA9IG5ld19leHBfMiAoJDIsICQxLCAkMyk7CisrCSAgfQorKwl8IGV4cCBNVUxPUDIgZXhwCisrCSAgeworKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworKwkgIH0KKysJfCAnIScgZXhwCisrCSAgeworKwkgICAgJCQgPSBuZXdfZXhwXzEgKGxub3QsICQyKTsKKysJICB9CisrCXwgJ24nCisrCSAgeworKwkgICAgJCQgPSBuZXdfZXhwXzAgKHZhcik7CisrCSAgfQorKwl8IE5VTUJFUgorKwkgIHsKKysJICAgIGlmICgoJCQgPSBuZXdfZXhwXzAgKG51bSkpICE9IE5VTEwpCisrCSAgICAgICQkLT52YWwubnVtID0gJDE7CisrCSAgfQorKwl8ICcoJyBleHAgJyknCisrCSAgeworKwkgICAgJCQgPSAkMjsKKysJICB9CisrCTsKKysKKyslJQorKworK3ZvaWQKKytpbnRlcm5hbF9mdW5jdGlvbgorK0ZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKKyt7CisrICBpZiAoZXhwID09IE5VTEwpCisrICAgIHJldHVybjsKKysKKysgIC8qIEhhbmRsZSB0aGUgcmVjdXJzaXZlIGNhc2UuICAqLworKyAgc3dpdGNoIChleHAtPm5hcmdzKQorKyAgICB7CisrICAgIGNhc2UgMzoKKysgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMl0pOworKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisrICAgIGNhc2UgMjoKKysgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMV0pOworKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisrICAgIGNhc2UgMToKKysgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMF0pOworKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisrICAgIGRlZmF1bHQ6CisrICAgICAgYnJlYWs7CisrICAgIH0KKysKKysgIGZyZWUgKGV4cCk7CisrfQorKworKworK3N0YXRpYyBpbnQKKyt5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApCisreworKyAgY29uc3QgY2hhciAqZXhwID0gKnBleHA7CisrICBpbnQgcmVzdWx0OworKworKyAgd2hpbGUgKDEpCisrICAgIHsKKysgICAgICBpZiAoZXhwWzBdID09ICdcMCcpCisrCXsKKysJICAqcGV4cCA9IGV4cDsKKysJICByZXR1cm4gWVlFT0Y7CisrCX0KKysKKysgICAgICBpZiAoZXhwWzBdICE9ICcgJyAmJiBleHBbMF0gIT0gJ1x0JykKKysJYnJlYWs7CisrCisrICAgICAgKytleHA7CisrICAgIH0KKysKKysgIHJlc3VsdCA9ICpleHArKzsKKysgIHN3aXRjaCAocmVzdWx0KQorKyAgICB7CisrICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKysgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorKyAgICAgIHsKKysJdW5zaWduZWQgbG9uZyBpbnQgbiA9IHJlc3VsdCAtICcwJzsKKysJd2hpbGUgKGV4cFswXSA+PSAnMCcgJiYgZXhwWzBdIDw9ICc5JykKKysJICB7CisrCSAgICBuICo9IDEwOworKwkgICAgbiArPSBleHBbMF0gLSAnMCc7CisrCSAgICArK2V4cDsKKysJICB9CisrCWx2YWwtPm51bSA9IG47CisrCXJlc3VsdCA9IE5VTUJFUjsKKysgICAgICB9CisrICAgICAgYnJlYWs7CisrCisrICAgIGNhc2UgJz0nOgorKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorKwl7CisrCSAgKytleHA7CisrCSAgbHZhbC0+b3AgPSBlcXVhbDsKKysJICByZXN1bHQgPSBFUVVPUDI7CisrCX0KKysgICAgICBlbHNlCisrCXJlc3VsdCA9IFlZRVJSQ09ERTsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnISc6CisrICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisrCXsKKysJICArK2V4cDsKKysJICBsdmFsLT5vcCA9IG5vdF9lcXVhbDsKKysJICByZXN1bHQgPSBFUVVPUDI7CisrCX0KKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnJic6CisrICAgIGNhc2UgJ3wnOgorKyAgICAgIGlmIChleHBbMF0gPT0gcmVzdWx0KQorKwkrK2V4cDsKKysgICAgICBlbHNlCisrCXJlc3VsdCA9IFlZRVJSQ09ERTsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnPCc6CisrICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisrCXsKKysJICArK2V4cDsKKysJICBsdmFsLT5vcCA9IGxlc3Nfb3JfZXF1YWw7CisrCX0KKysgICAgICBlbHNlCisrCWx2YWwtPm9wID0gbGVzc190aGFuOworKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnPic6CisrICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisrCXsKKysJICArK2V4cDsKKysJICBsdmFsLT5vcCA9IGdyZWF0ZXJfb3JfZXF1YWw7CisrCX0KKysgICAgICBlbHNlCisrCWx2YWwtPm9wID0gZ3JlYXRlcl90aGFuOworKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnKic6CisrICAgICAgbHZhbC0+b3AgPSBtdWx0OworKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKysgICAgICBicmVhazsKKysKKysgICAgY2FzZSAnLyc6CisrICAgICAgbHZhbC0+b3AgPSBkaXZpZGU7CisrICAgICAgcmVzdWx0ID0gTVVMT1AyOworKyAgICAgIGJyZWFrOworKworKyAgICBjYXNlICclJzoKKysgICAgICBsdmFsLT5vcCA9IG1vZHVsZTsKKysgICAgICByZXN1bHQgPSBNVUxPUDI7CisrICAgICAgYnJlYWs7CisrCisrICAgIGNhc2UgJysnOgorKyAgICAgIGx2YWwtPm9wID0gcGx1czsKKysgICAgICByZXN1bHQgPSBBRERPUDI7CisrICAgICAgYnJlYWs7CisrCisrICAgIGNhc2UgJy0nOgorKyAgICAgIGx2YWwtPm9wID0gbWludXM7CisrICAgICAgcmVzdWx0ID0gQURET1AyOworKyAgICAgIGJyZWFrOworKworKyAgICBjYXNlICduJzoKKysgICAgY2FzZSAnPyc6CisrICAgIGNhc2UgJzonOgorKyAgICBjYXNlICcoJzoKKysgICAgY2FzZSAnKSc6CisrICAgICAgLyogTm90aGluZywganVzdCByZXR1cm4gdGhlIGNoYXJhY3Rlci4gICovCisrICAgICAgYnJlYWs7CisrCisrICAgIGNhc2UgJzsnOgorKyAgICBjYXNlICdcbic6CisrICAgIGNhc2UgJ1wwJzoKKysgICAgICAvKiBCZSBzYWZlIGFuZCBsZXQgdGhlIHVzZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLiAgKi8KKysgICAgICAtLWV4cDsKKysgICAgICByZXN1bHQgPSBZWUVPRjsKKysgICAgICBicmVhazsKKysKKysgICAgZGVmYXVsdDoKKysgICAgICByZXN1bHQgPSBZWUVSUkNPREU7CisrI2lmIFlZREVCVUcgIT0gMAorKyAgICAgIC0tZXhwOworKyNlbmRpZgorKyAgICAgIGJyZWFrOworKyAgICB9CisrCisrICAqcGV4cCA9IGV4cDsKKysKKysgIHJldHVybiByZXN1bHQ7CisrfQorKworKworK3N0YXRpYyB2b2lkCisreXllcnJvciAoY29uc3QgY2hhciAqc3RyKQorK3sKKysgIC8qIERvIG5vdGhpbmcuICBXZSBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlLiAgKi8KKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcG8ydGJsLnNlZC5pbgkxOTk4LTA0LTI2IDA5OjIwOjUyLjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9wbzJ0Ymwuc2VkLmluCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCitAQCAtMSwxMDIgKzAsMCBAQAorLSMgcG8ydGJsLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gbG9va3VwIHRhYmxlIGZvciBjYXRnZXRzCistIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCistIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCistIworLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CistIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCistIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy0jCistIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCistIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLSMKKy0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCistIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKy0jCistMSB7CistICBpXAorLS8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHBvMnRibC5zZWQgZnJvbSBAUEFDS0FHRSBOQU1FQC5wb3QuICAqL1wKKy1cCistI2lmIEhBVkVfQ09ORklHX0hcCistIyBpbmNsdWRlIDxjb25maWcuaD5cCistI2VuZGlmXAorLVwKKy0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIlwKKy1cCistY29uc3Qgc3RydWN0IF9tc2dfZW50IF9tc2dfdGJsW10gPSB7CistICBoCistICBzLy4qLzAvCistICB4CistfQorLSMKKy0jIFdyaXRlIG1zZ2lkIGVudHJpZXMgaW4gQyBhcnJheSBmb3JtLgorLSMKKy0vXm1zZ2lkLyB7CistICBzL21zZ2lkWyAJXSpcKCIuKiJcKS8gIHtcMS8KKy0gIHRiCistIyBBcHBlbmQgdGhlIG5leHQgbGluZQorLSAgOmIKKy0gIE4KKy0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KKy0gIHMvXCguKlwpIlwoXG5cKSJcKC4qIlwpL1wxXDJcMy8KKy0jIFllcywgdGhlbiBicmFuY2guCistICB0YQorLSMgQmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgZmlsZSBjb3JyZWN0bHkgZm9ybWVkIHRoZSBsaW5lCistIyBqdXN0IHJlYWQgY2Fubm90IGJlIGFnYWluIGJlIGEgbXNnaWQgbGluZS4gIFNvIGl0J3Mgc2FmZSB0byBpZ25vcmUKKy0jIGl0LgorLSAgcy9cKC4qXClcbi4qL1wxLworLSAgYmMKKy0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCistICA6YQorLSAgcy9cKC4qXClcKFxuLipcKS9cMVxcXDIvCistICBQCistIyBXZSBjYW5ub3QgdXNlIEQgaGVyZS4KKy0gIHMvLipcblwoLipcKS9cMS8KKy0jIFNvbWUgYnVnZ3kgc2VkcyBkbyBub3QgY2xlYXIgdGhlIGBzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbiBzaW5jZSBsYXN0IGBgdCcnJworLSMgZmxhZyBvbiBgTicsIHNvIHdlIGRvIGEgYHQnIGhlcmUgdG8gY2xlYXIgaXQuCistICB0YgorLSMgTm90IHJlYWNoZWQKKy0gIDpjCistICB4CistIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKKy0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgorLSAgdGQKKy0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCistIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCistICA6ZAorLSAgcy85XChfKlwpJC9fXDEvCistICB0ZAorLSMgQXNzdXJlIGF0IGxlYXN0IG9uZSBkaWdpdCBpcyBhdmFpbGFibGUuCistICBzL15cKF8qXCkkLzBcMS8KKy0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KKy0gIHMvOFwoXypcKSQvOVwxLworLSAgcy83XChfKlwpJC84XDEvCistICBzLzZcKF8qXCkkLzdcMS8KKy0gIHMvNVwoXypcKSQvNlwxLworLSAgcy80XChfKlwpJC81XDEvCistICBzLzNcKF8qXCkkLzRcMS8KKy0gIHMvMlwoXypcKSQvM1wxLworLSAgcy8xXChfKlwpJC8yXDEvCistICBzLzBcKF8qXCkkLzFcMS8KKy0jIENvbnZlcnQgdGhlIGhpZGRlbiBgOScgZGlnaXRzIHRvIGAwJ3MuCistICBzL18vMC9nCistICB4CistICBHCistICBzL1woLipcKVxuXChbMC05XSpcKS9cMSwgXDJ9LC8KKy0gIHMvXCguKlwpIiQvXDEvCistICBwCistfQorLSMKKy0jIExhc3QgbGluZS4KKy0jCistJCB7CistICBpXAorLX07XAorLQorLSAgZworLSAgcy8wKlwoLipcKS9pbnQgX21zZ190YmxfbGVuZ3RoID0gXDE7L3AKKy19CistZAorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3ByaW50Zi1hcmdzLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvcHJpbnRmLWFyZ3MuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjU5NTcxMTYwOCAtMDQwMAorQEAgLTAsMCArMSwxMTkgQEAKKysvKiBEZWNvbXBvc2VkIHByaW50ZiBhcmd1bWVudCBsaXN0LgorKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisrI2VuZGlmCisrCisrLyogU3BlY2lmaWNhdGlvbi4gICovCisrI2luY2x1ZGUgInByaW50Zi1hcmdzLmgiCisrCisrI2lmZGVmIFNUQVRJQworK1NUQVRJQworKyNlbmRpZgorK2ludAorK3ByaW50Zl9mZXRjaGFyZ3MgKHZhX2xpc3QgYXJncywgYXJndW1lbnRzICphKQorK3sKKysgIHNpemVfdCBpOworKyAgYXJndW1lbnQgKmFwOworKworKyAgZm9yIChpID0gMCwgYXAgPSAmYS0+YXJnWzBdOyBpIDwgYS0+Y291bnQ7IGkrKywgYXArKykKKysgICAgc3dpdGNoIChhcC0+dHlwZSkKKysgICAgICB7CisrICAgICAgY2FzZSBUWVBFX1NDSEFSOgorKwlhcC0+YS5hX3NjaGFyID0gdmFfYXJnIChhcmdzLCAvKnNpZ25lZCBjaGFyKi8gaW50KTsKKysJYnJlYWs7CisrICAgICAgY2FzZSBUWVBFX1VDSEFSOgorKwlhcC0+YS5hX3VjaGFyID0gdmFfYXJnIChhcmdzLCAvKnVuc2lnbmVkIGNoYXIqLyBpbnQpOworKwlicmVhazsKKysgICAgICBjYXNlIFRZUEVfU0hPUlQ6CisrCWFwLT5hLmFfc2hvcnQgPSB2YV9hcmcgKGFyZ3MsIC8qc2hvcnQqLyBpbnQpOworKwlicmVhazsKKysgICAgICBjYXNlIFRZUEVfVVNIT1JUOgorKwlhcC0+YS5hX3VzaG9ydCA9IHZhX2FyZyAoYXJncywgLyp1bnNpZ25lZCBzaG9ydCovIGludCk7CisrCWJyZWFrOworKyAgICAgIGNhc2UgVFlQRV9JTlQ6CisrCWFwLT5hLmFfaW50ID0gdmFfYXJnIChhcmdzLCBpbnQpOworKwlicmVhazsKKysgICAgICBjYXNlIFRZUEVfVUlOVDoKKysJYXAtPmEuYV91aW50ID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOworKwlicmVhazsKKysgICAgICBjYXNlIFRZUEVfTE9OR0lOVDoKKysJYXAtPmEuYV9sb25naW50ID0gdmFfYXJnIChhcmdzLCBsb25nIGludCk7CisrCWJyZWFrOworKyAgICAgIGNhc2UgVFlQRV9VTE9OR0lOVDoKKysJYXAtPmEuYV91bG9uZ2ludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBpbnQpOworKwlicmVhazsKKysjaWZkZWYgSEFWRV9MT05HX0xPTkcKKysgICAgICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6CisrCWFwLT5hLmFfbG9uZ2xvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgbG9uZyBpbnQpOworKwlicmVhazsKKysgICAgICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgorKwlhcC0+YS5hX3Vsb25nbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBsb25nIGludCk7CisrCWJyZWFrOworKyNlbmRpZgorKyAgICAgIGNhc2UgVFlQRV9ET1VCTEU6CisrCWFwLT5hLmFfZG91YmxlID0gdmFfYXJnIChhcmdzLCBkb3VibGUpOworKwlicmVhazsKKysjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorKyAgICAgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgorKwlhcC0+YS5hX2xvbmdkb3VibGUgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgZG91YmxlKTsKKysJYnJlYWs7CisrI2VuZGlmCisrICAgICAgY2FzZSBUWVBFX0NIQVI6CisrCWFwLT5hLmFfY2hhciA9IHZhX2FyZyAoYXJncywgaW50KTsKKysJYnJlYWs7CisrI2lmZGVmIEhBVkVfV0lOVF9UCisrICAgICAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKKysJYXAtPmEuYV93aWRlX2NoYXIgPSB2YV9hcmcgKGFyZ3MsIHdpbnRfdCk7CisrCWJyZWFrOworKyNlbmRpZgorKyAgICAgIGNhc2UgVFlQRV9TVFJJTkc6CisrCWFwLT5hLmFfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOworKwlicmVhazsKKysjaWZkZWYgSEFWRV9XQ0hBUl9UCisrICAgICAgY2FzZSBUWVBFX1dJREVfU1RSSU5HOgorKwlhcC0+YS5hX3dpZGVfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCB3Y2hhcl90ICopOworKwlicmVhazsKKysjZW5kaWYKKysgICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKKysJYXAtPmEuYV9wb2ludGVyID0gdmFfYXJnIChhcmdzLCB2b2lkICopOworKwlicmVhazsKKysgICAgICBjYXNlIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjoKKysJYXAtPmEuYV9jb3VudF9zY2hhcl9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBzaWduZWQgY2hhciAqKTsKKysJYnJlYWs7CisrICAgICAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6CisrCWFwLT5hLmFfY291bnRfc2hvcnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgc2hvcnQgKik7CisrCWJyZWFrOworKyAgICAgIGNhc2UgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjoKKysJYXAtPmEuYV9jb3VudF9pbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgaW50ICopOworKwlicmVhazsKKysgICAgICBjYXNlIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOgorKwlhcC0+YS5hX2NvdW50X2xvbmdpbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgbG9uZyBpbnQgKik7CisrCWJyZWFrOworKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworKyAgICAgIGNhc2UgVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOgorKwlhcC0+YS5hX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgbG9uZyBpbnQgKik7CisrCWJyZWFrOworKyNlbmRpZgorKyAgICAgIGRlZmF1bHQ6CisrCS8qIFVua25vd24gdHlwZS4gICovCisrCXJldHVybiAtMTsKKysgICAgICB9CisrICByZXR1cm4gMDsKKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcHJpbnRmLWFyZ3MuaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9wcmludGYtYXJncy5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjAxNzEwNjk2IC0wNDAwCitAQCAtMCwwICsxLDEzNyBAQAorKy8qIERlY29tcG9zZWQgcHJpbnRmIGFyZ3VtZW50IGxpc3QuCisrICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKyNpZm5kZWYgX1BSSU5URl9BUkdTX0gKKysjZGVmaW5lIF9QUklOVEZfQVJHU19ICisrCisrLyogR2V0IHNpemVfdC4gICovCisrI2luY2x1ZGUgPHN0ZGRlZi5oPgorKworKy8qIEdldCB3Y2hhcl90LiAgKi8KKysjaWZkZWYgSEFWRV9XQ0hBUl9UCisrIyBpbmNsdWRlIDxzdGRkZWYuaD4KKysjZW5kaWYKKysKKysvKiBHZXQgd2ludF90LiAgKi8KKysjaWZkZWYgSEFWRV9XSU5UX1QKKysjIGluY2x1ZGUgPHdjaGFyLmg+CisrI2VuZGlmCisrCisrLyogR2V0IHZhX2xpc3QuICAqLworKyNpbmNsdWRlIDxzdGRhcmcuaD4KKysKKysKKysvKiBBcmd1bWVudCB0eXBlcyAqLworK3R5cGVkZWYgZW51bQorK3sKKysgIFRZUEVfTk9ORSwKKysgIFRZUEVfU0NIQVIsCisrICBUWVBFX1VDSEFSLAorKyAgVFlQRV9TSE9SVCwKKysgIFRZUEVfVVNIT1JULAorKyAgVFlQRV9JTlQsCisrICBUWVBFX1VJTlQsCisrICBUWVBFX0xPTkdJTlQsCisrICBUWVBFX1VMT05HSU5ULAorKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworKyAgVFlQRV9MT05HTE9OR0lOVCwKKysgIFRZUEVfVUxPTkdMT05HSU5ULAorKyNlbmRpZgorKyAgVFlQRV9ET1VCTEUsCisrI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKysgIFRZUEVfTE9OR0RPVUJMRSwKKysjZW5kaWYKKysgIFRZUEVfQ0hBUiwKKysjaWZkZWYgSEFWRV9XSU5UX1QKKysgIFRZUEVfV0lERV9DSEFSLAorKyNlbmRpZgorKyAgVFlQRV9TVFJJTkcsCisrI2lmZGVmIEhBVkVfV0NIQVJfVAorKyAgVFlQRV9XSURFX1NUUklORywKKysjZW5kaWYKKysgIFRZUEVfUE9JTlRFUiwKKysgIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUiwKKysgIFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUiwKKysgIFRZUEVfQ09VTlRfSU5UX1BPSU5URVIsCisrICBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUgorKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworKywgVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSCisrI2VuZGlmCisrfSBhcmdfdHlwZTsKKysKKysvKiBQb2x5bW9ycGhpYyBhcmd1bWVudCAqLworK3R5cGVkZWYgc3RydWN0CisreworKyAgYXJnX3R5cGUgdHlwZTsKKysgIHVuaW9uCisrICB7CisrICAgIHNpZ25lZCBjaGFyCQkJYV9zY2hhcjsKKysgICAgdW5zaWduZWQgY2hhcgkJYV91Y2hhcjsKKysgICAgc2hvcnQJCQlhX3Nob3J0OworKyAgICB1bnNpZ25lZCBzaG9ydAkJYV91c2hvcnQ7CisrICAgIGludAkJCQlhX2ludDsKKysgICAgdW5zaWduZWQgaW50CQlhX3VpbnQ7CisrICAgIGxvbmcgaW50CQkJYV9sb25naW50OworKyAgICB1bnNpZ25lZCBsb25nIGludAkJYV91bG9uZ2ludDsKKysjaWZkZWYgSEFWRV9MT05HX0xPTkcKKysgICAgbG9uZyBsb25nIGludAkJYV9sb25nbG9uZ2ludDsKKysgICAgdW5zaWduZWQgbG9uZyBsb25nIGludAlhX3Vsb25nbG9uZ2ludDsKKysjZW5kaWYKKysgICAgZmxvYXQJCQlhX2Zsb2F0OworKyAgICBkb3VibGUJCQlhX2RvdWJsZTsKKysjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorKyAgICBsb25nIGRvdWJsZQkJCWFfbG9uZ2RvdWJsZTsKKysjZW5kaWYKKysgICAgaW50CQkJCWFfY2hhcjsKKysjaWZkZWYgSEFWRV9XSU5UX1QKKysgICAgd2ludF90CQkJYV93aWRlX2NoYXI7CisrI2VuZGlmCisrICAgIGNvbnN0IGNoYXIqCQkJYV9zdHJpbmc7CisrI2lmZGVmIEhBVkVfV0NIQVJfVAorKyAgICBjb25zdCB3Y2hhcl90KgkJYV93aWRlX3N0cmluZzsKKysjZW5kaWYKKysgICAgdm9pZCoJCQlhX3BvaW50ZXI7CisrICAgIHNpZ25lZCBjaGFyICoJCWFfY291bnRfc2NoYXJfcG9pbnRlcjsKKysgICAgc2hvcnQgKgkJCWFfY291bnRfc2hvcnRfcG9pbnRlcjsKKysgICAgaW50ICoJCQlhX2NvdW50X2ludF9wb2ludGVyOworKyAgICBsb25nIGludCAqCQkJYV9jb3VudF9sb25naW50X3BvaW50ZXI7CisrI2lmZGVmIEhBVkVfTE9OR19MT05HCisrICAgIGxvbmcgbG9uZyBpbnQgKgkJYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyOworKyNlbmRpZgorKyAgfQorKyAgYTsKKyt9CisrYXJndW1lbnQ7CisrCisrdHlwZWRlZiBzdHJ1Y3QKKyt7CisrICBzaXplX3QgY291bnQ7CisrICBhcmd1bWVudCAqYXJnOworK30KKythcmd1bWVudHM7CisrCisrCisrLyogRmV0Y2ggdGhlIGFyZ3VtZW50cywgcHV0dGluZyB0aGVtIGludG8gYS4gKi8KKysjaWZkZWYgU1RBVElDCisrU1RBVElDCisrI2Vsc2UKKytleHRlcm4KKysjZW5kaWYKKytpbnQgcHJpbnRmX2ZldGNoYXJncyAodmFfbGlzdCBhcmdzLCBhcmd1bWVudHMgKmEpOworKworKyNlbmRpZiAvKiBfUFJJTlRGX0FSR1NfSCAqLworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3ByaW50Zi5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL3ByaW50Zi5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjA3NzA5Nzg0IC0wNDAwCitAQCAtMCwwICsxLDM3MSBAQAorKy8qIEZvcm1hdHRlZCBvdXRwdXQgdG8gc3RyaW5ncywgdXNpbmcgUE9TSVgvWFNJIGZvcm1hdCBzdHJpbmdzIHdpdGggcG9zaXRpb25zLgorKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysgICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgYW55IGxhdGVyIHZlcnNpb24uCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisrCisrI2lmZGVmIEhBVkVfQ09ORklHX0gKKysjIGluY2x1ZGUgPGNvbmZpZy5oPgorKyNlbmRpZgorKworKyNpZmRlZiBfX0dOVUNfXworKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisrIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorKyNlbHNlCisrIyBpZmRlZiBfTVNDX1ZFUgorKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorKyMgZWxzZQorKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisrIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorKyMgIGVsc2UKKysjICAgaWZkZWYgX0FJWAorKyAjcHJhZ21hIGFsbG9jYQorKyMgICBlbHNlCisrIyAgICBpZm5kZWYgYWxsb2NhCisrY2hhciAqYWxsb2NhICgpOworKyMgICAgZW5kaWYKKysjICAgZW5kaWYKKysjICBlbmRpZgorKyMgZW5kaWYKKysjZW5kaWYKKysKKysjaW5jbHVkZSA8c3RkaW8uaD4KKysKKysjaWYgIUhBVkVfUE9TSVhfUFJJTlRGCisrCisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxzdHJpbmcuaD4KKysKKysvKiBXaGVuIGJ1aWxkaW5nIGEgRExMLCB3ZSBtdXN0IGV4cG9ydCBzb21lIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBiZWNhdXNlCisrICAgdGhlIGZ1bmN0aW9ucyBhcmUgb25seSBkZWZpbmVkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UKKysgICBkb24ndCBuZWVkIHRvIHVzZSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW4gYW55IGNhc2UuICAqLworKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIEJVSUxESU5HX0RMTAorKyMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKysjZWxzZQorKyMgZGVmaW5lIERMTF9FWFBPUlRFRAorKyNlbmRpZgorKworKyNkZWZpbmUgU1RBVElDIHN0YXRpYworKworKy8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJwcmludGYtYXJncy5oIi4gICovCisrI2luY2x1ZGUgInByaW50Zi1hcmdzLmMiCisrCisrLyogRGVmaW5lIGF1eGlsaWFyeSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInByaW50Zi1wYXJzZS5oIi4gICovCisrI2luY2x1ZGUgInByaW50Zi1wYXJzZS5jIgorKworKy8qIERlZmluZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInZhc25wcmludGYuaCIuICAqLworKyNkZWZpbmUgdmFzbnByaW50ZiBsaWJpbnRsX3Zhc25wcmludGYKKysjaW5jbHVkZSAidmFzbnByaW50Zi5jIgorKyNpZiAwIC8qIG5vdCBuZWVkZWQgKi8KKysjZGVmaW5lIGFzbnByaW50ZiBsaWJpbnRsX2FzbnByaW50ZgorKyNpbmNsdWRlICJhc25wcmludGYuYyIKKysjZW5kaWYKKysKKytETExfRVhQT1JURUQKKytpbnQKKytsaWJpbnRsX3ZmcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorK3sKKysgIGlmIChzdHJjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQorKyAgICByZXR1cm4gdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKysgIGVsc2UKKysgICAgeworKyAgICAgIHNpemVfdCBsZW5ndGg7CisrICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChOVUxMLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworKyAgICAgIGludCByZXR2YWwgPSAtMTsKKysgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisrCXsKKysJICBpZiAoZndyaXRlIChyZXN1bHQsIDEsIGxlbmd0aCwgc3RyZWFtKSA9PSBsZW5ndGgpCisrCSAgICByZXR2YWwgPSBsZW5ndGg7CisrCSAgZnJlZSAocmVzdWx0KTsKKysJfQorKyAgICAgIHJldHVybiByZXR2YWw7CisrICAgIH0KKyt9CisrCisrRExMX0VYUE9SVEVECisraW50CisrbGliaW50bF9mcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorK3sKKysgIHZhX2xpc3QgYXJnczsKKysgIGludCByZXR2YWw7CisrCisrICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKysgIHJldHZhbCA9IGxpYmludGxfdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKysgIHZhX2VuZCAoYXJncyk7CisrICByZXR1cm4gcmV0dmFsOworK30KKysKKytETExfRVhQT1JURUQKKytpbnQKKytsaWJpbnRsX3ZwcmludGYgKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorK3sKKysgIHJldHVybiBsaWJpbnRsX3ZmcHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXJncyk7CisrfQorKworK0RMTF9FWFBPUlRFRAorK2ludAorK2xpYmludGxfcHJpbnRmIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyt7CisrICB2YV9saXN0IGFyZ3M7CisrICBpbnQgcmV0dmFsOworKworKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisrICByZXR2YWwgPSBsaWJpbnRsX3ZwcmludGYgKGZvcm1hdCwgYXJncyk7CisrICB2YV9lbmQgKGFyZ3MpOworKyAgcmV0dXJuIHJldHZhbDsKKyt9CisrCisrRExMX0VYUE9SVEVECisraW50CisrbGliaW50bF92c3ByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKKyt7CisrICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKKysgICAgcmV0dXJuIHZzcHJpbnRmIChyZXN1bHRidWYsIGZvcm1hdCwgYXJncyk7CisrICBlbHNlCisrICAgIHsKKysgICAgICBzaXplX3QgbGVuZ3RoID0gKHNpemVfdCkgfjAgLyAoNCAqIHNpemVvZiAoY2hhcikpOworKyAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworKyAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQorKwl7CisrCSAgZnJlZSAocmVzdWx0KTsKKysJICByZXR1cm4gLTE7CisrCX0KKysgICAgICBlbHNlCisrCXJldHVybiBsZW5ndGg7CisrICAgIH0KKyt9CisrCisrRExMX0VYUE9SVEVECisraW50CisrbGliaW50bF9zcHJpbnRmIChjaGFyICpyZXN1bHRidWYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorK3sKKysgIHZhX2xpc3QgYXJnczsKKysgIGludCByZXR2YWw7CisrCisrICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKysgIHJldHZhbCA9IGxpYmludGxfdnNwcmludGYgKHJlc3VsdGJ1ZiwgZm9ybWF0LCBhcmdzKTsKKysgIHZhX2VuZCAoYXJncyk7CisrICByZXR1cm4gcmV0dmFsOworK30KKysKKysjaWYgSEFWRV9TTlBSSU5URgorKworKyMgaWYgSEFWRV9ERUNMX19TTlBSSU5URgorKyAgIC8qIFdpbmRvd3MuICAqLworKyMgIGRlZmluZSBzeXN0ZW1fdnNucHJpbnRmIF92c25wcmludGYKKysjIGVsc2UKKysgICAvKiBVbml4LiAgKi8KKysjICBkZWZpbmUgc3lzdGVtX3ZzbnByaW50ZiB2c25wcmludGYKKysjIGVuZGlmCisrCisrRExMX0VYUE9SVEVECisraW50CisrbGliaW50bF92c25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCisreworKyAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisrICAgIHJldHVybiBzeXN0ZW1fdnNucHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKysgIGVsc2UKKysgICAgeworKyAgICAgIHNpemVfdCBtYXhsZW5ndGggPSBsZW5ndGg7CisrICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChyZXN1bHRidWYsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisrICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCisrCXsKKysJICBpZiAobWF4bGVuZ3RoID4gMCkKKysJICAgIHsKKysJICAgICAgaWYgKGxlbmd0aCA8IG1heGxlbmd0aCkKKysJCWFib3J0ICgpOworKwkgICAgICBtZW1jcHkgKHJlc3VsdGJ1ZiwgcmVzdWx0LCBtYXhsZW5ndGggLSAxKTsKKysJICAgICAgcmVzdWx0YnVmW21heGxlbmd0aCAtIDFdID0gJ1wwJzsKKysJICAgIH0KKysJICBmcmVlIChyZXN1bHQpOworKwkgIHJldHVybiAtMTsKKysJfQorKyAgICAgIGVsc2UKKysJcmV0dXJuIGxlbmd0aDsKKysgICAgfQorK30KKysKKytETExfRVhQT1JURUQKKytpbnQKKytsaWJpbnRsX3NucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorK3sKKysgIHZhX2xpc3QgYXJnczsKKysgIGludCByZXR2YWw7CisrCisrICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKysgIHJldHZhbCA9IGxpYmludGxfdnNucHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKysgIHZhX2VuZCAoYXJncyk7CisrICByZXR1cm4gcmV0dmFsOworK30KKysKKysjZW5kaWYKKysKKysjaWYgSEFWRV9BU1BSSU5URgorKworK0RMTF9FWFBPUlRFRAorK2ludAorK2xpYmludGxfdmFzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCisreworKyAgc2l6ZV90IGxlbmd0aDsKKysgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKysgIGlmIChyZXN1bHQgPT0gTlVMTCkKKysgICAgcmV0dXJuIC0xOworKyAgKnJlc3VsdHAgPSByZXN1bHQ7CisrICByZXR1cm4gbGVuZ3RoOworK30KKysKKytETExfRVhQT1JURUQKKytpbnQKKytsaWJpbnRsX2FzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisreworKyAgdmFfbGlzdCBhcmdzOworKyAgaW50IHJldHZhbDsKKysKKysgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworKyAgcmV0dmFsID0gbGliaW50bF92YXNwcmludGYgKHJlc3VsdHAsIGZvcm1hdCwgYXJncyk7CisrICB2YV9lbmQgKGFyZ3MpOworKyAgcmV0dXJuIHJldHZhbDsKKyt9CisrCisrI2VuZGlmCisrCisrI2lmIEhBVkVfRldQUklOVEYKKysKKysjaW5jbHVkZSA8d2NoYXIuaD4KKysKKysjZGVmaW5lIFdJREVfQ0hBUl9WRVJTSU9OIDEKKysKKysvKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAid3ByaW50Zi1wYXJzZS5oIi4gICovCisrI2luY2x1ZGUgInByaW50Zi1wYXJzZS5jIgorKworKy8qIERlZmluZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInZhc25wcmludGYuaCIuICAqLworKyNkZWZpbmUgdmFzbndwcmludGYgbGliaW50bF92YXNud3ByaW50ZgorKyNpbmNsdWRlICJ2YXNucHJpbnRmLmMiCisrI2lmIDAgLyogbm90IG5lZWRlZCAqLworKyNkZWZpbmUgYXNud3ByaW50ZiBsaWJpbnRsX2FzbndwcmludGYKKysjaW5jbHVkZSAiYXNucHJpbnRmLmMiCisrI2VuZGlmCisrCisrIyBpZiBIQVZFX0RFQ0xfX1NOV1BSSU5URgorKyAgIC8qIFdpbmRvd3MuICAqLworKyMgIGRlZmluZSBzeXN0ZW1fdnN3cHJpbnRmIF92c253cHJpbnRmCisrIyBlbHNlCisrICAgLyogVW5peC4gICovCisrIyAgZGVmaW5lIHN5c3RlbV92c3dwcmludGYgdnN3cHJpbnRmCisrIyBlbmRpZgorKworK0RMTF9FWFBPUlRFRAorK2ludAorK2xpYmludGxfdmZ3cHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorK3sKKysgIGlmICh3Y3NjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQorKyAgICByZXR1cm4gdmZ3cHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7CisrICBlbHNlCisrICAgIHsKKysgICAgICBzaXplX3QgbGVuZ3RoOworKyAgICAgIHdjaGFyX3QgKnJlc3VsdCA9IGxpYmludGxfdmFzbndwcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisrICAgICAgaW50IHJldHZhbCA9IC0xOworKyAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKKysJeworKwkgIHNpemVfdCBpOworKwkgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKysJICAgIGlmIChmcHV0d2MgKHJlc3VsdFtpXSwgc3RyZWFtKSA9PSBXRU9GKQorKwkgICAgICBicmVhazsKKysJICBpZiAoaSA9PSBsZW5ndGgpCisrCSAgICByZXR2YWwgPSBsZW5ndGg7CisrCSAgZnJlZSAocmVzdWx0KTsKKysJfQorKyAgICAgIHJldHVybiByZXR2YWw7CisrICAgIH0KKyt9CisrCisrRExMX0VYUE9SVEVECisraW50CisrbGliaW50bF9md3ByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKKyt7CisrICB2YV9saXN0IGFyZ3M7CisrICBpbnQgcmV0dmFsOworKworKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisrICByZXR2YWwgPSBsaWJpbnRsX3Zmd3ByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOworKyAgdmFfZW5kIChhcmdzKTsKKysgIHJldHVybiByZXR2YWw7CisrfQorKworK0RMTF9FWFBPUlRFRAorK2ludAorK2xpYmludGxfdndwcmludGYgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorK3sKKysgIHJldHVybiBsaWJpbnRsX3Zmd3ByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOworK30KKysKKytETExfRVhQT1JURUQKKytpbnQKKytsaWJpbnRsX3dwcmludGYgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQorK3sKKysgIHZhX2xpc3QgYXJnczsKKysgIGludCByZXR2YWw7CisrCisrICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKysgIHJldHZhbCA9IGxpYmludGxfdndwcmludGYgKGZvcm1hdCwgYXJncyk7CisrICB2YV9lbmQgKGFyZ3MpOworKyAgcmV0dXJuIHJldHZhbDsKKyt9CisrCisrRExMX0VYUE9SVEVECisraW50CisrbGliaW50bF92c3dwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCisreworKyAgaWYgKHdjc2NociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisrICAgIHJldHVybiBzeXN0ZW1fdnN3cHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKysgIGVsc2UKKysgICAgeworKyAgICAgIHNpemVfdCBtYXhsZW5ndGggPSBsZW5ndGg7CisrICAgICAgd2NoYXJfdCAqcmVzdWx0ID0gbGliaW50bF92YXNud3ByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworKyAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQorKwl7CisrCSAgaWYgKG1heGxlbmd0aCA+IDApCisrCSAgICB7CisrCSAgICAgIGlmIChsZW5ndGggPCBtYXhsZW5ndGgpCisrCQlhYm9ydCAoKTsKKysJICAgICAgbWVtY3B5IChyZXN1bHRidWYsIHJlc3VsdCwgKG1heGxlbmd0aCAtIDEpICogc2l6ZW9mICh3Y2hhcl90KSk7CisrCSAgICAgIHJlc3VsdGJ1ZlttYXhsZW5ndGggLSAxXSA9IDA7CisrCSAgICB9CisrCSAgZnJlZSAocmVzdWx0KTsKKysJICByZXR1cm4gLTE7CisrCX0KKysgICAgICBlbHNlCisrCXJldHVybiBsZW5ndGg7CisrICAgIH0KKyt9CisrCisrRExMX0VYUE9SVEVECisraW50CisrbGliaW50bF9zd3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKKyt7CisrICB2YV9saXN0IGFyZ3M7CisrICBpbnQgcmV0dmFsOworKworKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisrICByZXR2YWwgPSBsaWJpbnRsX3Zzd3ByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisrICB2YV9lbmQgKGFyZ3MpOworKyAgcmV0dXJuIHJldHZhbDsKKyt9CisrCisrI2VuZGlmCisrCisrI2VuZGlmCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcHJpbnRmLXBhcnNlLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvcHJpbnRmLXBhcnNlLmMJMjAwNC0wOS0xMiAxNDo0MDozNC42MjI3MDc1MDQgLTA0MDAKK0BAIC0wLDAgKzEsNTM3IEBACisrLyogRm9ybWF0dGVkIG91dHB1dCB0byBzdHJpbmdzLgorKyAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAwLCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrIyBpbmNsdWRlIDxjb25maWcuaD4KKysjZW5kaWYKKysKKysvKiBTcGVjaWZpY2F0aW9uLiAgKi8KKysjaWYgV0lERV9DSEFSX1ZFUlNJT04KKysjIGluY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKKysjZWxzZQorKyMgaW5jbHVkZSAicHJpbnRmLXBhcnNlLmgiCisrI2VuZGlmCisrCisrLyogR2V0IHNpemVfdCwgTlVMTC4gICovCisrI2luY2x1ZGUgPHN0ZGRlZi5oPgorKworKy8qIEdldCBpbnRtYXhfdC4gICovCisrI2lmIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYCisrIyBpbmNsdWRlIDxzdGRpbnQuaD4KKysjZW5kaWYKKysjaWYgSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWAorKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKysjZW5kaWYKKysKKysvKiBtYWxsb2MoKSwgcmVhbGxvYygpLCBmcmVlKCkuICAqLworKyNpbmNsdWRlIDxzdGRsaWIuaD4KKysKKysvKiBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuICAqLworKyNpbmNsdWRlICJ4c2l6ZS5oIgorKworKyNpZiBXSURFX0NIQVJfVkVSU0lPTgorKyMgZGVmaW5lIFBSSU5URl9QQVJTRSB3cHJpbnRmX3BhcnNlCisrIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKKysjIGRlZmluZSBESVJFQ1RJVkUgd2NoYXJfdF9kaXJlY3RpdmUKKysjIGRlZmluZSBESVJFQ1RJVkVTIHdjaGFyX3RfZGlyZWN0aXZlcworKyNlbHNlCisrIyBkZWZpbmUgUFJJTlRGX1BBUlNFIHByaW50Zl9wYXJzZQorKyMgZGVmaW5lIENIQVJfVCBjaGFyCisrIyBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCisrIyBkZWZpbmUgRElSRUNUSVZFUyBjaGFyX2RpcmVjdGl2ZXMKKysjZW5kaWYKKysKKysjaWZkZWYgU1RBVElDCisrU1RBVElDCisrI2VuZGlmCisraW50CisrUFJJTlRGX1BBUlNFIChjb25zdCBDSEFSX1QgKmZvcm1hdCwgRElSRUNUSVZFUyAqZCwgYXJndW1lbnRzICphKQorK3sKKysgIGNvbnN0IENIQVJfVCAqY3AgPSBmb3JtYXQ7CQkvKiBwb2ludGVyIGludG8gZm9ybWF0ICovCisrICBzaXplX3QgYXJnX3Bvc24gPSAwOwkJLyogbnVtYmVyIG9mIHJlZ3VsYXIgYXJndW1lbnRzIGNvbnN1bWVkICovCisrICBzaXplX3QgZF9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGQtPmRpciAqLworKyAgc2l6ZV90IGFfYWxsb2NhdGVkOwkJCS8qIGFsbG9jYXRlZCBlbGVtZW50cyBvZiBhLT5hcmcgKi8KKysgIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoID0gMDsKKysgIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IDA7CisrCisrICBkLT5jb3VudCA9IDA7CisrICBkX2FsbG9jYXRlZCA9IDE7CisrICBkLT5kaXIgPSBtYWxsb2MgKGRfYWxsb2NhdGVkICogc2l6ZW9mIChESVJFQ1RJVkUpKTsKKysgIGlmIChkLT5kaXIgPT0gTlVMTCkKKysgICAgLyogT3V0IG9mIG1lbW9yeS4gICovCisrICAgIHJldHVybiAtMTsKKysKKysgIGEtPmNvdW50ID0gMDsKKysgIGFfYWxsb2NhdGVkID0gMDsKKysgIGEtPmFyZyA9IE5VTEw7CisrCisrI2RlZmluZSBSRUdJU1RFUl9BUkcoX2luZGV4XyxfdHlwZV8pIFwKKysgIHsJCQkJCQkJCQlcCisrICAgIHNpemVfdCBuID0gKF9pbmRleF8pOwkJCQkJCVwKKysgICAgaWYgKG4gPj0gYV9hbGxvY2F0ZWQpCQkJCQkJXAorKyAgICAgIHsJCQkJCQkJCQlcCisrCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQlcCisrCWFyZ3VtZW50ICptZW1vcnk7CQkJCQkJXAorKwkJCQkJCQkJCVwKKysJYV9hbGxvY2F0ZWQgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCAyKTsJCQkJXAorKwlpZiAoYV9hbGxvY2F0ZWQgPD0gbikJCQkJCQlcCisrCSAgYV9hbGxvY2F0ZWQgPSB4c3VtIChuLCAxKTsJCQkJCVwKKysJbWVtb3J5X3NpemUgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCBzaXplb2YgKGFyZ3VtZW50KSk7CQlcCisrCWlmIChzaXplX292ZXJmbG93X3AgKG1lbW9yeV9zaXplKSkJCQkJXAorKwkgIC8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLwkJCVwKKysJICBnb3RvIGVycm9yOwkJCQkJCQlcCisrCW1lbW9yeSA9IChhLT5hcmcJCQkJCQlcCisrCQkgID8gcmVhbGxvYyAoYS0+YXJnLCBtZW1vcnlfc2l6ZSkJCQlcCisrCQkgIDogbWFsbG9jIChtZW1vcnlfc2l6ZSkpOwkJCQlcCisrCWlmIChtZW1vcnkgPT0gTlVMTCkJCQkJCQlcCisrCSAgLyogT3V0IG9mIG1lbW9yeS4gICovCQkJCQkJXAorKwkgIGdvdG8gZXJyb3I7CQkJCQkJCVwKKysJYS0+YXJnID0gbWVtb3J5OwkJCQkJCVwKKysgICAgICB9CQkJCQkJCQkJXAorKyAgICB3aGlsZSAoYS0+Y291bnQgPD0gbikJCQkJCQlcCisrICAgICAgYS0+YXJnW2EtPmNvdW50KytdLnR5cGUgPSBUWVBFX05PTkU7CQkJCVwKKysgICAgaWYgKGEtPmFyZ1tuXS50eXBlID09IFRZUEVfTk9ORSkJCQkJCVwKKysgICAgICBhLT5hcmdbbl0udHlwZSA9IChfdHlwZV8pOwkJCQkJXAorKyAgICBlbHNlIGlmIChhLT5hcmdbbl0udHlwZSAhPSAoX3R5cGVfKSkJCQkJXAorKyAgICAgIC8qIEFtYmlndW91cyB0eXBlIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8JCQlcCisrICAgICAgZ290byBlcnJvcjsJCQkJCQkJXAorKyAgfQorKworKyAgd2hpbGUgKCpjcCAhPSAnXDAnKQorKyAgICB7CisrICAgICAgQ0hBUl9UIGMgPSAqY3ArKzsKKysgICAgICBpZiAoYyA9PSAnJScpCisrCXsKKysJICBzaXplX3QgYXJnX2luZGV4ID0gQVJHX05PTkU7CisrCSAgRElSRUNUSVZFICpkcCA9ICZkLT5kaXJbZC0+Y291bnRdOy8qIHBvaW50ZXIgdG8gbmV4dCBkaXJlY3RpdmUgKi8KKysKKysJICAvKiBJbml0aWFsaXplIHRoZSBuZXh0IGRpcmVjdGl2ZS4gICovCisrCSAgZHAtPmRpcl9zdGFydCA9IGNwIC0gMTsKKysJICBkcC0+ZmxhZ3MgPSAwOworKwkgIGRwLT53aWR0aF9zdGFydCA9IE5VTEw7CisrCSAgZHAtPndpZHRoX2VuZCA9IE5VTEw7CisrCSAgZHAtPndpZHRoX2FyZ19pbmRleCA9IEFSR19OT05FOworKwkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBOVUxMOworKwkgIGRwLT5wcmVjaXNpb25fZW5kID0gTlVMTDsKKysJICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IEFSR19OT05FOworKwkgIGRwLT5hcmdfaW5kZXggPSBBUkdfTk9ORTsKKysKKysJICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KKysJICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQorKwkgICAgeworKwkgICAgICBjb25zdCBDSEFSX1QgKm5wOworKworKwkgICAgICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKysJCTsKKysJICAgICAgaWYgKCpucCA9PSAnJCcpCisrCQl7CisrCQkgIHNpemVfdCBuID0gMDsKKysKKysJCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisrCQkgICAgbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOworKwkJICBpZiAobiA9PSAwKQorKwkJICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCisrCQkgICAgZ290byBlcnJvcjsKKysJCSAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCisrCQkgICAgLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeSBsYXRlci4gICovCisrCQkgICAgZ290byBlcnJvcjsKKysJCSAgYXJnX2luZGV4ID0gbiAtIDE7CisrCQkgIGNwID0gbnAgKyAxOworKwkJfQorKwkgICAgfQorKworKwkgIC8qIFJlYWQgdGhlIGZsYWdzLiAgKi8KKysJICBmb3IgKDs7KQorKwkgICAgeworKwkgICAgICBpZiAoKmNwID09ICdcJycpCisrCQl7CisrCQkgIGRwLT5mbGFncyB8PSBGTEFHX0dST1VQOworKwkJICBjcCsrOworKwkJfQorKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJy0nKQorKwkJeworKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19MRUZUOworKwkJICBjcCsrOworKwkJfQorKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJysnKQorKwkJeworKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19TSE9XU0lHTjsKKysJCSAgY3ArKzsKKysJCX0KKysJICAgICAgZWxzZSBpZiAoKmNwID09ICcgJykKKysJCXsKKysJCSAgZHAtPmZsYWdzIHw9IEZMQUdfU1BBQ0U7CisrCQkgIGNwKys7CisrCQl9CisrCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnIycpCisrCQl7CisrCQkgIGRwLT5mbGFncyB8PSBGTEFHX0FMVDsKKysJCSAgY3ArKzsKKysJCX0KKysJICAgICAgZWxzZSBpZiAoKmNwID09ICcwJykKKysJCXsKKysJCSAgZHAtPmZsYWdzIHw9IEZMQUdfWkVSTzsKKysJCSAgY3ArKzsKKysJCX0KKysJICAgICAgZWxzZQorKwkJYnJlYWs7CisrCSAgICB9CisrCisrCSAgLyogUGFyc2UgdGhlIGZpZWxkIHdpZHRoLiAgKi8KKysJICBpZiAoKmNwID09ICcqJykKKysJICAgIHsKKysJICAgICAgZHAtPndpZHRoX3N0YXJ0ID0gY3A7CisrCSAgICAgIGNwKys7CisrCSAgICAgIGRwLT53aWR0aF9lbmQgPSBjcDsKKysJICAgICAgaWYgKG1heF93aWR0aF9sZW5ndGggPCAxKQorKwkJbWF4X3dpZHRoX2xlbmd0aCA9IDE7CisrCisrCSAgICAgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLworKwkgICAgICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQorKwkJeworKwkJICBjb25zdCBDSEFSX1QgKm5wOworKworKwkJICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKysJCSAgICA7CisrCQkgIGlmICgqbnAgPT0gJyQnKQorKwkJICAgIHsKKysJCSAgICAgIHNpemVfdCBuID0gMDsKKysKKysJCSAgICAgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorKwkJCW4gPSB4c3VtICh4dGltZXMgKG4sIDEwKSwgKm5wIC0gJzAnKTsKKysJCSAgICAgIGlmIChuID09IDApCisrCQkJLyogUG9zaXRpb25hbCBhcmd1bWVudCAwLiAgKi8KKysJCQlnb3RvIGVycm9yOworKwkJICAgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCisrCQkJLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeSBsYXRlci4gICovCisrCQkJZ290byBlcnJvcjsKKysJCSAgICAgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBuIC0gMTsKKysJCSAgICAgIGNwID0gbnAgKyAxOworKwkJICAgIH0KKysJCX0KKysJICAgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggPT0gQVJHX05PTkUpCisrCQl7CisrCQkgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBhcmdfcG9zbisrOworKwkJICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKKysJCSAgICAvKiBhcmdfcG9zbiB3cmFwcGVkIGFyb3VuZC4gICovCisrCQkgICAgZ290byBlcnJvcjsKKysJCX0KKysJICAgICAgUkVHSVNURVJfQVJHIChkcC0+d2lkdGhfYXJnX2luZGV4LCBUWVBFX0lOVCk7CisrCSAgICB9CisrCSAgZWxzZSBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQorKwkgICAgeworKwkgICAgICBzaXplX3Qgd2lkdGhfbGVuZ3RoOworKworKwkgICAgICBkcC0+d2lkdGhfc3RhcnQgPSBjcDsKKysJICAgICAgZm9yICg7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKKysJCTsKKysJICAgICAgZHAtPndpZHRoX2VuZCA9IGNwOworKwkgICAgICB3aWR0aF9sZW5ndGggPSBkcC0+d2lkdGhfZW5kIC0gZHAtPndpZHRoX3N0YXJ0OworKwkgICAgICBpZiAobWF4X3dpZHRoX2xlbmd0aCA8IHdpZHRoX2xlbmd0aCkKKysJCW1heF93aWR0aF9sZW5ndGggPSB3aWR0aF9sZW5ndGg7CisrCSAgICB9CisrCisrCSAgLyogUGFyc2UgdGhlIHByZWNpc2lvbi4gICovCisrCSAgaWYgKCpjcCA9PSAnLicpCisrCSAgICB7CisrCSAgICAgIGNwKys7CisrCSAgICAgIGlmICgqY3AgPT0gJyonKQorKwkJeworKwkJICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gY3AgLSAxOworKwkJICBjcCsrOworKwkJICBkcC0+cHJlY2lzaW9uX2VuZCA9IGNwOworKwkJICBpZiAobWF4X3ByZWNpc2lvbl9sZW5ndGggPCAyKQorKwkJICAgIG1heF9wcmVjaXNpb25fbGVuZ3RoID0gMjsKKysKKysJCSAgLyogVGVzdCBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCisrCQkgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisrCQkgICAgeworKwkJICAgICAgY29uc3QgQ0hBUl9UICpucDsKKysKKysJCSAgICAgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorKwkJCTsKKysJCSAgICAgIGlmICgqbnAgPT0gJyQnKQorKwkJCXsKKysJCQkgIHNpemVfdCBuID0gMDsKKysKKysJCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorKwkJCSAgICBuID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7CisrCQkJICBpZiAobiA9PSAwKQorKwkJCSAgICAvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLworKwkJCSAgICBnb3RvIGVycm9yOworKwkJCSAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCisrCQkJICAgIC8qIG4gdG9vIGxhcmdlLCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkKKysJCQkgICAgICAgbGF0ZXIuICAqLworKwkJCSAgICBnb3RvIGVycm9yOworKwkJCSAgZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPSBuIC0gMTsKKysJCQkgIGNwID0gbnAgKyAxOworKwkJCX0KKysJCSAgICB9CisrCQkgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKKysJCSAgICB7CisrCQkgICAgICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IGFyZ19wb3NuKys7CisrCQkgICAgICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPT0gQVJHX05PTkUpCisrCQkJLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLworKwkJCWdvdG8gZXJyb3I7CisrCQkgICAgfQorKwkJICBSRUdJU1RFUl9BUkcgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4LCBUWVBFX0lOVCk7CisrCQl9CisrCSAgICAgIGVsc2UKKysJCXsKKysJCSAgc2l6ZV90IHByZWNpc2lvbl9sZW5ndGg7CisrCisrCQkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBjcCAtIDE7CisrCQkgIGZvciAoOyAqY3AgPj0gJzAnICYmICpjcCA8PSAnOSc7IGNwKyspCisrCQkgICAgOworKwkJICBkcC0+cHJlY2lzaW9uX2VuZCA9IGNwOworKwkJICBwcmVjaXNpb25fbGVuZ3RoID0gZHAtPnByZWNpc2lvbl9lbmQgLSBkcC0+cHJlY2lzaW9uX3N0YXJ0OworKwkJICBpZiAobWF4X3ByZWNpc2lvbl9sZW5ndGggPCBwcmVjaXNpb25fbGVuZ3RoKQorKwkJICAgIG1heF9wcmVjaXNpb25fbGVuZ3RoID0gcHJlY2lzaW9uX2xlbmd0aDsKKysJCX0KKysJICAgIH0KKysKKysJICB7CisrCSAgICBhcmdfdHlwZSB0eXBlOworKworKwkgICAgLyogUGFyc2UgYXJndW1lbnQgdHlwZS9zaXplIHNwZWNpZmllcnMuICAqLworKwkgICAgeworKwkgICAgICBpbnQgZmxhZ3MgPSAwOworKworKwkgICAgICBmb3IgKDs7KQorKwkJeworKwkJICBpZiAoKmNwID09ICdoJykKKysJCSAgICB7CisrCQkgICAgICBmbGFncyB8PSAoMSA8PCAoZmxhZ3MgJiAxKSk7CisrCQkgICAgICBjcCsrOworKwkJICAgIH0KKysJCSAgZWxzZSBpZiAoKmNwID09ICdMJykKKysJCSAgICB7CisrCQkgICAgICBmbGFncyB8PSA0OworKwkJICAgICAgY3ArKzsKKysJCSAgICB9CisrCQkgIGVsc2UgaWYgKCpjcCA9PSAnbCcpCisrCQkgICAgeworKwkJICAgICAgZmxhZ3MgKz0gODsKKysJCSAgICAgIGNwKys7CisrCQkgICAgfQorKyNpZmRlZiBIQVZFX0lOVE1BWF9UCisrCQkgIGVsc2UgaWYgKCpjcCA9PSAnaicpCisrCQkgICAgeworKwkJICAgICAgaWYgKHNpemVvZiAoaW50bWF4X3QpID4gc2l6ZW9mIChsb25nKSkKKysJCQl7CisrCQkJICAvKiBpbnRtYXhfdCA9IGxvbmcgbG9uZyAqLworKwkJCSAgZmxhZ3MgKz0gMTY7CisrCQkJfQorKwkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGludCkpCisrCQkJeworKwkJCSAgLyogaW50bWF4X3QgPSBsb25nICovCisrCQkJICBmbGFncyArPSA4OworKwkJCX0KKysJCSAgICAgIGNwKys7CisrCQkgICAgfQorKyNlbmRpZgorKwkJICBlbHNlIGlmICgqY3AgPT0gJ3onIHx8ICpjcCA9PSAnWicpCisrCQkgICAgeworKwkJICAgICAgLyogJ3onIGlzIHN0YW5kYXJkaXplZCBpbiBJU08gQyA5OSwgYnV0IGdsaWJjIHVzZXMgJ1onCisrCQkJIGJlY2F1c2UgdGhlIHdhcm5pbmcgZmFjaWxpdHkgaW4gZ2NjLTIuOTUuMiB1bmRlcnN0YW5kcworKwkJCSBvbmx5ICdaJyAoc2VlIGdjYy0yLjk1LjIvZ2NjL2MtY29tbW9uLmM6MTc4NCkuICAqLworKwkJICAgICAgaWYgKHNpemVvZiAoc2l6ZV90KSA+IHNpemVvZiAobG9uZykpCisrCQkJeworKwkJCSAgLyogc2l6ZV90ID0gbG9uZyBsb25nICovCisrCQkJICBmbGFncyArPSAxNjsKKysJCQl9CisrCQkgICAgICBlbHNlIGlmIChzaXplb2YgKHNpemVfdCkgPiBzaXplb2YgKGludCkpCisrCQkJeworKwkJCSAgLyogc2l6ZV90ID0gbG9uZyAqLworKwkJCSAgZmxhZ3MgKz0gODsKKysJCQl9CisrCQkgICAgICBjcCsrOworKwkJICAgIH0KKysJCSAgZWxzZSBpZiAoKmNwID09ICd0JykKKysJCSAgICB7CisrCQkgICAgICBpZiAoc2l6ZW9mIChwdHJkaWZmX3QpID4gc2l6ZW9mIChsb25nKSkKKysJCQl7CisrCQkJICAvKiBwdHJkaWZmX3QgPSBsb25nIGxvbmcgKi8KKysJCQkgIGZsYWdzICs9IDE2OworKwkJCX0KKysJCSAgICAgIGVsc2UgaWYgKHNpemVvZiAocHRyZGlmZl90KSA+IHNpemVvZiAoaW50KSkKKysJCQl7CisrCQkJICAvKiBwdHJkaWZmX3QgPSBsb25nICovCisrCQkJICBmbGFncyArPSA4OworKwkJCX0KKysJCSAgICAgIGNwKys7CisrCQkgICAgfQorKwkJICBlbHNlCisrCQkgICAgYnJlYWs7CisrCQl9CisrCisrCSAgICAgIC8qIFJlYWQgdGhlIGNvbnZlcnNpb24gY2hhcmFjdGVyLiAgKi8KKysJICAgICAgYyA9ICpjcCsrOworKwkgICAgICBzd2l0Y2ggKGMpCisrCQl7CisrCQljYXNlICdkJzogY2FzZSAnaSc6CisrI2lmZGVmIEhBVkVfTE9OR19MT05HCisrCQkgIGlmIChmbGFncyA+PSAxNiB8fCAoZmxhZ3MgJiA0KSkKKysJCSAgICB0eXBlID0gVFlQRV9MT05HTE9OR0lOVDsKKysJCSAgZWxzZQorKyNlbmRpZgorKwkJICBpZiAoZmxhZ3MgPj0gOCkKKysJCSAgICB0eXBlID0gVFlQRV9MT05HSU5UOworKwkJICBlbHNlIGlmIChmbGFncyAmIDIpCisrCQkgICAgdHlwZSA9IFRZUEVfU0NIQVI7CisrCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKKysJCSAgICB0eXBlID0gVFlQRV9TSE9SVDsKKysJCSAgZWxzZQorKwkJICAgIHR5cGUgPSBUWVBFX0lOVDsKKysJCSAgYnJlYWs7CisrCQljYXNlICdvJzogY2FzZSAndSc6IGNhc2UgJ3gnOiBjYXNlICdYJzoKKysjaWZkZWYgSEFWRV9MT05HX0xPTkcKKysJCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQorKwkJICAgIHR5cGUgPSBUWVBFX1VMT05HTE9OR0lOVDsKKysJCSAgZWxzZQorKyNlbmRpZgorKwkJICBpZiAoZmxhZ3MgPj0gOCkKKysJCSAgICB0eXBlID0gVFlQRV9VTE9OR0lOVDsKKysJCSAgZWxzZSBpZiAoZmxhZ3MgJiAyKQorKwkJICAgIHR5cGUgPSBUWVBFX1VDSEFSOworKwkJICBlbHNlIGlmIChmbGFncyAmIDEpCisrCQkgICAgdHlwZSA9IFRZUEVfVVNIT1JUOworKwkJICBlbHNlCisrCQkgICAgdHlwZSA9IFRZUEVfVUlOVDsKKysJCSAgYnJlYWs7CisrCQljYXNlICdmJzogY2FzZSAnRic6IGNhc2UgJ2UnOiBjYXNlICdFJzogY2FzZSAnZyc6IGNhc2UgJ0cnOgorKwkJY2FzZSAnYSc6IGNhc2UgJ0EnOgorKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisrCQkgIGlmIChmbGFncyA+PSAxNiB8fCAoZmxhZ3MgJiA0KSkKKysJCSAgICB0eXBlID0gVFlQRV9MT05HRE9VQkxFOworKwkJICBlbHNlCisrI2VuZGlmCisrCQkgIHR5cGUgPSBUWVBFX0RPVUJMRTsKKysJCSAgYnJlYWs7CisrCQljYXNlICdjJzoKKysJCSAgaWYgKGZsYWdzID49IDgpCisrI2lmZGVmIEhBVkVfV0lOVF9UCisrCQkgICAgdHlwZSA9IFRZUEVfV0lERV9DSEFSOworKyNlbHNlCisrCQkgICAgZ290byBlcnJvcjsKKysjZW5kaWYKKysJCSAgZWxzZQorKwkJICAgIHR5cGUgPSBUWVBFX0NIQVI7CisrCQkgIGJyZWFrOworKyNpZmRlZiBIQVZFX1dJTlRfVAorKwkJY2FzZSAnQyc6CisrCQkgIHR5cGUgPSBUWVBFX1dJREVfQ0hBUjsKKysJCSAgYyA9ICdjJzsKKysJCSAgYnJlYWs7CisrI2VuZGlmCisrCQljYXNlICdzJzoKKysJCSAgaWYgKGZsYWdzID49IDgpCisrI2lmZGVmIEhBVkVfV0NIQVJfVAorKwkJICAgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOworKyNlbHNlCisrCQkgICAgZ290byBlcnJvcjsKKysjZW5kaWYKKysJCSAgZWxzZQorKwkJICAgIHR5cGUgPSBUWVBFX1NUUklORzsKKysJCSAgYnJlYWs7CisrI2lmZGVmIEhBVkVfV0NIQVJfVAorKwkJY2FzZSAnUyc6CisrCQkgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOworKwkJICBjID0gJ3MnOworKwkJICBicmVhazsKKysjZW5kaWYKKysJCWNhc2UgJ3AnOgorKwkJICB0eXBlID0gVFlQRV9QT0lOVEVSOworKwkJICBicmVhazsKKysJCWNhc2UgJ24nOgorKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworKwkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCisrCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUjsKKysJCSAgZWxzZQorKyNlbmRpZgorKwkJICBpZiAoZmxhZ3MgPj0gOCkKKysJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVI7CisrCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKKysJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOworKwkJICBlbHNlIGlmIChmbGFncyAmIDEpCisrCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjsKKysJCSAgZWxzZQorKwkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSOworKwkJICBicmVhazsKKysJCWNhc2UgJyUnOgorKwkJICB0eXBlID0gVFlQRV9OT05FOworKwkJICBicmVhazsKKysJCWRlZmF1bHQ6CisrCQkgIC8qIFVua25vd24gY29udmVyc2lvbiBjaGFyYWN0ZXIuICAqLworKwkJICBnb3RvIGVycm9yOworKwkJfQorKwkgICAgfQorKworKwkgICAgaWYgKHR5cGUgIT0gVFlQRV9OT05FKQorKwkgICAgICB7CisrCQlkcC0+YXJnX2luZGV4ID0gYXJnX2luZGV4OworKwkJaWYgKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpCisrCQkgIHsKKysJCSAgICBkcC0+YXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKKysJCSAgICBpZiAoZHAtPmFyZ19pbmRleCA9PSBBUkdfTk9ORSkKKysJCSAgICAgIC8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KKysJCSAgICAgIGdvdG8gZXJyb3I7CisrCQkgIH0KKysJCVJFR0lTVEVSX0FSRyAoZHAtPmFyZ19pbmRleCwgdHlwZSk7CisrCSAgICAgIH0KKysJICAgIGRwLT5jb252ZXJzaW9uID0gYzsKKysJICAgIGRwLT5kaXJfZW5kID0gY3A7CisrCSAgfQorKworKwkgIGQtPmNvdW50Kys7CisrCSAgaWYgKGQtPmNvdW50ID49IGRfYWxsb2NhdGVkKQorKwkgICAgeworKwkgICAgICBzaXplX3QgbWVtb3J5X3NpemU7CisrCSAgICAgIERJUkVDVElWRSAqbWVtb3J5OworKworKwkgICAgICBkX2FsbG9jYXRlZCA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIDIpOworKwkgICAgICBtZW1vcnlfc2l6ZSA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIHNpemVvZiAoRElSRUNUSVZFKSk7CisrCSAgICAgIGlmIChzaXplX292ZXJmbG93X3AgKG1lbW9yeV9zaXplKSkKKysJCS8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLworKwkJZ290byBlcnJvcjsKKysJICAgICAgbWVtb3J5ID0gcmVhbGxvYyAoZC0+ZGlyLCBtZW1vcnlfc2l6ZSk7CisrCSAgICAgIGlmIChtZW1vcnkgPT0gTlVMTCkKKysJCS8qIE91dCBvZiBtZW1vcnkuICAqLworKwkJZ290byBlcnJvcjsKKysJICAgICAgZC0+ZGlyID0gbWVtb3J5OworKwkgICAgfQorKwl9CisrICAgIH0KKysgIGQtPmRpcltkLT5jb3VudF0uZGlyX3N0YXJ0ID0gY3A7CisrCisrICBkLT5tYXhfd2lkdGhfbGVuZ3RoID0gbWF4X3dpZHRoX2xlbmd0aDsKKysgIGQtPm1heF9wcmVjaXNpb25fbGVuZ3RoID0gbWF4X3ByZWNpc2lvbl9sZW5ndGg7CisrICByZXR1cm4gMDsKKysKKytlcnJvcjoKKysgIGlmIChhLT5hcmcpCisrICAgIGZyZWUgKGEtPmFyZyk7CisrICBpZiAoZC0+ZGlyKQorKyAgICBmcmVlIChkLT5kaXIpOworKyAgcmV0dXJuIC0xOworK30KKysKKysjdW5kZWYgRElSRUNUSVZFUworKyN1bmRlZiBESVJFQ1RJVkUKKysjdW5kZWYgQ0hBUl9UCisrI3VuZGVmIFBSSU5URl9QQVJTRQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3ByaW50Zi1wYXJzZS5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL3ByaW50Zi1wYXJzZS5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjI4NzA2NTkyIC0wNDAwCitAQCAtMCwwICsxLDc1IEBACisrLyogUGFyc2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisrICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKysgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKysgICBVU0EuICAqLworKworKyNpZm5kZWYgX1BSSU5URl9QQVJTRV9ICisrI2RlZmluZSBfUFJJTlRGX1BBUlNFX0gKKysKKysjaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKKysKKysKKysvKiBGbGFncyAqLworKyNkZWZpbmUgRkxBR19HUk9VUAkgMQkvKiAnIGZsYWcgKi8KKysjZGVmaW5lIEZMQUdfTEVGVAkgMgkvKiAtIGZsYWcgKi8KKysjZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCisrI2RlZmluZSBGTEFHX1NQQUNFCSA4CS8qIHNwYWNlIGZsYWcgKi8KKysjZGVmaW5lIEZMQUdfQUxUCTE2CS8qICMgZmxhZyAqLworKyNkZWZpbmUgRkxBR19aRVJPCTMyCisrCisrLyogYXJnX2luZGV4IHZhbHVlIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudCBpcyBjb25zdW1lZC4gICovCisrI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKKysKKysvKiBBIHBhcnNlZCBkaXJlY3RpdmUuICAqLworK3R5cGVkZWYgc3RydWN0CisreworKyAgY29uc3QgY2hhciogZGlyX3N0YXJ0OworKyAgY29uc3QgY2hhciogZGlyX2VuZDsKKysgIGludCBmbGFnczsKKysgIGNvbnN0IGNoYXIqIHdpZHRoX3N0YXJ0OworKyAgY29uc3QgY2hhciogd2lkdGhfZW5kOworKyAgc2l6ZV90IHdpZHRoX2FyZ19pbmRleDsKKysgIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9zdGFydDsKKysgIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9lbmQ7CisrICBzaXplX3QgcHJlY2lzaW9uX2FyZ19pbmRleDsKKysgIGNoYXIgY29udmVyc2lvbjsgLyogZCBpIG8gdSB4IFggZiBlIEUgZyBHIGMgcyBwIG4gVSAlIGJ1dCBub3QgQyBTICovCisrICBzaXplX3QgYXJnX2luZGV4OworK30KKytjaGFyX2RpcmVjdGl2ZTsKKysKKysvKiBBIHBhcnNlZCBmb3JtYXQgc3RyaW5nLiAgKi8KKyt0eXBlZGVmIHN0cnVjdAorK3sKKysgIHNpemVfdCBjb3VudDsKKysgIGNoYXJfZGlyZWN0aXZlICpkaXI7CisrICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKKysgIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKKyt9CisrY2hhcl9kaXJlY3RpdmVzOworKworKworKy8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKKysgICBpbiBkaXJlY3RpdmVzWzBdLCAuLi4sIGRpcmVjdGl2ZXNbTi0xXSwgYW5kIHNldHMgZGlyZWN0aXZlc1tOXS5kaXJfc3RhcnQKKysgICB0byB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgQWxzbyBmaWxscyBpbiB0aGUgYXJnX3R5cGUgZmllbGRzIG9mIHRoZQorKyAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLworKyNpZmRlZiBTVEFUSUMKKytTVEFUSUMKKysjZWxzZQorK2V4dGVybgorKyNlbmRpZgorK2ludCBwcmludGZfcGFyc2UgKGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhcl9kaXJlY3RpdmVzICpkLCBhcmd1bWVudHMgKmEpOworKworKyNlbmRpZiAvKiBfUFJJTlRGX1BBUlNFX0ggKi8KKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9yZWYtYWRkLnNpbgkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9yZWYtYWRkLnNpbgkyMDA0LTA5LTEyIDE0OjQwOjM0LjYzMzcwNTgzMiAtMDQwMAorQEAgLTAsMCArMSwzMSBAQAorKyMgQWRkIHRoaXMgcGFja2FnZSB0byBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBzdG9yZWQgaW4gYSB0ZXh0IGZpbGUuCisrIworKyMgICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrIworKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysjICAgYW55IGxhdGVyIHZlcnNpb24uCisrIworKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysjICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrIworKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyMgICBVU0EuCisrIworKyMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4uCisrIworKy9eIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IC8geworKyAgcy8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovLworKyAgdGEKKysgIDphCisrICBzLyBAUEFDS0FHRUAgLyBAUEFDS0FHRUAgLworKyAgdGIKKysgIHMvICQvIEBQQUNLQUdFQCAvCisrICA6YgorKyAgcy9eLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8KKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcmVmLWRlbC5zaW4JMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvcmVmLWRlbC5zaW4JMjAwNC0wOS0xMiAxNDo0MDozNC42Mzg3MDUwNzIgLTA0MDAKK0BAIC0wLDAgKzEsMjYgQEAKKysjIFJlbW92ZSB0aGlzIHBhY2thZ2UgZnJvbSBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBzdG9yZWQgaW4gYSB0ZXh0IGZpbGUuCisrIworKyMgICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrIworKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisrIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysjICAgYW55IGxhdGVyIHZlcnNpb24uCisrIworKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKysjICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrIworKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKyMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyMgICBVU0EuCisrIworKyMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4uCisrIworKy9eIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IC8geworKyAgcy8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovLworKyAgcy8gQFBBQ0tBR0VAIC8gLworKyAgcy9eLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8KKyt9CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcmVsb2NhdGFibGUuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC9yZWxvY2F0YWJsZS5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjQ0NzA0MTYwIC0wNDAwCitAQCAtMCwwICsxLDQ0OSBAQAorKy8qIFByb3ZpZGUgcmVsb2NhdGFibGUgcGFja2FnZXMuCisrICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysKKysvKiBUZWxsIGdsaWJjJ3MgPHN0ZGlvLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIGdldGxpbmUoKS4KKysgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKysgICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCisrI2lmbmRlZiBfR05VX1NPVVJDRQorKyMgZGVmaW5lIF9HTlVfU09VUkNFCTEKKysjZW5kaWYKKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSAiY29uZmlnLmgiCisrI2VuZGlmCisrCisrLyogU3BlY2lmaWNhdGlvbi4gICovCisrI2luY2x1ZGUgInJlbG9jYXRhYmxlLmgiCisrCisrI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQorKworKyNpbmNsdWRlIDxzdGRkZWYuaD4KKysjaW5jbHVkZSA8c3RkaW8uaD4KKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2luY2x1ZGUgPHN0cmluZy5oPgorKworKyNpZmRlZiBOT19YTUFMTE9DCisrIyBkZWZpbmUgeG1hbGxvYyBtYWxsb2MKKysjZWxzZQorKyMgaW5jbHVkZSAieGFsbG9jLmgiCisrI2VuZGlmCisrCisrI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCisrIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorKyMgaW5jbHVkZSA8d2luZG93cy5oPgorKyNlbmRpZgorKworKyNpZiBERVBFTkRTX09OX0xJQkNIQVJTRVQKKysjIGluY2x1ZGUgPGxpYmNoYXJzZXQuaD4KKysjZW5kaWYKKysjaWYgREVQRU5EU19PTl9MSUJJQ09OViAmJiBIQVZFX0lDT05WCisrIyBpbmNsdWRlIDxpY29udi5oPgorKyNlbmRpZgorKyNpZiBERVBFTkRTX09OX0xJQklOVEwgJiYgRU5BQkxFX05MUworKyMgaW5jbHVkZSA8bGliaW50bC5oPgorKyNlbmRpZgorKworKy8qIEZha2VkIGNoZWFwICdib29sJy4gICovCisrI3VuZGVmIGJvb2wKKysjdW5kZWYgZmFsc2UKKysjdW5kZWYgdHJ1ZQorKyNkZWZpbmUgYm9vbCBpbnQKKysjZGVmaW5lIGZhbHNlIDAKKysjZGVmaW5lIHRydWUgMQorKworKy8qIFBhdGhuYW1lIHN1cHBvcnQuCisrICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCisrICAgSVNfUEFUSF9XSVRIX0RJUihQKSAgdGVzdHMgd2hldGhlciBQIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24uCisrICovCisrI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCisrIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisrICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKKysgICAgICYmIChQKVsxXSA9PSAnOicpCisrIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSBcCisrICAgIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCB8fCBzdHJjaHIgKFAsICdcXCcpICE9IE5VTEwgfHwgSEFTX0RFVklDRSAoUCkpCisrIyBkZWZpbmUgRklMRVNZU1RFTV9QUkVGSVhfTEVOKFApIChIQVNfREVWSUNFIChQKSA/IDIgOiAwKQorKyNlbHNlCisrICAvKiBVbml4ICovCisrIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJykKKysjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKKysjIGRlZmluZSBGSUxFU1lTVEVNX1BSRUZJWF9MRU4oUCkgMAorKyNlbmRpZgorKworKy8qIE9yaWdpbmFsIGluc3RhbGxhdGlvbiBwcmVmaXguICAqLworK3N0YXRpYyBjaGFyICpvcmlnX3ByZWZpeDsKKytzdGF0aWMgc2l6ZV90IG9yaWdfcHJlZml4X2xlbjsKKysvKiBDdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXguICAqLworK3N0YXRpYyBjaGFyICpjdXJyX3ByZWZpeDsKKytzdGF0aWMgc2l6ZV90IGN1cnJfcHJlZml4X2xlbjsKKysvKiBUaGVzZSBwcmVmaXhlcyBkbyBub3QgZW5kIGluIGEgc2xhc2guICBBbnl0aGluZyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkCisrICAgdG8gdGhlbSBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaC4gICovCisrCisrLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhpcyBtb2R1bGUuCisrICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKysgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKysgICBpbnN0ZWFkIG9mICIvIikuICAqLworK3N0YXRpYyB2b2lkCisrc2V0X3RoaXNfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywKKysJCQkgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYXJnKQorK3sKKysgIGlmIChvcmlnX3ByZWZpeF9hcmcgIT0gTlVMTCAmJiBjdXJyX3ByZWZpeF9hcmcgIT0gTlVMTAorKyAgICAgIC8qIE9wdGltaXphdGlvbjogaWYgb3JpZ19wcmVmaXggYW5kIGN1cnJfcHJlZml4IGFyZSBlcXVhbCwgdGhlCisrCSByZWxvY2F0aW9uIGlzIGEgbm9wLiAgKi8KKysgICAgICAmJiBzdHJjbXAgKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKSAhPSAwKQorKyAgICB7CisrICAgICAgLyogRHVwbGljYXRlIHRoZSBhcmd1bWVudCBzdHJpbmdzLiAgKi8KKysgICAgICBjaGFyICptZW1vcnk7CisrCisrICAgICAgb3JpZ19wcmVmaXhfbGVuID0gc3RybGVuIChvcmlnX3ByZWZpeF9hcmcpOworKyAgICAgIGN1cnJfcHJlZml4X2xlbiA9IHN0cmxlbiAoY3Vycl9wcmVmaXhfYXJnKTsKKysgICAgICBtZW1vcnkgPSAoY2hhciAqKSB4bWFsbG9jIChvcmlnX3ByZWZpeF9sZW4gKyAxICsgY3Vycl9wcmVmaXhfbGVuICsgMSk7CisrI2lmZGVmIE5PX1hNQUxMT0MKKysgICAgICBpZiAobWVtb3J5ICE9IE5VTEwpCisrI2VuZGlmCisrCXsKKysJICBtZW1jcHkgKG1lbW9yeSwgb3JpZ19wcmVmaXhfYXJnLCBvcmlnX3ByZWZpeF9sZW4gKyAxKTsKKysJICBvcmlnX3ByZWZpeCA9IG1lbW9yeTsKKysJICBtZW1vcnkgKz0gb3JpZ19wcmVmaXhfbGVuICsgMTsKKysJICBtZW1jcHkgKG1lbW9yeSwgY3Vycl9wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9sZW4gKyAxKTsKKysJICBjdXJyX3ByZWZpeCA9IG1lbW9yeTsKKysJICByZXR1cm47CisrCX0KKysgICAgfQorKyAgb3JpZ19wcmVmaXggPSBOVUxMOworKyAgY3Vycl9wcmVmaXggPSBOVUxMOworKyAgLyogRG9uJ3Qgd29ycnkgYWJvdXQgd2FzdGVkIG1lbW9yeSBoZXJlIC0gdGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IG9ubHkKKysgICAgIGNhbGxlZCBvbmNlLiAgKi8KKyt9CisrCisrLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCisrICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKysgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKysgICBpbnN0ZWFkIG9mICIvIikuICAqLworK3ZvaWQKKytzZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYXJnKQorK3sKKysgIHNldF90aGlzX3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7CisrCisrICAvKiBOb3cgbm90aWZ5IGFsbCBkZXBlbmRlbnQgbGlicmFyaWVzLiAgKi8KKysjaWYgREVQRU5EU19PTl9MSUJDSEFSU0VUCisrICBsaWJjaGFyc2V0X3NldF9yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOworKyNlbmRpZgorKyNpZiBERVBFTkRTX09OX0xJQklDT05WICYmIEhBVkVfSUNPTlYgJiYgX0xJQklDT05WX1ZFUlNJT04gPj0gMHgwMTA5CisrICBsaWJpY29udl9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKKysjZW5kaWYKKysjaWYgREVQRU5EU19PTl9MSUJJTlRMICYmIEVOQUJMRV9OTFMgJiYgZGVmaW5lZCBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeAorKyAgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKKysjZW5kaWYKKyt9CisrCisrI2lmICFkZWZpbmVkIElOX0xJQlJBUlkgfHwgKGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUikKKysKKysvKiBDb252ZW5pZW5jZSBmdW5jdGlvbjoKKysgICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKKysgICBpbnN0YWxsYXRpb24gcHJlZml4LCB0aGUgb3JpZ2luYWwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBhIHBhcnRpY3VsYXIKKysgICBmaWxlLCBhbmQgdGhlIGN1cnJlbnQgcGF0aG5hbWUgb2YgdGhpcyBmaWxlLiAgUmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4gICovCisrI2lmZGVmIElOX0xJQlJBUlkKKysjZGVmaW5lIGNvbXB1dGVfY3Vycl9wcmVmaXggbG9jYWxfY29tcHV0ZV9jdXJyX3ByZWZpeAorK3N0YXRpYworKyNlbmRpZgorK2NvbnN0IGNoYXIgKgorK2NvbXB1dGVfY3Vycl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCwKKysJCSAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyLAorKwkJICAgICBjb25zdCBjaGFyICpjdXJyX3BhdGhuYW1lKQorK3sKKysgIGNvbnN0IGNoYXIgKmN1cnJfaW5zdGFsbGRpcjsKKysgIGNvbnN0IGNoYXIgKnJlbF9pbnN0YWxsZGlyOworKworKyAgaWYgKGN1cnJfcGF0aG5hbWUgPT0gTlVMTCkKKysgICAgcmV0dXJuIE5VTEw7CisrCisrICAvKiBEZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIHJlbGF0aXZlIHRvIHRoZSBwcmVmaXguCisrICAgICBUaGlzIGlzIHNpbXBseSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWdfaW5zdGFsbHByZWZpeCBhbmQKKysgICAgIG9yaWdfaW5zdGFsbGRpci4gICovCisrICBpZiAoc3RybmNtcCAob3JpZ19pbnN0YWxscHJlZml4LCBvcmlnX2luc3RhbGxkaXIsIHN0cmxlbiAob3JpZ19pbnN0YWxscHJlZml4KSkKKysgICAgICAhPSAwKQorKyAgICAvKiBTaG91bGRuJ3QgaGFwcGVuIC0gbm90aGluZyBzaG91bGQgYmUgaW5zdGFsbGVkIG91dHNpZGUgJChwcmVmaXgpLiAgKi8KKysgICAgcmV0dXJuIE5VTEw7CisrICByZWxfaW5zdGFsbGRpciA9IG9yaWdfaW5zdGFsbGRpciArIHN0cmxlbiAob3JpZ19pbnN0YWxscHJlZml4KTsKKysKKysgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgKi8KKysgIHsKKysgICAgY29uc3QgY2hhciAqcF9iYXNlID0gY3Vycl9wYXRobmFtZSArIEZJTEVTWVNURU1fUFJFRklYX0xFTiAoY3Vycl9wYXRobmFtZSk7CisrICAgIGNvbnN0IGNoYXIgKnAgPSBjdXJyX3BhdGhuYW1lICsgc3RybGVuIChjdXJyX3BhdGhuYW1lKTsKKysgICAgY2hhciAqcTsKKysKKysgICAgd2hpbGUgKHAgPiBwX2Jhc2UpCisrICAgICAgeworKwlwLS07CisrCWlmIChJU1NMQVNIICgqcCkpCisrCSAgYnJlYWs7CisrICAgICAgfQorKworKyAgICBxID0gKGNoYXIgKikgeG1hbGxvYyAocCAtIGN1cnJfcGF0aG5hbWUgKyAxKTsKKysjaWZkZWYgTk9fWE1BTExPQworKyAgICBpZiAocSA9PSBOVUxMKQorKyAgICAgIHJldHVybiBOVUxMOworKyNlbmRpZgorKyAgICBtZW1jcHkgKHEsIGN1cnJfcGF0aG5hbWUsIHAgLSBjdXJyX3BhdGhuYW1lKTsKKysgICAgcVtwIC0gY3Vycl9wYXRobmFtZV0gPSAnXDAnOworKyAgICBjdXJyX2luc3RhbGxkaXIgPSBxOworKyAgfQorKworKyAgLyogQ29tcHV0ZSB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IGJ5IHJlbW92aW5nIHRoZSB0cmFpbGluZworKyAgICAgcmVsX2luc3RhbGxkaXIgZnJvbSBpdC4gICovCisrICB7CisrICAgIGNvbnN0IGNoYXIgKnJwID0gcmVsX2luc3RhbGxkaXIgKyBzdHJsZW4gKHJlbF9pbnN0YWxsZGlyKTsKKysgICAgY29uc3QgY2hhciAqY3AgPSBjdXJyX2luc3RhbGxkaXIgKyBzdHJsZW4gKGN1cnJfaW5zdGFsbGRpcik7CisrICAgIGNvbnN0IGNoYXIgKmNwX2Jhc2UgPQorKyAgICAgIGN1cnJfaW5zdGFsbGRpciArIEZJTEVTWVNURU1fUFJFRklYX0xFTiAoY3Vycl9pbnN0YWxsZGlyKTsKKysKKysgICAgd2hpbGUgKHJwID4gcmVsX2luc3RhbGxkaXIgJiYgY3AgPiBjcF9iYXNlKQorKyAgICAgIHsKKysJYm9vbCBzYW1lID0gZmFsc2U7CisrCWNvbnN0IGNoYXIgKnJwaSA9IHJwOworKwljb25zdCBjaGFyICpjcGkgPSBjcDsKKysKKysJd2hpbGUgKHJwaSA+IHJlbF9pbnN0YWxsZGlyICYmIGNwaSA+IGNwX2Jhc2UpCisrCSAgeworKwkgICAgcnBpLS07CisrCSAgICBjcGktLTsKKysJICAgIGlmIChJU1NMQVNIICgqcnBpKSB8fCBJU1NMQVNIICgqY3BpKSkKKysJICAgICAgeworKwkJaWYgKElTU0xBU0ggKCpycGkpICYmIElTU0xBU0ggKCpjcGkpKQorKwkJICBzYW1lID0gdHJ1ZTsKKysJCWJyZWFrOworKwkgICAgICB9CisrI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworKwkgICAgLyogV2luMzIsIE9TLzIsIERPUyAtIGNhc2UgaW5zaWduaWZpY2FudCBmaWxlc3lzdGVtICovCisrCSAgICBpZiAoKCpycGkgPj0gJ2EnICYmICpycGkgPD0gJ3onID8gKnJwaSAtICdhJyArICdBJyA6ICpycGkpCisrCQkhPSAoKmNwaSA+PSAnYScgJiYgKmNwaSA8PSAneicgPyAqY3BpIC0gJ2EnICsgJ0EnIDogKmNwaSkpCisrCSAgICAgIGJyZWFrOworKyNlbHNlCisrCSAgICBpZiAoKnJwaSAhPSAqY3BpKQorKwkgICAgICBicmVhazsKKysjZW5kaWYKKysJICB9CisrCWlmICghc2FtZSkKKysJICBicmVhazsKKysJLyogVGhlIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50IHdhcyB0aGUgc2FtZS4gIG9waSBhbmQgY3BpIG5vdyBwb2ludAorKwkgICB0byB0aGUgc2xhc2ggYmVmb3JlIGl0LiAgKi8KKysJcnAgPSBycGk7CisrCWNwID0gY3BpOworKyAgICAgIH0KKysKKysgICAgaWYgKHJwID4gcmVsX2luc3RhbGxkaXIpCisrICAgICAgLyogVW5leHBlY3RlZDogVGhlIGN1cnJfaW5zdGFsbGRpciBkb2VzIG5vdCBlbmQgd2l0aCByZWxfaW5zdGFsbGRpci4gICovCisrICAgICAgcmV0dXJuIE5VTEw7CisrCisrICAgIHsKKysgICAgICBzaXplX3QgY3Vycl9wcmVmaXhfbGVuID0gY3AgLSBjdXJyX2luc3RhbGxkaXI7CisrICAgICAgY2hhciAqY3Vycl9wcmVmaXg7CisrCisrICAgICAgY3Vycl9wcmVmaXggPSAoY2hhciAqKSB4bWFsbG9jIChjdXJyX3ByZWZpeF9sZW4gKyAxKTsKKysjaWZkZWYgTk9fWE1BTExPQworKyAgICAgIGlmIChjdXJyX3ByZWZpeCA9PSBOVUxMKQorKwlyZXR1cm4gTlVMTDsKKysjZW5kaWYKKysgICAgICBtZW1jcHkgKGN1cnJfcHJlZml4LCBjdXJyX2luc3RhbGxkaXIsIGN1cnJfcHJlZml4X2xlbik7CisrICAgICAgY3Vycl9wcmVmaXhbY3Vycl9wcmVmaXhfbGVuXSA9ICdcMCc7CisrCisrICAgICAgcmV0dXJuIGN1cnJfcHJlZml4OworKyAgICB9CisrICB9CisrfQorKworKyNlbmRpZiAvKiAhSU5fTElCUkFSWSB8fCBQSUMgKi8KKysKKysjaWYgZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSCisrCisrLyogRnVsbCBwYXRobmFtZSBvZiBzaGFyZWQgbGlicmFyeSwgb3IgTlVMTC4gICovCisrc3RhdGljIGNoYXIgKnNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOworKworKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXworKworKy8qIERldGVybWluZSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgd2hlbiBpdCBpcyBsb2FkZWQuICAqLworKworK0JPT0wgV0lOQVBJCisrRGxsTWFpbiAoSElOU1RBTkNFIG1vZHVsZV9oYW5kbGUsIERXT1JEIGV2ZW50LCBMUFZPSUQgcmVzZXJ2ZWQpCisreworKyAgKHZvaWQpIHJlc2VydmVkOworKworKyAgaWYgKGV2ZW50ID09IERMTF9QUk9DRVNTX0FUVEFDSCkKKysgICAgeworKyAgICAgIC8qIFRoZSBETEwgaXMgYmVpbmcgbG9hZGVkIGludG8gYW4gYXBwbGljYXRpb24ncyBhZGRyZXNzIHJhbmdlLiAgKi8KKysgICAgICBzdGF0aWMgY2hhciBsb2NhdGlvbltNQVhfUEFUSF07CisrCisrICAgICAgaWYgKCFHZXRNb2R1bGVGaWxlTmFtZSAobW9kdWxlX2hhbmRsZSwgbG9jYXRpb24sIHNpemVvZiAobG9jYXRpb24pKSkKKysJLyogU2hvdWxkbid0IGhhcHBlbi4gICovCisrCXJldHVybiBGQUxTRTsKKysKKysgICAgICBpZiAoIUlTX1BBVEhfV0lUSF9ESVIgKGxvY2F0aW9uKSkKKysJLyogU2hvdWxkbid0IGhhcHBlbi4gICovCisrCXJldHVybiBGQUxTRTsKKysKKysgICAgICBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IHN0cmR1cCAobG9jYXRpb24pOworKyAgICB9CisrCisrICByZXR1cm4gVFJVRTsKKyt9CisrCisrI2Vsc2UgLyogVW5peCAqLworKworK3N0YXRpYyB2b2lkCisrZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKQorK3sKKysjaWYgZGVmaW5lZCBfX2xpbnV4X18gJiYgX19HTElCQ19fID49IDIKKysgIC8qIExpbnV4IGhhcyAvcHJvYy9zZWxmL21hcHMuIGdsaWJjIDIgaGFzIHRoZSBnZXRsaW5lKCkgZnVuY3Rpb24uICAqLworKyAgRklMRSAqZnA7CisrCisrICAvKiBPcGVuIHRoZSBjdXJyZW50IHByb2Nlc3MnIG1hcHMgZmlsZS4gIEl0IGRlc2NyaWJlcyBvbmUgVk1BIHBlciBsaW5lLiAgKi8KKysgIGZwID0gZm9wZW4gKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOworKyAgaWYgKGZwKQorKyAgICB7CisrICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpICZmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOworKyAgICAgIGZvciAoOzspCisrCXsKKysJICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisrCSAgaW50IGM7CisrCisrCSAgaWYgKGZzY2FuZiAoZnAsICIlbHgtJWx4IiwgJnN0YXJ0LCAmZW5kKSAhPSAyKQorKwkgICAgYnJlYWs7CisrCSAgaWYgKGFkZHJlc3MgPj0gc3RhcnQgJiYgYWRkcmVzcyA8PSBlbmQgLSAxKQorKwkgICAgeworKwkgICAgICAvKiBGb3VuZCBpdC4gIE5vdyBzZWUgaWYgdGhpcyBsaW5lIGNvbnRhaW5zIGEgZmlsZW5hbWUuICAqLworKwkgICAgICB3aGlsZSAoYyA9IGdldGMgKGZwKSwgYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmIGMgIT0gJy8nKQorKwkJY29udGludWU7CisrCSAgICAgIGlmIChjID09ICcvJykKKysJCXsKKysJCSAgc2l6ZV90IHNpemU7CisrCQkgIGludCBsZW47CisrCisrCQkgIHVuZ2V0YyAoYywgZnApOworKwkJICBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IE5VTEw7IHNpemUgPSAwOworKwkJICBsZW4gPSBnZXRsaW5lICgmc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUsICZzaXplLCBmcCk7CisrCQkgIGlmIChsZW4gPj0gMCkKKysJCSAgICB7CisrCQkgICAgICAvKiBTdWNjZXNzOiBmaWxsZWQgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUuICAqLworKwkJICAgICAgaWYgKGxlbiA+IDAgJiYgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWVbbGVuIC0gMV0gPT0gJ1xuJykKKysJCQlzaGFyZWRfbGlicmFyeV9mdWxsbmFtZVtsZW4gLSAxXSA9ICdcMCc7CisrCQkgICAgfQorKwkJfQorKwkgICAgICBicmVhazsKKysJICAgIH0KKysJICB3aGlsZSAoYyA9IGdldGMgKGZwKSwgYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorKwkgICAgY29udGludWU7CisrCX0KKysgICAgICBmY2xvc2UgKGZwKTsKKysgICAgfQorKyNlbmRpZgorK30KKysKKysjZW5kaWYgLyogV0lOMzIgLyBVbml4ICovCisrCisrLyogUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHNoYXJlZCBsaWJyYXJ5LgorKyAgIFJldHVybiBOVUxMIGlmIHVua25vd24uCisrICAgR3VhcmFudGVlZCB0byB3b3JrIG9ubHkgb24gTGludXggYW5kIFdvZTMyLiAgKi8KKytzdGF0aWMgY2hhciAqCisrZ2V0X3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpCisreworKyNpZiAhKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKQorKyAgc3RhdGljIGJvb2wgdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKKysgIGlmICghdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSkKKysgICAgeworKyAgICAgIGZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCk7CisrICAgICAgdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IHRydWU7CisrICAgIH0KKysjZW5kaWYKKysgIHJldHVybiBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKKyt9CisrCisrI2VuZGlmIC8qIFBJQyAqLworKworKy8qIFJldHVybnMgdGhlIHBhdGhuYW1lLCByZWxvY2F0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbgorKyAgIGRpcmVjdG9yeS4gICovCisrY29uc3QgY2hhciAqCisrcmVsb2NhdGUgKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQorK3sKKysjaWYgZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSCisrICBzdGF0aWMgaW50IGluaXRpYWxpemVkOworKworKyAgLyogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYSBzaGFyZWQgbGlicmFyeS4gICovCisrICBpZiAoIWluaXRpYWxpemVkKQorKyAgICB7CisrICAgICAgLyogQXQgdGhpcyBwb2ludCwgb3JpZ19wcmVmaXggYW5kIGN1cnJfcHJlZml4IGxpa2VseSBoYXZlIGFscmVhZHkgYmVlbgorKwkgc2V0IHRocm91Z2ggdGhlIG1haW4gcHJvZ3JhbSdzIHNldF9wcm9ncmFtX25hbWVfYW5kX2luc3RhbGxkaXIKKysJIGZ1bmN0aW9uLiAgVGhpcyBpcyBzdWZmaWNpZW50IGluIHRoZSBjYXNlIHRoYXQgdGhlIGxpYnJhcnkgaGFzCisrCSBpbml0aWFsbHkgYmVlbiBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgb3JpZ19wcmVmaXguICBCdXQgd2UgY2FuIGRvCisrCSBiZXR0ZXIsIHRvIGFsc28gY292ZXIgdGhlIGNhc2VzIHRoYXQgMS4gaXQgaGFzIGJlZW4gaW5zdGFsbGVkCisrCSBpbiBhIGRpZmZlcmVudCBwcmVmaXggYmVmb3JlIGJlaW5nIG1vdmVkIHRvIG9yaWdfcHJlZml4IGFuZCAobGF0ZXIpCisrCSB0byBjdXJyX3ByZWZpeCwgMi4gdW5saWtlIHRoZSBwcm9ncmFtLCBpdCBoYXMgbm90IG1vdmVkIGF3YXkgZnJvbQorKwkgb3JpZ19wcmVmaXguICAqLworKyAgICAgIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCA9IElOU1RBTExQUkVGSVg7CisrICAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyID0gSU5TVEFMTERJUjsKKysgICAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeF9iZXR0ZXI7CisrCisrICAgICAgY3Vycl9wcmVmaXhfYmV0dGVyID0KKysJY29tcHV0ZV9jdXJyX3ByZWZpeCAob3JpZ19pbnN0YWxscHJlZml4LCBvcmlnX2luc3RhbGxkaXIsCisrCQkJICAgICBnZXRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkpOworKyAgICAgIGlmIChjdXJyX3ByZWZpeF9iZXR0ZXIgPT0gTlVMTCkKKysJY3Vycl9wcmVmaXhfYmV0dGVyID0gY3Vycl9wcmVmaXg7CisrCisrICAgICAgc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX2luc3RhbGxwcmVmaXgsIGN1cnJfcHJlZml4X2JldHRlcik7CisrCisrICAgICAgaW5pdGlhbGl6ZWQgPSAxOworKyAgICB9CisrI2VuZGlmCisrCisrICAvKiBOb3RlOiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIGhlcmUsCisrICAgICBldmVuIGZvciBET1MtbGlrZSBmaWxlc3lzdGVtcywgYmVjYXVzZSB0aGUgcGF0aG5hbWUgYXJndW1lbnQgd2FzCisrICAgICB0eXBpY2FsbHkgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIE1ha2VmaWxlIHZhcmlhYmxlIGFzIG9yaWdfcHJlZml4IGNhbWUKKysgICAgIGZyb20uICAqLworKyAgaWYgKG9yaWdfcHJlZml4ICE9IE5VTEwgJiYgY3Vycl9wcmVmaXggIT0gTlVMTAorKyAgICAgICYmIHN0cm5jbXAgKHBhdGhuYW1lLCBvcmlnX3ByZWZpeCwgb3JpZ19wcmVmaXhfbGVuKSA9PSAwKQorKyAgICB7CisrICAgICAgaWYgKHBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl0gPT0gJ1wwJykKKysJLyogcGF0aG5hbWUgZXF1YWxzIG9yaWdfcHJlZml4LiAgKi8KKysJcmV0dXJuIGN1cnJfcHJlZml4OworKyAgICAgIGlmIChJU1NMQVNIIChwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dKSkKKysJeworKwkgIC8qIHBhdGhuYW1lIHN0YXJ0cyB3aXRoIG9yaWdfcHJlZml4LiAgKi8KKysJICBjb25zdCBjaGFyICpwYXRobmFtZV90YWlsID0gJnBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl07CisrCSAgY2hhciAqcmVzdWx0ID0KKysJICAgIChjaGFyICopIHhtYWxsb2MgKGN1cnJfcHJlZml4X2xlbiArIHN0cmxlbiAocGF0aG5hbWVfdGFpbCkgKyAxKTsKKysKKysjaWZkZWYgTk9fWE1BTExPQworKwkgIGlmIChyZXN1bHQgIT0gTlVMTCkKKysjZW5kaWYKKysJICAgIHsKKysJICAgICAgbWVtY3B5IChyZXN1bHQsIGN1cnJfcHJlZml4LCBjdXJyX3ByZWZpeF9sZW4pOworKwkgICAgICBzdHJjcHkgKHJlc3VsdCArIGN1cnJfcHJlZml4X2xlbiwgcGF0aG5hbWVfdGFpbCk7CisrCSAgICAgIHJldHVybiByZXN1bHQ7CisrCSAgICB9CisrCX0KKysgICAgfQorKyAgLyogTm90aGluZyB0byByZWxvY2F0ZS4gICovCisrICByZXR1cm4gcGF0aG5hbWU7CisrfQorKworKyNlbmRpZgorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3JlbG9jYXRhYmxlLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvcmVsb2NhdGFibGUuaAkyMDA0LTA5LTEyIDE0OjQwOjM0LjY1MTcwMzA5NiAtMDQwMAorQEAgLTAsMCArMSw3NyBAQAorKy8qIFByb3ZpZGUgcmVsb2NhdGFibGUgcGFja2FnZXMuCisrICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZuZGVmIF9SRUxPQ0FUQUJMRV9ICisrI2RlZmluZSBfUkVMT0NBVEFCTEVfSAorKworKyNpZmRlZiBfX2NwbHVzcGx1cworK2V4dGVybiAiQyIgeworKyNlbmRpZgorKworKworKy8qIFRoaXMgY2FuIGJlIGVuYWJsZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlIC0tZW5hYmxlLXJlbG9jYXRhYmxlIG9wdGlvbi4gICovCisrI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQorKworKy8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKKysgICB0aGlzIGlzIGEgcHJpdmF0ZSAuaCBmaWxlLCB3ZSBkb24ndCBuZWVkIHRvIHVzZSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKysgICBpbiBhbnkgY2FzZS4gICovCisrI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCisrIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVEIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorKyNlbHNlCisrIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVECisrI2VuZGlmCisrCisrLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCisrICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKysgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKysgICBpbnN0ZWFkIG9mICIvIikuICAqLworK2V4dGVybiBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgdm9pZAorKyAgICAgICBzZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4LAorKwkJCSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4KTsKKysKKysvKiBSZXR1cm5zIHRoZSBwYXRobmFtZSwgcmVsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24KKysgICBkaXJlY3RvcnkuICAqLworK2V4dGVybiBjb25zdCBjaGFyICogcmVsb2NhdGUgKGNvbnN0IGNoYXIgKnBhdGhuYW1lKTsKKysKKysvKiBNZW1vcnkgbWFuYWdlbWVudDogcmVsb2NhdGUoKSBsZWFrcyBtZW1vcnksIGJlY2F1c2UgaXQgaGFzIHRvIGNvbnN0cnVjdAorKyAgIGEgZnJlc2ggcGF0aG5hbWUuICBJZiB0aGlzIGlzIGEgcHJvYmxlbSBiZWNhdXNlIHlvdXIgcHJvZ3JhbSBjYWxscworKyAgIHJlbG9jYXRlKCkgZnJlcXVlbnRseSwgdGhpbmsgYWJvdXQgY2FjaGluZyB0aGUgcmVzdWx0LiAgKi8KKysKKysvKiBDb252ZW5pZW5jZSBmdW5jdGlvbjoKKysgICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKKysgICBpbnN0YWxsYXRpb24gcHJlZml4LCB0aGUgb3JpZ2luYWwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBhIHBhcnRpY3VsYXIKKysgICBmaWxlLCBhbmQgdGhlIGN1cnJlbnQgcGF0aG5hbWUgb2YgdGhpcyBmaWxlLiAgUmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4gICovCisrZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCisrCQkJCQkgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyLAorKwkJCQkJIGNvbnN0IGNoYXIgKmN1cnJfcGF0aG5hbWUpOworKworKyNlbHNlCisrCisrLyogQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBoYXJkd2lyZWQgcGF0aG5hbWVzLiAgKi8KKysjZGVmaW5lIHJlbG9jYXRlKHBhdGhuYW1lKSAocGF0aG5hbWUpCisrCisrI2VuZGlmCisrCisrCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrfQorKyNlbmRpZgorKworKyNlbmRpZiAvKiBfUkVMT0NBVEFCTEVfSCAqLworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3RleHRkb21haW4uYwkxOTk4LTA0LTI2IDA5OjIyOjM3LjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC90ZXh0ZG9tYWluLmMJMjAwNC0wOS0xMiAxNDo0MDozNC42NTY3MDIzMzYgLTA0MDAKK0BAIC0xLDUxICsxLDYwIEBACistLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRleHRkb21haW4oMykgZnVuY3Rpb24KKy0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCistICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisrLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRleHRkb21haW4oMykgZnVuY3Rpb24uCisrICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAKKy0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CistICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCistICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisgCisgI2lmZGVmIEhBVkVfQ09ORklHX0gKKyAjIGluY2x1ZGUgPGNvbmZpZy5oPgorICNlbmRpZgorIAorLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCistIyBpbmNsdWRlIDxzdGRsaWIuaD4KKy0jZW5kaWYKKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2luY2x1ZGUgPHN0cmluZy5oPgorIAorLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQworLSMgaW5jbHVkZSA8c3RyaW5nLmg+CisrI2lmZGVmIF9MSUJDCisrIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisgI2Vsc2UKKy0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KKy0jIGlmbmRlZiBtZW1jcHkKKy0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQorLSMgZW5kaWYKKysjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyAjZW5kaWYKKysjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyAKKyAjaWZkZWYgX0xJQkMKKy0jIGluY2x1ZGUgPGxpYmludGwuaD4KKysvKiBXZSBoYXZlIHRvIGhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLworKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKyAjZWxzZQorLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgorKy8qIFByb3ZpZGUgZHVtbXkgaW1wbGVtZW50YXRpb24gaWYgdGhpcyBpcyBvdXRzaWRlIGdsaWJjLiAgKi8KKysjIGRlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZShDTEFTUywgTkFNRSkKKysjIGRlZmluZSBfX2xpYmNfcndsb2NrX3dybG9jayhOQU1FKQorKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCisrI2VuZGlmCisrCisrLyogVGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiB0aGUgc3RhbmRhbG9uZSBsaWJpbnRsLmEgbXVzdCBoYXZlIGRpZmZlcmVudAorKyAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCisrICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCisrI2lmICFkZWZpbmVkIF9MSUJDCisrIyBkZWZpbmUgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluCisrIyBkZWZpbmUgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluCisgI2VuZGlmCisgCisgLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworIAorIC8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgdGV4dCBkb21haW4uICAqLworLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW107CisrZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSBhdHRyaWJ1dGVfaGlkZGVuOworIAorIC8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLworLWV4dGVybiBjb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKytleHRlcm4gY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gYXR0cmlidXRlX2hpZGRlbjsKKyAKKyAKKyAvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCitAQCAtNTQsNTAgKzYzLDc2IEBACisgICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyAjaWZkZWYgX0xJQkMKKyAjIGRlZmluZSBURVhURE9NQUlOIF9fdGV4dGRvbWFpbgorLSMgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCisrIyBpZm5kZWYgc3RyZHVwCisrIyAgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCisrIyBlbmRpZgorICNlbHNlCistIyBkZWZpbmUgVEVYVERPTUFJTiB0ZXh0ZG9tYWluX18KKysjIGRlZmluZSBURVhURE9NQUlOIGxpYmludGxfdGV4dGRvbWFpbgorICNlbmRpZgorIAorKy8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLworK19fbGliY19yd2xvY2tfZGVmaW5lIChleHRlcm4sIF9ubF9zdGF0ZV9sb2NrIGF0dHJpYnV0ZV9oaWRkZW4pCisrCisgLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCisgICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KKyAgICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KKyBjaGFyICoKKy1URVhURE9NQUlOIChkb21haW5uYW1lKQorLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKKytURVhURE9NQUlOIChjb25zdCBjaGFyICpkb21haW5uYW1lKQorIHsKKy0gIGNoYXIgKm9sZDsKKysgIGNoYXIgKm5ld19kb21haW47CisrICBjaGFyICpvbGRfZG9tYWluOworIAorICAgLyogQSBOVUxMIHBvaW50ZXIgcmVxdWVzdHMgdGhlIGN1cnJlbnQgc2V0dGluZy4gICovCisgICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQorICAgICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CisgCistICBvbGQgPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKysgIF9fbGliY19yd2xvY2tfd3Jsb2NrIChfbmxfc3RhdGVfbG9jayk7CisrCisrICBvbGRfZG9tYWluID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CisgCisgICAvKiBJZiBkb21haW4gbmFtZSBpcyB0aGUgbnVsbCBzdHJpbmcgc2V0IHRvIGRlZmF1bHQgZG9tYWluICJtZXNzYWdlcyIuICAqLworICAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJworICAgICAgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pID09IDApCistICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47CisrICAgIHsKKysgICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOworKyAgICAgIG5ld19kb21haW4gPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKysgICAgfQorKyAgZWxzZSBpZiAoc3RyY21wIChkb21haW5uYW1lLCBvbGRfZG9tYWluKSA9PSAwKQorKyAgICAvKiBUaGlzIGNhbiBoYXBwZW4gYW5kIHBlb3BsZSB3aWxsIHVzZSBpdCB0byBzaWduYWwgdGhhdCBzb21lCisrICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGNoYW5nZWQuICAqLworKyAgICBuZXdfZG9tYWluID0gb2xkX2RvbWFpbjsKKyAgIGVsc2UKKyAgICAgeworICAgICAgIC8qIElmIHRoZSBmb2xsb3dpbmcgbWFsbG9jIGZhaWxzIGBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbicKKyAJIHdpbGwgYmUgTlVMTC4gIFRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhbmQgc28gc2lnbmFscyB3ZQorIAkgYXJlIG91dCBvZiBjb3JlLiAgKi8KKyAjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCistICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBzdHJkdXAgKGRvbWFpbm5hbWUpOworKyAgICAgIG5ld19kb21haW4gPSBzdHJkdXAgKGRvbWFpbm5hbWUpOworICNlbHNlCisgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOworLSAgICAgIGNoYXIgKmNwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworLSAgICAgIGlmIChjcCAhPSBOVUxMKQorLQltZW1jcHkgKGNwLCBkb21haW5uYW1lLCBsZW4pOworLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gY3A7CisrICAgICAgbmV3X2RvbWFpbiA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKysgICAgICBpZiAobmV3X2RvbWFpbiAhPSBOVUxMKQorKwltZW1jcHkgKG5ld19kb21haW4sIGRvbWFpbm5hbWUsIGxlbik7CisgI2VuZGlmCisrCisrICAgICAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKKysJX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBuZXdfZG9tYWluOworICAgICB9CisgCistICBpZiAob2xkICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQorLSAgICBmcmVlIChvbGQpOworKyAgLyogV2UgdXNlIHRoaXMgcG9zc2liaWxpdHkgdG8gc2lnbmFsIGEgY2hhbmdlIG9mIHRoZSBsb2FkZWQgY2F0YWxvZ3MKKysgICAgIHNpbmNlIHRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIGNhc2UgYW5kIHRoZXJlIGlzIG5vIG90aGVyIGVhc3kgd2UKKysgICAgIHRvIGRvIGl0LiAgRG8gaXQgb25seSB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLiAgKi8KKysgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCisrICAgIHsKKysgICAgICArK19ubF9tc2dfY2F0X2NudHI7CisgCistICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CisrICAgICAgaWYgKG9sZF9kb21haW4gIT0gbmV3X2RvbWFpbiAmJiBvbGRfZG9tYWluICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQorKwlmcmVlIChvbGRfZG9tYWluKTsKKysgICAgfQorKworKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKysKKysgIHJldHVybiBuZXdfZG9tYWluOworIH0KKyAKKyAjaWZkZWYgX0xJQkMKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC92YXNucHJpbnRmLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvdmFzbnByaW50Zi5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjYyNzAxNDI0IC0wNDAwCitAQCAtMCwwICsxLDg4NyBAQAorKy8qIHZzcHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysvKiBUZWxsIGdsaWJjJ3MgPHN0ZGlvLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIHNucHJpbnRmKCkuCisrICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCisrICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKysjIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCisrI2VuZGlmCisrCisrI2lmZGVmIEhBVkVfQ09ORklHX0gKKysjIGluY2x1ZGUgPGNvbmZpZy5oPgorKyNlbmRpZgorKyNpZm5kZWYgSU5fTElCSU5UTAorKyMgaW5jbHVkZSA8YWxsb2NhLmg+CisrI2VuZGlmCisrCisrLyogU3BlY2lmaWNhdGlvbi4gICovCisrI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisrIyBpbmNsdWRlICJ2YXNud3ByaW50Zi5oIgorKyNlbHNlCisrIyBpbmNsdWRlICJ2YXNucHJpbnRmLmgiCisrI2VuZGlmCisrCisrI2luY2x1ZGUgPHN0ZGlvLmg+CS8qIHNucHJpbnRmKCksIHNwcmludGYoKSAqLworKyNpbmNsdWRlIDxzdGRsaWIuaD4JLyogYWJvcnQoKSwgbWFsbG9jKCksIHJlYWxsb2MoKSwgZnJlZSgpICovCisrI2luY2x1ZGUgPHN0cmluZy5oPgkvKiBtZW1jcHkoKSwgc3RybGVuKCkgKi8KKysjaW5jbHVkZSA8ZXJybm8uaD4JLyogZXJybm8gKi8KKysjaW5jbHVkZSA8bGltaXRzLmg+CS8qIENIQVJfQklUICovCisrI2luY2x1ZGUgPGZsb2F0Lmg+CS8qIERCTF9NQVhfRVhQLCBMREJMX01BWF9FWFAgKi8KKysjaWYgV0lERV9DSEFSX1ZFUlNJT04KKysjIGluY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKKysjZWxzZQorKyMgaW5jbHVkZSAicHJpbnRmLXBhcnNlLmgiCisrI2VuZGlmCisrCisrLyogQ2hlY2tlZCBzaXplX3QgY29tcHV0YXRpb25zLiAgKi8KKysjaW5jbHVkZSAieHNpemUuaCIKKysKKysjaWZkZWYgSEFWRV9XQ0hBUl9UCisrIyBpZmRlZiBIQVZFX1dDU0xFTgorKyMgIGRlZmluZSBsb2NhbF93Y3NsZW4gd2NzbGVuCisrIyBlbHNlCisrICAgLyogU29sYXJpcyAyLjUuMSBoYXMgd2NzbGVuKCkgaW4gYSBzZXBhcmF0ZSBsaWJyYXJ5IGxpYncuc28uIFRvIGF2b2lkCisrICAgICAgYSBkZXBlbmRlbmN5IHRvd2FyZHMgdGhpcyBsaWJyYXJ5LCBoZXJlIGlzIGEgbG9jYWwgc3Vic3RpdHV0ZS4KKysgICAgICBEZWZpbmUgdGhpcyBzdWJzdGl0dXRlIG9ubHkgb25jZSwgZXZlbiBpZiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQKKysgICAgICB0d2ljZSBpbiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0LiAgKi8KKysjICBpZm5kZWYgbG9jYWxfd2NzbGVuX2RlZmluZWQKKysjICAgZGVmaW5lIGxvY2FsX3djc2xlbl9kZWZpbmVkIDEKKytzdGF0aWMgc2l6ZV90CisrbG9jYWxfd2NzbGVuIChjb25zdCB3Y2hhcl90ICpzKQorK3sKKysgIGNvbnN0IHdjaGFyX3QgKnB0cjsKKysKKysgIGZvciAocHRyID0gczsgKnB0ciAhPSAod2NoYXJfdCkgMDsgcHRyKyspCisrICAgIDsKKysgIHJldHVybiBwdHIgLSBzOworK30KKysjICBlbmRpZgorKyMgZW5kaWYKKysjZW5kaWYKKysKKysjaWYgV0lERV9DSEFSX1ZFUlNJT04KKysjIGRlZmluZSBWQVNOUFJJTlRGIHZhc253cHJpbnRmCisrIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKKysjIGRlZmluZSBESVJFQ1RJVkUgd2NoYXJfdF9kaXJlY3RpdmUKKysjIGRlZmluZSBESVJFQ1RJVkVTIHdjaGFyX3RfZGlyZWN0aXZlcworKyMgZGVmaW5lIFBSSU5URl9QQVJTRSB3cHJpbnRmX3BhcnNlCisrIyBkZWZpbmUgVVNFX1NOUFJJTlRGIDEKKysjIGlmIEhBVkVfREVDTF9fU05XUFJJTlRGCisrICAgLyogT24gV2luZG93cywgdGhlIGZ1bmN0aW9uIHN3cHJpbnRmKCkgaGFzIGEgZGlmZmVyZW50IHNpZ25hdHVyZSB0aGFuCisrICAgICAgb24gVW5peDsgd2UgdXNlIHRoZSBfc253cHJpbnRmKCkgZnVuY3Rpb24gaW5zdGVhZC4gICovCisrIyAgZGVmaW5lIFNOUFJJTlRGIF9zbndwcmludGYKKysjIGVsc2UKKysgICAvKiBVbml4LiAgKi8KKysjICBkZWZpbmUgU05QUklOVEYgc3dwcmludGYKKysjIGVuZGlmCisrI2Vsc2UKKysjIGRlZmluZSBWQVNOUFJJTlRGIHZhc25wcmludGYKKysjIGRlZmluZSBDSEFSX1QgY2hhcgorKyMgZGVmaW5lIERJUkVDVElWRSBjaGFyX2RpcmVjdGl2ZQorKyMgZGVmaW5lIERJUkVDVElWRVMgY2hhcl9kaXJlY3RpdmVzCisrIyBkZWZpbmUgUFJJTlRGX1BBUlNFIHByaW50Zl9wYXJzZQorKyMgZGVmaW5lIFVTRV9TTlBSSU5URiAoSEFWRV9ERUNMX19TTlBSSU5URiB8fCBIQVZFX1NOUFJJTlRGKQorKyMgaWYgSEFWRV9ERUNMX19TTlBSSU5URgorKyAgIC8qIFdpbmRvd3MuICAqLworKyMgIGRlZmluZSBTTlBSSU5URiBfc25wcmludGYKKysjIGVsc2UKKysgICAvKiBVbml4LiAgKi8KKysjICBkZWZpbmUgU05QUklOVEYgc25wcmludGYKKysjIGVuZGlmCisrI2VuZGlmCisrCisrQ0hBUl9UICoKKytWQVNOUFJJTlRGIChDSEFSX1QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBDSEFSX1QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorK3sKKysgIERJUkVDVElWRVMgZDsKKysgIGFyZ3VtZW50cyBhOworKworKyAgaWYgKFBSSU5URl9QQVJTRSAoZm9ybWF0LCAmZCwgJmEpIDwgMCkKKysgICAgeworKyAgICAgIGVycm5vID0gRUlOVkFMOworKyAgICAgIHJldHVybiBOVUxMOworKyAgICB9CisrCisrI2RlZmluZSBDTEVBTlVQKCkgXAorKyAgZnJlZSAoZC5kaXIpOwkJCQkJCQkJXAorKyAgaWYgKGEuYXJnKQkJCQkJCQkJXAorKyAgICBmcmVlIChhLmFyZyk7CisrCisrICBpZiAocHJpbnRmX2ZldGNoYXJncyAoYXJncywgJmEpIDwgMCkKKysgICAgeworKyAgICAgIENMRUFOVVAgKCk7CisrICAgICAgZXJybm8gPSBFSU5WQUw7CisrICAgICAgcmV0dXJuIE5VTEw7CisrICAgIH0KKysKKysgIHsKKysgICAgc2l6ZV90IGJ1Zl9uZWVkZWRsZW5ndGg7CisrICAgIENIQVJfVCAqYnVmOworKyAgICBDSEFSX1QgKmJ1Zl9tYWxsb2NlZDsKKysgICAgY29uc3QgQ0hBUl9UICpjcDsKKysgICAgc2l6ZV90IGk7CisrICAgIERJUkVDVElWRSAqZHA7CisrICAgIC8qIE91dHB1dCBzdHJpbmcgYWNjdW11bGF0b3IuICAqLworKyAgICBDSEFSX1QgKnJlc3VsdDsKKysgICAgc2l6ZV90IGFsbG9jYXRlZDsKKysgICAgc2l6ZV90IGxlbmd0aDsKKysKKysgICAgLyogQWxsb2NhdGUgYSBzbWFsbCBidWZmZXIgdGhhdCB3aWxsIGhvbGQgYSBkaXJlY3RpdmUgcGFzc2VkIHRvCisrICAgICAgIHNwcmludGYgb3Igc25wcmludGYuICAqLworKyAgICBidWZfbmVlZGVkbGVuZ3RoID0KKysgICAgICB4c3VtNCAoNywgZC5tYXhfd2lkdGhfbGVuZ3RoLCBkLm1heF9wcmVjaXNpb25fbGVuZ3RoLCA2KTsKKysjaWYgSEFWRV9BTExPQ0EKKysgICAgaWYgKGJ1Zl9uZWVkZWRsZW5ndGggPCA0MDAwIC8gc2l6ZW9mIChDSEFSX1QpKQorKyAgICAgIHsKKysJYnVmID0gKENIQVJfVCAqKSBhbGxvY2EgKGJ1Zl9uZWVkZWRsZW5ndGggKiBzaXplb2YgKENIQVJfVCkpOworKwlidWZfbWFsbG9jZWQgPSBOVUxMOworKyAgICAgIH0KKysgICAgZWxzZQorKyNlbmRpZgorKyAgICAgIHsKKysJc2l6ZV90IGJ1Zl9tZW1zaXplID0geHRpbWVzIChidWZfbmVlZGVkbGVuZ3RoLCBzaXplb2YgKENIQVJfVCkpOworKwlpZiAoc2l6ZV9vdmVyZmxvd19wIChidWZfbWVtc2l6ZSkpCisrCSAgZ290byBvdXRfb2ZfbWVtb3J5XzE7CisrCWJ1ZiA9IChDSEFSX1QgKikgbWFsbG9jIChidWZfbWVtc2l6ZSk7CisrCWlmIChidWYgPT0gTlVMTCkKKysJICBnb3RvIG91dF9vZl9tZW1vcnlfMTsKKysJYnVmX21hbGxvY2VkID0gYnVmOworKyAgICAgIH0KKysKKysgICAgaWYgKHJlc3VsdGJ1ZiAhPSBOVUxMKQorKyAgICAgIHsKKysJcmVzdWx0ID0gcmVzdWx0YnVmOworKwlhbGxvY2F0ZWQgPSAqbGVuZ3RocDsKKysgICAgICB9CisrICAgIGVsc2UKKysgICAgICB7CisrCXJlc3VsdCA9IE5VTEw7CisrCWFsbG9jYXRlZCA9IDA7CisrICAgICAgfQorKyAgICBsZW5ndGggPSAwOworKyAgICAvKiBJbnZhcmlhbnRzOgorKyAgICAgICByZXN1bHQgaXMgZWl0aGVyID09IHJlc3VsdGJ1ZiBvciA9PSBOVUxMIG9yIG1hbGxvYy1hbGxvY2F0ZWQuCisrICAgICAgIElmIGxlbmd0aCA+IDAsIHRoZW4gcmVzdWx0ICE9IE5VTEwuICAqLworKworKyAgICAvKiBFbnN1cmVzIHRoYXQgYWxsb2NhdGVkID49IG5lZWRlZC4gIEFib3J0cyB0aHJvdWdoIGEganVtcCB0bworKyAgICAgICBvdXRfb2ZfbWVtb3J5IGlmIG5lZWRlZCBpcyBTSVpFX01BWCBvciBvdGhlcndpc2UgdG9vIGJpZy4gICovCisrI2RlZmluZSBFTlNVUkVfQUxMT0NBVElPTihuZWVkZWQpIFwKKysgICAgaWYgKChuZWVkZWQpID4gYWxsb2NhdGVkKQkJCQkJCSAgICAgXAorKyAgICAgIHsJCQkJCQkJCQkgICAgIFwKKysJc2l6ZV90IG1lbW9yeV9zaXplOwkJCQkJCSAgICAgXAorKwlDSEFSX1QgKm1lbW9yeTsJCQkJCQkJICAgICBcCisrCQkJCQkJCQkJICAgICBcCisrCWFsbG9jYXRlZCA9IChhbGxvY2F0ZWQgPiAwID8geHRpbWVzIChhbGxvY2F0ZWQsIDIpIDogMTIpOwkgICAgIFwKKysJaWYgKChuZWVkZWQpID4gYWxsb2NhdGVkKQkJCQkJICAgICBcCisrCSAgYWxsb2NhdGVkID0gKG5lZWRlZCk7CQkJCQkJICAgICBcCisrCW1lbW9yeV9zaXplID0geHRpbWVzIChhbGxvY2F0ZWQsIHNpemVvZiAoQ0hBUl9UKSk7CQkgICAgIFwKKysJaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQkJCQkgICAgIFwKKysJICBnb3RvIG91dF9vZl9tZW1vcnk7CQkJCQkJICAgICBcCisrCWlmIChyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKQkJCSAgICAgXAorKwkgIG1lbW9yeSA9IChDSEFSX1QgKikgbWFsbG9jIChtZW1vcnlfc2l6ZSk7CQkJICAgICBcCisrCWVsc2UJCQkJCQkJCSAgICAgXAorKwkgIG1lbW9yeSA9IChDSEFSX1QgKikgcmVhbGxvYyAocmVzdWx0LCBtZW1vcnlfc2l6ZSk7CQkgICAgIFwKKysJaWYgKG1lbW9yeSA9PSBOVUxMKQkJCQkJCSAgICAgXAorKwkgIGdvdG8gb3V0X29mX21lbW9yeTsJCQkJCQkgICAgIFwKKysJaWYgKHJlc3VsdCA9PSByZXN1bHRidWYgJiYgbGVuZ3RoID4gMCkJCQkJICAgICBcCisrCSAgbWVtY3B5IChtZW1vcnksIHJlc3VsdCwgbGVuZ3RoICogc2l6ZW9mIChDSEFSX1QpKTsJCSAgICAgXAorKwlyZXN1bHQgPSBtZW1vcnk7CQkJCQkJICAgICBcCisrICAgICAgfQorKworKyAgICBmb3IgKGNwID0gZm9ybWF0LCBpID0gMCwgZHAgPSAmZC5kaXJbMF07IDsgY3AgPSBkcC0+ZGlyX2VuZCwgaSsrLCBkcCsrKQorKyAgICAgIHsKKysJaWYgKGNwICE9IGRwLT5kaXJfc3RhcnQpCisrCSAgeworKwkgICAgc2l6ZV90IG4gPSBkcC0+ZGlyX3N0YXJ0IC0gY3A7CisrCSAgICBzaXplX3QgYXVnbWVudGVkX2xlbmd0aCA9IHhzdW0gKGxlbmd0aCwgbik7CisrCisrCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoYXVnbWVudGVkX2xlbmd0aCk7CisrCSAgICBtZW1jcHkgKHJlc3VsdCArIGxlbmd0aCwgY3AsIG4gKiBzaXplb2YgKENIQVJfVCkpOworKwkgICAgbGVuZ3RoID0gYXVnbWVudGVkX2xlbmd0aDsKKysJICB9CisrCWlmIChpID09IGQuY291bnQpCisrCSAgYnJlYWs7CisrCisrCS8qIEV4ZWN1dGUgYSBzaW5nbGUgZGlyZWN0aXZlLiAgKi8KKysJaWYgKGRwLT5jb252ZXJzaW9uID09ICclJykKKysJICB7CisrCSAgICBzaXplX3QgYXVnbWVudGVkX2xlbmd0aDsKKysKKysJICAgIGlmICghKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpKQorKwkgICAgICBhYm9ydCAoKTsKKysJICAgIGF1Z21lbnRlZF9sZW5ndGggPSB4c3VtIChsZW5ndGgsIDEpOworKwkgICAgRU5TVVJFX0FMTE9DQVRJT04gKGF1Z21lbnRlZF9sZW5ndGgpOworKwkgICAgcmVzdWx0W2xlbmd0aF0gPSAnJSc7CisrCSAgICBsZW5ndGggPSBhdWdtZW50ZWRfbGVuZ3RoOworKwkgIH0KKysJZWxzZQorKwkgIHsKKysJICAgIGlmICghKGRwLT5hcmdfaW5kZXggIT0gQVJHX05PTkUpKQorKwkgICAgICBhYm9ydCAoKTsKKysKKysJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnbicpCisrCSAgICAgIHsKKysJCXN3aXRjaCAoYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSkKKysJCSAgeworKwkJICBjYXNlIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjoKKysJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X3NjaGFyX3BvaW50ZXIgPSBsZW5ndGg7CisrCQkgICAgYnJlYWs7CisrCQkgIGNhc2UgVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSOgorKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfc2hvcnRfcG9pbnRlciA9IGxlbmd0aDsKKysJCSAgICBicmVhazsKKysJCSAgY2FzZSBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSOgorKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfaW50X3BvaW50ZXIgPSBsZW5ndGg7CisrCQkgICAgYnJlYWs7CisrCQkgIGNhc2UgVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVI6CisrCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9sb25naW50X3BvaW50ZXIgPSBsZW5ndGg7CisrCQkgICAgYnJlYWs7CisrI2lmZGVmIEhBVkVfTE9OR19MT05HCisrCQkgIGNhc2UgVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOgorKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfbG9uZ2xvbmdpbnRfcG9pbnRlciA9IGxlbmd0aDsKKysJCSAgICBicmVhazsKKysjZW5kaWYKKysJCSAgZGVmYXVsdDoKKysJCSAgICBhYm9ydCAoKTsKKysJCSAgfQorKwkgICAgICB9CisrCSAgICBlbHNlCisrCSAgICAgIHsKKysJCWFyZ190eXBlIHR5cGUgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlOworKwkJQ0hBUl9UICpwOworKwkJdW5zaWduZWQgaW50IHByZWZpeF9jb3VudDsKKysJCWludCBwcmVmaXhlc1syXTsKKysjaWYgIVVTRV9TTlBSSU5URgorKwkJc2l6ZV90IHRtcF9sZW5ndGg7CisrCQlDSEFSX1QgdG1wYnVmWzcwMF07CisrCQlDSEFSX1QgKnRtcDsKKysKKysJCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUgZm9yIGNhbGxpbmcKKysJCSAgIHNwcmludGYuICAqLworKwkJeworKwkJICBzaXplX3Qgd2lkdGg7CisrCQkgIHNpemVfdCBwcmVjaXNpb247CisrCisrCQkgIHdpZHRoID0gMDsKKysJCSAgaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQorKwkJICAgIHsKKysJCSAgICAgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ICE9IEFSR19OT05FKQorKwkJCXsKKysJCQkgIGludCBhcmc7CisrCisrCQkJICBpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKKysJCQkgICAgYWJvcnQgKCk7CisrCQkJICBhcmcgPSBhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS5hLmFfaW50OworKwkJCSAgd2lkdGggPSAoYXJnIDwgMCA/ICh1bnNpZ25lZCBpbnQpICgtYXJnKSA6IGFyZyk7CisrCQkJfQorKwkJICAgICAgZWxzZQorKwkJCXsKKysJCQkgIGNvbnN0IENIQVJfVCAqZGlnaXRwID0gZHAtPndpZHRoX3N0YXJ0OworKworKwkJCSAgZG8KKysJCQkgICAgd2lkdGggPSB4c3VtICh4dGltZXMgKHdpZHRoLCAxMCksICpkaWdpdHArKyAtICcwJyk7CisrCQkJICB3aGlsZSAoZGlnaXRwICE9IGRwLT53aWR0aF9lbmQpOworKwkJCX0KKysJCSAgICB9CisrCisrCQkgIHByZWNpc2lvbiA9IDY7CisrCQkgIGlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQorKwkJICAgIHsKKysJCSAgICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKKysJCQl7CisrCQkJICBpbnQgYXJnOworKworKwkJCSAgaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorKwkJCSAgICBhYm9ydCAoKTsKKysJCQkgIGFyZyA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OworKwkJCSAgcHJlY2lzaW9uID0gKGFyZyA8IDAgPyAwIDogYXJnKTsKKysJCQl9CisrCQkgICAgICBlbHNlCisrCQkJeworKwkJCSAgY29uc3QgQ0hBUl9UICpkaWdpdHAgPSBkcC0+cHJlY2lzaW9uX3N0YXJ0ICsgMTsKKysKKysJCQkgIHByZWNpc2lvbiA9IDA7CisrCQkJICBkbworKwkJCSAgICBwcmVjaXNpb24gPSB4c3VtICh4dGltZXMgKHByZWNpc2lvbiwgMTApLCAqZGlnaXRwKysgLSAnMCcpOworKwkJCSAgd2hpbGUgKGRpZ2l0cCAhPSBkcC0+cHJlY2lzaW9uX2VuZCk7CisrCQkJfQorKwkJICAgIH0KKysKKysJCSAgc3dpdGNoIChkcC0+Y29udmVyc2lvbikKKysJCSAgICB7CisrCisrCQkgICAgY2FzZSAnZCc6IGNhc2UgJ2knOiBjYXNlICd1JzoKKysjIGlmZGVmIEhBVkVfTE9OR19MT05HCisrCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCisrCQkJdG1wX2xlbmd0aCA9CisrCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKKysJCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCisrCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLworKwkJCQkJICkKKysJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworKwkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KKysJCSAgICAgIGVsc2UKKysjIGVuZGlmCisrCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQorKwkJCXRtcF9sZW5ndGggPQorKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVAorKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKysJCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCisrCQkJCQkgKQorKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisrCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworKwkJICAgICAgZWxzZQorKwkJCXRtcF9sZW5ndGggPQorKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCisrCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLworKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKysJCQkJCSApCisrCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKysJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisrCQkgICAgICBicmVhazsKKysKKysJCSAgICBjYXNlICdvJzoKKysjIGlmZGVmIEhBVkVfTE9OR19MT05HCisrCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCisrCQkJdG1wX2xlbmd0aCA9CisrCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKKysJCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KKysJCQkJCSApCisrCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKysJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisrCQkgICAgICBlbHNlCisrIyBlbmRpZgorKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKKysJCQl0bXBfbGVuZ3RoID0KKysJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKKysJCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KKysJCQkJCSApCisrCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKysJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisrCQkgICAgICBlbHNlCisrCQkJdG1wX2xlbmd0aCA9CisrCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKKysJCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KKysJCQkJCSApCisrCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKysJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisrCQkgICAgICBicmVhazsKKysKKysJCSAgICBjYXNlICd4JzogY2FzZSAnWCc6CisrIyBpZmRlZiBIQVZFX0xPTkdfTE9ORworKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQorKwkJCXRtcF9sZW5ndGggPQorKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCisrCQkJCQkgICogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KKysJCQkJCSApCisrCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKysJCQkgICsgMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduIG9yIGFsdGVybmF0ZSBmb3JtICovCisrCQkgICAgICBlbHNlCisrIyBlbmRpZgorKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKKysJCQl0bXBfbGVuZ3RoID0KKysJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKKysJCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLworKwkJCQkJICkKKysJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworKwkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gb3IgYWx0ZXJuYXRlIGZvcm0gKi8KKysJCSAgICAgIGVsc2UKKysJCQl0bXBfbGVuZ3RoID0KKysJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVAorKwkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCisrCQkJCQkgKQorKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisrCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiBvciBhbHRlcm5hdGUgZm9ybSAqLworKwkJICAgICAgYnJlYWs7CisrCisrCQkgICAgY2FzZSAnZic6IGNhc2UgJ0YnOgorKyMgaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFKQorKwkJCXRtcF9sZW5ndGggPQorKwkJCSAgKHVuc2lnbmVkIGludCkgKExEQkxfTUFYX0VYUAorKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKysJCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCisrCQkJCQkgKQorKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisrCQkJICArIDEwOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KKysJCSAgICAgIGVsc2UKKysjIGVuZGlmCisrCQkJdG1wX2xlbmd0aCA9CisrCQkJICAodW5zaWduZWQgaW50KSAoREJMX01BWF9FWFAKKysJCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCisrCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLworKwkJCQkJICkKKysJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworKwkJCSAgKyAxMDsgLyogc2lnbiwgZGVjaW1hbCBwb2ludCBldGMuICovCisrCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgcHJlY2lzaW9uKTsKKysJCSAgICAgIGJyZWFrOworKworKwkJICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogY2FzZSAnZyc6IGNhc2UgJ0cnOgorKwkJICAgIGNhc2UgJ2EnOiBjYXNlICdBJzoKKysJCSAgICAgIHRtcF9sZW5ndGggPQorKwkJCTEyOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50LCBleHBvbmVudCBldGMuICovCisrCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgcHJlY2lzaW9uKTsKKysJCSAgICAgIGJyZWFrOworKworKwkJICAgIGNhc2UgJ2MnOgorKyMgaWYgZGVmaW5lZCBIQVZFX1dJTlRfVCAmJiAhV0lERV9DSEFSX1ZFUlNJT04KKysJCSAgICAgIGlmICh0eXBlID09IFRZUEVfV0lERV9DSEFSKQorKwkJCXRtcF9sZW5ndGggPSBNQl9DVVJfTUFYOworKwkJICAgICAgZWxzZQorKyMgZW5kaWYKKysJCQl0bXBfbGVuZ3RoID0gMTsKKysJCSAgICAgIGJyZWFrOworKworKwkJICAgIGNhc2UgJ3MnOgorKyMgaWZkZWYgSEFWRV9XQ0hBUl9UCisrCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX1dJREVfU1RSSU5HKQorKwkJCXsKKysJCQkgIHRtcF9sZW5ndGggPQorKwkJCSAgICBsb2NhbF93Y3NsZW4gKGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX3N0cmluZyk7CisrCisrIyAgaWYgIVdJREVfQ0hBUl9WRVJTSU9OCisrCQkJICB0bXBfbGVuZ3RoID0geHRpbWVzICh0bXBfbGVuZ3RoLCBNQl9DVVJfTUFYKTsKKysjICBlbmRpZgorKwkJCX0KKysJCSAgICAgIGVsc2UKKysjIGVuZGlmCisrCQkJdG1wX2xlbmd0aCA9IHN0cmxlbiAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3N0cmluZyk7CisrCQkgICAgICBicmVhazsKKysKKysJCSAgICBjYXNlICdwJzoKKysJCSAgICAgIHRtcF9sZW5ndGggPQorKwkJCSh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHZvaWQgKikgKiBDSEFSX0JJVAorKwkJCQkJKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLworKwkJCQkgICAgICAgKQorKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisrCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgMHggKi8KKysJCSAgICAgIGJyZWFrOworKworKwkJICAgIGRlZmF1bHQ6CisrCQkgICAgICBhYm9ydCAoKTsKKysJCSAgICB9CisrCisrCQkgIGlmICh0bXBfbGVuZ3RoIDwgd2lkdGgpCisrCQkgICAgdG1wX2xlbmd0aCA9IHdpZHRoOworKworKwkJICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7IC8qIGFjY291bnQgZm9yIHRyYWlsaW5nIE5VTCAqLworKwkJfQorKworKwkJaWYgKHRtcF9sZW5ndGggPD0gc2l6ZW9mICh0bXBidWYpIC8gc2l6ZW9mIChDSEFSX1QpKQorKwkJICB0bXAgPSB0bXBidWY7CisrCQllbHNlCisrCQkgIHsKKysJCSAgICBzaXplX3QgdG1wX21lbXNpemUgPSB4dGltZXMgKHRtcF9sZW5ndGgsIHNpemVvZiAoQ0hBUl9UKSk7CisrCisrCQkgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAodG1wX21lbXNpemUpKQorKwkJICAgICAgLyogT3ZlcmZsb3csIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeS4gICovCisrCQkgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisrCQkgICAgdG1wID0gKENIQVJfVCAqKSBtYWxsb2MgKHRtcF9tZW1zaXplKTsKKysJCSAgICBpZiAodG1wID09IE5VTEwpCisrCQkgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KKysJCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKysJCSAgfQorKyNlbmRpZgorKworKwkJLyogQ29uc3RydWN0IHRoZSBmb3JtYXQgc3RyaW5nIGZvciBjYWxsaW5nIHNucHJpbnRmIG9yCisrCQkgICBzcHJpbnRmLiAgKi8KKysJCXAgPSBidWY7CisrCQkqcCsrID0gJyUnOworKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfR1JPVVApCisrCQkgICpwKysgPSAnXCcnOworKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkKKysJCSAgKnArKyA9ICctJzsKKysJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX1NIT1dTSUdOKQorKwkJICAqcCsrID0gJysnOworKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfU1BBQ0UpCisrCQkgICpwKysgPSAnICc7CisrCQlpZiAoZHAtPmZsYWdzICYgRkxBR19BTFQpCisrCQkgICpwKysgPSAnIyc7CisrCQlpZiAoZHAtPmZsYWdzICYgRkxBR19aRVJPKQorKwkJICAqcCsrID0gJzAnOworKwkJaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQorKwkJICB7CisrCQkgICAgc2l6ZV90IG4gPSBkcC0+d2lkdGhfZW5kIC0gZHAtPndpZHRoX3N0YXJ0OworKwkJICAgIG1lbWNweSAocCwgZHAtPndpZHRoX3N0YXJ0LCBuICogc2l6ZW9mIChDSEFSX1QpKTsKKysJCSAgICBwICs9IG47CisrCQkgIH0KKysJCWlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQorKwkJICB7CisrCQkgICAgc2l6ZV90IG4gPSBkcC0+cHJlY2lzaW9uX2VuZCAtIGRwLT5wcmVjaXNpb25fc3RhcnQ7CisrCQkgICAgbWVtY3B5IChwLCBkcC0+cHJlY2lzaW9uX3N0YXJ0LCBuICogc2l6ZW9mIChDSEFSX1QpKTsKKysJCSAgICBwICs9IG47CisrCQkgIH0KKysKKysJCXN3aXRjaCAodHlwZSkKKysJCSAgeworKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworKwkJICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6CisrCQkgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6CisrCQkgICAgKnArKyA9ICdsJzsKKysJCSAgICAvKkZBTExUSFJPVUdIKi8KKysjZW5kaWYKKysJCSAgY2FzZSBUWVBFX0xPTkdJTlQ6CisrCQkgIGNhc2UgVFlQRV9VTE9OR0lOVDoKKysjaWZkZWYgSEFWRV9XSU5UX1QKKysJCSAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKKysjZW5kaWYKKysjaWZkZWYgSEFWRV9XQ0hBUl9UCisrCQkgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKKysjZW5kaWYKKysJCSAgICAqcCsrID0gJ2wnOworKwkJICAgIGJyZWFrOworKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisrCQkgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgorKwkJICAgICpwKysgPSAnTCc7CisrCQkgICAgYnJlYWs7CisrI2VuZGlmCisrCQkgIGRlZmF1bHQ6CisrCQkgICAgYnJlYWs7CisrCQkgIH0KKysJCSpwID0gZHAtPmNvbnZlcnNpb247CisrI2lmIFVTRV9TTlBSSU5URgorKwkJcFsxXSA9ICclJzsKKysJCXBbMl0gPSAnbic7CisrCQlwWzNdID0gJ1wwJzsKKysjZWxzZQorKwkJcFsxXSA9ICdcMCc7CisrI2VuZGlmCisrCisrCQkvKiBDb25zdHJ1Y3QgdGhlIGFyZ3VtZW50cyBmb3IgY2FsbGluZyBzbnByaW50ZiBvciBzcHJpbnRmLiAgKi8KKysJCXByZWZpeF9jb3VudCA9IDA7CisrCQlpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKKysJCSAgeworKwkJICAgIGlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorKwkJICAgICAgYWJvcnQgKCk7CisrCQkgICAgcHJlZml4ZXNbcHJlZml4X2NvdW50KytdID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKKysJCSAgfQorKwkJaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQorKwkJICB7CisrCQkgICAgaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorKwkJICAgICAgYWJvcnQgKCk7CisrCQkgICAgcHJlZml4ZXNbcHJlZml4X2NvdW50KytdID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7CisrCQkgIH0KKysKKysjaWYgVVNFX1NOUFJJTlRGCisrCQkvKiBQcmVwYXJlIGNoZWNraW5nIHdoZXRoZXIgc25wcmludGYgcmV0dXJucyB0aGUgY291bnQKKysJCSAgIHZpYSAlbi4gICovCisrCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7CisrCQlyZXN1bHRbbGVuZ3RoXSA9ICdcMCc7CisrI2VuZGlmCisrCisrCQlmb3IgKDs7KQorKwkJICB7CisrCQkgICAgc2l6ZV90IG1heGxlbjsKKysJCSAgICBpbnQgY291bnQ7CisrCQkgICAgaW50IHJldGNvdW50OworKworKwkJICAgIG1heGxlbiA9IGFsbG9jYXRlZCAtIGxlbmd0aDsKKysJCSAgICBjb3VudCA9IC0xOworKwkJICAgIHJldGNvdW50ID0gMDsKKysKKysjaWYgVVNFX1NOUFJJTlRGCisrIyBkZWZpbmUgU05QUklOVEZfQlVGKGFyZykgXAorKwkJICAgIHN3aXRjaCAocHJlZml4X2NvdW50KQkJCQkgICAgXAorKwkJICAgICAgewkJCQkJCQkgICAgXAorKwkJICAgICAgY2FzZSAwOgkJCQkJCSAgICBcCisrCQkJcmV0Y291bnQgPSBTTlBSSU5URiAocmVzdWx0ICsgbGVuZ3RoLCBtYXhsZW4sIGJ1ZiwgIFwKKysJCQkJCSAgICAgYXJnLCAmY291bnQpOwkJICAgIFwKKysJCQlicmVhazsJCQkJCQkgICAgXAorKwkJICAgICAgY2FzZSAxOgkJCQkJCSAgICBcCisrCQkJcmV0Y291bnQgPSBTTlBSSU5URiAocmVzdWx0ICsgbGVuZ3RoLCBtYXhsZW4sIGJ1ZiwgIFwKKysJCQkJCSAgICAgcHJlZml4ZXNbMF0sIGFyZywgJmNvdW50KTsJICAgIFwKKysJCQlicmVhazsJCQkJCQkgICAgXAorKwkJICAgICAgY2FzZSAyOgkJCQkJCSAgICBcCisrCQkJcmV0Y291bnQgPSBTTlBSSU5URiAocmVzdWx0ICsgbGVuZ3RoLCBtYXhsZW4sIGJ1ZiwgIFwKKysJCQkJCSAgICAgcHJlZml4ZXNbMF0sIHByZWZpeGVzWzFdLCBhcmcsIFwKKysJCQkJCSAgICAgJmNvdW50KTsJCQkgICAgXAorKwkJCWJyZWFrOwkJCQkJCSAgICBcCisrCQkgICAgICBkZWZhdWx0OgkJCQkJCSAgICBcCisrCQkJYWJvcnQgKCk7CQkJCQkgICAgXAorKwkJICAgICAgfQorKyNlbHNlCisrIyBkZWZpbmUgU05QUklOVEZfQlVGKGFyZykgXAorKwkJICAgIHN3aXRjaCAocHJlZml4X2NvdW50KQkJCQkgICAgXAorKwkJICAgICAgewkJCQkJCQkgICAgXAorKwkJICAgICAgY2FzZSAwOgkJCQkJCSAgICBcCisrCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgYXJnKTsJCSAgICBcCisrCQkJYnJlYWs7CQkJCQkJICAgIFwKKysJCSAgICAgIGNhc2UgMToJCQkJCQkgICAgXAorKwkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIHByZWZpeGVzWzBdLCBhcmcpOwkgICAgXAorKwkJCWJyZWFrOwkJCQkJCSAgICBcCisrCQkgICAgICBjYXNlIDI6CQkJCQkJICAgIFwKKysJCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBwcmVmaXhlc1swXSwgcHJlZml4ZXNbMV0sXAorKwkJCQkJIGFyZyk7CQkJCSAgICBcCisrCQkJYnJlYWs7CQkJCQkJICAgIFwKKysJCSAgICAgIGRlZmF1bHQ6CQkJCQkJICAgIFwKKysJCQlhYm9ydCAoKTsJCQkJCSAgICBcCisrCQkgICAgICB9CisrI2VuZGlmCisrCisrCQkgICAgc3dpdGNoICh0eXBlKQorKwkJICAgICAgeworKwkJICAgICAgY2FzZSBUWVBFX1NDSEFSOgorKwkJCXsKKysJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc2NoYXI7CisrCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisrCQkJfQorKwkJCWJyZWFrOworKwkJICAgICAgY2FzZSBUWVBFX1VDSEFSOgorKwkJCXsKKysJCQkgIHVuc2lnbmVkIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWNoYXI7CisrCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisrCQkJfQorKwkJCWJyZWFrOworKwkJICAgICAgY2FzZSBUWVBFX1NIT1JUOgorKwkJCXsKKysJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc2hvcnQ7CisrCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisrCQkJfQorKwkJCWJyZWFrOworKwkJICAgICAgY2FzZSBUWVBFX1VTSE9SVDoKKysJCQl7CisrCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VzaG9ydDsKKysJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKysJCQl9CisrCQkJYnJlYWs7CisrCQkgICAgICBjYXNlIFRZUEVfSU5UOgorKwkJCXsKKysJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfaW50OworKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworKwkJCX0KKysJCQlicmVhazsKKysJCSAgICAgIGNhc2UgVFlQRV9VSU5UOgorKwkJCXsKKysJCQkgIHVuc2lnbmVkIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWludDsKKysJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKysJCQl9CisrCQkJYnJlYWs7CisrCQkgICAgICBjYXNlIFRZUEVfTE9OR0lOVDoKKysJCQl7CisrCQkJICBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2ludDsKKysJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKysJCQl9CisrCQkJYnJlYWs7CisrCQkgICAgICBjYXNlIFRZUEVfVUxPTkdJTlQ6CisrCQkJeworKwkJCSAgdW5zaWduZWQgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Vsb25naW50OworKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworKwkJCX0KKysJCQlicmVhazsKKysjaWZkZWYgSEFWRV9MT05HX0xPTkcKKysJCSAgICAgIGNhc2UgVFlQRV9MT05HTE9OR0lOVDoKKysJCQl7CisrCQkJICBsb25nIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nbG9uZ2ludDsKKysJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKysJCQl9CisrCQkJYnJlYWs7CisrCQkgICAgICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgorKwkJCXsKKysJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Vsb25nbG9uZ2ludDsKKysJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKysJCQl9CisrCQkJYnJlYWs7CisrI2VuZGlmCisrCQkgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorKwkJCXsKKysJCQkgIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlOworKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworKwkJCX0KKysJCQlicmVhazsKKysjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorKwkJICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6CisrCQkJeworKwkJCSAgbG9uZyBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdkb3VibGU7CisrCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisrCQkJfQorKwkJCWJyZWFrOworKyNlbmRpZgorKwkJICAgICAgY2FzZSBUWVBFX0NIQVI6CisrCQkJeworKwkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jaGFyOworKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworKwkJCX0KKysJCQlicmVhazsKKysjaWZkZWYgSEFWRV9XSU5UX1QKKysJCSAgICAgIGNhc2UgVFlQRV9XSURFX0NIQVI6CisrCQkJeworKwkJCSAgd2ludF90IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX2NoYXI7CisrCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisrCQkJfQorKwkJCWJyZWFrOworKyNlbmRpZgorKwkJICAgICAgY2FzZSBUWVBFX1NUUklORzoKKysJCQl7CisrCQkJICBjb25zdCBjaGFyICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc3RyaW5nOworKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworKwkJCX0KKysJCQlicmVhazsKKysjaWZkZWYgSEFWRV9XQ0hBUl9UCisrCQkgICAgICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6CisrCQkJeworKwkJCSAgY29uc3Qgd2NoYXJfdCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3dpZGVfc3RyaW5nOworKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworKwkJCX0KKysJCQlicmVhazsKKysjZW5kaWYKKysJCSAgICAgIGNhc2UgVFlQRV9QT0lOVEVSOgorKwkJCXsKKysJCQkgIHZvaWQgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9wb2ludGVyOworKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworKwkJCX0KKysJCQlicmVhazsKKysJCSAgICAgIGRlZmF1bHQ6CisrCQkJYWJvcnQgKCk7CisrCQkgICAgICB9CisrCisrI2lmIFVTRV9TTlBSSU5URgorKwkJICAgIC8qIFBvcnRhYmlsaXR5OiBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyBvZiBzbnByaW50ZigpCisrCQkgICAgICAgYXJlIElTTyBDIDk5IGNvbXBsaWFudC4gIERldGVybWluZSB0aGUgbnVtYmVyIG9mCisrCQkgICAgICAgYnl0ZXMgdGhhdCBzbnByaW50ZigpIGhhcyBwcm9kdWNlZCBvciB3b3VsZCBoYXZlCisrCQkgICAgICAgcHJvZHVjZWQuICAqLworKwkJICAgIGlmIChjb3VudCA+PSAwKQorKwkJICAgICAgeworKwkJCS8qIFZlcmlmeSB0aGF0IHNucHJpbnRmKCkgaGFzIE5VTC10ZXJtaW5hdGVkIGl0cworKwkJCSAgIHJlc3VsdC4gICovCisrCQkJaWYgKGNvdW50IDwgbWF4bGVuICYmIHJlc3VsdFtsZW5ndGggKyBjb3VudF0gIT0gJ1wwJykKKysJCQkgIGFib3J0ICgpOworKwkJCS8qIFBvcnRhYmlsaXR5IGhhY2suICAqLworKwkJCWlmIChyZXRjb3VudCA+IGNvdW50KQorKwkJCSAgY291bnQgPSByZXRjb3VudDsKKysJCSAgICAgIH0KKysJCSAgICBlbHNlCisrCQkgICAgICB7CisrCQkJLyogc25wcmludGYoKSBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicKKysJCQkgICBkaXJlY3RpdmUuICAqLworKwkJCWlmIChwWzFdICE9ICdcMCcpCisrCQkJICB7CisrCQkJICAgIC8qIERvbid0IHVzZSB0aGUgJyVuJyBkaXJlY3RpdmU7IGluc3RlYWQsIGxvb2sKKysJCQkgICAgICAgYXQgdGhlIHNucHJpbnRmKCkgcmV0dXJuIHZhbHVlLiAgKi8KKysJCQkgICAgcFsxXSA9ICdcMCc7CisrCQkJICAgIGNvbnRpbnVlOworKwkJCSAgfQorKwkJCWVsc2UKKysJCQkgIHsKKysJCQkgICAgLyogTG9vayBhdCB0aGUgc25wcmludGYoKSByZXR1cm4gdmFsdWUuICAqLworKwkJCSAgICBpZiAocmV0Y291bnQgPCAwKQorKwkJCSAgICAgIHsKKysJCQkJLyogSFAtVVggMTAuMjAgc25wcmludGYoKSBpcyBkb3VibHkgZGVmaWNpZW50OgorKwkJCQkgICBJdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicgZGlyZWN0aXZlLAorKwkJCQkgICAqYW5kKiBpdCByZXR1cm5zIC0xIChyYXRoZXIgdGhhbiB0aGUgbGVuZ3RoCisrCQkJCSAgIHRoYXQgd291bGQgaGF2ZSBiZWVuIHJlcXVpcmVkKSB3aGVuIHRoZQorKwkJCQkgICBidWZmZXIgaXMgdG9vIHNtYWxsLiAgKi8KKysJCQkJc2l6ZV90IGJpZ2dlcl9uZWVkID0KKysJCQkJICB4c3VtICh4dGltZXMgKGFsbG9jYXRlZCwgMiksIDEyKTsKKysJCQkJRU5TVVJFX0FMTE9DQVRJT04gKGJpZ2dlcl9uZWVkKTsKKysJCQkJY29udGludWU7CisrCQkJICAgICAgfQorKwkJCSAgICBlbHNlCisrCQkJICAgICAgY291bnQgPSByZXRjb3VudDsKKysJCQkgIH0KKysJCSAgICAgIH0KKysjZW5kaWYKKysKKysJCSAgICAvKiBBdHRlbXB0IHRvIGhhbmRsZSBmYWlsdXJlLiAgKi8KKysJCSAgICBpZiAoY291bnQgPCAwKQorKwkJICAgICAgeworKwkJCWlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQorKwkJCSAgZnJlZSAocmVzdWx0KTsKKysJCQlpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCisrCQkJICBmcmVlIChidWZfbWFsbG9jZWQpOworKwkJCUNMRUFOVVAgKCk7CisrCQkJZXJybm8gPSBFSU5WQUw7CisrCQkJcmV0dXJuIE5VTEw7CisrCQkgICAgICB9CisrCisrI2lmICFVU0VfU05QUklOVEYKKysJCSAgICBpZiAoY291bnQgPj0gdG1wX2xlbmd0aCkKKysJCSAgICAgIC8qIHRtcF9sZW5ndGggd2FzIGluY29ycmVjdGx5IGNhbGN1bGF0ZWQgLSBmaXggdGhlCisrCQkJIGNvZGUgYWJvdmUhICAqLworKwkJICAgICAgYWJvcnQgKCk7CisrI2VuZGlmCisrCisrCQkgICAgLyogTWFrZSByb29tIGZvciB0aGUgcmVzdWx0LiAgKi8KKysJCSAgICBpZiAoY291bnQgPj0gbWF4bGVuKQorKwkJICAgICAgeworKwkJCS8qIE5lZWQgYXQgbGVhc3QgY291bnQgYnl0ZXMuICBCdXQgYWxsb2NhdGUKKysJCQkgICBwcm9wb3J0aW9uYWxseSwgdG8gYXZvaWQgbG9vcGluZyBldGVybmFsbHkgaWYKKysJCQkgICBzbnByaW50ZigpIHJlcG9ydHMgYSB0b28gc21hbGwgY291bnQuICAqLworKwkJCXNpemVfdCBuID0KKysJCQkgIHhtYXggKHhzdW0gKGxlbmd0aCwgY291bnQpLCB4dGltZXMgKGFsbG9jYXRlZCwgMikpOworKworKwkJCUVOU1VSRV9BTExPQ0FUSU9OIChuKTsKKysjaWYgVVNFX1NOUFJJTlRGCisrCQkJY29udGludWU7CisrI2VuZGlmCisrCQkgICAgICB9CisrCisrI2lmIFVTRV9TTlBSSU5URgorKwkJICAgIC8qIFRoZSBzbnByaW50ZigpIHJlc3VsdCBkaWQgZml0LiAgKi8KKysjZWxzZQorKwkJICAgIC8qIEFwcGVuZCB0aGUgc3ByaW50ZigpIHJlc3VsdC4gICovCisrCQkgICAgbWVtY3B5IChyZXN1bHQgKyBsZW5ndGgsIHRtcCwgY291bnQgKiBzaXplb2YgKENIQVJfVCkpOworKwkJICAgIGlmICh0bXAgIT0gdG1wYnVmKQorKwkJICAgICAgZnJlZSAodG1wKTsKKysjZW5kaWYKKysKKysJCSAgICBsZW5ndGggKz0gY291bnQ7CisrCQkgICAgYnJlYWs7CisrCQkgIH0KKysJICAgICAgfQorKwkgIH0KKysgICAgICB9CisrCisrICAgIC8qIEFkZCB0aGUgZmluYWwgTlVMLiAgKi8KKysgICAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgMSkpOworKyAgICByZXN1bHRbbGVuZ3RoXSA9ICdcMCc7CisrCisrICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmICYmIGxlbmd0aCArIDEgPCBhbGxvY2F0ZWQpCisrICAgICAgeworKwkvKiBTaHJpbmsgdGhlIGFsbG9jYXRlZCBtZW1vcnkgaWYgcG9zc2libGUuICAqLworKwlDSEFSX1QgKm1lbW9yeTsKKysKKysJbWVtb3J5ID0gKENIQVJfVCAqKSByZWFsbG9jIChyZXN1bHQsIChsZW5ndGggKyAxKSAqIHNpemVvZiAoQ0hBUl9UKSk7CisrCWlmIChtZW1vcnkgIT0gTlVMTCkKKysJICByZXN1bHQgPSBtZW1vcnk7CisrICAgICAgfQorKworKyAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCisrICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKKysgICAgQ0xFQU5VUCAoKTsKKysgICAgKmxlbmd0aHAgPSBsZW5ndGg7CisrICAgIHJldHVybiByZXN1bHQ7CisrCisrICBvdXRfb2ZfbWVtb3J5OgorKyAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKKysgICAgICBmcmVlIChyZXN1bHQpOworKyAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCisrICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKKysgIG91dF9vZl9tZW1vcnlfMToKKysgICAgQ0xFQU5VUCAoKTsKKysgICAgZXJybm8gPSBFTk9NRU07CisrICAgIHJldHVybiBOVUxMOworKyAgfQorK30KKysKKysjdW5kZWYgU05QUklOVEYKKysjdW5kZWYgVVNFX1NOUFJJTlRGCisrI3VuZGVmIFBSSU5URl9QQVJTRQorKyN1bmRlZiBESVJFQ1RJVkVTCisrI3VuZGVmIERJUkVDVElWRQorKyN1bmRlZiBDSEFSX1QKKysjdW5kZWYgVkFTTlBSSU5URgorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3Zhc25wcmludGYuaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC92YXNucHJpbnRmLmgJMjAwNC0wOS0xMiAxNDo0MDozNC42Njc3MDA2NjQgLTA0MDAKK0BAIC0wLDAgKzEsNjEgQEAKKysvKiB2c3ByaW50ZiB3aXRoIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KKysgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgYW55IGxhdGVyIHZlcnNpb24uCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisrCisrI2lmbmRlZiBfVkFTTlBSSU5URl9ICisrI2RlZmluZSBfVkFTTlBSSU5URl9ICisrCisrLyogR2V0IHZhX2xpc3QuICAqLworKyNpbmNsdWRlIDxzdGRhcmcuaD4KKysKKysvKiBHZXQgc2l6ZV90LiAgKi8KKysjaW5jbHVkZSA8c3RkZGVmLmg+CisrCisrI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCisrLyogVGhpcyBmZWF0dXJlIGlzIGF2YWlsYWJsZSBpbiBnY2MgdmVyc2lvbnMgMi41IGFuZCBsYXRlci4gICovCisrIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA1KSB8fCBfX1NUUklDVF9BTlNJX18KKysjICBkZWZpbmUgX19hdHRyaWJ1dGVfXyhTcGVjKSAvKiBlbXB0eSAqLworKyMgZW5kaWYKKysvKiBUaGUgX18tcHJvdGVjdGVkIHZhcmlhbnRzIG9mIGBmb3JtYXQnIGFuZCBgcHJpbnRmJyBhdHRyaWJ1dGVzCisrICAgYXJlIGFjY2VwdGVkIGJ5IGdjYyB2ZXJzaW9ucyAyLjYuNCAoZWZmZWN0aXZlbHkgMi43KSBhbmQgbGF0ZXIuICAqLworKyMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykKKysjICBkZWZpbmUgX19mb3JtYXRfXyBmb3JtYXQKKysjICBkZWZpbmUgX19wcmludGZfXyBwcmludGYKKysjIGVuZGlmCisrI2VuZGlmCisrCisrI2lmZGVmCV9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIiB7CisrI2VuZGlmCisrCisrLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBhIHN0cmluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4KKysgICBZb3UgY2FuIHBhc3MgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGluIFJFU1VMVEJVRiBhbmQgaXRzCisrICAgc2l6ZSBpbiAqTEVOR1RIUDsgb3RoZXJ3aXNlIHlvdSBwYXNzIFJFU1VMVEJVRiA9IE5VTEwuCisrICAgSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHJpbmcgKHRoaXMgbWF5IGJlID0gUkVTVUxUQlVGCisrICAgaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB3YXMgbmVjZXNzYXJ5KSBhbmQgc2V0ICpMRU5HVEhQIHRvIHRoZQorKyAgIG51bWJlciBvZiByZXN1bHRpbmcgYnl0ZXMsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgVXBvbiBlcnJvciwgc2V0CisrICAgZXJybm8gYW5kIHJldHVybiBOVUxMLiAgKi8KKytleHRlcm4gY2hhciAqIGFzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorKyAgICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKKytleHRlcm4gY2hhciAqIHZhc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKKysgICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7CisrCisrI2lmZGVmCV9fY3BsdXNwbHVzCisrfQorKyNlbmRpZgorKworKyNlbmRpZiAvKiBfVkFTTlBSSU5URl9IICovCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvdmFzbndwcmludGYuaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC92YXNud3ByaW50Zi5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjczNjk5NzUyIC0wNDAwCitAQCAtMCwwICsxLDQ2IEBACisrLyogdnN3cHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgorKyAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZuZGVmIF9WQVNOV1BSSU5URl9ICisrI2RlZmluZSBfVkFTTldQUklOVEZfSAorKworKy8qIEdldCB2YV9saXN0LiAgKi8KKysjaW5jbHVkZSA8c3RkYXJnLmg+CisrCisrLyogR2V0IHdjaGFyX3QsIHNpemVfdC4gICovCisrI2luY2x1ZGUgPHN0ZGRlZi5oPgorKworKyNpZmRlZglfX2NwbHVzcGx1cworK2V4dGVybiAiQyIgeworKyNlbmRpZgorKworKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCisrICAgWW91IGNhbiBwYXNzIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBpbiBSRVNVTFRCVUYgYW5kIGl0cworKyAgIHNpemUgaW4gKkxFTkdUSFA7IG90aGVyd2lzZSB5b3UgcGFzcyBSRVNVTFRCVUYgPSBOVUxMLgorKyAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nICh0aGlzIG1heSBiZSA9IFJFU1VMVEJVRgorKyAgIGlmIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gd2FzIG5lY2Vzc2FyeSkgYW5kIHNldCAqTEVOR1RIUCB0byB0aGUKKysgICBudW1iZXIgb2YgcmVzdWx0aW5nIGJ5dGVzLCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gIFVwb24gZXJyb3IsIHNldAorKyAgIGVycm5vIGFuZCByZXR1cm4gTlVMTC4gICovCisrZXh0ZXJuIHdjaGFyX3QgKiBhc253cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pOworK2V4dGVybiB3Y2hhcl90ICogdmFzbndwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7CisrCisrI2lmZGVmCV9fY3BsdXNwbHVzCisrfQorKyNlbmRpZgorKworKyNlbmRpZiAvKiBfVkFTTldQUklOVEZfSCAqLworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL1ZFUlNJT04JMTk5OC0wNC0yNiAwOToyMjozNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwvVkVSU0lPTgkyMDA0LTA5LTEyIDE0OjQwOjM0LjY3OTY5ODg0MCAtMDQwMAorQEAgLTEgKzEgQEAKKy1HTlUgZ2V0dGV4dCBsaWJyYXJ5IGZyb20gZ2V0dGV4dC0wLjEwLjMyCisrR05VIGdldHRleHQgbGlicmFyeSBmcm9tIGdldHRleHQtMC4xNC4xCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvd3ByaW50Zi1wYXJzZS5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9pbnRsL3dwcmludGYtcGFyc2UuaAkyMDA0LTA5LTEyIDE0OjQwOjM0LjY5NTY5NjQwOCAtMDQwMAorQEAgLTAsMCArMSw3NSBAQAorKy8qIFBhcnNlIHByaW50ZiBmb3JtYXQgc3RyaW5nLgorKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisrICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKysgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisrICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrCisrICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKysgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisrICAgVVNBLiAgKi8KKysKKysjaWZuZGVmIF9XUFJJTlRGX1BBUlNFX0gKKysjZGVmaW5lIF9XUFJJTlRGX1BBUlNFX0gKKysKKysjaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKKysKKysKKysvKiBGbGFncyAqLworKyNkZWZpbmUgRkxBR19HUk9VUAkgMQkvKiAnIGZsYWcgKi8KKysjZGVmaW5lIEZMQUdfTEVGVAkgMgkvKiAtIGZsYWcgKi8KKysjZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCisrI2RlZmluZSBGTEFHX1NQQUNFCSA4CS8qIHNwYWNlIGZsYWcgKi8KKysjZGVmaW5lIEZMQUdfQUxUCTE2CS8qICMgZmxhZyAqLworKyNkZWZpbmUgRkxBR19aRVJPCTMyCisrCisrLyogYXJnX2luZGV4IHZhbHVlIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudCBpcyBjb25zdW1lZC4gICovCisrI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKKysKKysvKiBBIHBhcnNlZCBkaXJlY3RpdmUuICAqLworK3R5cGVkZWYgc3RydWN0CisreworKyAgY29uc3Qgd2NoYXJfdCogZGlyX3N0YXJ0OworKyAgY29uc3Qgd2NoYXJfdCogZGlyX2VuZDsKKysgIGludCBmbGFnczsKKysgIGNvbnN0IHdjaGFyX3QqIHdpZHRoX3N0YXJ0OworKyAgY29uc3Qgd2NoYXJfdCogd2lkdGhfZW5kOworKyAgc2l6ZV90IHdpZHRoX2FyZ19pbmRleDsKKysgIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9zdGFydDsKKysgIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9lbmQ7CisrICBzaXplX3QgcHJlY2lzaW9uX2FyZ19pbmRleDsKKysgIHdjaGFyX3QgY29udmVyc2lvbjsgLyogZCBpIG8gdSB4IFggZiBlIEUgZyBHIGMgcyBwIG4gVSAlIGJ1dCBub3QgQyBTICovCisrICBzaXplX3QgYXJnX2luZGV4OworK30KKyt3Y2hhcl90X2RpcmVjdGl2ZTsKKysKKysvKiBBIHBhcnNlZCBmb3JtYXQgc3RyaW5nLiAgKi8KKyt0eXBlZGVmIHN0cnVjdAorK3sKKysgIHNpemVfdCBjb3VudDsKKysgIHdjaGFyX3RfZGlyZWN0aXZlICpkaXI7CisrICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKKysgIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKKyt9Cisrd2NoYXJfdF9kaXJlY3RpdmVzOworKworKworKy8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKKysgICBpbiBkaXJlY3RpdmVzWzBdLCAuLi4sIGRpcmVjdGl2ZXNbTi0xXSwgYW5kIHNldHMgZGlyZWN0aXZlc1tOXS5kaXJfc3RhcnQKKysgICB0byB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgQWxzbyBmaWxscyBpbiB0aGUgYXJnX3R5cGUgZmllbGRzIG9mIHRoZQorKyAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLworKyNpZmRlZiBTVEFUSUMKKytTVEFUSUMKKysjZWxzZQorK2V4dGVybgorKyNlbmRpZgorK2ludCB3cHJpbnRmX3BhcnNlIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHdjaGFyX3RfZGlyZWN0aXZlcyAqZCwgYXJndW1lbnRzICphKTsKKysKKysjZW5kaWYgLyogX1dQUklOVEZfUEFSU0VfSCAqLworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3hvcGVuLW1zZy5zZWQJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL2ludGwveG9wZW4tbXNnLnNlZAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorQEAgLTEsMTA0ICswLDAgQEAKKy0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIFgvT3BlbiBzdHlsZSAubXNnIGZpbGUKKy0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KKy0jCistIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKy0jIGFueSBsYXRlciB2ZXJzaW9uLgorLSMKKy0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCistIworLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCistIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorLSMKKy0jCistIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSAubXNnIHNob3VsZCBiZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKy0jIG1lc3NhZ2Ugc2V0IG51bWJlci4gIFdlIHVzZSBhbHdheXMgc2V0IG51bWJlciAxLgorLSMKKy0xIHsKKy0gIGlcCistJHNldCAxICMgQXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHBvMm1zZy5zZWQKKy0gIGgKKy0gIHMvLiovMC8KKy0gIHgKKy19CistIworLSMgV2UgY29weSBhbGwgY29tbWVudHMgaW50byB0aGUgLm1zZyBmaWxlLiAgUGVyaGFwcyB0aGV5IGNhbiBoZWxwLgorLSMKKy0vXiMvIHMvXiNbIAldKi8kIC9wCistIworLSMgV2UgY29weSB0aGUgb3JpZ2luYWwgbWVzc2FnZSBhcyBhIGNvbW1lbnQgaW50byB0aGUgLm1zZyBmaWxlLgorLSMKKy0vXm1zZ2lkLyB7CistIyBEb2VzIG5vdCB3b3JrIG5vdworLSMgIC8iJC8hIHsKKy0jICAgIHMvXFwkLy8KKy0jICAgIHMvJC8gLi4uIChtb3JlIGxpbmVzIGZvbGxvd2luZykiLworLSMgIH0KKy0gIHMvXm1zZ2lkWyAJXSoiXCguKlwpIiQvJCBPcmlnaW5hbCBNZXNzYWdlOiBcMS8KKy0gIHAKKy19CistIworLSMgVGhlIC5tc2cgZmlsZSBjb250YWlucywgb3RoZXIgdGhlbiB0aGUgLnBvIGZpbGUsIG9ubHkgdGhlIHRyYW5zbGF0aW9ucworLSMgYnV0IGVhY2ggZ2l2ZW4gYSB1bmlxdWUgSUQuICBTdGFydGluZyBmcm9tIDEgYW5kIGluY3JlbWVudGluZyBieSAxIGZvcgorLSMgZWFjaCBtZXNzYWdlIHdlIGFzc2lnbiB0aGVtIHRvIHRoZSBtZXNzYWdlcy4KKy0jIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSAucG8gZmlsZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjYXQtaWQtdGJsLmMgZmlsZQorLSMgKHdpdGggcG8tdG8tdGJsKSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgaGVyZS4gIChBdCBsZWFzdCB0aGUgb3JkZXIKKy0jIG9mIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBiZSBjaGFuZ2VkLikKKy0jCistL15tc2dzdHIvIHsKKy0gIHMvbXNnc3RyWyAJXSoiXCguKlwpIi9cMS8KKy0gIHgKKy0jIFRoZSBmb2xsb3dpbmcgbmljZSBzb2x1dGlvbiBpcyBieQorLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+CistICB0ZAorLSMgSW5jcmVtZW50IGEgZGVjaW1hbCBudW1iZXIgaW4gcGF0dGVybiBzcGFjZS4KKy0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KKy0gIDpkCistICBzLzlcKF8qXCkkL19cMS8KKy0gIHRkCistIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KKy0gIHMvXlwoXypcKSQvMFwxLworLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgorLSAgcy84XChfKlwpJC85XDEvCistICBzLzdcKF8qXCkkLzhcMS8KKy0gIHMvNlwoXypcKSQvN1wxLworLSAgcy81XChfKlwpJC82XDEvCistICBzLzRcKF8qXCkkLzVcMS8KKy0gIHMvM1woXypcKSQvNFwxLworLSAgcy8yXChfKlwpJC8zXDEvCistICBzLzFcKF8qXCkkLzJcMS8KKy0gIHMvMFwoXypcKSQvMVwxLworLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KKy0gIHMvXy8wL2cKKy0gIHgKKy0jIEJyaW5nIHRoZSBsaW5lIGluIHRoZSBmb3JtYXQgYDxudW1iZXI+IDxtZXNzYWdlPicKKy0gIEcKKy0gIHMvXlteXG5dKiQvJiAvCistICBzL1woLipcKVxuXChbMC05XSpcKS9cMiBcMS8KKy0jIENsZWFyIGZsYWcgZnJvbSBsYXN0IHN1YnN0aXR1dGlvbi4KKy0gIHRiCistIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KKy0gIDpiCistICBOCistIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgYSBjb250aW51YXRpb24gbGluZS4KKy0gIHMvXCguKlxuXCkiXCguKlwpIi9cMVwyLworLSMgWWVzLCB0aGVuIGJyYW5jaC4KKy0gIHRhCistICBQCistICBECistIyBOb3RlIHRoYXQgYEQnIGluY2x1ZGVzIGEganVtcCB0byB0aGUgc3RhcnQhIQorLSMgV2UgZm91bmQgYSBjb250aW51YXRpb24gbGluZS4gIEJ1dCBiZWZvcmUgcHJpbnRpbmcgaW5zZXJ0ICdcJy4KKy0gIDphCistICBzL1woLipcKVwoXG4uKlwpL1wxXFxcMi8KKy0gIFAKKy0jIFdlIGNhbm5vdCB1c2UgdGhlIHNlZCBjb21tYW5kIGBEJyBoZXJlCistICBzLy4qXG5cKC4qXCkvXDEvCistICB0YgorLX0KKy1kCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwveHNpemUuaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvaW50bC94c2l6ZS5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNzAwNjk1NjQ4IC0wNDAwCitAQCAtMCwwICsxLDEwOSBAQAorKy8qIHhzaXplLmggLS0gQ2hlY2tlZCBzaXplX3QgY29tcHV0YXRpb25zLgorKworKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKysKKysgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKysgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisrICAgYW55IGxhdGVyIHZlcnNpb24uCisrCisrICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKworKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorKyAgIFVTQS4gICovCisrCisrI2lmbmRlZiBfWFNJWkVfSAorKyNkZWZpbmUgX1hTSVpFX0gKKysKKysvKiBHZXQgc2l6ZV90LiAgKi8KKysjaW5jbHVkZSA8c3RkZGVmLmg+CisrCisrLyogR2V0IFNJWkVfTUFYLiAgKi8KKysjaW5jbHVkZSA8bGltaXRzLmg+CisrI2lmIEhBVkVfU1RESU5UX0gKKysjIGluY2x1ZGUgPHN0ZGludC5oPgorKyNlbmRpZgorKworKy8qIFRoZSBzaXplIG9mIG1lbW9yeSBvYmplY3RzIGlzIG9mdGVuIGNvbXB1dGVkIHRocm91Z2ggZXhwcmVzc2lvbnMgb2YKKysgICB0eXBlIHNpemVfdC4gRXhhbXBsZToKKysgICAgICB2b2lkKiBwID0gbWFsbG9jIChoZWFkZXJfc2l6ZSArIG4gKiBlbGVtZW50X3NpemUpLgorKyAgIFRoZXNlIGNvbXB1dGF0aW9ucyBjYW4gbGVhZCB0byBvdmVyZmxvdy4gIFdoZW4gdGhpcyBoYXBwZW5zLCBtYWxsb2MoKQorKyAgIHJldHVybnMgYSBwaWVjZSBvZiBtZW1vcnkgdGhhdCBpcyB3YXkgdG9vIHNtYWxsLCBhbmQgdGhlIHByb2dyYW0gdGhlbgorKyAgIGNyYXNoZXMgd2hpbGUgYXR0ZW1wdGluZyB0byBmaWxsIHRoZSBtZW1vcnkuCisrICAgVG8gYXZvaWQgdGhpcywgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGluIHRoaXMgZmlsZSBjaGVjayBmb3Igb3ZlcmZsb3cuCisrICAgVGhlIGNvbnZlbnRpb24gaXMgdGhhdCBTSVpFX01BWCByZXByZXNlbnRzIG92ZXJmbG93LgorKyAgIG1hbGxvYyAoU0laRV9NQVgpIGlzIG5vdCBndWFyYW50ZWVkIHRvIGZhaWwgLS0gdGhpbmsgb2YgYSBtYWxsb2MKKysgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbW1hcCAtLSwgaXQncyByZWNvbW1lbmRlZCB0byB1c2Ugc2l6ZV9vdmVyZmxvd19wKCkKKysgICBvciBzaXplX2luX2JvdW5kc19wKCkgYmVmb3JlIGludm9raW5nIG1hbGxvYygpLgorKyAgIFRoZSBleGFtcGxlIHRodXMgYmVjb21lczoKKysgICAgICBzaXplX3Qgc2l6ZSA9IHhzdW0gKGhlYWRlcl9zaXplLCB4dGltZXMgKG4sIGVsZW1lbnRfc2l6ZSkpOworKyAgICAgIHZvaWQgKnAgPSAoc2l6ZV9pbl9ib3VuZHNfcCAoc2l6ZSkgPyBtYWxsb2MgKHNpemUpIDogTlVMTCk7CisrKi8KKysKKysvKiBDb252ZXJ0IGFuIGFyYml0cmFyeSB2YWx1ZSA+PSAwIHRvIHR5cGUgc2l6ZV90LiAgKi8KKysjZGVmaW5lIHhjYXN0X3NpemVfdChOKSBcCisrICAoKE4pIDw9IFNJWkVfTUFYID8gKHNpemVfdCkgKE4pIDogU0laRV9NQVgpCisrCisrLyogU3VtIG9mIHR3byBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCisrc3RhdGljIGlubGluZSBzaXplX3QKKysjaWYgX19HTlVDX18gPj0gMworK19fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisrI2VuZGlmCisreHN1bSAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIpCisreworKyAgc2l6ZV90IHN1bSA9IHNpemUxICsgc2l6ZTI7CisrICByZXR1cm4gKHN1bSA+PSBzaXplMSA/IHN1bSA6IFNJWkVfTUFYKTsKKyt9CisrCisrLyogU3VtIG9mIHRocmVlIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KKytzdGF0aWMgaW5saW5lIHNpemVfdAorKyNpZiBfX0dOVUNfXyA+PSAzCisrX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKysjZW5kaWYKKyt4c3VtMyAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIsIHNpemVfdCBzaXplMykKKyt7CisrICByZXR1cm4geHN1bSAoeHN1bSAoc2l6ZTEsIHNpemUyKSwgc2l6ZTMpOworK30KKysKKysvKiBTdW0gb2YgZm91ciBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCisrc3RhdGljIGlubGluZSBzaXplX3QKKysjaWYgX19HTlVDX18gPj0gMworK19fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisrI2VuZGlmCisreHN1bTQgKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyLCBzaXplX3Qgc2l6ZTMsIHNpemVfdCBzaXplNCkKKyt7CisrICByZXR1cm4geHN1bSAoeHN1bSAoeHN1bSAoc2l6ZTEsIHNpemUyKSwgc2l6ZTMpLCBzaXplNCk7CisrfQorKworKy8qIE1heGltdW0gb2YgdHdvIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KKytzdGF0aWMgaW5saW5lIHNpemVfdAorKyNpZiBfX0dOVUNfXyA+PSAzCisrX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKysjZW5kaWYKKyt4bWF4IChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMikKKyt7CisrICAvKiBObyBleHBsaWNpdCBjaGVjayBpcyBuZWVkZWQgaGVyZSwgYmVjYXVzZSBmb3IgYW55IG46CisrICAgICBtYXggKFNJWkVfTUFYLCBuKSA9PSBTSVpFX01BWCBhbmQgbWF4IChuLCBTSVpFX01BWCkgPT0gU0laRV9NQVguICAqLworKyAgcmV0dXJuIChzaXplMSA+PSBzaXplMiA/IHNpemUxIDogc2l6ZTIpOworK30KKysKKysvKiBNdWx0aXBsaWNhdGlvbiBvZiBhIGNvdW50IHdpdGggYW4gZWxlbWVudCBzaXplLCB3aXRoIG92ZXJmbG93IGNoZWNrLgorKyAgIFRoZSBjb3VudCBtdXN0IGJlID49IDAgYW5kIHRoZSBlbGVtZW50IHNpemUgbXVzdCBiZSA+IDAuCisrICAgVGhpcyBpcyBhIG1hY3JvLCBub3QgYW4gaW5saW5lIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IHdvcmtzIGNvcnJlY3RseSBldmVuCisrICAgd2hlbiBOIGlzIG9mIGEgd2lkZXIgdHVwZSBhbmQgTiA+IFNJWkVfTUFYLiAgKi8KKysjZGVmaW5lIHh0aW1lcyhOLCBFTFNJWkUpIFwKKysgICgoTikgPD0gU0laRV9NQVggLyAoRUxTSVpFKSA/IChzaXplX3QpIChOKSAqIChFTFNJWkUpIDogU0laRV9NQVgpCisrCisrLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAgKi8KKysjZGVmaW5lIHNpemVfb3ZlcmZsb3dfcChTSVpFKSBcCisrICAoKFNJWkUpID09IFNJWkVfTUFYKQorKy8qIENoZWNrIGFnYWluc3Qgb3ZlcmZsb3cuICAqLworKyNkZWZpbmUgc2l6ZV9pbl9ib3VuZHNfcChTSVpFKSBcCisrICAoKFNJWkUpICE9IFNJWkVfTUFYKQorKworKyNlbmRpZiAvKiBfWFNJWkVfSCAqLworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9DaGFuZ2VMb2cJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L0NoYW5nZUxvZwkyMDA0LTA5LTEyIDE0OjQwOjM1LjA1NDY0MTg0MCAtMDQwMAorQEAgLTAsMCArMSwzMiBAQAorKzIwMDQtMDktMTIgIGdldHRleHRpemUgIDxidWctZ251LWdldHRleHRAZ251Lm9yZz4KKysKKysJKiBjb2Rlc2V0Lm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBnZXR0ZXh0Lm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBnbGliYzIxLm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBpY29udi5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogaW50ZGl2MC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogaW50bWF4Lm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBpbnR0eXBlcy5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogaW50dHlwZXNfaC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogaW50dHlwZXMtcHJpLm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBpc2MtcG9zaXgubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorKwkqIGxjbWVzc2FnZS5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogbGliLWxkLm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBsaWItbGluay5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogbGliLXByZWZpeC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogbG9uZ2RvdWJsZS5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogbG9uZ2xvbmcubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorKwkqIG5scy5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogcG8ubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorKwkqIHByaW50Zi1wb3NpeC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogcHJvZ3Rlc3QubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorKwkqIHNpZ25lZC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogc2l6ZV9tYXgubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorKwkqIHN0ZGludF9oLm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiB1aW50bWF4X3QubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorKwkqIHVsb25nbG9uZy5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogd2NoYXJfdC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogd2ludF90Lm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiB4c2l6ZS5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLgorKworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9jb2Rlc2V0Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9tNC9jb2Rlc2V0Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODIwNjc3NDA4IC0wNDAwCitAQCAtMCwwICsxLDIzIEBACisrIyBjb2Rlc2V0Lm00IHNlcmlhbCBBTTEgKGdldHRleHQtMC4xMC40MCkKKytkbmwgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKKytkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KKytkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKKytkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKysKKytkbmwgRnJvbSBCcnVubyBIYWlibGUuCisrCisrQUNfREVGVU4oW0FNX0xBTkdJTkZPX0NPREVTRVRdLAorK1sKKysgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgbmxfbGFuZ2luZm8gYW5kIENPREVTRVRdLCBhbV9jdl9sYW5naW5mb19jb2Rlc2V0LAorKyAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsYW5naW5mby5oPl0sCisrICAgICAgW2NoYXIqIGNzID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7XSwKKysgICAgICBhbV9jdl9sYW5naW5mb19jb2Rlc2V0PXllcywKKysgICAgICBhbV9jdl9sYW5naW5mb19jb2Rlc2V0PW5vKQorKyAgICBdKQorKyAgaWYgdGVzdCAkYW1fY3ZfbGFuZ2luZm9fY29kZXNldCA9IHllczsgdGhlbgorKyAgICBBQ19ERUZJTkUoSEFWRV9MQU5HSU5GT19DT0RFU0VULCAxLAorKyAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgPGxhbmdpbmZvLmg+IGFuZCBubF9sYW5naW5mbyhDT0RFU0VUKS5dKQorKyAgZmkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9nZXR0ZXh0Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9tNC9nZXR0ZXh0Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODI2Njc2NDk2IC0wNDAwCitAQCAtMCwwICsxLDQ4NyBAQAorKyMgZ2V0dGV4dC5tNCBzZXJpYWwgMjggKGdldHRleHQtMC4xMykKKytkbmwgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKKytkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KKytkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKKytkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKytkbmwKKytkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorK2RubCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisrZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKKytkbmwgZnVuY3Rpb25hbGl0eS4KKytkbmwgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgb2YgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaXMgY292ZXJlZAorK2RubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKKytkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisrZG5sIFRoZXkgYXJlICpub3QqIGluIHRoZSBwdWJsaWMgZG9tYWluLgorKworK2RubCBBdXRob3JzOgorK2RubCAgIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LTIwMDAuCisrZG5sICAgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LCAyMDAwLTIwMDMuCisrCisrZG5sIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCisrCisrZG5sIFVzYWdlOiBBTV9HTlVfR0VUVEVYVChbSU5UTFNZTUJPTF0sIFtORUVEU1lNQk9MXSwgW0lOVExESVJdKS4KKytkbmwgSU5UTFNZTUJPTCBjYW4gYmUgb25lIG9mICdleHRlcm5hbCcsICduby1saWJ0b29sJywgJ3VzZS1saWJ0b29sJy4gVGhlCisrZG5sICAgIGRlZmF1bHQgKGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQgb3IgZW1wdHkpIGlzICduby1saWJ0b29sJy4KKytkbmwgICAgSU5UTFNZTUJPTCBzaG91bGQgYmUgJ2V4dGVybmFsJyBmb3IgcGFja2FnZXMgd2l0aCBubyBpbnRsIGRpcmVjdG9yeSwKKytkbmwgICAgYW5kICduby1saWJ0b29sJyBvciAndXNlLWxpYnRvb2wnIGZvciBwYWNrYWdlcyB3aXRoIGFuIGludGwgZGlyZWN0b3J5LgorK2RubCAgICBJZiBJTlRMU1lNQk9MIGlzICd1c2UtbGlidG9vbCcsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkKKytkbmwgICAgJCh0b3BfYnVpbGRkaXIpL2ludGwvbGliaW50bC5sYSB3aWxsIGJlIGNyZWF0ZWQgKHNoYXJlZCBhbmQvb3Igc3RhdGljLAorK2RubCAgICBkZXBlbmRpbmcgb24gLS17ZW5hYmxlLGRpc2FibGV9LXtzaGFyZWQsc3RhdGljfSBhbmQgb24gdGhlIHByZXNlbmNlIG9mCisrZG5sICAgIEFNLURJU0FCTEUtU0hBUkVEKS4gSWYgSU5UTFNZTUJPTCBpcyAnbm8tbGlidG9vbCcsIGEgc3RhdGljIGxpYnJhcnkKKytkbmwgICAgJCh0b3BfYnVpbGRkaXIpL2ludGwvbGliaW50bC5hIHdpbGwgYmUgY3JlYXRlZC4KKytkbmwgSWYgTkVFRFNZTUJPTCBpcyBzcGVjaWZpZWQgYW5kIGlzICduZWVkLW5nZXR0ZXh0JywgdGhlbiBHTlUgZ2V0dGV4dAorK2RubCAgICBpbXBsZW1lbnRhdGlvbnMgKGluIGxpYmMgb3IgbGliaW50bCkgd2l0aG91dCB0aGUgbmdldHRleHQoKSBmdW5jdGlvbgorK2RubCAgICB3aWxsIGJlIGlnbm9yZWQuICBJZiBORUVEU1lNQk9MIGlzIHNwZWNpZmllZCBhbmQgaXMKKytkbmwgICAgJ25lZWQtZm9ybWF0c3RyaW5nLW1hY3JvcycsIHRoZW4gR05VIGdldHRleHQgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QKKytkbmwgICAgc3VwcG9ydCB0aGUgSVNPIEMgOTkgPGludHR5cGVzLmg+IGZvcm1hdHN0cmluZyBtYWNyb3Mgd2lsbCBiZSBpZ25vcmVkLgorK2RubCBJTlRMRElSIGlzIHVzZWQgdG8gZmluZCB0aGUgaW50bCBsaWJyYXJpZXMuICBJZiBlbXB0eSwKKytkbmwgICAgdGhlIHZhbHVlIGAkKHRvcF9idWlsZGRpcikvaW50bC8nIGlzIHVzZWQuCisrZG5sCisrZG5sIFRoZSByZXN1bHQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgb25lIG9mIHRocmVlIGNhc2VzOgorK2RubCAxKSBHTlUgZ2V0dGV4dCwgYXMgaW5jbHVkZWQgaW4gdGhlIGludGwgc3ViZGlyZWN0b3J5LCB3aWxsIGJlIGNvbXBpbGVkCisrZG5sICAgIGFuZCB1c2VkLgorK2RubCAgICBDYXRhbG9nIGZvcm1hdDogR05VIC0tPiBpbnN0YWxsIGluICQoZGF0YWRpcikKKytkbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IC5tbyBhZnRlciBpbnN0YWxsYXRpb24sIC5nbW8gaW4gc291cmNlIHRyZWUKKytkbmwgMikgR05VIGdldHRleHQgaGFzIGJlZW4gZm91bmQgaW4gdGhlIHN5c3RlbSdzIEMgbGlicmFyeS4KKytkbmwgICAgQ2F0YWxvZyBmb3JtYXQ6IEdOVSAtLT4gaW5zdGFsbCBpbiAkKGRhdGFkaXIpCisrZG5sICAgIENhdGFsb2cgZXh0ZW5zaW9uOiAubW8gYWZ0ZXIgaW5zdGFsbGF0aW9uLCAuZ21vIGluIHNvdXJjZSB0cmVlCisrZG5sIDMpIE5vIGludGVybmF0aW9uYWxpemF0aW9uLCBhbHdheXMgdXNlIEVuZ2xpc2ggbXNnaWQuCisrZG5sICAgIENhdGFsb2cgZm9ybWF0OiBub25lCisrZG5sICAgIENhdGFsb2cgZXh0ZW5zaW9uOiBub25lCisrZG5sIElmIElOVExTWU1CT0wgaXMgJ2V4dGVybmFsJywgb25seSBjYXNlcyAyIGFuZCAzIGNhbiBvY2N1ci4KKytkbmwgVGhlIHVzZSBvZiAuZ21vIGlzIGhpc3RvcmljYWwgKGl0IHdhcyBuZWVkZWQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdGhlCisrZG5sIEdOVSBmb3JtYXQgY2F0YWxvZ3Mgd2hlbiBidWlsZGluZyBvbiBhIHBsYXRmb3JtIHdpdGggYW4gWC9PcGVuIGdldHRleHQpLAorK2RubCBidXQgd2Uga2VlcCBpdCBpbiBvcmRlciBub3QgdG8gZm9yY2UgaXJyZWxldmFudCBmaWxlbmFtZSBjaGFuZ2VzIG9uIHRoZQorK2RubCBtYWludGFpbmVycy4KKytkbmwKKytBQ19ERUZVTihbQU1fR05VX0dFVFRFWFRdLAorK1sKKysgIGRubCBBcmd1bWVudCBjaGVja2luZy4KKysgIGlmZWxzZShbJDFdLCBbXSwgLCBbaWZlbHNlKFskMV0sIFtleHRlcm5hbF0sICwgW2lmZWxzZShbJDFdLCBbbm8tbGlidG9vbF0sICwgW2lmZWxzZShbJDFdLCBbdXNlLWxpYnRvb2xdLCAsCisrICAgIFtlcnJwcmludChbRVJST1I6IGludmFsaWQgZmlyc3QgYXJndW1lbnQgdG8gQU1fR05VX0dFVFRFWFQKKytdKV0pXSldKV0pCisrICBpZmVsc2UoWyQyXSwgW10sICwgW2lmZWxzZShbJDJdLCBbbmVlZC1uZ2V0dGV4dF0sICwgW2lmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwgLAorKyAgICBbZXJycHJpbnQoW0VSUk9SOiBpbnZhbGlkIHNlY29uZCBhcmd1bWVudCB0byBBTV9HTlVfR0VUVEVYVAorK10pXSldKV0pCisrICBkZWZpbmUoZ3RfaW5jbHVkZWRfaW50bCwgaWZlbHNlKFskMV0sIFtleHRlcm5hbF0sIFtub10sIFt5ZXNdKSkKKysgIGRlZmluZShndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXgsIGlmZWxzZShbJDFdLCBbdXNlLWxpYnRvb2xdLCBbbF0sIFtdKSkKKysKKysgIEFDX1JFUVVJUkUoW0FNX1BPX1NVQkRJUlNdKWRubAorKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworKyAgICBBQ19SRVFVSVJFKFtBTV9JTlRMX1NVQkRJUl0pZG5sCisrICBdKQorKworKyAgZG5sIFByZXJlcXVpc2l0ZXMgb2YgQUNfTElCX0xJTktGTEFHU19CT0RZLgorKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKysgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisrCisrICBkbmwgU29tZXRpbWVzIGxpYmludGwgcmVxdWlyZXMgbGliaWNvbnYsIHNvIGZpcnN0IHNlYXJjaCBmb3IgbGliaWNvbnYuCisrICBkbmwgSWRlYWxseSB3ZSB3b3VsZCBkbyB0aGlzIHNlYXJjaCBvbmx5IGFmdGVyIHRoZQorKyAgZG5sICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKysgIGRubCAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorKyAgZG5sIHRlc3RzLiBCdXQgaWYgY29uZmlndXJlLmluIGludm9rZXMgQU1fSUNPTlYgYWZ0ZXIgQU1fR05VX0dFVFRFWFQKKysgIGRubCB0aGUgY29uZmlndXJlIHNjcmlwdCB3b3VsZCBuZWVkIHRvIGNvbnRhaW4gdGhlIHNhbWUgc2hlbGwgY29kZQorKyAgZG5sIGFnYWluLCBvdXRzaWRlIGFueSAnaWYnLiBUaGVyZSBhcmUgdHdvIHNvbHV0aW9uczoKKysgIGRubCAtIEludm9rZSBBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWSBoZXJlLCBvdXRzaWRlIGFueSAnaWYnLgorKyAgZG5sIC0gQ29udHJvbCB0aGUgZXhwYW5zaW9ucyBpbiBtb3JlIGRldGFpbCB1c2luZyBBQ19QUk9WSURFX0lGRUxTRS4KKysgIGRubCBTaW5jZSBBQ19QUk9WSURFX0lGRUxTRSBpcyBvbmx5IGluIGF1dG9jb25mID49IDIuNTIgYW5kIG5vdAorKyAgZG5sIGRvY3VtZW50ZWQsIHdlIGF2b2lkIGl0LgorKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgLCBbCisrICAgIEFDX1JFUVVJUkUoW0FNX0lDT05WX0xJTktGTEFHU19CT0RZXSkKKysgIF0pCisrCisrICBkbmwgU2V0IFVTRV9OTFMuCisrICBBTV9OTFMKKysKKysgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKKysgICAgQlVJTERfSU5DTFVERURfTElCSU5UTD1ubworKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworKyAgXSkKKysgIExJQklOVEw9CisrICBMVExJQklOVEw9CisrICBQT1NVQj0KKysKKysgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKKysgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisrICAgIGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dD1ubworKyAgICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCBbCisrICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKKysgICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAorKyAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAorKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKKysgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCisrICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKKysKKysgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKysgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKysgICAgXSkKKysgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKysgICAgICAgIGRubCB0byB1c2UuICBJZiBHTlUgZ2V0dGV4dCBpcyBhdmFpbGFibGUgd2UgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUKKysgICAgICAgIGRubCB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgorKworKyAgICAgICAgZG5sIEFkZCBhIHZlcnNpb24gbnVtYmVyIHRvIHRoZSBjYWNoZSBtYWNyb3MuCisrICAgICAgICBkZWZpbmUoW2d0X2FwaV92ZXJzaW9uXSwgaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLCAzLCBpZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCAyLCAxKSkpCisrICAgICAgICBkZWZpbmUoW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjXSwgW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF1ndF9hcGlfdmVyc2lvbltfbGliY10pCisrICAgICAgICBkZWZpbmUoW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsXSwgW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF1ndF9hcGlfdmVyc2lvbltfbGliaW50bF0pCisrCisrICAgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dudWdldHRleHRfbGliYywKKysgICAgICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+CisrXWlmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwKKytbI2lmbmRlZiBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTgorKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpICgobWFqb3IpID09IDAgPyAwIDogLTEpCisrI2VuZGlmCisrY2hhbmdlcXVvdGUoLClkbmwKKyt0eXBlZGVmIGludCBhcnJheSBbMiAqIChfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTigwKSA+PSAxKSAtIDFdOworK2NoYW5nZXF1b3RlKFssXSlkbmwKKytdLCBbXSlbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworK2V4dGVybiBpbnQgKl9ubF9kb21haW5fYmluZGluZ3M7XSwKKysgICAgICAgICAgICBbYmluZHRleHRkb21haW4gKCIiLCAiIik7CisrcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV1pZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCBbICsgKGludCkgbmdldHRleHQgKCIiLCAiIiwgMCldLCBbXSlbICsgX25sX21zZ19jYXRfY250ciArICpfbmxfZG9tYWluX2JpbmRpbmdzXSwKKysgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHRfbGliYz15ZXMsCisrICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmM9bm8pXSkKKysKKysgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKysgICAgICAgICAgZG5sIFNvbWV0aW1lcyBsaWJpbnRsIHJlcXVpcmVzIGxpYmljb252LCBzbyBmaXJzdCBzZWFyY2ggZm9yIGxpYmljb252LgorKyAgICAgICAgICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCAsIFsKKysgICAgICAgICAgICBBTV9JQ09OVl9MSU5LCisrICAgICAgICAgIF0pCisrICAgICAgICAgIGRubCBTZWFyY2ggZm9yIGxpYmludGwgYW5kIGRlZmluZSBMSUJJTlRMLCBMVExJQklOVEwgYW5kIElOQ0lOVEwKKysgICAgICAgICAgZG5sIGFjY29yZGluZ2x5LiBEb24ndCB1c2UgQUNfTElCX0xJTktGTEFHU19CT0RZKFtpbnRsXSxbaWNvbnZdKQorKyAgICAgICAgICBkbmwgYmVjYXVzZSB0aGF0IHdvdWxkIGFkZCAiLWxpY29udiIgdG8gTElCSU5UTCBhbmQgTFRMSUJJTlRMCisrICAgICAgICAgIGRubCBldmVuIGlmIGxpYmljb252IGRvZXNuJ3QgZXhpc3QuCisrICAgICAgICAgIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShbaW50bF0pCisrICAgICAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgR05VIGdldHRleHQgaW4gbGliaW50bF0sCisrICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwsCisrICAgICAgICAgICBbZ3Rfc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorKyAgICAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJElOQ0lOVEwiCisrICAgICAgICAgICAgZ3Rfc2F2ZV9MSUJTPSIkTElCUyIKKysgICAgICAgICAgICBMSUJTPSIkTElCUyAkTElCSU5UTCIKKysgICAgICAgICAgICBkbmwgTm93IHNlZSB3aGV0aGVyIGxpYmludGwgZXhpc3RzIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24gbGliaWNvbnYuCisrICAgICAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+CisrXWlmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwKKytbI2lmbmRlZiBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTgorKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpICgobWFqb3IpID09IDAgPyAwIDogLTEpCisrI2VuZGlmCisrY2hhbmdlcXVvdGUoLClkbmwKKyt0eXBlZGVmIGludCBhcnJheSBbMiAqIChfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTigwKSA+PSAxKSAtIDFdOworK2NoYW5nZXF1b3RlKFssXSlkbmwKKytdLCBbXSlbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworK2V4dGVybgorKyNpZmRlZiBfX2NwbHVzcGx1cworKyJDIgorKyNlbmRpZgorK2NvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKCk7XSwKKysgICAgICAgICAgICAgIFtiaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKKytyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXWlmZWxzZShbJDJdLCBbbmVlZC1uZ2V0dGV4dF0sIFsgKyAoaW50KSBuZ2V0dGV4dCAoIiIsICIiLCAwKV0sIFtdKVsgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9leHBhbmRfYWxpYXMgKDApXSwKKysgICAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsPXllcywKKysgICAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsPW5vKQorKyAgICAgICAgICAgIGRubCBOb3cgc2VlIHdoZXRoZXIgbGliaW50bCBleGlzdHMgYW5kIGRlcGVuZHMgb24gbGliaWNvbnYuCisrICAgICAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsIiAhPSB5ZXMgJiYgdGVzdCAtbiAiJExJQklDT05WIjsgdGhlbgorKyAgICAgICAgICAgICAgTElCUz0iJExJQlMgJExJQklDT05WIgorKyAgICAgICAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+CisrXWlmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwKKytbI2lmbmRlZiBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTgorKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpICgobWFqb3IpID09IDAgPyAwIDogLTEpCisrI2VuZGlmCisrY2hhbmdlcXVvdGUoLClkbmwKKyt0eXBlZGVmIGludCBhcnJheSBbMiAqIChfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTigwKSA+PSAxKSAtIDFdOworK2NoYW5nZXF1b3RlKFssXSlkbmwKKytdLCBbXSlbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworK2V4dGVybgorKyNpZmRlZiBfX2NwbHVzcGx1cworKyJDIgorKyNlbmRpZgorK2NvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKCk7XSwKKysgICAgICAgICAgICAgICAgW2JpbmR0ZXh0ZG9tYWluICgiIiwgIiIpOworK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgWyArIChpbnQpIG5nZXR0ZXh0ICgiIiwgIiIsIDApXSwgW10pWyArIF9ubF9tc2dfY2F0X2NudHIgKyAqX25sX2V4cGFuZF9hbGlhcyAoMCldLAorKyAgICAgICAgICAgICAgIFtMSUJJTlRMPSIkTElCSU5UTCAkTElCSUNPTlYiCisrICAgICAgICAgICAgICAgIExUTElCSU5UTD0iJExUTElCSU5UTCAkTFRMSUJJQ09OViIKKysgICAgICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGw9eWVzCisrICAgICAgICAgICAgICAgXSkKKysgICAgICAgICAgICBmaQorKyAgICAgICAgICAgIENQUEZMQUdTPSIkZ3Rfc2F2ZV9DUFBGTEFHUyIKKysgICAgICAgICAgICBMSUJTPSIkZ3Rfc2F2ZV9MSUJTIl0pCisrICAgICAgICBmaQorKworKyAgICAgICAgZG5sIElmIGFuIGFscmVhZHkgcHJlc2VudCBvciBwcmVpbnN0YWxsZWQgR05VIGdldHRleHQoKSBpcyBmb3VuZCwKKysgICAgICAgIGRubCB1c2UgaXQuICBCdXQgaWYgdGhpcyBtYWNybyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0LCBhbmQgR05VCisrICAgICAgICBkbmwgZ2V0dGV4dCBpcyBhbHJlYWR5IHByZWluc3RhbGxlZCBpbiBsaWJpbnRsLCB3ZSB1cGRhdGUgdGhpcworKyAgICAgICAgZG5sIGxpYmludGwuICAoQ2YuIHRoZSBpbnN0YWxsIHJ1bGUgaW4gaW50bC9NYWtlZmlsZS5pbi4pCisrICAgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmMiID0gInllcyIgXAorKyAgICAgICAgICAgfHwgeyB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiID0gInllcyIgXAorKyAgICAgICAgICAgICAgICAmJiB0ZXN0ICIkUEFDS0FHRSIgIT0gZ2V0dGV4dC1ydW50aW1lIFwKKysgICAgICAgICAgICAgICAgJiYgdGVzdCAiJFBBQ0tBR0UiICE9IGdldHRleHQtdG9vbHM7IH07IHRoZW4KKysgICAgICAgICAgZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0PXllcworKyAgICAgICAgZWxzZQorKyAgICAgICAgICBkbmwgUmVzZXQgdGhlIHZhbHVlcyBzZXQgYnkgc2VhcmNoaW5nIGZvciBsaWJpbnRsLgorKyAgICAgICAgICBMSUJJTlRMPQorKyAgICAgICAgICBMVExJQklOVEw9CisrICAgICAgICAgIElOQ0lOVEw9CisrICAgICAgICBmaQorKworKyAgICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCBbCisrICAgICAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorKyAgICAgICAgICBkbmwgR05VIGdldHRleHQgaXMgbm90IGZvdW5kIGluIHRoZSBDIGxpYnJhcnkuCisrICAgICAgICAgIGRubCBGYWxsIGJhY2sgb24gaW5jbHVkZWQgR05VIGdldHRleHQgbGlicmFyeS4KKysgICAgICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKysgICAgICAgIGZpCisrICAgICAgZmkKKysKKysgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorKyAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KKysgICAgICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9eWVzCisrICAgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKysgICAgICAgIExJQklOVEw9ImlmZWxzZShbJDNdLFtdLFwke3RvcF9idWlsZGRpcn0vaW50bCxbJDNdKS9saWJpbnRsLltdZ3RfbGlidG9vbF9zdWZmaXhfcHJlZml4W11hICRMSUJJQ09OViIKKysgICAgICAgIExUTElCSU5UTD0iaWZlbHNlKFskM10sW10sXCR7dG9wX2J1aWxkZGlyfS9pbnRsLFskM10pL2xpYmludGwuW11ndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXhbXWEgJExUTElCSUNPTlYiCisrICAgICAgICBMSUJTPWBlY2hvICIgJExJQlMgIiB8IHNlZCAtZSAncy8gLWxpbnRsIC8gLycgLWUgJ3MvXiAvLycgLWUgJ3MvICQvLydgCisrICAgICAgZmkKKysKKysgICAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiIFwKKysgICAgICAgICB8fCB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorKyAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB0byB1c2UgR05VIGdldHRleHQgdG9vbHMuCisrICAgICAgICBDQVRPQkpFWFQ9LmdtbworKyAgICAgIGZpCisrICAgIF0pCisrCisrICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyIgXAorKyAgICAgICB8fCB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorKyAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLAorKyAgICAgICAgW0RlZmluZSB0byAxIGlmIHRyYW5zbGF0aW9uIG9mIHByb2dyYW0gbWVzc2FnZXMgdG8gdGhlIHVzZXIncyBuYXRpdmUgbGFuZ3VhZ2UKKysgICBpcyByZXF1ZXN0ZWQuXSkKKysgICAgZWxzZQorKyAgICAgIFVTRV9OTFM9bm8KKysgICAgZmkKKysgIGZpCisrCisrICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gdXNlIE5MU10pCisrICBBQ19NU0dfUkVTVUxUKFskVVNFX05MU10pCisrICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXJlIHRoZSBnZXR0ZXh0IGZ1bmN0aW9uIGNvbWVzIGZyb21dKQorKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisrICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisrICAgICAgICBndF9zb3VyY2U9ImV4dGVybmFsIGxpYmludGwiCisrICAgICAgZWxzZQorKyAgICAgICAgZ3Rfc291cmNlPSJsaWJjIgorKyAgICAgIGZpCisrICAgIGVsc2UKKysgICAgICBndF9zb3VyY2U9ImluY2x1ZGVkIGludGwgZGlyZWN0b3J5IgorKyAgICBmaQorKyAgICBBQ19NU0dfUkVTVUxUKFskZ3Rfc291cmNlXSkKKysgIGZpCisrCisrICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorKworKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisrICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisrICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBsaW5rIHdpdGggbGliaW50bF0pCisrICAgICAgICBBQ19NU0dfUkVTVUxUKFskTElCSU5UTF0pCisrICAgICAgICBBQ19MSUJfQVBQRU5EVE9WQVIoW0NQUEZMQUdTXSwgWyRJTkNJTlRMXSkKKysgICAgICBmaQorKworKyAgICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBwYWNrYWdlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKysgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAorKyAgICAgICBbRGVmaW5lIGlmIHRoZSBHTlUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGlzIGFscmVhZHkgcHJlc2VudCBvciBwcmVpbnN0YWxsZWQuXSkKKysgICAgICBBQ19ERUZJTkUoSEFWRV9EQ0dFVFRFWFQsIDEsCisrICAgICAgIFtEZWZpbmUgaWYgdGhlIEdOVSBkY2dldHRleHQoKSBmdW5jdGlvbiBpcyBhbHJlYWR5IHByZXNlbnQgb3IgcHJlaW5zdGFsbGVkLl0pCisrICAgIGZpCisrCisrICAgIGRubCBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCisrICAgIFBPU1VCPXBvCisrICBmaQorKworKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworKyAgICBkbmwgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IEJVSUxEX0lOQ0xVREVEX0xJQklOVEwKKysgICAgZG5sIHRvICd5ZXMnIGJlY2F1c2Ugc29tZSBvZiB0aGUgdGVzdHN1aXRlIHJlcXVpcmVzIGl0LgorKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0LXJ1bnRpbWUgfHwgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dC10b29sczsgdGhlbgorKyAgICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9eWVzCisrICAgIGZpCisrCisrICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgorKyAgICBBQ19TVUJTVChCVUlMRF9JTkNMVURFRF9MSUJJTlRMKQorKyAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKKysgICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQorKworKyAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgY29uZmlndXJlLmlucyBtYXkgYmUgdXNpbmcgdGhpcy4KKysgICAgbmxzX2N2X2hlYWRlcl9pbnRsPQorKyAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PQorKworKyAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgTWFrZWZpbGVzIG1heSBiZSB1c2luZyB0aGlzLgorKyAgICBEQVRBRElSTkFNRT1zaGFyZQorKyAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKKysKKysgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKysgICAgSU5TVE9CSkVYVD0ubW8KKysgICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKKysKKysgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKysgICAgR0VOQ0FUPWdlbmNhdAorKyAgICBBQ19TVUJTVChHRU5DQVQpCisrCisrICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBNYWtlZmlsZXMgbWF5IGJlIHVzaW5nIHRoaXMuCisrICAgIGlmIHRlc3QgIiRVU0VfSU5DTFVERURfTElCSU5UTCIgPSB5ZXM7IHRoZW4KKysgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorKyAgICBmaQorKyAgICBBQ19TVUJTVChJTlRMT0JKUykKKysKKysgICAgZG5sIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgaWYgdGhlIHN1cnJvdW5kaW5nIHBhY2thZ2Ugd2lzaGVzIGl0LgorKyAgICBJTlRMX0xJQlRPT0xfU1VGRklYX1BSRUZJWD1ndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXgKKysgICAgQUNfU1VCU1QoSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVgpCisrICBdKQorKworKyAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKysgIElOVExMSUJTPSIkTElCSU5UTCIKKysgIEFDX1NVQlNUKElOVExMSUJTKQorKworKyAgZG5sIE1ha2UgYWxsIGRvY3VtZW50ZWQgdmFyaWFibGVzIGtub3duIHRvIGF1dG9jb25mLgorKyAgQUNfU1VCU1QoTElCSU5UTCkKKysgIEFDX1NVQlNUKExUTElCSU5UTCkKKysgIEFDX1NVQlNUKFBPU1VCKQorK10pCisrCisrCisrZG5sIENoZWNrcyBmb3IgYWxsIHByZXJlcXVpc2l0ZXMgb2YgdGhlIGludGwgc3ViZGlyZWN0b3J5LAorK2RubCBleGNlcHQgZm9yIElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYIChhbmQgcG9zc2libHkgTElCVE9PTCksIElOVExPQkpTLAorK2RubCAgICAgICAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMLCBCVUlMRF9JTkNMVURFRF9MSUJJTlRMLgorK0FDX0RFRlVOKFtBTV9JTlRMX1NVQkRJUl0sCisrWworKyAgQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKKysgIEFDX1JFUVVJUkUoW0FNX01LSU5TVEFMTERJUlNdKWRubAorKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisrICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCisrICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCisrICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAorKyAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAorKyAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCisrICBBQ19SRVFVSVJFKFtiaF9DX1NJR05FRF0pZG5sCisrICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCisrICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKKysgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKKysgIEFDX1JFUVVJUkUoW2ptX0FDX1RZUEVfTE9OR19MT05HXSlkbmwKKysgIEFDX1JFUVVJUkUoW2d0X1RZUEVfTE9OR0RPVUJMRV0pZG5sCisrICBBQ19SRVFVSVJFKFtndF9UWVBFX1dDSEFSX1RdKWRubAorKyAgQUNfUkVRVUlSRShbZ3RfVFlQRV9XSU5UX1RdKWRubAorKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX0lOVFRZUEVTX0hdKQorKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX1NURElOVF9IXSkKKysgIEFDX1JFUVVJUkUoW2d0X1RZUEVfSU5UTUFYX1RdKQorKyAgQUNfUkVRVUlSRShbZ3RfUFJJTlRGX1BPU0lYXSkKKysgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKKysgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCisrICBBQ19SRVFVSVJFKFtqbV9HTElCQzIxXSlkbmwKKysgIEFDX1JFUVVJUkUoW2d0X0lOVERJVjBdKWRubAorKyAgQUNfUkVRVUlSRShbam1fQUNfVFlQRV9VSU5UTUFYX1RdKWRubAorKyAgQUNfUkVRVUlSRShbZ3RfSEVBREVSX0lOVFRZUEVTX0hdKWRubAorKyAgQUNfUkVRVUlSRShbZ3RfSU5UVFlQRVNfUFJJXSlkbmwKKysgIEFDX1JFUVVJUkUoW2dsX1hTSVpFXSlkbmwKKysKKysgIEFDX0NIRUNLX1RZUEUoW3B0cmRpZmZfdF0sICwKKysgICAgW0FDX0RFRklORShbcHRyZGlmZl90XSwgW2xvbmddLAorKyAgICAgICBbRGVmaW5lIGFzIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgdHdvIHBvaW50ZXJzLCBpZiB0aGUgc3lzdGVtIGRvZXNuJ3QgZGVmaW5lIGl0Ll0pCisrICAgIF0pCisrICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdGRkZWYuaCBcCisrc3RkbGliLmggc3RyaW5nLmggdW5pc3RkLmggc3lzL3BhcmFtLmhdKQorKyAgQUNfQ0hFQ0tfRlVOQ1MoW2FzcHJpbnRmIGZ3cHJpbnRmIGdldGN3ZCBnZXRlZ2lkIGdldGV1aWQgZ2V0Z2lkIGdldHVpZCBcCisrbWVtcGNweSBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc25wcmludGYgc3RwY3B5IHN0cmNhc2VjbXAgc3RyZHVwIFwKKytzdHJ0b3VsIHRzZWFyY2ggd2NzbGVuIF9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0IFwKKytfX2ZzZXRsb2NraW5nXSkKKysKKysgIGRubCBVc2UgdGhlIF9zbnByaW50ZiBmdW5jdGlvbiBvbmx5IGlmIGl0IGlzIGRlY2xhcmVkIChiZWNhdXNlIG9uIE5ldEJTRCBpdAorKyAgZG5sIGlzIGRlZmluZWQgYXMgYSB3ZWFrIGFsaWFzIG9mIHNucHJpbnRmOyB3ZSBwcmVmZXIgdG8gdXNlIHRoZSBsYXR0ZXIpLgorKyAgZ3RfQ0hFQ0tfREVDTChfc25wcmludGYsIFsjaW5jbHVkZSA8c3RkaW8uaD5dKQorKyAgZ3RfQ0hFQ0tfREVDTChfc253cHJpbnRmLCBbI2luY2x1ZGUgPHN0ZGlvLmg+XSkKKysKKysgIGRubCBVc2UgdGhlICpfdW5sb2NrZWQgZnVuY3Rpb25zIG9ubHkgaWYgdGhleSBhcmUgZGVjbGFyZWQuCisrICBkbmwgKGJlY2F1c2Ugc29tZSBvZiB0aGVtIHdlcmUgZGVmaW5lZCB3aXRob3V0IGJlaW5nIGRlY2xhcmVkIGluIFNvbGFyaXMKKysgIGRubCAyLjUuMSBidXQgd2VyZSByZW1vdmVkIGluIFNvbGFyaXMgMi42LCB3aGVyZWFzIHdlIHdhbnQgYmluYXJpZXMgYnVpbHQKKysgIGRubCBvbiBTb2xhcmlzIDIuNS4xIHRvIHJ1biBvbiBTb2xhcmlzIDIuNikuCisrICBkbmwgRG9uJ3QgdXNlIEFDX0NIRUNLX0RFQ0xTIGJlY2F1c2UgaXQgaXNuJ3Qgc3VwcG9ydGVkIGluIGF1dG9jb25mLTIuMTMuCisrICBndF9DSEVDS19ERUNMKGZlb2ZfdW5sb2NrZWQsIFsjaW5jbHVkZSA8c3RkaW8uaD5dKQorKyAgZ3RfQ0hFQ0tfREVDTChmZ2V0c191bmxvY2tlZCwgWyNpbmNsdWRlIDxzdGRpby5oPl0pCisrICBndF9DSEVDS19ERUNMKGdldGNfdW5sb2NrZWQsIFsjaW5jbHVkZSA8c3RkaW8uaD5dKQorKworKyAgY2FzZSAkZ3RfY3ZfZnVuY19wcmludGZfcG9zaXggaW4KKysgICAgKnllcykgSEFWRV9QT1NJWF9QUklOVEY9MSA7OworKyAgICAqKSBIQVZFX1BPU0lYX1BSSU5URj0wIDs7CisrICBlc2FjCisrICBBQ19TVUJTVChbSEFWRV9QT1NJWF9QUklOVEZdKQorKyAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfYXNwcmludGYiID0geWVzOyB0aGVuCisrICAgIEhBVkVfQVNQUklOVEY9MQorKyAgZWxzZQorKyAgICBIQVZFX0FTUFJJTlRGPTAKKysgIGZpCisrICBBQ19TVUJTVChbSEFWRV9BU1BSSU5URl0pCisrICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY19zbnByaW50ZiIgPSB5ZXM7IHRoZW4KKysgICAgSEFWRV9TTlBSSU5URj0xCisrICBlbHNlCisrICAgIEhBVkVfU05QUklOVEY9MAorKyAgZmkKKysgIEFDX1NVQlNUKFtIQVZFX1NOUFJJTlRGXSkKKysgIGlmIHRlc3QgIiRhY19jdl9mdW5jX3dwcmludGYiID0geWVzOyB0aGVuCisrICAgIEhBVkVfV1BSSU5URj0xCisrICBlbHNlCisrICAgIEhBVkVfV1BSSU5URj0wCisrICBmaQorKyAgQUNfU1VCU1QoW0hBVkVfV1BSSU5URl0pCisrCisrICBBTV9JQ09OVgorKyAgQU1fTEFOR0lORk9fQ09ERVNFVAorKyAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisrICAgIEFNX0xDX01FU1NBR0VTCisrICBmaQorKworKyAgZG5sIGludGwvcGx1cmFsLmMgaXMgZ2VuZXJhdGVkIGZyb20gaW50bC9wbHVyYWwueS4gSXQgcmVxdWlyZXMgYmlzb24sCisrICBkbmwgYmVjYXVzZSBwbHVyYWwueSB1c2VzIGJpc29uIHNwZWNpZmljIGZlYXR1cmVzLiBJdCByZXF1aXJlcyBhdCBsZWFzdAorKyAgZG5sIGJpc29uLTEuMjYgYmVjYXVzZSBlYXJsaWVyIHZlcnNpb25zIGdlbmVyYXRlIGEgcGx1cmFsLmMgdGhhdCBkb2Vzbid0CisrICBkbmwgY29tcGlsZS4KKysgIGRubCBiaXNvbiBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIG1haW50YWluZXIgKHdobyB0b3VjaGVzIHBsdXJhbC55KS4gQnV0IGluCisrICBkbmwgb3JkZXIgdG8gYXZvaWQgc2VwYXJhdGUgTWFrZWZpbGVzIG9yIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSwgd2UgcHV0CisrICBkbmwgdGhlIHJ1bGUgaW4gZ2VuZXJhbCBNYWtlZmlsZS4gTm93LCBzb21lIHBlb3BsZSBjYXJlbGVzc2x5IHRvdWNoIHRoZQorKyAgZG5sIGZpbGVzIG9yIGhhdmUgYSBicm9rZW4gIm1ha2UiIHByb2dyYW0sIGhlbmNlIHRoZSBwbHVyYWwuYyBydWxlIHdpbGwKKysgIGRubCBzb21ldGltZXMgZmlyZS4gVG8gYXZvaWQgYW4gZXJyb3IsIGRlZmluZXMgQklTT04gdG8gIjoiIGlmIGl0IGlzIG5vdAorKyAgZG5sIHByZXNlbnQgb3IgdG9vIG9sZC4KKysgIEFDX0NIRUNLX1BST0dTKFtJTlRMQklTT05dLCBbYmlzb25dKQorKyAgaWYgdGVzdCAteiAiJElOVExCSVNPTiI7IHRoZW4KKysgICAgYWNfdmVyY19mYWlsPXllcworKyAgZWxzZQorKyAgICBkbmwgRm91bmQgaXQsIG5vdyBjaGVjayB0aGUgdmVyc2lvbi4KKysgICAgQUNfTVNHX0NIRUNLSU5HKFt2ZXJzaW9uIG9mIGJpc29uXSkKKytjaGFuZ2VxdW90ZSg8PCw+PilkbmwKKysgICAgYWNfcHJvZ192ZXJzaW9uPWAkSU5UTEJJU09OIC0tdmVyc2lvbiAyPiYxIHwgc2VkIC1uICdzL14uKkdOVSBCaXNvbi4qIFwoWzAtOV0qXC5bMC05Ll0qXCkuKiQvXDEvcCdgCisrICAgIGNhc2UgJGFjX3Byb2dfdmVyc2lvbiBpbgorKyAgICAgICcnKSBhY19wcm9nX3ZlcnNpb249InYuID8uPz8sIGJhZCI7IGFjX3ZlcmNfZmFpbD15ZXM7OworKyAgICAgIDEuMls2LTldKiB8IDEuWzMtOV1bMC05XSogfCBbMi05XS4qKQorK2NoYW5nZXF1b3RlKFssXSlkbmwKKysgICAgICAgICBhY19wcm9nX3ZlcnNpb249IiRhY19wcm9nX3ZlcnNpb24sIG9rIjsgYWNfdmVyY19mYWlsPW5vOzsKKysgICAgICAqKSBhY19wcm9nX3ZlcnNpb249IiRhY19wcm9nX3ZlcnNpb24sIGJhZCI7IGFjX3ZlcmNfZmFpbD15ZXM7OworKyAgICBlc2FjCisrICAgIEFDX01TR19SRVNVTFQoWyRhY19wcm9nX3ZlcnNpb25dKQorKyAgZmkKKysgIGlmIHRlc3QgJGFjX3ZlcmNfZmFpbCA9IHllczsgdGhlbgorKyAgICBJTlRMQklTT049OgorKyAgZmkKKytdKQorKworKworK2RubCBndF9DSEVDS19ERUNMKEZVTkMsIElOQ0xVREVTKQorK2RubCBDaGVjayB3aGV0aGVyIGEgZnVuY3Rpb24gaXMgZGVjbGFyZWQuCisrQUNfREVGVU4oW2d0X0NIRUNLX0RFQ0xdLAorK1sKKysgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICQxIGlzIGRlY2xhcmVkXSwgYWNfY3ZfaGF2ZV9kZWNsXyQxLAorKyAgICBbQUNfVFJZX0NPTVBJTEUoWyQyXSwgWworKyNpZm5kZWYgJDEKKysgIGNoYXIgKnAgPSAoY2hhciAqKSAkMTsKKysjZW5kaWYKKytdLCBhY19jdl9oYXZlX2RlY2xfJDE9eWVzLCBhY19jdl9oYXZlX2RlY2xfJDE9bm8pXSkKKysgIGlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF8kMSA9IHllczsgdGhlbgorKyAgICBndF92YWx1ZT0xCisrICBlbHNlCisrICAgIGd0X3ZhbHVlPTAKKysgIGZpCisrICBBQ19ERUZJTkVfVU5RVU9URUQoW0hBVkVfREVDTF9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIFskZ3RfdmFsdWVdLAorKyAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGAkMScsIGFuZCB0byAwIGlmIHlvdSBkb24ndC5dKQorK10pCisrCisrCisrZG5sIFVzYWdlOiBBTV9HTlVfR0VUVEVYVF9WRVJTSU9OKFtnZXR0ZXh0LXZlcnNpb25dKQorK0FDX0RFRlVOKFtBTV9HTlVfR0VUVEVYVF9WRVJTSU9OXSwgW10pCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2dsaWJjMjEubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L2dsaWJjMjEubTQJMjAwNC0wOS0xMiAxNDo0MDozNC44MzM2NzU0MzIgLTA0MDAKK0BAIC0wLDAgKzEsMzIgQEAKKysjIGdsaWJjMjEubTQgc2VyaWFsIDIgKGZpbGV1dGlscy00LjEuMywgZ2V0dGV4dC0wLjEwLjQwKQorK2RubCBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworKyMgVGVzdCBmb3IgdGhlIEdOVSBDIExpYnJhcnksIHZlcnNpb24gMi4xIG9yIG5ld2VyLgorKyMgRnJvbSBCcnVubyBIYWlibGUuCisrCisrQUNfREVGVU4oW2ptX0dMSUJDMjFdLAorKyAgWworKyAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSAyLjEgb3IgbmV3ZXIsCisrICAgICAgYWNfY3ZfZ251X2xpYnJhcnlfMl8xLAorKyAgICAgIFtBQ19FR1JFUF9DUFAoW0x1Y2t5IEdOVSB1c2VyXSwKKysJWworKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorKyNpZmRlZiBfX0dOVV9MSUJSQVJZX18KKysgI2lmIChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMSkgfHwgKF9fR0xJQkNfXyA+IDIpCisrICBMdWNreSBHTlUgdXNlcgorKyAjZW5kaWYKKysjZW5kaWYKKysJXSwKKysJYWNfY3ZfZ251X2xpYnJhcnlfMl8xPXllcywKKysJYWNfY3ZfZ251X2xpYnJhcnlfMl8xPW5vKQorKyAgICAgIF0KKysgICAgKQorKyAgICBBQ19TVUJTVChHTElCQzIxKQorKyAgICBHTElCQzIxPSIkYWNfY3ZfZ251X2xpYnJhcnlfMl8xIgorKyAgXQorKykKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvaWNvbnYubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L2ljb252Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODM5Njc0NTIwIC0wNDAwCitAQCAtMCwwICsxLDEwMyBAQAorKyMgaWNvbnYubTQgc2VyaWFsIEFNNCAoZ2V0dGV4dC0wLjExLjMpCisrZG5sIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrCisrZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorKworK0FDX0RFRlVOKFtBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWV0sCisrWworKyAgZG5sIFByZXJlcXVpc2l0ZXMgb2YgQUNfTElCX0xJTktGTEFHU19CT0RZLgorKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKysgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisrCisrICBkbmwgU2VhcmNoIGZvciBsaWJpY29udiBhbmQgZGVmaW5lIExJQklDT05WLCBMVExJQklDT05WIGFuZCBJTkNJQ09OVgorKyAgZG5sIGFjY29yZGluZ2x5LgorKyAgQUNfTElCX0xJTktGTEFHU19CT0RZKFtpY29udl0pCisrXSkKKysKKytBQ19ERUZVTihbQU1fSUNPTlZfTElOS10sCisrWworKyAgZG5sIFNvbWUgc3lzdGVtcyBoYXZlIGljb252IGluIGxpYmMsIHNvbWUgaGF2ZSBpdCBpbiBsaWJpY29udiAoT1NGLzEgYW5kCisrICBkbmwgdGhvc2Ugd2l0aCB0aGUgc3RhbmRhbG9uZSBwb3J0YWJsZSBHTlUgbGliaWNvbnYgaW5zdGFsbGVkKS4KKysKKysgIGRubCBTZWFyY2ggZm9yIGxpYmljb252IGFuZCBkZWZpbmUgTElCSUNPTlYsIExUTElCSUNPTlYgYW5kIElOQ0lDT05WCisrICBkbmwgYWNjb3JkaW5nbHkuCisrICBBQ19SRVFVSVJFKFtBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWV0pCisrCisrICBkbmwgQWRkICRJTkNJQ09OViB0byBDUFBGTEFHUyBiZWZvcmUgcGVyZm9ybWluZyB0aGUgZm9sbG93aW5nIGNoZWNrcywKKysgIGRubCBiZWNhdXNlIGlmIHRoZSB1c2VyIGhhcyBpbnN0YWxsZWQgbGliaWNvbnYgYW5kIG5vdCBkaXNhYmxlZCBpdHMgdXNlCisrICBkbmwgdmlhIC0td2l0aG91dC1saWJpY29udi1wcmVmaXgsIGhlIHdhbnRzIHRvIHVzZSBpdC4gVGhlIGZpcnN0CisrICBkbmwgQUNfVFJZX0xJTksgd2lsbCB0aGVuIGZhaWwsIHRoZSBzZWNvbmQgQUNfVFJZX0xJTksgd2lsbCBzdWNjZWVkLgorKyAgYW1fc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorKyAgQUNfTElCX0FQUEVORFRPVkFSKFtDUFBGTEFHU10sIFskSU5DSUNPTlZdKQorKworKyAgQUNfQ0FDSEVfQ0hFQ0soZm9yIGljb252LCBhbV9jdl9mdW5jX2ljb252LCBbCisrICAgIGFtX2N2X2Z1bmNfaWNvbnY9Im5vLCBjb25zaWRlciBpbnN0YWxsaW5nIEdOVSBsaWJpY29udiIKKysgICAgYW1fY3ZfbGliX2ljb252PW5vCisrICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8c3RkbGliLmg+CisrI2luY2x1ZGUgPGljb252Lmg+XSwKKysgICAgICBbaWNvbnZfdCBjZCA9IGljb252X29wZW4oIiIsIiIpOworKyAgICAgICBpY29udihjZCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKysgICAgICAgaWNvbnZfY2xvc2UoY2QpO10sCisrICAgICAgYW1fY3ZfZnVuY19pY29udj15ZXMpCisrICAgIGlmIHRlc3QgIiRhbV9jdl9mdW5jX2ljb252IiAhPSB5ZXM7IHRoZW4KKysgICAgICBhbV9zYXZlX0xJQlM9IiRMSUJTIgorKyAgICAgIExJQlM9IiRMSUJTICRMSUJJQ09OViIKKysgICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxpY29udi5oPl0sCisrICAgICAgICBbaWNvbnZfdCBjZCA9IGljb252X29wZW4oIiIsIiIpOworKyAgICAgICAgIGljb252KGNkLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworKyAgICAgICAgIGljb252X2Nsb3NlKGNkKTtdLAorKyAgICAgICAgYW1fY3ZfbGliX2ljb252PXllcworKyAgICAgICAgYW1fY3ZfZnVuY19pY29udj15ZXMpCisrICAgICAgTElCUz0iJGFtX3NhdmVfTElCUyIKKysgICAgZmkKKysgIF0pCisrICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgPSB5ZXM7IHRoZW4KKysgICAgQUNfREVGSU5FKEhBVkVfSUNPTlYsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGljb252KCkgZnVuY3Rpb24uXSkKKysgIGZpCisrICBpZiB0ZXN0ICIkYW1fY3ZfbGliX2ljb252IiA9IHllczsgdGhlbgorKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBsaW5rIHdpdGggbGliaWNvbnZdKQorKyAgICBBQ19NU0dfUkVTVUxUKFskTElCSUNPTlZdKQorKyAgZWxzZQorKyAgICBkbmwgSWYgJExJQklDT05WIGRpZG4ndCBsZWFkIHRvIGEgdXNhYmxlIGxpYnJhcnksIHdlIGRvbid0IG5lZWQgJElOQ0lDT05WCisrICAgIGRubCBlaXRoZXIuCisrICAgIENQUEZMQUdTPSIkYW1fc2F2ZV9DUFBGTEFHUyIKKysgICAgTElCSUNPTlY9CisrICAgIExUTElCSUNPTlY9CisrICBmaQorKyAgQUNfU1VCU1QoTElCSUNPTlYpCisrICBBQ19TVUJTVChMVExJQklDT05WKQorK10pCisrCisrQUNfREVGVU4oW0FNX0lDT05WXSwKKytbCisrICBBTV9JQ09OVl9MSU5LCisrICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgPSB5ZXM7IHRoZW4KKysgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaWNvbnYgZGVjbGFyYXRpb25dKQorKyAgICBBQ19DQUNIRV9WQUwoYW1fY3ZfcHJvdG9faWNvbnYsIFsKKysgICAgICBBQ19UUllfQ09NUElMRShbCisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxpY29udi5oPgorK2V4dGVybgorKyNpZmRlZiBfX2NwbHVzcGx1cworKyJDIgorKyNlbmRpZgorKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorK3NpemVfdCBpY29udiAoaWNvbnZfdCBjZCwgY2hhciAqICppbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwgY2hhciAqICpvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KTsKKysjZWxzZQorK3NpemVfdCBpY29udigpOworKyNlbmRpZgorK10sIFtdLCBhbV9jdl9wcm90b19pY29udl9hcmcxPSIiLCBhbV9jdl9wcm90b19pY29udl9hcmcxPSJjb25zdCIpCisrICAgICAgYW1fY3ZfcHJvdG9faWNvbnY9ImV4dGVybiBzaXplX3QgaWNvbnYgKGljb252X3QgY2QsICRhbV9jdl9wcm90b19pY29udl9hcmcxIGNoYXIgKiAqaW5idWYsIHNpemVfdCAqaW5ieXRlc2xlZnQsIGNoYXIgKiAqb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCk7Il0pCisrICAgIGFtX2N2X3Byb3RvX2ljb252PWBlY2hvICJbJF1hbV9jdl9wcm90b19pY29udiIgfCB0ciAtcyAnICcgfCBzZWQgLWUgJ3MvKCAvKC8nYAorKyAgICBBQ19NU0dfUkVTVUxUKFskXXthY190Oi0KKysgICAgICAgICB9WyRdYW1fY3ZfcHJvdG9faWNvbnYpCisrICAgIEFDX0RFRklORV9VTlFVT1RFRChJQ09OVl9DT05TVCwgJGFtX2N2X3Byb3RvX2ljb252X2FyZzEsCisrICAgICAgW0RlZmluZSBhcyBjb25zdCBpZiB0aGUgZGVjbGFyYXRpb24gb2YgaWNvbnYoKSBuZWVkcyBjb25zdC5dKQorKyAgZmkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9pbnRkaXYwLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9tNC9pbnRkaXYwLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODQ1NjczNjA4IC0wNDAwCitAQCAtMCwwICsxLDcyIEBACisrIyBpbnRkaXYwLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTEuMykKKytkbmwgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrCisrZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorKworK0FDX0RFRlVOKFtndF9JTlRESVYwXSwKKytbCisrICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKysgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKysKKysgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGludGVnZXIgZGl2aXNpb24gYnkgemVybyByYWlzZXMgU0lHRlBFXSwKKysgICAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGUsCisrICAgIFsKKysgICAgICBBQ19UUllfUlVOKFsKKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2luY2x1ZGUgPHNpZ25hbC5oPgorKworK3N0YXRpYyB2b2lkCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrc2lnZnBlX2hhbmRsZXIgKGludCBzaWcpCisrI2Vsc2UKKytzaWdmcGVfaGFuZGxlciAoc2lnKSBpbnQgc2lnOworKyNlbmRpZgorK3sKKysgIC8qIEV4aXQgd2l0aCBjb2RlIDAgaWYgU0lHRlBFLCB3aXRoIGNvZGUgMSBpZiBhbnkgb3RoZXIgc2lnbmFsLiAgKi8KKysgIGV4aXQgKHNpZyAhPSBTSUdGUEUpOworK30KKysKKytpbnQgeCA9IDE7CisraW50IHkgPSAwOworK2ludCB6OworK2ludCBuYW47CisrCisraW50IG1haW4gKCkKKyt7CisrICBzaWduYWwgKFNJR0ZQRSwgc2lnZnBlX2hhbmRsZXIpOworKy8qIElSSVggYW5kIEFJWCAod2hlbiAieGxjIC1xY2hlY2siIGlzIHVzZWQpIHlpZWxkIHNpZ25hbCBTSUdUUkFQLiAgKi8KKysjaWYgKGRlZmluZWQgKF9fc2dpKSB8fCBkZWZpbmVkIChfQUlYKSkgJiYgZGVmaW5lZCAoU0lHVFJBUCkKKysgIHNpZ25hbCAoU0lHVFJBUCwgc2lnZnBlX2hhbmRsZXIpOworKyNlbmRpZgorKy8qIExpbnV4L1NQQVJDIHlpZWxkcyBzaWduYWwgU0lHSUxMLiAgKi8KKysjaWYgZGVmaW5lZCAoX19zcGFyY19fKSAmJiBkZWZpbmVkIChfX2xpbnV4X18pCisrICBzaWduYWwgKFNJR0lMTCwgc2lnZnBlX2hhbmRsZXIpOworKyNlbmRpZgorKworKyAgeiA9IHggLyB5OworKyAgbmFuID0geSAvIHk7CisrICBleGl0ICgxKTsKKyt9CisrXSwgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9eWVzLCBndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZT1ubywKKysgICAgICAgIFsKKysgICAgICAgICAgIyBHdWVzcyBiYXNlZCBvbiB0aGUgQ1BVLgorKyAgICAgICAgICBjYXNlICIkaG9zdF9jcHUiIGluCisrICAgICAgICAgICAgYWxwaGEqIHwgaVszNDU2N104NiB8IG02OGsgfCBzMzkwKikKKysgICAgICAgICAgICAgIGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlPSJndWVzc2luZyB5ZXMiOzsKKysgICAgICAgICAgICAqKQorKyAgICAgICAgICAgICAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9Imd1ZXNzaW5nIG5vIjs7CisrICAgICAgICAgIGVzYWMKKysgICAgICAgIF0pCisrICAgIF0pCisrICBjYXNlICIkZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGUiIGluCisrICAgICp5ZXMpIHZhbHVlPTE7OworKyAgICAqKSB2YWx1ZT0wOzsKKysgIGVzYWMKKysgIEFDX0RFRklORV9VTlFVT1RFRChJTlRESVYwX1JBSVNFU19TSUdGUEUsICR2YWx1ZSwKKysgICAgW0RlZmluZSBpZiBpbnRlZ2VyIGRpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHNpZ25hbCBTSUdGUEUuXSkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9pbnRtYXgubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L2ludG1heC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljg1NTY3MjA4OCAtMDQwMAorQEAgLTAsMCArMSwzMiBAQAorKyMgaW50bWF4Lm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCisrZG5sIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrCisrZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorK2RubCBUZXN0IHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgdGhlICdpbnRtYXhfdCcgdHlwZSwgYnV0IGRvbid0IGF0dGVtcHQgdG8KKytkbmwgZmluZCBhIHJlcGxhY2VtZW50IGlmIGl0IGlzIGxhY2tpbmcuCisrCisrQUNfREVGVU4oW2d0X1RZUEVfSU5UTUFYX1RdLAorK1sKKysgIEFDX1JFUVVJUkUoW2ptX0FDX0hFQURFUl9JTlRUWVBFU19IXSkKKysgIEFDX1JFUVVJUkUoW2ptX0FDX0hFQURFUl9TVERJTlRfSF0pCisrICBBQ19DQUNIRV9DSEVDSyhmb3IgaW50bWF4X3QsIGd0X2N2X2NfaW50bWF4X3QsCisrICAgIFtBQ19UUllfQ09NUElMRShbCisrI2luY2x1ZGUgPHN0ZGRlZi5oPiAKKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2lmIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYCisrI2luY2x1ZGUgPHN0ZGludC5oPgorKyNlbmRpZgorKyNpZiBIQVZFX0lOVFRZUEVTX0hfV0lUSF9VSU5UTUFYCisrI2luY2x1ZGUgPGludHR5cGVzLmg+CisrI2VuZGlmCisrXSwgW2ludG1heF90IHggPSAtMTtdLCBndF9jdl9jX2ludG1heF90PXllcywgZ3RfY3ZfY19pbnRtYXhfdD1ubyldKQorKyAgaWYgdGVzdCAkZ3RfY3ZfY19pbnRtYXhfdCA9IHllczsgdGhlbgorKyAgICBBQ19ERUZJTkUoSEFWRV9JTlRNQVhfVCwgMSwKKysgICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnaW50bWF4X3QnIHR5cGUgaW4gPHN0ZGludC5oPiBvciA8aW50dHlwZXMuaD4uXSkKKysgIGZpCisrXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvaW50dHlwZXNfaC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvaW50dHlwZXNfaC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljg2ODY3MDExMiAtMDQwMAorQEAgLTAsMCArMSwyOCBAQAorKyMgaW50dHlwZXNfaC5tNCBzZXJpYWwgNSAoZ2V0dGV4dC0wLjEyKQorK2RubCBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworK2RubCBGcm9tIFBhdWwgRWdnZXJ0LgorKworKyMgRGVmaW5lIEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVggaWYgPGludHR5cGVzLmg+IGV4aXN0cywKKysjIGRvZXNuJ3QgY2xhc2ggd2l0aCA8c3lzL3R5cGVzLmg+LCBhbmQgZGVjbGFyZXMgdWludG1heF90LgorKworK0FDX0RFRlVOKFtqbV9BQ19IRUFERVJfSU5UVFlQRVNfSF0sCisrWworKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBpbnR0eXBlcy5oXSwgam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2gsCisrICBbQUNfVFJZX0NPTVBJTEUoCisrICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrI2luY2x1ZGUgPGludHR5cGVzLmg+XSwKKysgICAgW3VpbnRtYXhfdCBpID0gKHVpbnRtYXhfdCkgLTE7XSwKKysgICAgam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2g9eWVzLAorKyAgICBqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaD1ubyldKQorKyAgaWYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSB5ZXM7IHRoZW4KKysgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVgsIDEsCisrICAgICAgW0RlZmluZSBpZiA8aW50dHlwZXMuaD4gZXhpc3RzLCBkb2Vzbid0IGNsYXNoIHdpdGggPHN5cy90eXBlcy5oPiwKKysgICAgICAgYW5kIGRlY2xhcmVzIHVpbnRtYXhfdC4gXSkKKysgIGZpCisrXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvaW50dHlwZXMubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L2ludHR5cGVzLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODYxNjcxMTc2IC0wNDAwCitAQCAtMCwwICsxLDI3IEBACisrIyBpbnR0eXBlcy5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjExLjQpCisrZG5sIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrCisrZG5sIEZyb20gUGF1bCBFZ2dlcnQuCisrCisrIyBEZWZpbmUgSEFWRV9JTlRUWVBFU19IIGlmIDxpbnR0eXBlcy5oPiBleGlzdHMgYW5kIGRvZXNuJ3QgY2xhc2ggd2l0aAorKyMgPHN5cy90eXBlcy5oPi4KKysKKytBQ19ERUZVTihbZ3RfSEVBREVSX0lOVFRZUEVTX0hdLAorK1sKKysgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgaW50dHlwZXMuaF0sIGd0X2N2X2hlYWRlcl9pbnR0eXBlc19oLAorKyAgWworKyAgICBBQ19UUllfQ09NUElMRSgKKysgICAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorKyNpbmNsdWRlIDxpbnR0eXBlcy5oPl0sCisrICAgICAgW10sIGd0X2N2X2hlYWRlcl9pbnR0eXBlc19oPXllcywgZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2g9bm8pCisrICBdKQorKyAgaWYgdGVzdCAkZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSB5ZXM7IHRoZW4KKysgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfSU5UVFlQRVNfSCwgMSwKKysgICAgICBbRGVmaW5lIGlmIDxpbnR0eXBlcy5oPiBleGlzdHMgYW5kIGRvZXNuJ3QgY2xhc2ggd2l0aCA8c3lzL3R5cGVzLmg+Ll0pCisrICBmaQorK10pCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2ludHR5cGVzLXByaS5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvaW50dHlwZXMtcHJpLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODc0NjY5MjAwIC0wNDAwCitAQCAtMCwwICsxLDMyIEBACisrIyBpbnR0eXBlcy1wcmkubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMS40KQorK2RubCBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKysKKysjIERlZmluZSBQUklfTUFDUk9TX0JST0tFTiBpZiA8aW50dHlwZXMuaD4gZXhpc3RzIGFuZCBkZWZpbmVzIHRoZSBQUkkqCisrIyBtYWNyb3MgdG8gbm9uLXN0cmluZyB2YWx1ZXMuICBUaGlzIGlzIHRoZSBjYXNlIG9uIEFJWCA0LjMuMy4KKysKKytBQ19ERUZVTihbZ3RfSU5UVFlQRVNfUFJJXSwKKytbCisrICBBQ19SRVFVSVJFKFtndF9IRUFERVJfSU5UVFlQRVNfSF0pCisrICBpZiB0ZXN0ICRndF9jdl9oZWFkZXJfaW50dHlwZXNfaCA9IHllczsgdGhlbgorKyAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgaW50dHlwZXMuaCBQUkl4Tk4gbWFjcm9zIGFyZSBicm9rZW5dLAorKyAgICAgIGd0X2N2X2ludHR5cGVzX3ByaV9icm9rZW4sCisrICAgICAgWworKyAgICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorKyNpZmRlZiBQUklkMzIKKytjaGFyICpwID0gUFJJZDMyOworKyNlbmRpZgorK10sIFtdLCBndF9jdl9pbnR0eXBlc19wcmlfYnJva2VuPW5vLCBndF9jdl9pbnR0eXBlc19wcmlfYnJva2VuPXllcykKKysgICAgICBdKQorKyAgZmkKKysgIGlmIHRlc3QgIiRndF9jdl9pbnR0eXBlc19wcmlfYnJva2VuIiA9IHllczsgdGhlbgorKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoUFJJX01BQ1JPU19CUk9LRU4sIDEsCisrICAgICAgW0RlZmluZSBpZiA8aW50dHlwZXMuaD4gZXhpc3RzIGFuZCBkZWZpbmVzIHVudXNhYmxlIFBSSSogbWFjcm9zLl0pCisrICBmaQorK10pCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2lzYy1wb3NpeC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvaXNjLXBvc2l4Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODg1NjY3NTI4IC0wNDAwCitAQCAtMCwwICsxLDI2IEBACisrIyBpc2MtcG9zaXgubTQgc2VyaWFsIDIgKGdldHRleHQtMC4xMS4yKQorK2RubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworKyMgVGhpcyBmaWxlIGlzIG5vdCBuZWVkZWQgd2l0aCBhdXRvY29uZi0yLjUzIGFuZCBuZXdlci4gIFJlbW92ZSBpdCBpbiAyMDA1LgorKworKyMgVGhpcyB0ZXN0IHJlcGxhY2VzIHRoZSBvbmUgaW4gYXV0b2NvbmYuCisrIyBDdXJyZW50bHkgdGhpcyBtYWNybyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhdXRvY29uZiBtYWNybworKyMgYmVjYXVzZSBnZXR0ZXh0J3MgZ2V0dGV4dC5tNCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGF1dG9tYWtlIHBhY2thZ2UpCisrIyBzdGlsbCB1c2VzIGl0LiAgT3RoZXJ3aXNlLCB0aGUgdXNlIGluIGdldHRleHQubTQgbWFrZXMgYXV0b2hlYWRlcgorKyMgZ2l2ZSB0aGVzZSBkaWFnbm9zdGljczoKKysjICAgY29uZmlndXJlLmluOjU1NjogQUNfVFJZX0NPTVBJTEUgd2FzIGNhbGxlZCBiZWZvcmUgQUNfSVNDX1BPU0lYCisrIyAgIGNvbmZpZ3VyZS5pbjo1NTY6IEFDX1RSWV9SVU4gd2FzIGNhbGxlZCBiZWZvcmUgQUNfSVNDX1BPU0lYCisrCisrdW5kZWZpbmUoW0FDX0lTQ19QT1NJWF0pCisrCisrQUNfREVGVU4oW0FDX0lTQ19QT1NJWF0sCisrICBbCisrICAgIGRubCBUaGlzIHRlc3QgcmVwbGFjZXMgdGhlIG9ic29sZXNjZW50IEFDX0lTQ19QT1NJWCBrbHVkZ2UuCisrICAgIEFDX0NIRUNLX0xJQihjcG9zaXgsIHN0cmVycm9yLCBbTElCUz0iJExJQlMgLWxjcG9zaXgiXSkKKysgIF0KKyspCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2xjbWVzc2FnZS5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvbGNtZXNzYWdlLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTAyNjY0OTQ0IC0wNDAwCitAQCAtMCwwICsxLDMyIEBACisrIyBsY21lc3NhZ2UubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMS4zKQorK2RubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorK2RubAorK2RubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCisrZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKytkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorK2RubCBmdW5jdGlvbmFsaXR5LgorK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCisrZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorK2RubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKytkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisrCisrZG5sIEF1dGhvcnM6CisrZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisrCisrIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorKworK0FDX0RFRlVOKFtBTV9MQ19NRVNTQUdFU10sCisrWworKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKKysgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCisrICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQorKyAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisrICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAorKyAgICAgIFtEZWZpbmUgaWYgeW91ciA8bG9jYWxlLmg+IGZpbGUgZGVmaW5lcyBMQ19NRVNTQUdFUy5dKQorKyAgZmkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9saWItbGQubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L2xpYi1sZC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0LjkwODY2NDAzMiAtMDQwMAorQEAgLTAsMCArMSwxMTIgQEAKKysjIGxpYi1sZC5tNCBzZXJpYWwgMyAoZ2V0dGV4dC0wLjEzKQorK2RubCBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworK2RubCBTdWJyb3V0aW5lcyBvZiBsaWJ0b29sLm00LAorK2RubCB3aXRoIHJlcGxhY2VtZW50cyBzL0FDXy9BQ19MSUIvIGFuZCBzL2x0X2N2L2FjbF9jdi8gdG8gYXZvaWQgY29sbGlzaW9uCisrZG5sIHdpdGggbGlidG9vbC5tNC4KKysKKytkbmwgRnJvbSBsaWJ0b29sLTEuNC4gU2V0cyB0aGUgdmFyaWFibGUgd2l0aF9nbnVfbGQgdG8geWVzIG9yIG5vLgorK0FDX0RFRlVOKFtBQ19MSUJfUFJPR19MRF9HTlVdLAorK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY2xfY3ZfcHJvZ19nbnVfbGQsCisrWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisrY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKysqR05VKiB8ICond2l0aCBCRkQnKikKKysgIGFjbF9jdl9wcm9nX2dudV9sZD15ZXMgOzsKKysqKQorKyAgYWNsX2N2X3Byb2dfZ251X2xkPW5vIDs7CisrZXNhY10pCisrd2l0aF9nbnVfbGQ9JGFjbF9jdl9wcm9nX2dudV9sZAorK10pCisrCisrZG5sIEZyb20gbGlidG9vbC0xLjQuIFNldHMgdGhlIHZhcmlhYmxlIExELgorK0FDX0RFRlVOKFtBQ19MSUJfUFJPR19MRF0sCisrW0FDX0FSR19XSVRIKGdudS1sZCwKKytbICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKKyt0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQorK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKysjIFByZXBhcmUgUEFUSF9TRVBBUkFUT1IuCisrIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCisraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKysgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKysgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKysgIGNobW9kICt4IGNvbmYkJC5zaAorKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisrICBlbHNlCisrICAgIFBBVEhfU0VQQVJBVE9SPToKKysgIGZpCisrICBybSAtZiBjb25mJCQuc2gKKytmaQorK2FjX3Byb2c9bGQKKytpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisrICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCisrICBjYXNlICRob3N0IGluCisrICAqLSotbWluZ3cqKQorKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisrICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKysgICopCisrICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKysgIGVzYWMKKysgIGNhc2UgJGFjX3Byb2cgaW4KKysgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisrICAgIFtbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopXQorKyAgICAgIFtyZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nXQorKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCisrICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKKysgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKysJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAorKyAgICAgIGRvbmUKKysgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKysgICAgICA7OworKyAgIiIpCisrICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorKyAgICBhY19wcm9nPWxkCisrICAgIDs7CisrICAqKQorKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisrICAgIHdpdGhfZ251X2xkPXVua25vd24KKysgICAgOzsKKysgIGVzYWMKKytlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKysgIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCisrZWxzZQorKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCisrZmkKKytBQ19DQUNIRV9WQUwoYWNsX2N2X3BhdGhfTEQsCisrW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KKysgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCisrICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKysgICAgICBhY2xfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKysgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisrICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorKyAgICAgIGNhc2UgYCIkYWNsX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGxgIGluCisrICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisrCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsgOzsKKysgICAgICAqKQorKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhayA7OworKyAgICAgIGVzYWMKKysgICAgZmkKKysgIGRvbmUKKysgIElGUz0iJGFjX3NhdmVfaWZzIgorK2Vsc2UKKysgIGFjbF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorK2ZpXSkKKytMRD0iJGFjbF9jdl9wYXRoX0xEIgorK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKysgIEFDX01TR19SRVNVTFQoJExEKQorK2Vsc2UKKysgIEFDX01TR19SRVNVTFQobm8pCisrZmkKKyt0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorK0FDX0xJQl9QUk9HX0xEX0dOVQorK10pCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2xpYi1saW5rLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9tNC9saWItbGluay5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0LjkxNDY2MzEyMCAtMDQwMAorQEAgLTAsMCArMSw1NTEgQEAKKysjIGxpYi1saW5rLm00IHNlcmlhbCA0IChnZXR0ZXh0LTAuMTIpCisrZG5sIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrCisrZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorKworK2RubCBBQ19MSUJfTElOS0ZMQUdTKG5hbWUgWywgZGVwZW5kZW5jaWVzXSkgc2VhcmNoZXMgZm9yIGxpYm5hbWUgYW5kCisrZG5sIHRoZSBsaWJyYXJpZXMgY29ycmVzcG9uZGluZyB0byBleHBsaWNpdCBhbmQgaW1wbGljaXQgZGVwZW5kZW5jaWVzLgorK2RubCBTZXRzIGFuZCBBQ19TVUJTVHMgdGhlIExJQiR7TkFNRX0gYW5kIExUTElCJHtOQU1FfSB2YXJpYWJsZXMgYW5kCisrZG5sIGF1Z21lbnRzIHRoZSBDUFBGTEFHUyB2YXJpYWJsZS4KKytBQ19ERUZVTihbQUNfTElCX0xJTktGTEFHU10sCisrWworKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKysgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisrICBkZWZpbmUoW05hbWVdLFt0cmFuc2xpdChbJDFdLFsuLy1dLCBbX19fXSldKQorKyAgZGVmaW5lKFtOQU1FXSxbdHJhbnNsaXQoWyQxXSxbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy1dLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX19dKV0pCisrICBBQ19DQUNIRV9DSEVDSyhbaG93IHRvIGxpbmsgd2l0aCBsaWJbXSQxXSwgW2FjX2N2X2xpYltdTmFtZVtdX2xpYnNdLCBbCisrICAgIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShbJDFdLCBbJDJdKQorKyAgICBhY19jdl9saWJbXU5hbWVbXV9saWJzPSIkTElCW11OQU1FIgorKyAgICBhY19jdl9saWJbXU5hbWVbXV9sdGxpYnM9IiRMVExJQltdTkFNRSIKKysgICAgYWNfY3ZfbGliW11OYW1lW11fY3BwZmxhZ3M9IiRJTkNbXU5BTUUiCisrICBdKQorKyAgTElCW11OQU1FPSIkYWNfY3ZfbGliW11OYW1lW11fbGlicyIKKysgIExUTElCW11OQU1FPSIkYWNfY3ZfbGliW11OYW1lW11fbHRsaWJzIgorKyAgSU5DW11OQU1FPSIkYWNfY3ZfbGliW11OYW1lW11fY3BwZmxhZ3MiCisrICBBQ19MSUJfQVBQRU5EVE9WQVIoW0NQUEZMQUdTXSwgWyRJTkNdTkFNRSkKKysgIEFDX1NVQlNUKFtMSUJdTkFNRSkKKysgIEFDX1NVQlNUKFtMVExJQl1OQU1FKQorKyAgZG5sIEFsc28gc2V0IEhBVkVfTElCW11OQU1FIHNvIHRoYXQgQUNfTElCX0hBVkVfTElOS0ZMQUdTIGNhbiByZXVzZSB0aGUKKysgIGRubCByZXN1bHRzIG9mIHRoaXMgc2VhcmNoIHdoZW4gdGhpcyBsaWJyYXJ5IGFwcGVhcnMgYXMgYSBkZXBlbmRlbmN5LgorKyAgSEFWRV9MSUJbXU5BTUU9eWVzCisrICB1bmRlZmluZShbTmFtZV0pCisrICB1bmRlZmluZShbTkFNRV0pCisrXSkKKysKKytkbmwgQUNfTElCX0hBVkVfTElOS0ZMQUdTKG5hbWUsIGRlcGVuZGVuY2llcywgaW5jbHVkZXMsIHRlc3Rjb2RlKQorK2RubCBzZWFyY2hlcyBmb3IgbGlibmFtZSBhbmQgdGhlIGxpYnJhcmllcyBjb3JyZXNwb25kaW5nIHRvIGV4cGxpY2l0IGFuZAorK2RubCBpbXBsaWNpdCBkZXBlbmRlbmNpZXMsIHRvZ2V0aGVyIHdpdGggdGhlIHNwZWNpZmllZCBpbmNsdWRlIGZpbGVzIGFuZAorK2RubCB0aGUgYWJpbGl0eSB0byBjb21waWxlIGFuZCBsaW5rIHRoZSBzcGVjaWZpZWQgdGVzdGNvZGUuIElmIGZvdW5kLCBpdAorK2RubCBzZXRzIGFuZCBBQ19TVUJTVHMgSEFWRV9MSUIke05BTUV9PXllcyBhbmQgdGhlIExJQiR7TkFNRX0gYW5kCisrZG5sIExUTElCJHtOQU1FfSB2YXJpYWJsZXMgYW5kIGF1Z21lbnRzIHRoZSBDUFBGTEFHUyB2YXJpYWJsZSwgYW5kCisrZG5sICNkZWZpbmVzIEhBVkVfTElCJHtOQU1FfSB0byAxLiBPdGhlcndpc2UsIGl0IHNldHMgYW5kIEFDX1NVQlNUcworK2RubCBIQVZFX0xJQiR7TkFNRX09bm8gYW5kIExJQiR7TkFNRX0gYW5kIExUTElCJHtOQU1FfSB0byBlbXB0eS4KKytBQ19ERUZVTihbQUNfTElCX0hBVkVfTElOS0ZMQUdTXSwKKytbCisrICBBQ19SRVFVSVJFKFtBQ19MSUJfUFJFUEFSRV9QUkVGSVhdKQorKyAgQUNfUkVRVUlSRShbQUNfTElCX1JQQVRIXSkKKysgIGRlZmluZShbTmFtZV0sW3RyYW5zbGl0KFskMV0sWy4vLV0sIFtfX19dKV0pCisrICBkZWZpbmUoW05BTUVdLFt0cmFuc2xpdChbJDFdLFthYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLV0sCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX10pXSkKKysKKysgIGRubCBTZWFyY2ggZm9yIGxpYltdTmFtZSBhbmQgZGVmaW5lIExJQltdTkFNRSwgTFRMSUJbXU5BTUUgYW5kIElOQ1tdTkFNRQorKyAgZG5sIGFjY29yZGluZ2x5LgorKyAgQUNfTElCX0xJTktGTEFHU19CT0RZKFskMV0sIFskMl0pCisrCisrICBkbmwgQWRkICRJTkNbXU5BTUUgdG8gQ1BQRkxBR1MgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZyBjaGVja3MsCisrICBkbmwgYmVjYXVzZSBpZiB0aGUgdXNlciBoYXMgaW5zdGFsbGVkIGxpYltdTmFtZSBhbmQgbm90IGRpc2FibGVkIGl0cyB1c2UKKysgIGRubCB2aWEgLS13aXRob3V0LWxpYltdTmFtZS1wcmVmaXgsIGhlIHdhbnRzIHRvIHVzZSBpdC4KKysgIGFjX3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKysgIEFDX0xJQl9BUFBFTkRUT1ZBUihbQ1BQRkxBR1NdLCBbJElOQ11OQU1FKQorKworKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsaWJbXSQxXSwgW2FjX2N2X2xpYltdTmFtZV0sIFsKKysgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKysgICAgTElCUz0iJExJQlMgJExJQltdTkFNRSIKKysgICAgQUNfVFJZX0xJTksoWyQzXSwgWyQ0XSwgW2FjX2N2X2xpYltdTmFtZT15ZXNdLCBbYWNfY3ZfbGliW11OYW1lPW5vXSkKKysgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKysgIF0pCisrICBpZiB0ZXN0ICIkYWNfY3ZfbGliW11OYW1lIiA9IHllczsgdGhlbgorKyAgICBIQVZFX0xJQltdTkFNRT15ZXMKKysgICAgQUNfREVGSU5FKFtIQVZFX0xJQl1OQU1FLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAkMSBsaWJyYXJ5Ll0pCisrICAgIEFDX01TR19DSEVDS0lORyhbaG93IHRvIGxpbmsgd2l0aCBsaWJbXSQxXSkKKysgICAgQUNfTVNHX1JFU1VMVChbJExJQltdTkFNRV0pCisrICBlbHNlCisrICAgIEhBVkVfTElCW11OQU1FPW5vCisrICAgIGRubCBJZiAkTElCW11OQU1FIGRpZG4ndCBsZWFkIHRvIGEgdXNhYmxlIGxpYnJhcnksIHdlIGRvbid0IG5lZWQKKysgICAgZG5sICRJTkNbXU5BTUUgZWl0aGVyLgorKyAgICBDUFBGTEFHUz0iJGFjX3NhdmVfQ1BQRkxBR1MiCisrICAgIExJQltdTkFNRT0KKysgICAgTFRMSUJbXU5BTUU9CisrICBmaQorKyAgQUNfU1VCU1QoW0hBVkVfTElCXU5BTUUpCisrICBBQ19TVUJTVChbTElCXU5BTUUpCisrICBBQ19TVUJTVChbTFRMSUJdTkFNRSkKKysgIHVuZGVmaW5lKFtOYW1lXSkKKysgIHVuZGVmaW5lKFtOQU1FXSkKKytdKQorKworK2RubCBEZXRlcm1pbmUgdGhlIHBsYXRmb3JtIGRlcGVuZGVudCBwYXJhbWV0ZXJzIG5lZWRlZCB0byB1c2UgcnBhdGg6CisrZG5sIGxpYmV4dCwgc2hsaWJleHQsIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsCisrZG5sIGhhcmRjb2RlX2RpcmVjdCwgaGFyZGNvZGVfbWludXNfTC4KKytBQ19ERUZVTihbQUNfTElCX1JQQVRIXSwKKytbCisrICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkgICAgICAgICAgICAgICAgZG5sIHdlIHVzZSAkQ0MsICRHQ0MsICRMREZMQUdTCisrICBBQ19SRVFVSVJFKFtBQ19MSUJfUFJPR19MRF0pICAgICAgICAgICAgZG5sIHdlIHVzZSAkTEQsICR3aXRoX2dudV9sZAorKyAgQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKSAgICAgICAgIGRubCB3ZSB1c2UgJGhvc3QKKysgIEFDX1JFUVVJUkUoW0FDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRdKSBkbmwgd2UgdXNlICRhY19hdXhfZGlyCisrICBBQ19DQUNIRV9DSEVDSyhbZm9yIHNoYXJlZCBsaWJyYXJ5IHJ1biBwYXRoIG9yaWdpbl0sIGFjbF9jdl9ycGF0aCwgWworKyAgICBDQz0iJENDIiBHQ0M9IiRHQ0MiIExERkxBR1M9IiRMREZMQUdTIiBMRD0iJExEIiB3aXRoX2dudV9sZD0iJHdpdGhfZ251X2xkIiBcCisrICAgICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICIkYWNfYXV4X2Rpci9jb25maWcucnBhdGgiICIkaG9zdCIgPiBjb25mdGVzdC5zaAorKyAgICAuIC4vY29uZnRlc3Quc2gKKysgICAgcm0gLWYgLi9jb25mdGVzdC5zaAorKyAgICBhY2xfY3ZfcnBhdGg9ZG9uZQorKyAgXSkKKysgIHdsPSIkYWNsX2N2X3dsIgorKyAgbGliZXh0PSIkYWNsX2N2X2xpYmV4dCIKKysgIHNobGliZXh0PSIkYWNsX2N2X3NobGliZXh0IgorKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGFjbF9jdl9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIgorKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0iJGFjbF9jdl9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIgorKyAgaGFyZGNvZGVfZGlyZWN0PSIkYWNsX2N2X2hhcmRjb2RlX2RpcmVjdCIKKysgIGhhcmRjb2RlX21pbnVzX0w9IiRhY2xfY3ZfaGFyZGNvZGVfbWludXNfTCIKKysgIGRubCBEZXRlcm1pbmUgd2hldGhlciB0aGUgdXNlciB3YW50cyBycGF0aCBoYW5kbGluZyBhdCBhbGwuCisrICBBQ19BUkdfRU5BQkxFKHJwYXRoLAorKyAgICBbICAtLWRpc2FibGUtcnBhdGggICAgICAgICBkbyBub3QgaGFyZGNvZGUgcnVudGltZSBsaWJyYXJ5IHBhdGhzXSwKKysgICAgOiwgZW5hYmxlX3JwYXRoPXllcykKKytdKQorKworK2RubCBBQ19MSUJfTElOS0ZMQUdTX0JPRFkobmFtZSBbLCBkZXBlbmRlbmNpZXNdKSBzZWFyY2hlcyBmb3IgbGlibmFtZSBhbmQKKytkbmwgdGhlIGxpYnJhcmllcyBjb3JyZXNwb25kaW5nIHRvIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBkZXBlbmRlbmNpZXMuCisrZG5sIFNldHMgdGhlIExJQiR7TkFNRX0sIExUTElCJHtOQU1FfSBhbmQgSU5DJHtOQU1FfSB2YXJpYWJsZXMuCisrQUNfREVGVU4oW0FDX0xJQl9MSU5LRkxBR1NfQk9EWV0sCisrWworKyAgZGVmaW5lKFtOQU1FXSxbdHJhbnNsaXQoWyQxXSxbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy1dLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX19dKV0pCisrICBkbmwgQnkgZGVmYXVsdCwgbG9vayBpbiAkaW5jbHVkZWRpciBhbmQgJGxpYmRpci4KKysgIHVzZV9hZGRpdGlvbmFsPXllcworKyAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFsKKysgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisrICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKysgIF0pCisrICBBQ19MSUJfQVJHX1dJVEgoW2xpYiQxLXByZWZpeF0sCisrWyAgLS13aXRoLWxpYiQxLXByZWZpeFs9RElSXSAgc2VhcmNoIGZvciBsaWIkMSBpbiBESVIvaW5jbHVkZSBhbmQgRElSL2xpYgorKyAgLS13aXRob3V0LWxpYiQxLXByZWZpeCAgICAgZG9uJ3Qgc2VhcmNoIGZvciBsaWIkMSBpbiBpbmNsdWRlZGlyIGFuZCBsaWJkaXJdLAorK1sKKysgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisrICAgICAgdXNlX2FkZGl0aW9uYWw9bm8KKysgICAgZWxzZQorKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKysgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbCisrICAgICAgICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfbGliZGlyPVwiJGxpYmRpclwiCisrICAgICAgICBdKQorKyAgICAgIGVsc2UKKysgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJHdpdGh2YWwvaW5jbHVkZSIKKysgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPSIkd2l0aHZhbC9saWIiCisrICAgICAgZmkKKysgICAgZmkKKytdKQorKyAgZG5sIFNlYXJjaCB0aGUgbGlicmFyeSBhbmQgaXRzIGRlcGVuZGVuY2llcyBpbiAkYWRkaXRpb25hbF9saWJkaXIgYW5kCisrICBkbmwgJExERkxBR1MuIFVzaW5nIGJyZWFkdGgtZmlyc3Qtc2VhY2guCisrICBMSUJbXU5BTUU9CisrICBMVExJQltdTkFNRT0KKysgIElOQ1tdTkFNRT0KKysgIHJwYXRoZGlycz0KKysgIGx0cnBhdGhkaXJzPQorKyAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPQorKyAgbmFtZXNfbmV4dF9yb3VuZD0nJDEgJDInCisrICB3aGlsZSB0ZXN0IC1uICIkbmFtZXNfbmV4dF9yb3VuZCI7IGRvCisrICAgIG5hbWVzX3RoaXNfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kIgorKyAgICBuYW1lc19uZXh0X3JvdW5kPQorKyAgICBmb3IgbmFtZSBpbiAkbmFtZXNfdGhpc19yb3VuZDsgZG8KKysgICAgICBhbHJlYWR5X2hhbmRsZWQ9CisrICAgICAgZm9yIG4gaW4gJG5hbWVzX2FscmVhZHlfaGFuZGxlZDsgZG8KKysgICAgICAgIGlmIHRlc3QgIiRuIiA9ICIkbmFtZSI7IHRoZW4KKysgICAgICAgICAgYWxyZWFkeV9oYW5kbGVkPXllcworKyAgICAgICAgICBicmVhaworKyAgICAgICAgZmkKKysgICAgICBkb25lCisrICAgICAgaWYgdGVzdCAteiAiJGFscmVhZHlfaGFuZGxlZCI7IHRoZW4KKysgICAgICAgIG5hbWVzX2FscmVhZHlfaGFuZGxlZD0iJG5hbWVzX2FscmVhZHlfaGFuZGxlZCAkbmFtZSIKKysgICAgICAgIGRubCBTZWUgaWYgaXQgd2FzIGFscmVhZHkgbG9jYXRlZCBieSBhbiBlYXJsaWVyIEFDX0xJQl9MSU5LRkxBR1MKKysgICAgICAgIGRubCBvciBBQ19MSUJfSEFWRV9MSU5LRkxBR1MgY2FsbC4KKysgICAgICAgIHVwcGVybmFtZT1gZWNobyAiJG5hbWUiIHwgc2VkIC1lICd5fGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tfEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19ffCdgCisrICAgICAgICBldmFsIHZhbHVlPVwiXCRIQVZFX0xJQiR1cHBlcm5hbWVcIgorKyAgICAgICAgaWYgdGVzdCAtbiAiJHZhbHVlIjsgdGhlbgorKyAgICAgICAgICBpZiB0ZXN0ICIkdmFsdWUiID0geWVzOyB0aGVuCisrICAgICAgICAgICAgZXZhbCB2YWx1ZT1cIlwkTElCJHVwcGVybmFtZVwiCisrICAgICAgICAgICAgdGVzdCAteiAiJHZhbHVlIiB8fCBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSR2YWx1ZSIKKysgICAgICAgICAgICBldmFsIHZhbHVlPVwiXCRMVExJQiR1cHBlcm5hbWVcIgorKyAgICAgICAgICAgIHRlc3QgLXogIiR2YWx1ZSIgfHwgTFRMSUJbXU5BTUU9IiR7TFRMSUJbXU5BTUV9JHtMVExJQltdTkFNRTorIH0kdmFsdWUiCisrICAgICAgICAgIGVsc2UKKysgICAgICAgICAgICBkbmwgQW4gZWFybGllciBjYWxsIHRvIEFDX0xJQl9IQVZFX0xJTktGTEFHUyBoYXMgZGV0ZXJtaW5lZAorKyAgICAgICAgICAgIGRubCB0aGF0IHRoaXMgbGlicmFyeSBkb2Vzbid0IGV4aXN0LiBTbyBqdXN0IGRyb3AgaXQuCisrICAgICAgICAgICAgOgorKyAgICAgICAgICBmaQorKyAgICAgICAgZWxzZQorKyAgICAgICAgICBkbmwgU2VhcmNoIHRoZSBsaWJyYXJ5IGxpYiRuYW1lIGluICRhZGRpdGlvbmFsX2xpYmRpciBhbmQgJExERkxBR1MKKysgICAgICAgICAgZG5sIGFuZCB0aGUgYWxyZWFkeSBjb25zdHJ1Y3RlZCAkTElCTkFNRS8kTFRMSUJOQU1FLgorKyAgICAgICAgICBmb3VuZF9kaXI9CisrICAgICAgICAgIGZvdW5kX2xhPQorKyAgICAgICAgICBmb3VuZF9zbz0KKysgICAgICAgICAgZm91bmRfYT0KKysgICAgICAgICAgaWYgdGVzdCAkdXNlX2FkZGl0aW9uYWwgPSB5ZXM7IHRoZW4KKysgICAgICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJleHQiICYmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kc2hsaWJleHQiOyB0aGVuCisrICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKysgICAgICAgICAgICAgIGZvdW5kX3NvPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJHNobGliZXh0IgorKyAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorKyAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorKyAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCI7IHRoZW4KKysgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkYWRkaXRpb25hbF9saWJkaXIiCisrICAgICAgICAgICAgICAgIGZvdW5kX2E9IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kbGliZXh0IgorKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSIKKysgICAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgZmkKKysgICAgICAgICAgZmkKKysgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiID0gIlgiOyB0aGVuCisrICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCW11OQU1FOyBkbworKyAgICAgICAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKysgICAgICAgICAgICAgIGNhc2UgIiR4IiBpbgorKyAgICAgICAgICAgICAgICAtTCopCisrICAgICAgICAgICAgICAgICAgZGlyPWBlY2hvICJYJHgiIHwgc2VkIC1lICdzL15YLUwvLydgCisrICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGliZXh0IiAmJiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRpciIKKysgICAgICAgICAgICAgICAgICAgIGZvdW5kX3NvPSIkZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCIKKysgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRkaXIvbGliJG5hbWUubGEiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorKyAgICAgICAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLiRsaWJleHQiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRpciIKKysgICAgICAgICAgICAgICAgICAgICAgZm91bmRfYT0iJGRpci9saWIkbmFtZS4kbGliZXh0IgorKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorKyAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgIDs7CisrICAgICAgICAgICAgICBlc2FjCisrICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2RpciIgIT0gIlgiOyB0aGVuCisrICAgICAgICAgICAgICAgIGJyZWFrCisrICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgIGRvbmUKKysgICAgICAgICAgZmkKKysgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiICE9ICJYIjsgdGhlbgorKyAgICAgICAgICAgIGRubCBGb3VuZCB0aGUgbGlicmFyeS4KKysgICAgICAgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1MJGZvdW5kX2RpciAtbCRuYW1lIgorKyAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfc28iICE9ICJYIjsgdGhlbgorKyAgICAgICAgICAgICAgZG5sIExpbmtpbmcgd2l0aCBhIHNoYXJlZCBsaWJyYXJ5LiBXZSBhdHRlbXB0IHRvIGhhcmRjb2RlIGl0cworKyAgICAgICAgICAgICAgZG5sIGRpcmVjdG9yeSBpbnRvIHRoZSBleGVjdXRhYmxlJ3MgcnVucGF0aCwgdW5sZXNzIGl0J3MgdGhlCisrICAgICAgICAgICAgICBkbmwgc3RhbmRhcmQgL3Vzci9saWIuCisrICAgICAgICAgICAgICBpZiB0ZXN0ICIkZW5hYmxlX3JwYXRoIiA9IG5vIHx8IHRlc3QgIlgkZm91bmRfZGlyIiA9ICJYL3Vzci9saWIiOyB0aGVuCisrICAgICAgICAgICAgICAgIGRubCBObyBoYXJkY29kaW5nIGlzIG5lZWRlZC4KKysgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZm91bmRfc28iCisrICAgICAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgICAgIGRubCBVc2UgYW4gZXhwbGljaXQgb3B0aW9uIHRvIGhhcmRjb2RlIERJUiBpbnRvIHRoZSByZXN1bHRpbmcKKysgICAgICAgICAgICAgICAgZG5sIGJpbmFyeS4KKysgICAgICAgICAgICAgICAgZG5sIFBvdGVudGlhbGx5IGFkZCBESVIgdG8gbHRycGF0aGRpcnMuCisrICAgICAgICAgICAgICAgIGRubCBUaGUgbHRycGF0aGRpcnMgd2lsbCBiZSBhcHBlbmRlZCB0byAkTFRMSUJOQU1FIGF0IHRoZSBlbmQuCisrICAgICAgICAgICAgICAgIGhhdmVpdD0KKysgICAgICAgICAgICAgICAgZm9yIHggaW4gJGx0cnBhdGhkaXJzOyBkbworKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRmb3VuZF9kaXIiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisrICAgICAgICAgICAgICAgICAgICBicmVhaworKyAgICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgIGRvbmUKKysgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKysgICAgICAgICAgICAgICAgICBsdHJwYXRoZGlycz0iJGx0cnBhdGhkaXJzICRmb3VuZF9kaXIiCisrICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgIGRubCBUaGUgaGFyZGNvZGluZyBpbnRvICRMSUJOQU1FIGlzIHN5c3RlbSBkZXBlbmRlbnQuCisrICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisrICAgICAgICAgICAgICAgICAgZG5sIFVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKysgICAgICAgICAgICAgICAgICBkbmwgcmVzdWx0aW5nIGJpbmFyeS4KKysgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKysgICAgICAgICAgICAgICAgZWxzZQorKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiAmJiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgZG5sIFVzZSBhbiBleHBsaWNpdCBvcHRpb24gdG8gaGFyZGNvZGUgRElSIGludG8gdGhlIHJlc3VsdGluZworKyAgICAgICAgICAgICAgICAgICAgZG5sIGJpbmFyeS4KKysgICAgICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9JGZvdW5kX3NvIgorKyAgICAgICAgICAgICAgICAgICAgZG5sIFBvdGVudGlhbGx5IGFkZCBESVIgdG8gcnBhdGhkaXJzLgorKyAgICAgICAgICAgICAgICAgICAgZG5sIFRoZSBycGF0aGRpcnMgd2lsbCBiZSBhcHBlbmRlZCB0byAkTElCTkFNRSBhdCB0aGUgZW5kLgorKyAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKysgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGZvdW5kX2RpciI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisrICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKysgICAgICAgICAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgICAgICAgIGRvbmUKKysgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgICAgIHJwYXRoZGlycz0iJHJwYXRoZGlycyAkZm91bmRfZGlyIgorKyAgICAgICAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgICAgICAgICBkbmwgUmVseSBvbiAiLUwkZm91bmRfZGlyIi4KKysgICAgICAgICAgICAgICAgICAgIGRubCBCdXQgZG9uJ3QgYWRkIGl0IGlmIGl0J3MgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIExERkxBR1MKKysgICAgICAgICAgICAgICAgICAgIGRubCBvciB0aGUgYWxyZWFkeSBjb25zdHJ1Y3RlZCAkTElCTkFNRQorKyAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExJQltdTkFNRTsgZG8KKysgICAgICAgICAgICAgICAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKysgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkZm91bmRfZGlyIjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKysgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworKyAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgZG9uZQorKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0tTCRmb3VuZF9kaXIiCisrICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisrICAgICAgICAgICAgICAgICAgICAgIGRubCBGSVhNRTogTm90IHN1cmUgd2hldGhlciB3ZSBzaG91bGQgdXNlCisrICAgICAgICAgICAgICAgICAgICAgIGRubCAiLUwkZm91bmRfZGlyIC1sJG5hbWUiIG9yICItTCRmb3VuZF9kaXIgJGZvdW5kX3NvIgorKyAgICAgICAgICAgICAgICAgICAgICBkbmwgaGVyZS4KKysgICAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZm91bmRfc28iCisrICAgICAgICAgICAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgICAgICAgICAgIGRubCBXZSBjYW5ub3QgdXNlICRoYXJkY29kZV9ydW5wYXRoX3ZhciBhbmQgTERfUlVOX1BBVEgKKysgICAgICAgICAgICAgICAgICAgICAgZG5sIGhlcmUsIGJlY2F1c2UgdGhpcyBkb2Vzbid0IGZpdCBpbiBmbGFncyBwYXNzZWQgdG8gdGhlCisrICAgICAgICAgICAgICAgICAgICAgIGRubCBjb21waWxlci4gU28gZ2l2ZSB1cC4gTm8gaGFyZGNvZGluZy4gVGhpcyBhZmZlY3RzIG9ubHkKKysgICAgICAgICAgICAgICAgICAgICAgZG5sIHZlcnkgb2xkIHN5c3RlbXMuCisrICAgICAgICAgICAgICAgICAgICAgIGRubCBGSVhNRTogTm90IHN1cmUgd2hldGhlciB3ZSBzaG91bGQgdXNlCisrICAgICAgICAgICAgICAgICAgICAgIGRubCAiLUwkZm91bmRfZGlyIC1sJG5hbWUiIG9yICItTCRmb3VuZF9kaXIgJGZvdW5kX3NvIgorKyAgICAgICAgICAgICAgICAgICAgICBkbmwgaGVyZS4KKysgICAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0tbCRuYW1lIgorKyAgICAgICAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2EiICE9ICJYIjsgdGhlbgorKyAgICAgICAgICAgICAgICBkbmwgTGlua2luZyB3aXRoIGEgc3RhdGljIGxpYnJhcnkuCisrICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9JGZvdW5kX2EiCisrICAgICAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgICAgIGRubCBXZSBzaG91bGRuJ3QgY29tZSBoZXJlLCBidXQgYW55d2F5IGl0J3MgZ29vZCB0byBoYXZlIGEKKysgICAgICAgICAgICAgICAgZG5sIGZhbGxiYWNrLgorKyAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfS1MJGZvdW5kX2RpciAtbCRuYW1lIgorKyAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICBmaQorKyAgICAgICAgICAgIGRubCBBc3N1bWUgdGhlIGluY2x1ZGUgZmlsZXMgYXJlIG5lYXJieS4KKysgICAgICAgICAgICBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9CisrICAgICAgICAgICAgY2FzZSAiJGZvdW5kX2RpciIgaW4KKysgICAgICAgICAgICAgICovbGliIHwgKi9saWIvKQorKyAgICAgICAgICAgICAgICBiYXNlZGlyPWBlY2hvICJYJGZvdW5kX2RpciIgfCBzZWQgLWUgJ3MsXlgsLCcgLWUgJ3MsL2xpYi8qJCwsJ2AKKysgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPSIkYmFzZWRpci9pbmNsdWRlIgorKyAgICAgICAgICAgICAgICA7OworKyAgICAgICAgICAgIGVzYWMKKysgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgiOyB0aGVuCisrICAgICAgICAgICAgICBkbmwgUG90ZW50aWFsbHkgYWRkICRhZGRpdGlvbmFsX2luY2x1ZGVkaXIgdG8gJElOQ05BTUUuCisrICAgICAgICAgICAgICBkbmwgQnV0IGRvbid0IGFkZCBpdAorKyAgICAgICAgICAgICAgZG5sICAgMS4gaWYgaXQncyB0aGUgc3RhbmRhcmQgL3Vzci9pbmNsdWRlLAorKyAgICAgICAgICAgICAgZG5sICAgMi4gaWYgaXQncyAvdXNyL2xvY2FsL2luY2x1ZGUgYW5kIHdlIGFyZSB1c2luZyBHQ0Mgb24gTGludXgsCisrICAgICAgICAgICAgICBkbmwgICAzLiBpZiBpdCdzIGFscmVhZHkgcHJlc2VudCBpbiAkQ1BQRkxBR1Mgb3IgdGhlIGFscmVhZHkKKysgICAgICAgICAgICAgIGRubCAgICAgIGNvbnN0cnVjdGVkICRJTkNOQU1FLAorKyAgICAgICAgICAgICAgZG5sICAgNC4gaWYgaXQgZG9lc24ndCBleGlzdCBhcyBhIGRpcmVjdG9yeS4KKysgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiAhPSAiWC91c3IvaW5jbHVkZSI7IHRoZW4KKysgICAgICAgICAgICAgICAgaGF2ZWl0PQorKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgPSAiWC91c3IvbG9jYWwvaW5jbHVkZSI7IHRoZW4KKysgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorKyAgICAgICAgICAgICAgICAgICAgICBsaW51eCopIGhhdmVpdD15ZXM7OworKyAgICAgICAgICAgICAgICAgICAgZXNhYworKyAgICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJENQUEZMQUdTICRJTkNbXU5BTUU7IGRvCisrICAgICAgICAgICAgICAgICAgICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW2V2YWwgeD1cIiR4XCJdKQorKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUkkYWRkaXRpb25hbF9pbmNsdWRlZGlyIjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisrICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisrICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgIGRvbmUKKysgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkSU5DTkFNRS4KKysgICAgICAgICAgICAgICAgICAgICAgSU5DW11OQU1FPSIke0lOQ1tdTkFNRX0ke0lOQ1tdTkFNRTorIH0tSSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiCisrICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgZG5sIExvb2sgZm9yIGRlcGVuZGVuY2llcy4KKysgICAgICAgICAgICBpZiB0ZXN0IC1uICIkZm91bmRfbGEiOyB0aGVuCisrICAgICAgICAgICAgICBkbmwgUmVhZCB0aGUgLmxhIGZpbGUuIEl0IGRlZmluZXMgdGhlIHZhcmlhYmxlcworKyAgICAgICAgICAgICAgZG5sIGRsbmFtZSwgbGlicmFyeV9uYW1lcywgb2xkX2xpYnJhcnksIGRlcGVuZGVuY3lfbGlicywgY3VycmVudCwKKysgICAgICAgICAgICAgIGRubCBhZ2UsIHJldmlzaW9uLCBpbnN0YWxsZWQsIGRsb3BlbiwgZGxwcmVvcGVuLCBsaWJkaXIuCisrICAgICAgICAgICAgICBzYXZlX2xpYmRpcj0iJGxpYmRpciIKKysgICAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9sYSIgaW4KKysgICAgICAgICAgICAgICAgKi8qIHwgKlxcKikgLiAiJGZvdW5kX2xhIiA7OworKyAgICAgICAgICAgICAgICAqKSAuICIuLyRmb3VuZF9sYSIgOzsKKysgICAgICAgICAgICAgIGVzYWMKKysgICAgICAgICAgICAgIGxpYmRpcj0iJHNhdmVfbGliZGlyIgorKyAgICAgICAgICAgICAgZG5sIFdlIHVzZSBvbmx5IGRlcGVuZGVuY3lfbGlicy4KKysgICAgICAgICAgICAgIGZvciBkZXAgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKysgICAgICAgICAgICAgICAgY2FzZSAiJGRlcCIgaW4KKysgICAgICAgICAgICAgICAgICAtTCopCisrICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX2xpYmRpcj1gZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLUwvLydgCisrICAgICAgICAgICAgICAgICAgICBkbmwgUG90ZW50aWFsbHkgYWRkICRhZGRpdGlvbmFsX2xpYmRpciB0byAkTElCTkFNRSBhbmQgJExUTElCTkFNRS4KKysgICAgICAgICAgICAgICAgICAgIGRubCBCdXQgZG9uJ3QgYWRkIGl0CisrICAgICAgICAgICAgICAgICAgICBkbmwgICAxLiBpZiBpdCdzIHRoZSBzdGFuZGFyZCAvdXNyL2xpYiwKKysgICAgICAgICAgICAgICAgICAgIGRubCAgIDIuIGlmIGl0J3MgL3Vzci9sb2NhbC9saWIgYW5kIHdlIGFyZSB1c2luZyBHQ0Mgb24gTGludXgsCisrICAgICAgICAgICAgICAgICAgICBkbmwgICAzLiBpZiBpdCdzIGFscmVhZHkgcHJlc2VudCBpbiAkTERGTEFHUyBvciB0aGUgYWxyZWFkeQorKyAgICAgICAgICAgICAgICAgICAgZG5sICAgICAgY29uc3RydWN0ZWQgJExJQk5BTUUsCisrICAgICAgICAgICAgICAgICAgICBkbmwgICA0LiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFzIGEgZGlyZWN0b3J5LgorKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgIT0gIlgvdXNyL2xpYiI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiA9ICJYL3Vzci9sb2NhbC9saWIiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKysgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKKysgICAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKysgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTElCW11OQU1FOyBkbworKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKysgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1MJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisrICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKysgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmwgUmVhbGx5IGFkZCAkYWRkaXRpb25hbF9saWJkaXIgdG8gJExJQk5BTUUuCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisrICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMVExJQltdTkFNRTsgZG8KKysgICAgICAgICAgICAgICAgICAgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisrICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisrICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfbGliZGlyIHRvICRMVExJQk5BTUUuCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUTElCW11OQU1FPSIke0xUTElCW11OQU1FfSR7TFRMSUJbXU5BTUU6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisrICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgOzsKKysgICAgICAgICAgICAgICAgICAtUiopCisrICAgICAgICAgICAgICAgICAgICBkaXI9YGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1SLy8nYAorKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV9ycGF0aCIgIT0gbm87IHRoZW4KKysgICAgICAgICAgICAgICAgICAgICAgZG5sIFBvdGVudGlhbGx5IGFkZCBESVIgdG8gcnBhdGhkaXJzLgorKyAgICAgICAgICAgICAgICAgICAgICBkbmwgVGhlIHJwYXRoZGlycyB3aWxsIGJlIGFwcGVuZGVkIHRvICRMSUJOQU1FIGF0IHRoZSBlbmQuCisrICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKysgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKysgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZGlyIjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKysgICAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgICBkb25lCisrICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgICAgICAgcnBhdGhkaXJzPSIkcnBhdGhkaXJzICRkaXIiCisrICAgICAgICAgICAgICAgICAgICAgIGZpCisrICAgICAgICAgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgRElSIHRvIGx0cnBhdGhkaXJzLgorKyAgICAgICAgICAgICAgICAgICAgICBkbmwgVGhlIGx0cnBhdGhkaXJzIHdpbGwgYmUgYXBwZW5kZWQgdG8gJExUTElCTkFNRSBhdCB0aGUgZW5kLgorKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisrICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRsdHJwYXRoZGlyczsgZG8KKysgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZGlyIjsgdGhlbgorKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKysgICAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgICBkb25lCisrICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisrICAgICAgICAgICAgICAgICAgICAgICAgbHRycGF0aGRpcnM9IiRsdHJwYXRoZGlycyAkZGlyIgorKyAgICAgICAgICAgICAgICAgICAgICBmaQorKyAgICAgICAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgICAgICAgIDs7CisrICAgICAgICAgICAgICAgICAgLWwqKQorKyAgICAgICAgICAgICAgICAgICAgZG5sIEhhbmRsZSB0aGlzIGluIHRoZSBuZXh0IHJvdW5kLgorKyAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtbC8vJ2AKKysgICAgICAgICAgICAgICAgICAgIDs7CisrICAgICAgICAgICAgICAgICAgKi5sYSkKKysgICAgICAgICAgICAgICAgICAgIGRubCBIYW5kbGUgdGhpcyBpbiB0aGUgbmV4dCByb3VuZC4gVGhyb3cgYXdheSB0aGUgLmxhJ3MKKysgICAgICAgICAgICAgICAgICAgIGRubCBkaXJlY3Rvcnk7IGl0IGlzIGFscmVhZHkgY29udGFpbmVkIGluIGEgcHJlY2VkaW5nIC1MCisrICAgICAgICAgICAgICAgICAgICBkbmwgb3B0aW9uLgorKyAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MsXlguKi8sLCcgLWUgJ3MsXmxpYiwsJyAtZSAncyxcLmxhJCwsJ2AKKysgICAgICAgICAgICAgICAgICAgIDs7CisrICAgICAgICAgICAgICAgICAgKikKKysgICAgICAgICAgICAgICAgICAgIGRubCBNb3N0IGxpa2VseSBhbiBpbW1lZGlhdGUgbGlicmFyeSBuYW1lLgorKyAgICAgICAgICAgICAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZGVwIgorKyAgICAgICAgICAgICAgICAgICAgTFRMSUJbXU5BTUU9IiR7TFRMSUJbXU5BTUV9JHtMVExJQltdTkFNRTorIH0kZGVwIgorKyAgICAgICAgICAgICAgICAgICAgOzsKKysgICAgICAgICAgICAgICAgZXNhYworKyAgICAgICAgICAgICAgZG9uZQorKyAgICAgICAgICAgIGZpCisrICAgICAgICAgIGVsc2UKKysgICAgICAgICAgICBkbmwgRGlkbid0IGZpbmQgdGhlIGxpYnJhcnk7IGFzc3VtZSBpdCBpcyBpbiB0aGUgc3lzdGVtIGRpcmVjdG9yaWVzCisrICAgICAgICAgICAgZG5sIGtub3duIHRvIHRoZSBsaW5rZXIgYW5kIHJ1bnRpbWUgbG9hZGVyLiAoQWxsIHRoZSBzeXN0ZW0KKysgICAgICAgICAgICBkbmwgZGlyZWN0b3JpZXMga25vd24gdG8gdGhlIGxpbmtlciBzaG91bGQgYWxzbyBiZSBrbm93biB0byB0aGUKKysgICAgICAgICAgICBkbmwgcnVudGltZSBsb2FkZXIsIG90aGVyd2lzZSB0aGUgc3lzdGVtIGlzIHNldmVyZWx5IG1pc2NvbmZpZ3VyZWQuKQorKyAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9LWwkbmFtZSIKKysgICAgICAgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1sJG5hbWUiCisrICAgICAgICAgIGZpCisrICAgICAgICBmaQorKyAgICAgIGZpCisrICAgIGRvbmUKKysgIGRvbmUKKysgIGlmIHRlc3QgIlgkcnBhdGhkaXJzIiAhPSAiWCI7IHRoZW4KKysgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisrICAgICAgZG5sIFdlaXJkIHBsYXRmb3JtOiBvbmx5IHRoZSBsYXN0IC1ycGF0aCBvcHRpb24gY291bnRzLCB0aGUgdXNlciBtdXN0CisrICAgICAgZG5sIHBhc3MgYWxsIHBhdGggZWxlbWVudHMgaW4gb25lIG9wdGlvbi4gV2UgY2FuIGFycmFuZ2UgdGhhdCBmb3IgYQorKyAgICAgIGRubCBzaW5nbGUgbGlicmFyeSwgYnV0IG5vdCB3aGVuIG1vcmUgdGhhbiBvbmUgJExJQk5BTUVzIGFyZSB1c2VkLgorKyAgICAgIGFsbGRpcnM9CisrICAgICAgZm9yIGZvdW5kX2RpciBpbiAkcnBhdGhkaXJzOyBkbworKyAgICAgICAgYWxsZGlycz0iJHthbGxkaXJzfSR7YWxsZGlyczorJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3J9JGZvdW5kX2RpciIKKysgICAgICBkb25lCisrICAgICAgZG5sIE5vdGU6IGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgdXNlcyAkbGliZGlyIGFuZCAkd2wuCisrICAgICAgYWNsX3NhdmVfbGliZGlyPSIkbGliZGlyIgorKyAgICAgIGxpYmRpcj0iJGFsbGRpcnMiCisrICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorKyAgICAgIGxpYmRpcj0iJGFjbF9zYXZlX2xpYmRpciIKKysgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmbGFnIgorKyAgICBlbHNlCisrICAgICAgZG5sIFRoZSAtcnBhdGggb3B0aW9ucyBhcmUgY3VtdWxhdGl2ZS4KKysgICAgICBmb3IgZm91bmRfZGlyIGluICRycGF0aGRpcnM7IGRvCisrICAgICAgICBhY2xfc2F2ZV9saWJkaXI9IiRsaWJkaXIiCisrICAgICAgICBsaWJkaXI9IiRmb3VuZF9kaXIiCisrICAgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisrICAgICAgICBsaWJkaXI9IiRhY2xfc2F2ZV9saWJkaXIiCisrICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmbGFnIgorKyAgICAgIGRvbmUKKysgICAgZmkKKysgIGZpCisrICBpZiB0ZXN0ICJYJGx0cnBhdGhkaXJzIiAhPSAiWCI7IHRoZW4KKysgICAgZG5sIFdoZW4gdXNpbmcgbGlidG9vbCwgdGhlIG9wdGlvbiB0aGF0IHdvcmtzIGZvciBib3RoIGxpYnJhcmllcyBhbmQKKysgICAgZG5sIGV4ZWN1dGFibGVzIGlzIC1SLiBUaGUgLVIgb3B0aW9ucyBhcmUgY3VtdWxhdGl2ZS4KKysgICAgZm9yIGZvdW5kX2RpciBpbiAkbHRycGF0aGRpcnM7IGRvCisrICAgICAgTFRMSUJbXU5BTUU9IiR7TFRMSUJbXU5BTUV9JHtMVExJQltdTkFNRTorIH0tUiRmb3VuZF9kaXIiCisrICAgIGRvbmUKKysgIGZpCisrXSkKKysKKytkbmwgQUNfTElCX0FQUEVORFRPVkFSKFZBUiwgQ09OVEVOVFMpIGFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIENPTlRFTlRTIHRvIFZBUiwKKytkbmwgdW5sZXNzIGFscmVhZHkgcHJlc2VudCBpbiBWQVIuCisrZG5sIFdvcmtzIG9ubHkgZm9yIENQUEZMQUdTLCBub3QgZm9yIExJQiogdmFyaWFibGVzIGJlY2F1c2UgdGhhdCBzb21ldGltZXMKKytkbmwgY29udGFpbnMgdHdvIG9yIHRocmVlIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHRoYXQgYmVsb25nIHRvZ2V0aGVyLgorK0FDX0RFRlVOKFtBQ19MSUJfQVBQRU5EVE9WQVJdLAorK1sKKysgIGZvciBlbGVtZW50IGluIFskMl07IGRvCisrICAgIGhhdmVpdD0KKysgICAgZm9yIHggaW4gJFskMV07IGRvCisrICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKysgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZWxlbWVudCI7IHRoZW4KKysgICAgICAgIGhhdmVpdD15ZXMKKysgICAgICAgIGJyZWFrCisrICAgICAgZmkKKysgICAgZG9uZQorKyAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorKyAgICAgIFskMV09IiR7WyQxXX0ke1skMV06KyB9JGVsZW1lbnQiCisrICAgIGZpCisrICBkb25lCisrXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvbGliLXByZWZpeC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvbGliLXByZWZpeC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0LjkyMTY2MjA1NiAtMDQwMAorQEAgLTAsMCArMSwxNTUgQEAKKysjIGxpYi1wcmVmaXgubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMykKKytkbmwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKKytkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KKytkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKKytkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKysKKytkbmwgRnJvbSBCcnVubyBIYWlibGUuCisrCisrZG5sIEFDX0xJQl9BUkdfV0lUSCBpcyBzeW5vbnltb3VzIHRvIEFDX0FSR19XSVRIIGluIGF1dG9jb25mLTIuMTMsIGFuZAorK2RubCBzaW1pbGFyIHRvIEFDX0FSR19XSVRIIGluIGF1dG9jb25mIDIuNTIuLi4yLjU3IGV4Y2VwdCB0aGF0IGlzIGRvZXNuJ3QKKytkbmwgcmVxdWlyZSBleGNlc3NpdmUgYnJhY2tldGluZy4KKytpZmRlZihbQUNfSEVMUF9TVFJJTkddLAorK1tBQ19ERUZVTihbQUNfTElCX0FSR19XSVRIXSwgW0FDX0FSR19XSVRIKFskMV0sW1skMl1dLFskM10sWyQ0XSldKV0sCisrW0FDX0RFRlVOKFtBQ19dW0xJQl9BUkdfV0lUSF0sIFtBQ19BUkdfV0lUSChbJDFdLFskMl0sWyQzXSxbJDRdKV0pXSkKKysKKytkbmwgQUNfTElCX1BSRUZJWCBhZGRzIHRvIHRoZSBDUFBGTEFHUyBhbmQgTERGTEFHUyB0aGUgZmxhZ3MgdGhhdCBhcmUgbmVlZGVkCisrZG5sIHRvIGFjY2VzcyBwcmV2aW91c2x5IGluc3RhbGxlZCBsaWJyYXJpZXMuIFRoZSBiYXNpYyBhc3N1bXB0aW9uIGlzIHRoYXQKKytkbmwgYSB1c2VyIHdpbGwgd2FudCBwYWNrYWdlcyB0byB1c2Ugb3RoZXIgcGFja2FnZXMgaGUgcHJldmlvdXNseSBpbnN0YWxsZWQKKytkbmwgd2l0aCB0aGUgc2FtZSAtLXByZWZpeCBvcHRpb24uCisrZG5sIFRoaXMgbWFjcm8gaXMgbm90IG5lZWRlZCBpZiBvbmx5IEFDX0xJQl9MSU5LRkxBR1MgaXMgdXNlZCB0byBsb2NhdGUKKytkbmwgbGlicmFyaWVzLCBidXQgaXMgb3RoZXJ3aXNlIHZlcnkgY29udmVuaWVudC4KKytBQ19ERUZVTihbQUNfTElCX1BSRUZJWF0sCisrWworKyAgQUNfQkVGT1JFKFskMF0sIFtBQ19MSUJfTElOS0ZMQUdTXSkKKysgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorKyAgQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKysgIGRubCBCeSBkZWZhdWx0LCBsb29rIGluICRpbmNsdWRlZGlyIGFuZCAkbGliZGlyLgorKyAgdXNlX2FkZGl0aW9uYWw9eWVzCisrICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoWworKyAgICBldmFsIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj1cIiRpbmNsdWRlZGlyXCIKKysgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJcIgorKyAgXSkKKysgIEFDX0xJQl9BUkdfV0lUSChbbGliLXByZWZpeF0sCisrWyAgLS13aXRoLWxpYi1wcmVmaXhbPURJUl0gc2VhcmNoIGZvciBsaWJyYXJpZXMgaW4gRElSL2luY2x1ZGUgYW5kIERJUi9saWIKKysgIC0td2l0aG91dC1saWItcHJlZml4ICAgIGRvbid0IHNlYXJjaCBmb3IgbGlicmFyaWVzIGluIGluY2x1ZGVkaXIgYW5kIGxpYmRpcl0sCisrWworKyAgICBpZiB0ZXN0ICJYJHdpdGh2YWwiID0gIlhubyI7IHRoZW4KKysgICAgICB1c2VfYWRkaXRpb25hbD1ubworKyAgICBlbHNlCisrICAgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYIjsgdGhlbgorKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFsKKysgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisrICAgICAgICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKysgICAgICAgIF0pCisrICAgICAgZWxzZQorKyAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPSIkd2l0aHZhbC9pbmNsdWRlIgorKyAgICAgICAgYWRkaXRpb25hbF9saWJkaXI9IiR3aXRodmFsL2xpYiIKKysgICAgICBmaQorKyAgICBmaQorK10pCisrICBpZiB0ZXN0ICR1c2VfYWRkaXRpb25hbCA9IHllczsgdGhlbgorKyAgICBkbmwgUG90ZW50aWFsbHkgYWRkICRhZGRpdGlvbmFsX2luY2x1ZGVkaXIgdG8gJENQUEZMQUdTLgorKyAgICBkbmwgQnV0IGRvbid0IGFkZCBpdAorKyAgICBkbmwgICAxLiBpZiBpdCdzIHRoZSBzdGFuZGFyZCAvdXNyL2luY2x1ZGUsCisrICAgIGRubCAgIDIuIGlmIGl0J3MgYWxyZWFkeSBwcmVzZW50IGluICRDUFBGTEFHUywKKysgICAgZG5sICAgMy4gaWYgaXQncyAvdXNyL2xvY2FsL2luY2x1ZGUgYW5kIHdlIGFyZSB1c2luZyBHQ0Mgb24gTGludXgsCisrICAgIGRubCAgIDQuIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYXMgYSBkaXJlY3RvcnkuCisrICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiAhPSAiWC91c3IvaW5jbHVkZSI7IHRoZW4KKysgICAgICBoYXZlaXQ9CisrICAgICAgZm9yIHggaW4gJENQUEZMQUdTOyBkbworKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKysgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKysgICAgICAgICAgaGF2ZWl0PXllcworKyAgICAgICAgICBicmVhaworKyAgICAgICAgZmkKKysgICAgICBkb25lCisrICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKysgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiA9ICJYL3Vzci9sb2NhbC9pbmNsdWRlIjsgdGhlbgorKyAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorKyAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKysgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisrICAgICAgICAgICAgZXNhYworKyAgICAgICAgICBmaQorKyAgICAgICAgZmkKKysgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisrICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisrICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkQ1BQRkxBR1MuCisrICAgICAgICAgICAgQ1BQRkxBR1M9IiR7Q1BQRkxBR1N9JHtDUFBGTEFHUzorIH0tSSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiCisrICAgICAgICAgIGZpCisrICAgICAgICBmaQorKyAgICAgIGZpCisrICAgIGZpCisrICAgIGRubCBQb3RlbnRpYWxseSBhZGQgJGFkZGl0aW9uYWxfbGliZGlyIHRvICRMREZMQUdTLgorKyAgICBkbmwgQnV0IGRvbid0IGFkZCBpdAorKyAgICBkbmwgICAxLiBpZiBpdCdzIHRoZSBzdGFuZGFyZCAvdXNyL2xpYiwKKysgICAgZG5sICAgMi4gaWYgaXQncyBhbHJlYWR5IHByZXNlbnQgaW4gJExERkxBR1MsCisrICAgIGRubCAgIDMuIGlmIGl0J3MgL3Vzci9sb2NhbC9saWIgYW5kIHdlIGFyZSB1c2luZyBHQ0Mgb24gTGludXgsCisrICAgIGRubCAgIDQuIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYXMgYSBkaXJlY3RvcnkuCisrICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9saWJkaXIiICE9ICJYL3Vzci9saWIiOyB0aGVuCisrICAgICAgaGF2ZWl0PQorKyAgICAgIGZvciB4IGluICRMREZMQUdTOyBkbworKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKysgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1MJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorKyAgICAgICAgICBoYXZlaXQ9eWVzCisrICAgICAgICAgIGJyZWFrCisrICAgICAgICBmaQorKyAgICAgIGRvbmUKKysgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorKyAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgPSAiWC91c3IvbG9jYWwvbGliIjsgdGhlbgorKyAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorKyAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKysgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisrICAgICAgICAgICAgZXNhYworKyAgICAgICAgICBmaQorKyAgICAgICAgZmkKKysgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisrICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKysgICAgICAgICAgICBkbmwgUmVhbGx5IGFkZCAkYWRkaXRpb25hbF9saWJkaXIgdG8gJExERkxBR1MuCisrICAgICAgICAgICAgTERGTEFHUz0iJHtMREZMQUdTfSR7TERGTEFHUzorIH0tTCRhZGRpdGlvbmFsX2xpYmRpciIKKysgICAgICAgICAgZmkKKysgICAgICAgIGZpCisrICAgICAgZmkKKysgICAgZmkKKysgIGZpCisrXSkKKysKKytkbmwgQUNfTElCX1BSRVBBUkVfUFJFRklYIGNyZWF0ZXMgdmFyaWFibGVzIGFjbF9maW5hbF9wcmVmaXgsCisrZG5sIGFjbF9maW5hbF9leGVjX3ByZWZpeCwgY29udGFpbmluZyB0aGUgdmFsdWVzIHRvIHdoaWNoICRwcmVmaXggYW5kCisrZG5sICRleGVjX3ByZWZpeCB3aWxsIGV4cGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgorK0FDX0RFRlVOKFtBQ19MSUJfUFJFUEFSRV9QUkVGSVhdLAorK1sKKysgIGRubCBVbmZvcnR1bmF0ZWx5LCBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGdldCBvbmx5IGZpbmFsbHkgZGV0ZXJtaW5lZAorKyAgZG5sIGF0IHRoZSBlbmQgb2YgY29uZmlndXJlLgorKyAgaWYgdGVzdCAiWCRwcmVmaXgiID0gIlhOT05FIjsgdGhlbgorKyAgICBhY2xfZmluYWxfcHJlZml4PSIkYWNfZGVmYXVsdF9wcmVmaXgiCisrICBlbHNlCisrICAgIGFjbF9maW5hbF9wcmVmaXg9IiRwcmVmaXgiCisrICBmaQorKyAgaWYgdGVzdCAiWCRleGVjX3ByZWZpeCIgPSAiWE5PTkUiOyB0aGVuCisrICAgIGFjbF9maW5hbF9leGVjX3ByZWZpeD0nJHtwcmVmaXh9JworKyAgZWxzZQorKyAgICBhY2xfZmluYWxfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKysgIGZpCisrICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisrICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorKyAgZXZhbCBhY2xfZmluYWxfZXhlY19wcmVmaXg9XCIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4XCIKKysgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKytdKQorKworK2RubCBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW3N0YXRlbWVudF0pIGV2YWx1YXRlcyBzdGF0ZW1lbnQsIHdpdGggdGhlCisrZG5sIHZhcmlhYmxlcyBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGJvdW5kIHRvIHRoZSB2YWx1ZXMgdGhleSB3aWxsIGhhdmUKKytkbmwgYXQgdGhlIGVuZCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4KKytBQ19ERUZVTihbQUNfTElCX1dJVEhfRklOQUxfUFJFRklYXSwKKytbCisrICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisrICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorKyAgYWNsX3NhdmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKysgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorKyAgJDEKKysgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisrICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisrXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvbG9uZ2RvdWJsZS5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvbG9uZ2RvdWJsZS5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljk0MjY1ODg2NCAtMDQwMAorQEAgLTAsMCArMSwzMCBAQAorKyMgbG9uZ2RvdWJsZS5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjEyKQorK2RubCBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKytkbmwgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgJ2xvbmcgZG91YmxlJyB0eXBlLgorK2RubCBQcmVyZXF1aXNpdGU6IEFDX1BST0dfQ0MKKysKKytBQ19ERUZVTihbZ3RfVFlQRV9MT05HRE9VQkxFXSwKKytbCisrICBBQ19DQUNIRV9DSEVDSyhbZm9yIGxvbmcgZG91YmxlXSwgZ3RfY3ZfY19sb25nX2RvdWJsZSwKKysgICAgW2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisrICAgICAgIGd0X2N2X2NfbG9uZ19kb3VibGU9eWVzCisrICAgICBlbHNlCisrICAgICAgIEFDX1RSWV9DT01QSUxFKFsKKysgICAgICAgICAvKiBUaGUgU3RhcmRlbnQgVmlzdHJhIGtub3dzIHNpemVvZihsb25nIGRvdWJsZSksIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IGl0LiAgKi8KKysgICAgICAgICBsb25nIGRvdWJsZSBmb28gPSAwLjA7CisrICAgICAgICAgLyogT24gVWx0cml4IDQuMyBjYywgbG9uZyBkb3VibGUgaXMgNCBhbmQgZG91YmxlIGlzIDguICAqLworKyAgICAgICAgIGludCBhcnJheSBbMiooc2l6ZW9mKGxvbmcgZG91YmxlKSA+PSBzaXplb2YoZG91YmxlKSkgLSAxXTsKKysgICAgICAgICBdLCAsCisrICAgICAgICAgZ3RfY3ZfY19sb25nX2RvdWJsZT15ZXMsIGd0X2N2X2NfbG9uZ19kb3VibGU9bm8pCisrICAgICBmaV0pCisrICBpZiB0ZXN0ICRndF9jdl9jX2xvbmdfZG91YmxlID0geWVzOyB0aGVuCisrICAgIEFDX0RFRklORShIQVZFX0xPTkdfRE9VQkxFLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnbG9uZyBkb3VibGUnIHR5cGUuXSkKKysgIGZpCisrXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvbG9uZ2xvbmcubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L2xvbmdsb25nLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTQ5NjU3ODAwIC0wNDAwCitAQCAtMCwwICsxLDI1IEBACisrIyBsb25nbG9uZy5tNCBzZXJpYWwgNAorK2RubCBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworK2RubCBGcm9tIFBhdWwgRWdnZXJ0LgorKworKyMgRGVmaW5lIEhBVkVfTE9OR19MT05HIGlmICdsb25nIGxvbmcnIHdvcmtzLgorKworK0FDX0RFRlVOKFtqbV9BQ19UWVBFX0xPTkdfTE9OR10sCisrWworKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsb25nIGxvbmddLCBhY19jdl90eXBlX2xvbmdfbG9uZywKKysgIFtBQ19UUllfTElOSyhbbG9uZyBsb25nIGxsID0gMUxMOyBpbnQgaSA9IDYzO10sCisrICAgIFtsb25nIGxvbmcgbGxtYXggPSAobG9uZyBsb25nKSAtMTsKKysgICAgIHJldHVybiBsbCA8PCBpIHwgbGwgPj4gaSB8IGxsbWF4IC8gbGwgfCBsbG1heCAlIGxsO10sCisrICAgIGFjX2N2X3R5cGVfbG9uZ19sb25nPXllcywKKysgICAgYWNfY3ZfdHlwZV9sb25nX2xvbmc9bm8pXSkKKysgIGlmIHRlc3QgJGFjX2N2X3R5cGVfbG9uZ19sb25nID0geWVzOyB0aGVuCisrICAgIEFDX0RFRklORShIQVZFX0xPTkdfTE9ORywgMSwKKysgICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnbG9uZyBsb25nJyB0eXBlLl0pCisrICBmaQorK10pCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L01ha2VmaWxlLmFtCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9tNC9NYWtlZmlsZS5hbQkyMDA0LTA5LTEyIDE0OjQwOjM1LjA0ODY0Mjc1MiAtMDQwMAorQEAgLTAsMCArMSBAQAorK0VYVFJBX0RJU1QgPSBjb2Rlc2V0Lm00IGdldHRleHQubTQgZ2xpYmMyMS5tNCBpY29udi5tNCBpbnRkaXYwLm00IGludG1heC5tNCBpbnR0eXBlcy5tNCBpbnR0eXBlc19oLm00IGludHR5cGVzLXByaS5tNCBpc2MtcG9zaXgubTQgbGNtZXNzYWdlLm00IGxpYi1sZC5tNCBsaWItbGluay5tNCBsaWItcHJlZml4Lm00IGxvbmdkb3VibGUubTQgbG9uZ2xvbmcubTQgbmxzLm00IHBvLm00IHByaW50Zi1wb3NpeC5tNCBwcm9ndGVzdC5tNCBzaWduZWQubTQgc2l6ZV9tYXgubTQgc3RkaW50X2gubTQgdWludG1heF90Lm00IHVsb25nbG9uZy5tNCB3Y2hhcl90Lm00IHdpbnRfdC5tNCB4c2l6ZS5tNAorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9ubHMubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L25scy5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljk1NTY1Njg4OCAtMDQwMAorQEAgLTAsMCArMSw0OSBAQAorKyMgbmxzLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCisrZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrZG5sCisrZG5sIFRoaXMgZmlsZSBjYW4gY2FuIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIKKytkbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CisrZG5sIGZ1bmN0aW9uYWxpdHkuCisrZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKKytkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCisrZG5sIGdldHRleHQgcGFja2FnZSBwYWNrYWdlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorK2RubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KKysKKytkbmwgQXV0aG9yczoKKytkbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS0yMDAwLgorK2RubCAgIEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPiwgMjAwMC0yMDAzLgorKworK0FDX0RFRlVOKFtBTV9OTFNdLAorK1sKKysgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKKysgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCisrICBBQ19BUkdfRU5BQkxFKG5scywKKysgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCisrICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCisrICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorKyAgQUNfU1VCU1QoVVNFX05MUykKKytdKQorKworK0FDX0RFRlVOKFtBTV9NS0lOU1RBTExESVJTXSwKKytbCisrICBkbmwgSWYgdGhlIEFDX0NPTkZJR19BVVhfRElSIG1hY3JvIGZvciBhdXRvY29uZiBpcyB1c2VkIHdlIHBvc3NpYmx5CisrICBkbmwgZmluZCB0aGUgbWtpbnN0YWxsZGlycyBzY3JpcHQgaW4gYW5vdGhlciBzdWJkaXIgYnV0ICQodG9wX3NyY2RpcikuCisrICBkbmwgVHJ5IHRvIGxvY2F0ZSBpdC4KKysgIE1LSU5TVEFMTERJUlM9CisrICBpZiB0ZXN0IC1uICIkYWNfYXV4X2RpciI7IHRoZW4KKysgICAgY2FzZSAiJGFjX2F1eF9kaXIiIGluCisrICAgICAgLyopIE1LSU5TVEFMTERJUlM9IiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiIDs7CisrICAgICAgKikgTUtJTlNUQUxMRElSUz0iXCQodG9wX2J1aWxkZGlyKS8kYWNfYXV4X2Rpci9ta2luc3RhbGxkaXJzIiA7OworKyAgICBlc2FjCisrICBmaQorKyAgaWYgdGVzdCAteiAiJE1LSU5TVEFMTERJUlMiOyB0aGVuCisrICAgIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMiCisrICBmaQorKyAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9wby5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvcG8ubTQJMjAwNC0wOS0xMiAxNDo0MDozNC45NjE2NTU5NzYgLTA0MDAKK0BAIC0wLDAgKzEsNDI2IEBACisrIyBwby5tNCBzZXJpYWwgMyAoZ2V0dGV4dC0wLjE0KQorK2RubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorK2RubAorK2RubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCisrZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKytkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorK2RubCBmdW5jdGlvbmFsaXR5LgorK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCisrZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorK2RubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKytkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisrCisrZG5sIEF1dGhvcnM6CisrZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUtMjAwMC4KKytkbmwgICBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4sIDIwMDAtMjAwMy4KKysKKytkbmwgQ2hlY2tzIGZvciBhbGwgcHJlcmVxdWlzaXRlcyBvZiB0aGUgcG8gc3ViZGlyZWN0b3J5LgorK0FDX0RFRlVOKFtBTV9QT19TVUJESVJTXSwKKytbCisrICBBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKKysgIEFDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCisrICBBQ19SRVFVSVJFKFtBTV9NS0lOU1RBTExESVJTXSlkbmwKKysgIEFDX1JFUVVJUkUoW0FNX05MU10pZG5sCisrCisrICBkbmwgUGVyZm9ybSB0aGUgZm9sbG93aW5nIHRlc3RzIGFsc28gaWYgLS1kaXNhYmxlLW5scyBoYXMgYmVlbiBnaXZlbiwKKysgIGRubCBiZWNhdXNlIHRoZXkgYXJlIG5lZWRlZCBmb3IgIm1ha2UgZGlzdCIgdG8gd29yay4KKysKKysgIGRubCBTZWFyY2ggZm9yIEdOVSBtc2dmbXQgaW4gdGhlIFBBVEguCisrICBkbmwgVGhlIGZpcnN0IHRlc3QgZXhjbHVkZXMgU29sYXJpcyBtc2dmbXQgYW5kIGVhcmx5IEdOVSBtc2dmbXQgdmVyc2lvbnMuCisrICBkbmwgVGhlIHNlY29uZCB0ZXN0IGV4Y2x1ZGVzIEZyZWVCU0QgbXNnZm10LgorKyAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKKysgICAgWyRhY19kaXIvJGFjX3dvcmQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKysgICAgIChpZiAkYWNfZGlyLyRhY193b3JkIC0tc3RhdGlzdGljcyAvZGV2L251bGwgMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCB1c2FnZSA+L2Rldi9udWxsOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpKV0sCisrICAgIDopCisrICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKysKKysgIGRubCBTZWFyY2ggZm9yIEdOVSB4Z2V0dGV4dCAwLjEyIG9yIG5ld2VyIGluIHRoZSBQQVRILgorKyAgZG5sIFRoZSBmaXJzdCB0ZXN0IGV4Y2x1ZGVzIFNvbGFyaXMgeGdldHRleHQgYW5kIGVhcmx5IEdOVSB4Z2V0dGV4dCB2ZXJzaW9ucy4KKysgIGRubCBUaGUgc2Vjb25kIHRlc3QgZXhjbHVkZXMgRnJlZUJTRCB4Z2V0dGV4dC4KKysgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorKyAgICBbJGFjX2Rpci8kYWNfd29yZCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKysgICAgIChpZiAkYWNfZGlyLyRhY193b3JkIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSldLAorKyAgICA6KQorKyAgZG5sIFJlbW92ZSBsZWZ0b3ZlciBmcm9tIEZyZWVCU0QgeGdldHRleHQgY2FsbC4KKysgIHJtIC1mIG1lc3NhZ2VzLnBvCisrCisrICBkbmwgU2VhcmNoIGZvciBHTlUgbXNnbWVyZ2UgMC4xMSBvciBuZXdlciBpbiB0aGUgUEFUSC4KKysgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHTUVSR0UsIG1zZ21lcmdlLAorKyAgICBbJGFjX2Rpci8kYWNfd29yZCAtLXVwZGF0ZSAtcSAvZGV2L251bGwgL2Rldi9udWxsID4vZGV2L251bGwgMj4mMV0sIDopCisrCisrICBkbmwgVGhpcyBjb3VsZCBnbyBhd2F5IHNvbWUgZGF5OyB0aGUgUEFUSF9QUk9HX1dJVEhfVEVTVCBhbHJlYWR5IGRvZXMgaXQuCisrICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgbXNnZm10LgorKyAgaWYgdGVzdCAiJEdNU0dGTVQiICE9ICI6IjsgdGhlbgorKyAgICBkbmwgSWYgaXQgaXMgbm8gR05VIG1zZ2ZtdCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQorKyAgICBkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgorKyAgICBpZiAkR01TR0ZNVCAtLXN0YXRpc3RpY3MgL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorKyAgICAgICAoaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisrICAgICAgOiA7CisrICAgIGVsc2UKKysgICAgICBHTVNHRk1UPWBlY2hvICIkR01TR0ZNVCIgfCBzZWQgLWUgJ3MsXi4qLywsJ2AKKysgICAgICBBQ19NU0dfUkVTVUxUKAorKyAgICAgICAgW2ZvdW5kICRHTVNHRk1UIHByb2dyYW0gaXMgbm90IEdOVSBtc2dmbXQ7IGlnbm9yZSBpdF0pCisrICAgICAgR01TR0ZNVD0iOiIKKysgICAgZmkKKysgIGZpCisrCisrICBkbmwgVGhpcyBjb3VsZCBnbyBhd2F5IHNvbWUgZGF5OyB0aGUgUEFUSF9QUk9HX1dJVEhfVEVTVCBhbHJlYWR5IGRvZXMgaXQuCisrICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCisrICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorKyAgICBkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCisrICAgIGRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCisrICAgIGlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKysgICAgICAgKGlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisrICAgICAgOiA7CisrICAgIGVsc2UKKysgICAgICBBQ19NU0dfUkVTVUxUKAorKyAgICAgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW0gaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKKysgICAgICBYR0VUVEVYVD0iOiIKKysgICAgZmkKKysgICAgZG5sIFJlbW92ZSBsZWZ0b3ZlciBmcm9tIEZyZWVCU0QgeGdldHRleHQgY2FsbC4KKysgICAgcm0gLWYgbWVzc2FnZXMucG8KKysgIGZpCisrCisrICBBQ19PVVRQVVRfQ09NTUFORFMoWworKyAgICBmb3IgYWNfZmlsZSBpbiAkQ09ORklHX0ZJTEVTOyBkbworKyAgICAgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIKKysgICAgICBjYXNlICIkYWNfZmlsZSIgaW4KKysgICAgICAgICo6KikgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisrICAgICAgZXNhYworKyAgICAgICMgUE8gZGlyZWN0b3JpZXMgaGF2ZSBhIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluLmluLgorKyAgICAgIGNhc2UgIiRhY19maWxlIiBpbiAqL01ha2VmaWxlLmluKQorKyAgICAgICAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIuCisrICAgICAgICBhY19kaXI9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisrICAgICAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gIiRhY19kaXIifHNlZCAncyVeXC4vJSUnYCIKKysgICAgICAgIGFjX2RvdHM9YGVjaG8gIiRhY19kaXJfc3VmZml4InxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKysgICAgICAgICMgSW4gYXV0b2NvbmYtMi4xMyBpdCBpcyBjYWxsZWQgJGFjX2dpdmVuX3NyY2Rpci4KKysgICAgICAgICMgSW4gYXV0b2NvbmYtMi41MCBpdCBpcyBjYWxsZWQgJHNyY2Rpci4KKysgICAgICAgIHRlc3QgLW4gIiRhY19naXZlbl9zcmNkaXIiIHx8IGFjX2dpdmVuX3NyY2Rpcj0iJHNyY2RpciIKKysgICAgICAgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisrICAgICAgICAgIC4pICB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2AgOzsKKysgICAgICAgICAgLyopIHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisrICAgICAgICAgICopICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisrICAgICAgICBlc2FjCisrICAgICAgICBpZiB0ZXN0IC1mICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvUE9URklMRVMuaW4iOyB0aGVuCisrICAgICAgICAgIHJtIC1mICIkYWNfZGlyL1BPVEZJTEVTIgorKyAgICAgICAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2Rpci9QT1RGSUxFUyIgfHwgZWNobyAiY3JlYXRpbmcgJGFjX2Rpci9QT1RGSUxFUyIKKysgICAgICAgICAgY2F0ICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvUE9URklMRVMuaW4iIHwgc2VkIC1lICIvXiMvZCIgLWUgIi9eWyAJXSpcJC9kIiAtZSAicywuKiwgICAgICR0b3Bfc3JjZGlyLyYgXFxcXCwiIHwgc2VkIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiA+ICIkYWNfZGlyL1BPVEZJTEVTIgorKyAgICAgICAgICBQT01BS0VGSUxFREVQUz0iUE9URklMRVMuaW4iCisrICAgICAgICAgICMgQUxMX0xJTkdVQVMsIFBPRklMRVMsIFVQREFURVBPRklMRVMsIERVTU1ZUE9GSUxFUywgR01PRklMRVMgZGVwZW5kCisrICAgICAgICAgICMgb24gJGFjX2RpciBidXQgZG9uJ3QgZGVwZW5kIG9uIHVzZXItc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24KKysgICAgICAgICAgIyBwYXJhbWV0ZXJzLgorKyAgICAgICAgICBpZiB0ZXN0IC1mICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyI7IHRoZW4KKysgICAgICAgICAgICAjIFRoZSBMSU5HVUFTIGZpbGUgY29udGFpbnMgdGhlIHNldCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzLgorKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRPQlNPTEVURV9BTExfTElOR1VBUyI7IHRoZW4KKysgICAgICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIgfHwgZWNobyAic2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiCisrICAgICAgICAgICAgZmkKKysgICAgICAgICAgICBBTExfTElOR1VBU189YHNlZCAtZSAiL14jL2QiICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyJgCisrICAgICAgICAgICAgIyBIaWRlIHRoZSBBTExfTElOR1VBUyBhc3NpZ21lbnQgZnJvbSBhdXRvbWFrZS4KKysgICAgICAgICAgICBldmFsICdBTExfTElOR1VBUycnPSRBTExfTElOR1VBU18nCisrICAgICAgICAgICAgUE9NQUtFRklMRURFUFM9IiRQT01BS0VGSUxFREVQUyBMSU5HVUFTIgorKyAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgIyBUaGUgc2V0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMgd2FzIGdpdmVuIGluIGNvbmZpZ3VyZS5pbi4KKysgICAgICAgICAgICBldmFsICdBTExfTElOR1VBUycnPSRPQlNPTEVURV9BTExfTElOR1VBUycKKysgICAgICAgICAgZmkKKysgICAgICAgICAgIyBDb21wdXRlIFBPRklMRVMKKysgICAgICAgICAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykucG8pCisrICAgICAgICAgICMgQ29tcHV0ZSBVUERBVEVQT0ZJTEVTCisrICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykucG8tdXBkYXRlKQorKyAgICAgICAgICAjIENvbXB1dGUgRFVNTVlQT0ZJTEVTCisrICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykubm9wKQorKyAgICAgICAgICAjIENvbXB1dGUgR01PRklMRVMKKysgICAgICAgICAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykuZ21vKQorKyAgICAgICAgICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorKyAgICAgICAgICAgIC4pIHNyY2RpcnByZT0gOzsKKysgICAgICAgICAgICAqKSBzcmNkaXJwcmU9JyQoc3JjZGlyKS8nIDs7CisrICAgICAgICAgIGVzYWMKKysgICAgICAgICAgUE9GSUxFUz0KKysgICAgICAgICAgVVBEQVRFUE9GSUxFUz0KKysgICAgICAgICAgRFVNTVlQT0ZJTEVTPQorKyAgICAgICAgICBHTU9GSUxFUz0KKysgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworKyAgICAgICAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5wbyIKKysgICAgICAgICAgICBVUERBVEVQT0ZJTEVTPSIkVVBEQVRFUE9GSUxFUyAkbGFuZy5wby11cGRhdGUiCisrICAgICAgICAgICAgRFVNTVlQT0ZJTEVTPSIkRFVNTVlQT0ZJTEVTICRsYW5nLm5vcCIKKysgICAgICAgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5nbW8iCisrICAgICAgICAgIGRvbmUKKysgICAgICAgICAgIyBDQVRBTE9HUyBkZXBlbmRzIG9uIGJvdGggJGFjX2RpciBhbmQgdGhlIHVzZXIncyBMSU5HVUFTCisrICAgICAgICAgICMgZW52aXJvbm1lbnQgdmFyaWFibGUuCisrICAgICAgICAgIElOU1RfTElOR1VBUz0KKysgICAgICAgICAgaWYgdGVzdCAtbiAiJEFMTF9MSU5HVUFTIjsgdGhlbgorKyAgICAgICAgICAgIGZvciBwcmVzZW50bGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisrICAgICAgICAgICAgICB1c2VpdD1ubworKyAgICAgICAgICAgICAgaWYgdGVzdCAiJVVOU0VUJSIgIT0gIiRMSU5HVUFTIjsgdGhlbgorKyAgICAgICAgICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkTElOR1VBUyIKKysgICAgICAgICAgICAgIGVsc2UKKysgICAgICAgICAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJEFMTF9MSU5HVUFTIgorKyAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICAgIGZvciBkZXNpcmVkbGFuZyBpbiAkZGVzaXJlZGxhbmd1YWdlczsgZG8KKysgICAgICAgICAgICAgICAgIyBVc2UgdGhlIHByZXNlbnRsYW5nIGNhdGFsb2cgaWYgZGVzaXJlZGxhbmcgaXMKKysgICAgICAgICAgICAgICAgIyAgIGEuIGVxdWFsIHRvIHByZXNlbnRsYW5nLCBvcgorKyAgICAgICAgICAgICAgICAjICAgYi4gYSB2YXJpYW50IG9mIHByZXNlbnRsYW5nIChiZWNhdXNlIGluIHRoaXMgY2FzZSwKKysgICAgICAgICAgICAgICAgIyAgICAgIHByZXNlbnRsYW5nIGNhbiBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgZm9yIG1lc3NhZ2VzCisrICAgICAgICAgICAgICAgICMgICAgICB3aGljaCBhcmUgbm90IHRyYW5zbGF0ZWQgaW4gdGhlIGRlc2lyZWRsYW5nIGNhdGFsb2cpLgorKyAgICAgICAgICAgICAgICBjYXNlICIkZGVzaXJlZGxhbmciIGluCisrICAgICAgICAgICAgICAgICAgIiRwcmVzZW50bGFuZyIqKSB1c2VpdD15ZXM7OworKyAgICAgICAgICAgICAgICBlc2FjCisrICAgICAgICAgICAgICBkb25lCisrICAgICAgICAgICAgICBpZiB0ZXN0ICR1c2VpdCA9IHllczsgdGhlbgorKyAgICAgICAgICAgICAgICBJTlNUX0xJTkdVQVM9IiRJTlNUX0xJTkdVQVMgJHByZXNlbnRsYW5nIgorKyAgICAgICAgICAgICAgZmkKKysgICAgICAgICAgICBkb25lCisrICAgICAgICAgIGZpCisrICAgICAgICAgIENBVEFMT0dTPQorKyAgICAgICAgICBpZiB0ZXN0IC1uICIkSU5TVF9MSU5HVUFTIjsgdGhlbgorKyAgICAgICAgICAgIGZvciBsYW5nIGluICRJTlNUX0xJTkdVQVM7IGRvCisrICAgICAgICAgICAgICBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nLmdtbyIKKysgICAgICAgICAgICBkb25lCisrICAgICAgICAgIGZpCisrICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIiB8fCBlY2hvICJjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIgorKyAgICAgICAgICBzZWQgLWUgIi9eUE9URklMRVMgPS9yICRhY19kaXIvUE9URklMRVMiIC1lICIvXiMgTWFrZXZhcnMvciAkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTWFrZXZhcnMiIC1lICJzfEBQT0ZJTEVTQHwkUE9GSUxFU3xnIiAtZSAic3xAVVBEQVRFUE9GSUxFU0B8JFVQREFURVBPRklMRVN8ZyIgLWUgInN8QERVTU1ZUE9GSUxFU0B8JERVTU1ZUE9GSUxFU3xnIiAtZSAic3xAR01PRklMRVNAfCRHTU9GSUxFU3xnIiAtZSAic3xAQ0FUQUxPR1NAfCRDQVRBTE9HU3xnIiAtZSAic3xAUE9NQUtFRklMRURFUFNAfCRQT01BS0VGSUxFREVQU3xnIiAiJGFjX2Rpci9NYWtlZmlsZS5pbiIgPiAiJGFjX2Rpci9NYWtlZmlsZSIKKysgICAgICAgICAgZm9yIGYgaW4gIiRhY19naXZlbl9zcmNkaXIvJGFjX2RpciIvUnVsZXMtKjsgZG8KKysgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKysgICAgICAgICAgICAgIGNhc2UgIiRmIiBpbgorKyAgICAgICAgICAgICAgICAqLm9yaWcgfCAqLmJhayB8ICp+KSA7OworKyAgICAgICAgICAgICAgICAqKSBjYXQgIiRmIiA+PiAiJGFjX2Rpci9NYWtlZmlsZSIgOzsKKysgICAgICAgICAgICAgIGVzYWMKKysgICAgICAgICAgICBmaQorKyAgICAgICAgICBkb25lCisrICAgICAgICBmaQorKyAgICAgICAgOzsKKysgICAgICBlc2FjCisrICAgIGRvbmVdLAorKyAgIFsjIENhcHR1cmUgdGhlIHZhbHVlIG9mIG9ic29sZXRlIEFMTF9MSU5HVUFTIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBjb21wdXRlCisrICAgICMgUE9GSUxFUywgVVBEQVRFUE9GSUxFUywgRFVNTVlQT0ZJTEVTLCBHTU9GSUxFUywgQ0FUQUxPR1MuIEJ1dCBoaWRlIGl0CisrICAgICMgZnJvbSBhdXRvbWFrZS4KKysgICAgZXZhbCAnT0JTT0xFVEVfQUxMX0xJTkdVQVMnJz0iJEFMTF9MSU5HVUFTIicKKysgICAgIyBDYXB0dXJlIHRoZSB2YWx1ZSBvZiBMSU5HVUFTIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBjb21wdXRlIENBVEFMT0dTLgorKyAgICBMSU5HVUFTPSIke0xJTkdVQVMtJVVOU0VUJX0iCisrICAgXSkKKytdKQorKworK2RubCBQb3N0cHJvY2Vzc2VzIGEgTWFrZWZpbGUgaW4gYSBkaXJlY3RvcnkgY29udGFpbmluZyBQTyBmaWxlcy4KKytBQ19ERUZVTihbQU1fUE9TVFBST0NFU1NfUE9fTUFLRUZJTEVdLAorK1sKKysgICMgV2hlbiB0aGlzIGNvZGUgaXMgcnVuLCBpbiBjb25maWcuc3RhdHVzLCB0d28gdmFyaWFibGVzIGhhdmUgYWxyZWFkeSBiZWVuCisrICAjIHNldDoKKysgICMgLSBPQlNPTEVURV9BTExfTElOR1VBUyBpcyB0aGUgdmFsdWUgb2YgTElOR1VBUyBzZXQgaW4gY29uZmlndXJlLmluLAorKyAgIyAtIExJTkdVQVMgaXMgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMSU5HVUFTIGF0IGNvbmZpZ3VyZQorKyAgIyAgIHRpbWUuCisrCisrY2hhbmdlcXVvdGUoLClkbmwKKysgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLgorKyAgYWNfZGlyPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJS9bXi9dW14vXSokJSUnYAorKyAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICIkYWNfZGlyInxzZWQgJ3MlXlwuLyUlJ2AiCisrICBhY19kb3RzPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCJ8c2VkICdzJS9bXi9dKiUuLi8lZydgCisrICAjIEluIGF1dG9jb25mLTIuMTMgaXQgaXMgY2FsbGVkICRhY19naXZlbl9zcmNkaXIuCisrICAjIEluIGF1dG9jb25mLTIuNTAgaXQgaXMgY2FsbGVkICRzcmNkaXIuCisrICB0ZXN0IC1uICIkYWNfZ2l2ZW5fc3JjZGlyIiB8fCBhY19naXZlbl9zcmNkaXI9IiRzcmNkaXIiCisrICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorKyAgICAuKSAgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgIDs7CisrICAgIC8qKSB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworKyAgICAqKSAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworKyAgZXNhYworKworKyAgIyBGaW5kIGEgd2F5IHRvIGVjaG8gc3RyaW5ncyB3aXRob3V0IGludGVycHJldGluZyBiYWNrc2xhc2guCisrICBpZiB0ZXN0ICJYYChlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorKyAgICBndF9lY2hvPSdlY2hvJworKyAgZWxzZQorKyAgICBpZiB0ZXN0ICJYYChwcmludGYgJyVzXG4nICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorKyAgICAgIGd0X2VjaG89J3ByaW50ZiAlc1xuJworKyAgICBlbHNlCisrICAgICAgZWNob19mdW5jICgpIHsKKysgICAgICAgIGNhdCA8PEVPVAorKyQqCisrRU9UCisrICAgICAgfQorKyAgICAgIGd0X2VjaG89J2VjaG9fZnVuYycKKysgICAgZmkKKysgIGZpCisrCisrICAjIEEgc2VkIHNjcmlwdCB0aGF0IGV4dHJhY3RzIHRoZSB2YWx1ZSBvZiBWQVJJQUJMRSBmcm9tIGEgTWFrZWZpbGUuCisrICBzZWRfeF92YXJpYWJsZT0nCisrIyBUZXN0IGlmIHRoZSBob2xkIHNwYWNlIGlzIGVtcHR5LgorK3gKKytzL1AvUC8KKyt4CisrdGEKKysjIFllcyBpdCB3YXMgZW1wdHkuIExvb2sgaWYgd2UgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFyaWFibGUgZGVmaW5pdGlvbi4KKysvXlsJIF0qVkFSSUFCTEVbCSBdKj0veworKyAgIyBTZWVuIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uLgorKyAgcy9eWwkgXSpWQVJJQUJMRVsJIF0qPS8vCisrICBiYQorK30KKytiZAorKzphCisrIyBIZXJlIHdlIGFyZSBwcm9jZXNzaW5nIGEgbGluZSBmcm9tIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uLgorKyMgUmVtb3ZlIGNvbW1lbnQsIG1vcmUgcHJlY2lzZWx5IHJlcGxhY2UgaXQgd2l0aCBhIHNwYWNlLgorK3MvIy4qJC8gLworKyMgU2VlIGlmIHRoZSBsaW5lIGVuZHMgaW4gYSBiYWNrc2xhc2guCisrdGIKKys6YgorK3MvXFwkLy8KKysjIFByaW50IHRoZSBsaW5lLCB3aXRob3V0IHRoZSB0cmFpbGluZyBiYWNrc2xhc2guCisrcAorK3RjCisrIyBUaGVyZSB3YXMgbm8gdHJhaWxpbmcgYmFja3NsYXNoLiBUaGUgZW5kIG9mIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uIGlzCisrIyByZWFjaGVkLiBDbGVhciB0aGUgaG9sZCBzcGFjZS4KKytzL14uKiQvLworK3gKKytiZAorKzpjCisrIyBBIHRyYWlsaW5nIGJhY2tzbGFzaCBtZWFucyB0aGF0IHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uIGNvbnRpbnVlcyBpbiB0aGUKKysjIG5leHQgbGluZS4gUHV0IGEgbm9uZW1wdHkgc3RyaW5nIGludG8gdGhlIGhvbGQgc3BhY2UgdG8gaW5kaWNhdGUgdGhpcy4KKytzL14uKiQvUC8KKyt4CisrOmQKKysnCisrY2hhbmdlcXVvdGUoWyxdKWRubAorKworKyAgIyBTZXQgUE9URklMRVMgdG8gdGhlIHZhbHVlIG9mIHRoZSBNYWtlZmlsZSB2YXJpYWJsZSBQT1RGSUxFUy4KKysgIHNlZF94X1BPVEZJTEVTPSJgJGd0X2VjaG8gXCIkc2VkX3hfdmFyaWFibGVcIiB8IHNlZCAtZSAnL14gKiMvZCcgLWUgJ3MvVkFSSUFCTEUvUE9URklMRVMvZydgIgorKyAgUE9URklMRVM9YHNlZCAtbiAtZSAiJHNlZF94X1BPVEZJTEVTIiA8ICIkYWNfZmlsZSJgCisrICAjIENvbXB1dGUgUE9URklMRVNfREVQUyBhcworKyAgIyAgICQoZm9yZWFjaCBmaWxlLCAkKFBPVEZJTEVTKSwgJCh0b3Bfc3JjZGlyKS8kKGZpbGUpKQorKyAgUE9URklMRVNfREVQUz0KKysgIGZvciBmaWxlIGluICRQT1RGSUxFUzsgZG8KKysgICAgUE9URklMRVNfREVQUz0iJFBPVEZJTEVTX0RFUFMgIickKHRvcF9zcmNkaXIpLyciJGZpbGUiCisrICBkb25lCisrICBQT01BS0VGSUxFREVQUz0iIgorKworKyAgaWYgdGVzdCAtbiAiJE9CU09MRVRFX0FMTF9MSU5HVUFTIjsgdGhlbgorKyAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogc2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiIHx8IGVjaG8gInNldHRpbmcgQUxMX0xJTkdVQVMgaW4gY29uZmlndXJlLmluIGlzIG9ic29sZXRlIgorKyAgZmkKKysgIGlmIHRlc3QgLWYgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTIjsgdGhlbgorKyAgICAjIFRoZSBMSU5HVUFTIGZpbGUgY29udGFpbnMgdGhlIHNldCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzLgorKyAgICBBTExfTElOR1VBU189YHNlZCAtZSAiL14jL2QiICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyJgCisrICAgIFBPTUFLRUZJTEVERVBTPSIkUE9NQUtFRklMRURFUFMgTElOR1VBUyIKKysgIGVsc2UKKysgICAgIyBTZXQgQUxMX0xJTkdVQVMgdG8gdGhlIHZhbHVlIG9mIHRoZSBNYWtlZmlsZSB2YXJpYWJsZSBMSU5HVUFTLgorKyAgICBzZWRfeF9MSU5HVUFTPSJgJGd0X2VjaG8gXCIkc2VkX3hfdmFyaWFibGVcIiB8IHNlZCAtZSAnL14gKiMvZCcgLWUgJ3MvVkFSSUFCTEUvTElOR1VBUy9nJ2AiCisrICAgIEFMTF9MSU5HVUFTXz1gc2VkIC1uIC1lICIkc2VkX3hfTElOR1VBUyIgPCAiJGFjX2ZpbGUiYAorKyAgZmkKKysgICMgSGlkZSB0aGUgQUxMX0xJTkdVQVMgYXNzaWdtZW50IGZyb20gYXV0b21ha2UuCisrICBldmFsICdBTExfTElOR1VBUycnPSRBTExfTElOR1VBU18nCisrICAjIENvbXB1dGUgUE9GSUxFUworKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykucG8pCisrICAjIENvbXB1dGUgVVBEQVRFUE9GSUxFUworKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChsYW5nKS5wby11cGRhdGUpCisrICAjIENvbXB1dGUgRFVNTVlQT0ZJTEVTCisrICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLm5vcCkKKysgICMgQ29tcHV0ZSBHTU9GSUxFUworKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykuZ21vKQorKyAgIyBDb21wdXRlIFBST1BFUlRJRVNGSUxFUworKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJCh0b3Bfc3JjZGlyKS8kKERPTUFJTilfJChsYW5nKS5wcm9wZXJ0aWVzKQorKyAgIyBDb21wdXRlIENMQVNTRklMRVMKKysgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQodG9wX3NyY2RpcikvJChET01BSU4pXyQobGFuZykuY2xhc3MpCisrICAjIENvbXB1dGUgUU1GSUxFUworKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQobGFuZykucW0pCisrICAjIENvbXB1dGUgTVNHRklMRVMKKysgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGZyb2IgJChsYW5nKSkubXNnKQorKyAgIyBDb21wdXRlIFJFU09VUkNFU0RMTEZJTEVTCisrICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChmcm9iICQobGFuZykpLyQoRE9NQUlOKS5yZXNvdXJjZXMuZGxsKQorKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKysgICAgLikgc3JjZGlycHJlPSA7OworKyAgICAqKSBzcmNkaXJwcmU9JyQoc3JjZGlyKS8nIDs7CisrICBlc2FjCisrICBQT0ZJTEVTPQorKyAgVVBEQVRFUE9GSUxFUz0KKysgIERVTU1ZUE9GSUxFUz0KKysgIEdNT0ZJTEVTPQorKyAgUFJPUEVSVElFU0ZJTEVTPQorKyAgQ0xBU1NGSUxFUz0KKysgIFFNRklMRVM9CisrICBNU0dGSUxFUz0KKysgIFJFU09VUkNFU0RMTEZJTEVTPQorKyAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworKyAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkc3JjZGlycHJlJGxhbmcucG8iCisrICAgIFVQREFURVBPRklMRVM9IiRVUERBVEVQT0ZJTEVTICRsYW5nLnBvLXVwZGF0ZSIKKysgICAgRFVNTVlQT0ZJTEVTPSIkRFVNTVlQT0ZJTEVTICRsYW5nLm5vcCIKKysgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkc3JjZGlycHJlJGxhbmcuZ21vIgorKyAgICBQUk9QRVJUSUVTRklMRVM9IiRQUk9QRVJUSUVTRklMRVMgXCQodG9wX3NyY2RpcikvXCQoRE9NQUlOKV8kbGFuZy5wcm9wZXJ0aWVzIgorKyAgICBDTEFTU0ZJTEVTPSIkQ0xBU1NGSUxFUyBcJCh0b3Bfc3JjZGlyKS9cJChET01BSU4pXyRsYW5nLmNsYXNzIgorKyAgICBRTUZJTEVTPSIkUU1GSUxFUyAkc3JjZGlycHJlJGxhbmcucW0iCisrICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL1wuLiokLy8nIC1lICd5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LydgCisrICAgIE1TR0ZJTEVTPSIkTVNHRklMRVMgJHNyY2RpcnByZSRmcm9iYmVkbGFuZy5tc2ciCisrICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL18vLS9nJ2AKKysgICAgUkVTT1VSQ0VTRExMRklMRVM9IiRSRVNPVVJDRVNETExGSUxFUyAkc3JjZGlycHJlJGZyb2JiZWRsYW5nL1wkKERPTUFJTikucmVzb3VyY2VzLmRsbCIKKysgIGRvbmUKKysgICMgQ0FUQUxPR1MgZGVwZW5kcyBvbiBib3RoICRhY19kaXIgYW5kIHRoZSB1c2VyJ3MgTElOR1VBUworKyAgIyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKysgIElOU1RfTElOR1VBUz0KKysgIGlmIHRlc3QgLW4gIiRBTExfTElOR1VBUyI7IHRoZW4KKysgICAgZm9yIHByZXNlbnRsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKysgICAgICB1c2VpdD1ubworKyAgICAgIGlmIHRlc3QgIiVVTlNFVCUiICE9ICIkTElOR1VBUyI7IHRoZW4KKysgICAgICAgIGRlc2lyZWRsYW5ndWFnZXM9IiRMSU5HVUFTIgorKyAgICAgIGVsc2UKKysgICAgICAgIGRlc2lyZWRsYW5ndWFnZXM9IiRBTExfTElOR1VBUyIKKysgICAgICBmaQorKyAgICAgIGZvciBkZXNpcmVkbGFuZyBpbiAkZGVzaXJlZGxhbmd1YWdlczsgZG8KKysgICAgICAgICMgVXNlIHRoZSBwcmVzZW50bGFuZyBjYXRhbG9nIGlmIGRlc2lyZWRsYW5nIGlzCisrICAgICAgICAjICAgYS4gZXF1YWwgdG8gcHJlc2VudGxhbmcsIG9yCisrICAgICAgICAjICAgYi4gYSB2YXJpYW50IG9mIHByZXNlbnRsYW5nIChiZWNhdXNlIGluIHRoaXMgY2FzZSwKKysgICAgICAgICMgICAgICBwcmVzZW50bGFuZyBjYW4gYmUgdXNlZCBhcyBhIGZhbGxiYWNrIGZvciBtZXNzYWdlcworKyAgICAgICAgIyAgICAgIHdoaWNoIGFyZSBub3QgdHJhbnNsYXRlZCBpbiB0aGUgZGVzaXJlZGxhbmcgY2F0YWxvZykuCisrICAgICAgICBjYXNlICIkZGVzaXJlZGxhbmciIGluCisrICAgICAgICAgICIkcHJlc2VudGxhbmciKikgdXNlaXQ9eWVzOzsKKysgICAgICAgIGVzYWMKKysgICAgICBkb25lCisrICAgICAgaWYgdGVzdCAkdXNlaXQgPSB5ZXM7IHRoZW4KKysgICAgICAgIElOU1RfTElOR1VBUz0iJElOU1RfTElOR1VBUyAkcHJlc2VudGxhbmciCisrICAgICAgZmkKKysgICAgZG9uZQorKyAgZmkKKysgIENBVEFMT0dTPQorKyAgSkFWQUNBVEFMT0dTPQorKyAgUVRDQVRBTE9HUz0KKysgIFRDTENBVEFMT0dTPQorKyAgQ1NIQVJQQ0FUQUxPR1M9CisrICBpZiB0ZXN0IC1uICIkSU5TVF9MSU5HVUFTIjsgdGhlbgorKyAgICBmb3IgbGFuZyBpbiAkSU5TVF9MSU5HVUFTOyBkbworKyAgICAgIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmcuZ21vIgorKyAgICAgIEpBVkFDQVRBTE9HUz0iJEpBVkFDQVRBTE9HUyBcJChET01BSU4pXyRsYW5nLnByb3BlcnRpZXMiCisrICAgICAgUVRDQVRBTE9HUz0iJFFUQ0FUQUxPR1MgJGxhbmcucW0iCisrICAgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXC4uKiQvLycgLWUgJ3kvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovJ2AKKysgICAgICBUQ0xDQVRBTE9HUz0iJFRDTENBVEFMT0dTICRmcm9iYmVkbGFuZy5tc2ciCisrICAgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXy8tL2cnYAorKyAgICAgIENTSEFSUENBVEFMT0dTPSIkQ1NIQVJQQ0FUQUxPR1MgJGZyb2JiZWRsYW5nL1wkKERPTUFJTikucmVzb3VyY2VzLmRsbCIKKysgICAgZG9uZQorKyAgZmkKKysKKysgIHNlZCAtZSAic3xAUE9URklMRVNfREVQU0B8JFBPVEZJTEVTX0RFUFN8ZyIgLWUgInN8QFBPRklMRVNAfCRQT0ZJTEVTfGciIC1lICJzfEBVUERBVEVQT0ZJTEVTQHwkVVBEQVRFUE9GSUxFU3xnIiAtZSAic3xARFVNTVlQT0ZJTEVTQHwkRFVNTVlQT0ZJTEVTfGciIC1lICJzfEBHTU9GSUxFU0B8JEdNT0ZJTEVTfGciIC1lICJzfEBQUk9QRVJUSUVTRklMRVNAfCRQUk9QRVJUSUVTRklMRVN8ZyIgLWUgInN8QENMQVNTRklMRVNAfCRDTEFTU0ZJTEVTfGciIC1lICJzfEBRTUZJTEVTQHwkUU1GSUxFU3xnIiAtZSAic3xATVNHRklMRVNAfCRNU0dGSUxFU3xnIiAtZSAic3xAUkVTT1VSQ0VTRExMRklMRVNAfCRSRVNPVVJDRVNETExGSUxFU3xnIiAtZSAic3xAQ0FUQUxPR1NAfCRDQVRBTE9HU3xnIiAtZSAic3xASkFWQUNBVEFMT0dTQHwkSkFWQUNBVEFMT0dTfGciIC1lICJzfEBRVENBVEFMT0dTQHwkUVRDQVRBTE9HU3xnIiAtZSAic3xAVENMQ0FUQUxPR1NAfCRUQ0xDQVRBTE9HU3xnIiAtZSAic3xAQ1NIQVJQQ0FUQUxPR1NAfCRDU0hBUlBDQVRBTE9HU3xnIiAtZSAncyxeI2Rpc3RkaXI6LGRpc3RkaXI6LCcgPCAiJGFjX2ZpbGUiID4gIiRhY19maWxlLnRtcCIKKysgIGlmIGdyZXAgLWwgJ0BUQ0xDQVRBTE9HU0AnICIkYWNfZmlsZSIgPiAvZGV2L251bGw7IHRoZW4KKysgICAgIyBBZGQgZGVwZW5kZW5jaWVzIHRoYXQgY2Fubm90IGJlIGZvcm11bGF0ZWQgYXMgYSBzaW1wbGUgc3VmZml4IHJ1bGUuCisrICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKysgICAgICBmcm9iYmVkbGFuZz1gZWNobyAkbGFuZyB8IHNlZCAtZSAncy9cLi4qJC8vJyAtZSAneS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8nYAorKyAgICAgIGNhdCA+PiAiJGFjX2ZpbGUudG1wIiA8PEVPRgorKyRmcm9iYmVkbGFuZy5tc2c6ICRsYW5nLnBvCisrCUBlY2hvICJcJChNU0dGTVQpIC1jIC0tdGNsIC1kIFwkKHNyY2RpcikgLWwgJGxhbmcgJHNyY2RpcnByZSRsYW5nLnBvIjsgXAorKwlcJChNU0dGTVQpIC1jIC0tdGNsIC1kICJcJChzcmNkaXIpIiAtbCAkbGFuZyAkc3JjZGlycHJlJGxhbmcucG8gfHwgeyBybSAtZiAiXCQoc3JjZGlyKS8kZnJvYmJlZGxhbmcubXNnIjsgZXhpdCAxOyB9CisrRU9GCisrICAgIGRvbmUKKysgIGZpCisrICBpZiBncmVwIC1sICdAQ1NIQVJQQ0FUQUxPR1NAJyAiJGFjX2ZpbGUiID4gL2Rldi9udWxsOyB0aGVuCisrICAgICMgQWRkIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSBmb3JtdWxhdGVkIGFzIGEgc2ltcGxlIHN1ZmZpeCBydWxlLgorKyAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisrICAgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXy8tL2cnYAorKyAgICAgIGNhdCA+PiAiJGFjX2ZpbGUudG1wIiA8PEVPRgorKyRmcm9iYmVkbGFuZy9cJChET01BSU4pLnJlc291cmNlcy5kbGw6ICRsYW5nLnBvCisrCUBlY2hvICJcJChNU0dGTVQpIC1jIC0tY3NoYXJwIC1kIFwkKHNyY2RpcikgLWwgJGxhbmcgJHNyY2RpcnByZSRsYW5nLnBvIC1yIFwkKERPTUFJTikiOyBcCisrCVwkKE1TR0ZNVCkgLWMgLS1jc2hhcnAgLWQgIlwkKHNyY2RpcikiIC1sICRsYW5nICRzcmNkaXJwcmUkbGFuZy5wbyAtciAiXCQoRE9NQUlOKSIgfHwgeyBybSAtZiAiXCQoc3JjZGlyKS8kZnJvYmJlZGxhbmcubXNnIjsgZXhpdCAxOyB9CisrRU9GCisrICAgIGRvbmUKKysgIGZpCisrICBpZiB0ZXN0IC1uICIkUE9NQUtFRklMRURFUFMiOyB0aGVuCisrICAgIGNhdCA+PiAiJGFjX2ZpbGUudG1wIiA8PEVPRgorK01ha2VmaWxlOiAkUE9NQUtFRklMRURFUFMKKytFT0YKKysgIGZpCisrICBtdiAiJGFjX2ZpbGUudG1wIiAiJGFjX2ZpbGUiCisrXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvcHJpbnRmLXBvc2l4Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9tNC9wcmludGYtcG9zaXgubTQJMjAwNC0wOS0xMiAxNDo0MDozNC45NzQ2NTQwMDAgLTA0MDAKK0BAIC0wLDAgKzEsNDYgQEAKKysjIHByaW50Zi1wb3NpeC5tNCBzZXJpYWwgMiAoZ2V0dGV4dC0wLjEzLjEpCisrZG5sIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKytkbmwgVGVzdCB3aGV0aGVyIHRoZSBwcmludGYoKSBmdW5jdGlvbiBzdXBwb3J0cyBQT1NJWC9YU0kgZm9ybWF0IHN0cmluZ3Mgd2l0aAorK2RubCBwb3NpdGlvbnMuCisrCisrQUNfREVGVU4oW2d0X1BSSU5URl9QT1NJWF0sCisrWworKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCisrICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBwcmludGYoKSBzdXBwb3J0cyBQT1NJWC9YU0kgZm9ybWF0IHN0cmluZ3NdLAorKyAgICBndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCwKKysgICAgWworKyAgICAgIEFDX1RSWV9SVU4oWworKyNpbmNsdWRlIDxzdGRpby5oPgorKyNpbmNsdWRlIDxzdHJpbmcuaD4KKysvKiBUaGUgc3RyaW5nICIlMiRkICUxJGQiLCB3aXRoIGRvbGxhciBjaGFyYWN0ZXJzIHByb3RlY3RlZCBmcm9tIHRoZSBzaGVsbCdzCisrICAgZG9sbGFyIGV4cGFuc2lvbiAocG9zc2libHkgYW4gYXV0b2NvbmYgYnVnKS4gICovCisrc3RhdGljIGNoYXIgZm9ybWF0W10gPSB7ICclJywgJzInLCAnJCcsICdkJywgJyAnLCAnJScsICcxJywgJyQnLCAnZCcsICdcMCcgfTsKKytzdGF0aWMgY2hhciBidWZbMTAwXTsKKytpbnQgbWFpbiAoKQorK3sKKysgIHNwcmludGYgKGJ1ZiwgZm9ybWF0LCAzMywgNTUpOworKyAgcmV0dXJuIChzdHJjbXAgKGJ1ZiwgIjU1IDMzIikgIT0gMCk7CisrfV0sIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PXllcywgZ3RfY3ZfZnVuY19wcmludGZfcG9zaXg9bm8sCisrICAgICAgWworKyAgICAgICAgQUNfRUdSRVBfQ1BQKG5vdHBvc2l4LCBbCisrI2lmIGRlZmluZWQgX19OZXRCU0RfXyB8fCBkZWZpbmVkIF9NU0NfVkVSIHx8IGRlZmluZWQgX19NSU5HVzMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fCisrICBub3Rwb3NpeAorKyNlbmRpZgorKyAgICAgICAgXSwgZ3RfY3ZfZnVuY19wcmludGZfcG9zaXg9Imd1ZXNzaW5nIG5vIiwKKysgICAgICAgICAgIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PSJndWVzc2luZyB5ZXMiKQorKyAgICAgIF0pCisrICAgIF0pCisrICBjYXNlICRndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCBpbgorKyAgICAqeWVzKQorKyAgICAgIEFDX0RFRklORShIQVZFX1BPU0lYX1BSSU5URiwgMSwKKysgICAgICAgIFtEZWZpbmUgaWYgeW91ciBwcmludGYoKSBmdW5jdGlvbiBzdXBwb3J0cyBmb3JtYXQgc3RyaW5ncyB3aXRoIHBvc2l0aW9ucy5dKQorKyAgICAgIDs7CisrICBlc2FjCisrXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvcHJvZ3Rlc3QubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L3Byb2d0ZXN0Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTkwNjUxNTY4IC0wNDAwCitAQCAtMCwwICsxLDkxIEBACisrIyBwcm9ndGVzdC5tNCBzZXJpYWwgMyAoZ2V0dGV4dC0wLjEyKQorK2RubCBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorK2RubAorK2RubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCisrZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKytkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorK2RubCBmdW5jdGlvbmFsaXR5LgorK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCisrZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorK2RubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKytkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisrCisrZG5sIEF1dGhvcnM6CisrZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisrCisrIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKysKKytkbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCisrZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQorK0FDX0RFRlVOKFtBTV9QQVRIX1BST0dfV0lUSF9URVNUXSwKKytbCisrIyBQcmVwYXJlIFBBVEhfU0VQQVJBVE9SLgorKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgorK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisrICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisrICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisrICBjaG1vZCAreCBjb25mJCQuc2gKKysgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICAgIFBBVEhfU0VQQVJBVE9SPSc7JworKyAgZWxzZQorKyAgICBQQVRIX1NFUEFSQVRPUj06CisrICBmaQorKyAgcm0gLWYgY29uZiQkLnNoCisrZmkKKysKKysjIEZpbmQgb3V0IGhvdyB0byB0ZXN0IGZvciBleGVjdXRhYmxlIGZpbGVzLiBEb24ndCB1c2UgYSB6ZXJvLWJ5dGUgZmlsZSwKKysjIGFzIHN5c3RlbXMgbWF5IHVzZSBtZXRob2RzIG90aGVyIHRoYW4gbW9kZSBiaXRzIHRvIGRldGVybWluZSBleGVjdXRhYmlsaXR5LgorK2NhdCA+Y29uZiQkLmZpbGUgPDxfQVNFT0YKKysjISAvYmluL3NoCisrZXhpdCAwCisrX0FTRU9GCisrY2htb2QgK3ggY29uZiQkLmZpbGUKKytpZiB0ZXN0IC14IGNvbmYkJC5maWxlID4vZGV2L251bGwgMj4mMTsgdGhlbgorKyAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC14IgorK2Vsc2UKKysgIGFjX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKytmaQorK3JtIC1mIGNvbmYkJC5maWxlCisrCisrIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKKytBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCisrQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCisrW2Nhc2UgIlskXSQxIiBpbgorKyAgW1tcXC9dXSogfCA/OltbXFwvXV0qKQorKyAgICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisrICAgIDs7CisrICAqKQorKyAgICBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKysgICAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisrICAgICAgSUZTPSIkYWNfc2F2ZV9JRlMiCisrICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKysgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgICAgICAgIGlmICRhY19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisrICAgICAgICAgIGlmIFskM107IHRoZW4KKysgICAgICAgICAgICBhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorKyAgICAgICAgICAgIGJyZWFrIDIKKysgICAgICAgICAgZmkKKysgICAgICAgIGZpCisrICAgICAgZG9uZQorKyAgICBkb25lCisrICAgIElGUz0iJGFjX3NhdmVfSUZTIgorK2RubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCisrZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCisraWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKKytdKWRubAorKyAgICA7OworK2VzYWNdKWRubAorKyQxPSIkYWNfY3ZfcGF0aF8kMSIKKytpZiB0ZXN0IGlmZWxzZShbJDRdLCAsIFstbiAiWyRdJDEiXSwgWyJbJF0kMSIgIT0gIiQ0Il0pOyB0aGVuCisrICBBQ19NU0dfUkVTVUxUKFskXSQxKQorK2Vsc2UKKysgIEFDX01TR19SRVNVTFQobm8pCisrZmkKKytBQ19TVUJTVCgkMSlkbmwKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9zaWduZWQubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L3NpZ25lZC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljk5NjY1MDY1NiAtMDQwMAorQEAgLTAsMCArMSwxOSBAQAorKyMgc2lnbmVkLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTAuNDApCisrZG5sIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrCisrZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorKworK0FDX0RFRlVOKFtiaF9DX1NJR05FRF0sCisrWworKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzaWduZWRdLCBiaF9jdl9jX3NpZ25lZCwKKysgICBbQUNfVFJZX0NPTVBJTEUoLCBbc2lnbmVkIGNoYXIgeDtdLCBiaF9jdl9jX3NpZ25lZD15ZXMsIGJoX2N2X2Nfc2lnbmVkPW5vKV0pCisrICBpZiB0ZXN0ICRiaF9jdl9jX3NpZ25lZCA9IG5vOyB0aGVuCisrICAgIEFDX0RFRklORShzaWduZWQsICwKKysgICAgICAgICAgICAgIFtEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIEMgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMga2V5d29yZC5dKQorKyAgZmkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9zaXplX21heC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvc2l6ZV9tYXgubTQJMjAwNC0wOS0xMiAxNDo0MDozNS4wMDM2NDk1OTIgLTA0MDAKK0BAIC0wLDAgKzEsNjEgQEAKKysjIHNpemVfbWF4Lm00IHNlcmlhbCAyCisrZG5sIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKysKKytBQ19ERUZVTihbZ2xfU0laRV9NQVhdLAorK1sKKysgIEFDX0NIRUNLX0hFQURFUlMoc3RkaW50LmgpCisrICBkbmwgRmlyc3QgdGVzdCB3aGV0aGVyIHRoZSBzeXN0ZW0gYWxyZWFkeSBoYXMgU0laRV9NQVguCisrICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBTSVpFX01BWF0pCisrICByZXN1bHQ9CisrICBBQ19FR1JFUF9DUFAoW0ZvdW5kIGl0XSwgWworKyNpbmNsdWRlIDxsaW1pdHMuaD4KKysjaWYgSEFWRV9TVERJTlRfSAorKyNpbmNsdWRlIDxzdGRpbnQuaD4KKysjZW5kaWYKKysjaWZkZWYgU0laRV9NQVgKKytGb3VuZCBpdAorKyNlbmRpZgorK10sIHJlc3VsdD15ZXMpCisrICBpZiB0ZXN0IC16ICIkcmVzdWx0IjsgdGhlbgorKyAgICBkbmwgRGVmaW5lIGl0IG91cnNlbHZlcy4gSGVyZSB3ZSBhc3N1bWUgdGhhdCB0aGUgdHlwZSAnc2l6ZV90JyBpcyBub3Qgd2lkZXIKKysgICAgZG5sIHRoYW4gdGhlIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnLgorKyAgICBkbmwgVGhlIF9BQ19DT01QVVRFX0lOVCBtYWNybyB3b3JrcyB1cCB0byBMT05HX01BWCwgc2luY2UgaXQgdXNlcyAnZXhwcicsCisrICAgIGRubCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHdvcmsgZnJvbSBMT05HX01JTiB0byBMT05HX01BWC4KKysgICAgX0FDX0NPTVBVVEVfSU5UKFt+KHNpemVfdCkwIC8gMTBdLCByZXNfaGksCisrICAgICAgWyNpbmNsdWRlIDxzdGRkZWYuaD5dLCByZXN1bHQ9PykKKysgICAgX0FDX0NPTVBVVEVfSU5UKFt+KHNpemVfdCkwICUgMTBdLCByZXNfbG8sCisrICAgICAgWyNpbmNsdWRlIDxzdGRkZWYuaD5dLCByZXN1bHQ9PykKKysgICAgX0FDX0NPTVBVVEVfSU5UKFtzaXplb2YgKHNpemVfdCkgPD0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpXSwgZml0c19pbl91aW50LAorKyAgICAgIFsjaW5jbHVkZSA8c3RkZGVmLmg+XSwgcmVzdWx0PT8pCisrICAgIGlmIHRlc3QgIiRmaXRzX2luX3VpbnQiID0gMTsgdGhlbgorKyAgICAgIGRubCBFdmVuIHRob3VnaCBTSVpFX01BWCBmaXRzIGluIGFuIHVuc2lnbmVkIGludCwgaXQgbXVzdCBiZSBvZiB0eXBlCisrICAgICAgZG5sICd1bnNpZ25lZCBsb25nJyBpZiB0aGUgdHlwZSAnc2l6ZV90JyBpcyB0aGUgc2FtZSBhcyAndW5zaWduZWQgbG9uZycuCisrICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRkZWYuaD4KKysgICAgICAgIGV4dGVybiBzaXplX3QgZm9vOworKyAgICAgICAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZm9vOworKyAgICAgICAgXSwgW10sIGZpdHNfaW5fdWludD0wKQorKyAgICBmaQorKyAgICBpZiB0ZXN0IC16ICIkcmVzdWx0IjsgdGhlbgorKyAgICAgIGlmIHRlc3QgIiRmaXRzX2luX3VpbnQiID0gMTsgdGhlbgorKyAgICAgICAgcmVzdWx0PSIkcmVzX2hpJHJlc19sbyJVCisrICAgICAgZWxzZQorKyAgICAgICAgcmVzdWx0PSIkcmVzX2hpJHJlc19sbyJVTAorKyAgICAgIGZpCisrICAgIGVsc2UKKysgICAgICBkbmwgU2hvdWxkbid0IGhhcHBlbiwgYnV0IHdobyBrbm93cy4uLgorKyAgICAgIHJlc3VsdD0nfihzaXplX3QpMCcKKysgICAgZmkKKysgIGZpCisrICBBQ19NU0dfUkVTVUxUKFskcmVzdWx0XSkKKysgIGlmIHRlc3QgIiRyZXN1bHQiICE9IHllczsgdGhlbgorKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoW1NJWkVfTUFYXSwgWyRyZXN1bHRdLAorKyAgICAgIFtEZWZpbmUgYXMgdGhlIG1heGltdW0gdmFsdWUgb2YgdHlwZSAnc2l6ZV90JywgaWYgdGhlIHN5c3RlbSBkb2Vzbid0IGRlZmluZSBpdC5dKQorKyAgZmkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9zdGRpbnRfaC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvc3RkaW50X2gubTQJMjAwNC0wOS0xMiAxNDo0MDozNS4wMDk2NDg2ODAgLTA0MDAKK0BAIC0wLDAgKzEsMjggQEAKKysjIHN0ZGludF9oLm00IHNlcmlhbCAzIChnZXR0ZXh0LTAuMTIpCisrZG5sIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrCisrZG5sIEZyb20gUGF1bCBFZ2dlcnQuCisrCisrIyBEZWZpbmUgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggaWYgPHN0ZGludC5oPiBleGlzdHMsCisrIyBkb2Vzbid0IGNsYXNoIHdpdGggPHN5cy90eXBlcy5oPiwgYW5kIGRlY2xhcmVzIHVpbnRtYXhfdC4KKysKKytBQ19ERUZVTihbam1fQUNfSEVBREVSX1NURElOVF9IXSwKKytbCisrICBBQ19DQUNIRV9DSEVDSyhbZm9yIHN0ZGludC5oXSwgam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oLAorKyAgW0FDX1RSWV9DT01QSUxFKAorKyAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorKyNpbmNsdWRlIDxzdGRpbnQuaD5dLAorKyAgICBbdWludG1heF90IGkgPSAodWludG1heF90KSAtMTtdLAorKyAgICBqbV9hY19jdl9oZWFkZXJfc3RkaW50X2g9eWVzLAorKyAgICBqbV9hY19jdl9oZWFkZXJfc3RkaW50X2g9bm8pXSkKKysgIGlmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaCA9IHllczsgdGhlbgorKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVgsIDEsCisrICAgICAgW0RlZmluZSBpZiA8c3RkaW50Lmg+IGV4aXN0cywgZG9lc24ndCBjbGFzaCB3aXRoIDxzeXMvdHlwZXMuaD4sCisrICAgICAgIGFuZCBkZWNsYXJlcyB1aW50bWF4X3QuIF0pCisrICBmaQorK10pCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L3VpbnRtYXhfdC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvdWludG1heF90Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzUuMDIxNjQ2ODU2IC0wNDAwCitAQCAtMCwwICsxLDMyIEBACisrIyB1aW50bWF4X3QubTQgc2VyaWFsIDcgKGdldHRleHQtMC4xMikKKytkbmwgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKKytkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KKytkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKKytkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKysKKytkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKysKKytBQ19QUkVSRVEoMi4xMykKKysKKysjIERlZmluZSB1aW50bWF4X3QgdG8gJ3Vuc2lnbmVkIGxvbmcnIG9yICd1bnNpZ25lZCBsb25nIGxvbmcnCisrIyBpZiBpdCBpcyBub3QgYWxyZWFkeSBkZWZpbmVkIGluIDxzdGRpbnQuaD4gb3IgPGludHR5cGVzLmg+LgorKworK0FDX0RFRlVOKFtqbV9BQ19UWVBFX1VJTlRNQVhfVF0sCisrWworKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX0lOVFRZUEVTX0hdKQorKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX1NURElOVF9IXSkKKysgIGlmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oID0gbm8gJiYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oID0gbm87IHRoZW4KKysgICAgQUNfUkVRVUlSRShbam1fQUNfVFlQRV9VTlNJR05FRF9MT05HX0xPTkddKQorKyAgICB0ZXN0ICRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZyA9IHllcyBcCisrICAgICAgJiYgYWNfdHlwZT0ndW5zaWduZWQgbG9uZyBsb25nJyBcCisrICAgICAgfHwgYWNfdHlwZT0ndW5zaWduZWQgbG9uZycKKysgICAgQUNfREVGSU5FX1VOUVVPVEVEKHVpbnRtYXhfdCwgJGFjX3R5cGUsCisrICAgICAgW0RlZmluZSB0byB1bnNpZ25lZCBsb25nIG9yIHVuc2lnbmVkIGxvbmcgbG9uZworKyAgICAgICBpZiA8c3RkaW50Lmg+IGFuZCA8aW50dHlwZXMuaD4gZG9uJ3QgZGVmaW5lLl0pCisrICBlbHNlCisrICAgIEFDX0RFRklORShIQVZFX1VJTlRNQVhfVCwgMSwKKysgICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAndWludG1heF90JyB0eXBlIGluIDxzdGRpbnQuaD4gb3IgPGludHR5cGVzLmg+Ll0pCisrICBmaQorK10pCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L3Vsb25nbG9uZy5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvbTQvdWxvbmdsb25nLm00CTIwMDQtMDktMTIgMTQ6NDA6MzUuMDI4NjQ1NzkyIC0wNDAwCitAQCAtMCwwICsxLDI1IEBACisrIyB1bG9uZ2xvbmcubTQgc2VyaWFsIDMKKytkbmwgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKKytkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KKytkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKKytkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKysKKytkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKysKKysjIERlZmluZSBIQVZFX1VOU0lHTkVEX0xPTkdfTE9ORyBpZiAndW5zaWduZWQgbG9uZyBsb25nJyB3b3Jrcy4KKysKKytBQ19ERUZVTihbam1fQUNfVFlQRV9VTlNJR05FRF9MT05HX0xPTkddLAorK1sKKysgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgdW5zaWduZWQgbG9uZyBsb25nXSwgYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmcsCisrICBbQUNfVFJZX0xJTksoW3Vuc2lnbmVkIGxvbmcgbG9uZyB1bGwgPSAxVUxMOyBpbnQgaSA9IDYzO10sCisrICAgIFt1bnNpZ25lZCBsb25nIGxvbmcgdWxsbWF4ID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgLTE7CisrICAgICByZXR1cm4gdWxsIDw8IGkgfCB1bGwgPj4gaSB8IHVsbG1heCAvIHVsbCB8IHVsbG1heCAlIHVsbDtdLAorKyAgICBhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZz15ZXMsCisrICAgIGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nPW5vKV0pCisrICBpZiB0ZXN0ICRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZyA9IHllczsgdGhlbgorKyAgICBBQ19ERUZJTkUoSEFWRV9VTlNJR05FRF9MT05HX0xPTkcsIDEsCisrICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3Vuc2lnbmVkIGxvbmcgbG9uZycgdHlwZS5dKQorKyAgZmkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC93Y2hhcl90Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9tNC93Y2hhcl90Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzUuMDM0NjQ0ODgwIC0wNDAwCitAQCAtMCwwICsxLDIyIEBACisrIyB3Y2hhcl90Lm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCisrZG5sIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKytkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCisrZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCisrZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCisrZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisrCisrZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorK2RubCBUZXN0IHdoZXRoZXIgPHN0ZGRlZi5oPiBoYXMgdGhlICd3Y2hhcl90JyB0eXBlLgorK2RubCBQcmVyZXF1aXNpdGU6IEFDX1BST0dfQ0MKKysKKytBQ19ERUZVTihbZ3RfVFlQRV9XQ0hBUl9UXSwKKytbCisrICBBQ19DQUNIRV9DSEVDSyhbZm9yIHdjaGFyX3RdLCBndF9jdl9jX3djaGFyX3QsCisrICAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGRlZi5oPgorKyAgICAgICB3Y2hhcl90IGZvbyA9ICh3Y2hhcl90KSdcMCc7XSwgLAorKyAgICAgICBndF9jdl9jX3djaGFyX3Q9eWVzLCBndF9jdl9jX3djaGFyX3Q9bm8pXSkKKysgIGlmIHRlc3QgJGd0X2N2X2Nfd2NoYXJfdCA9IHllczsgdGhlbgorKyAgICBBQ19ERUZJTkUoSEFWRV9XQ0hBUl9ULCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnd2NoYXJfdCcgdHlwZS5dKQorKyAgZmkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC93aW50X3QubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L3dpbnRfdC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM1LjA0MDY0Mzk2OCAtMDQwMAorQEAgLTAsMCArMSwyMiBAQAorKyMgd2ludF90Lm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCisrZG5sIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKytkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisrZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorKworK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKytkbmwgVGVzdCB3aGV0aGVyIDx3Y2hhci5oPiBoYXMgdGhlICd3aW50X3QnIHR5cGUuCisrZG5sIFByZXJlcXVpc2l0ZTogQUNfUFJPR19DQworKworK0FDX0RFRlVOKFtndF9UWVBFX1dJTlRfVF0sCisrWworKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3aW50X3RdLCBndF9jdl9jX3dpbnRfdCwKKysgICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD4KKysgICAgICAgd2ludF90IGZvbyA9ICh3Y2hhcl90KSdcMCc7XSwgLAorKyAgICAgICBndF9jdl9jX3dpbnRfdD15ZXMsIGd0X2N2X2Nfd2ludF90PW5vKV0pCisrICBpZiB0ZXN0ICRndF9jdl9jX3dpbnRfdCA9IHllczsgdGhlbgorKyAgICBBQ19ERUZJTkUoSEFWRV9XSU5UX1QsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICd3aW50X3QnIHR5cGUuXSkKKysgIGZpCisrXSkKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQveHNpemUubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL200L3hzaXplLm00CTIwMDQtMDktMTIgMTQ6NDA6MzUuMDQ3NjQyOTA0IC0wNDAwCitAQCAtMCwwICsxLDE0IEBACisrIyB4c2l6ZS5tNCBzZXJpYWwgMgorK2RubCBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisrZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKKytkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KKytkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKKytkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKysKKytBQ19ERUZVTihbZ2xfWFNJWkVdLAorK1sKKysgIGRubCBQcmVyZXF1aXNpdGVzIG9mIGxpYi94c2l6ZS5oLgorKyAgQUNfUkVRVUlSRShbZ2xfU0laRV9NQVhdKQorKyAgQUNfQ0hFQ0tfSEVBREVSUyhzdGRpbnQuaCkKKytdKQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9NYWtlZmlsZS5hbQkxOTk4LTEyLTMwIDA2OjE5OjQwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvTWFrZWZpbGUuYW0JMjAwNC0wOS0xMiAxNDo0MDozNS4xMjE2MzE2NTYgLTA0MDAKK0BAIC0xLDUgKzEsNSBAQAorIFNVQkRJUlMgPSBsaWIgaW50bCBzcmMgcG8gbWFuIHRlc3RzdWl0ZQorLUVYVFJBX0RJU1QgPSBjaGVjay5scnpzeiBDT01QQVRBQklMSVRZIFJFQURNRS5jdnMgUkVBRE1FLmlzZG40bGludXggXAorK0VYVFJBX0RJU1QgPSBjb25maWcucnBhdGggIGNoZWNrLmxyenN6IENPTVBBVEFCSUxJVFkgUkVBRE1FLmN2cyBSRUFETUUuaXNkbjRsaW51eCBcCisgCVJFQURNRS5nZXR0ZXh0IHJwbXJjIGJ1aWxkcnBtIHN5c3R5cGUuaW4gZmFzdGNoZWNrLnNoIFJFQURNRS50ZXN0cyBcCisgCWJlb3MtcnVucGlwZWQuYyBmYXN0Y2hlY2suYmVvcworIG5vaW5zdF9TQ1JJUFRTPXN5c3R5cGUKK0BAIC04MywzICs4Myw1IEBACisgcnBtOiAkKFBSKS50YXIuZ3ogU3BlY2ZpbGUKKyAJJChzcmNkaXIpL2J1aWxkcnBtICQoc3JjZGlyKQorIAorKworK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL01ha2VmaWxlLmluCTE5OTgtMTItMzAgMTE6MzE6NDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9NYWtlZmlsZS5pbgkyMDA0LTA5LTEyIDE0OjQwOjM1LjEwOTYzMzQ4MCAtMDQwMAorQEAgLTEyNSw3ICsxMjUsNyBAQAorIAkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisgCisgJChBQ0xPQ0FMX000KTogIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00CistCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCisrCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpIC1JIG00CisgCisgY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZQorIAkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL21raW5zdGFsbGRpcnMJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrKyBscnpzei0wLjEyLjIwL21raW5zdGFsbGRpcnMJMjAwNC0wOS0xMiAxNDo0MDozNC4zMzc3NTA4MjQgLTA0MDAKK0BAIC0xLDM0ICsxLDE1MCBAQAorICMhIC9iaW4vc2gKKyAjIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQorLSMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisrCisrc2NyaXB0dmVyc2lvbj0yMDA0LTAyLTE1LjIwCisrCisrIyBPcmlnaW5hbCBhdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KKyAjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKy0jIExhc3QgbW9kaWZpZWQ6IDE5OTUtMDMtMDUKKy0jIFB1YmxpYyBkb21haW4KKysjIFB1YmxpYyBkb21haW4uCisrIworKyMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKKysjIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KKysjIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgorIAorIGVycnN0YXR1cz0wCisrZGlybW9kZT0iIgorIAorLWZvciBmaWxlIGluICR7MSsiJEAifSA7IGRvCistICAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKKy0gICBzaGlmdAorK3VzYWdlPSJcCisrVXNhZ2U6IG1raW5zdGFsbGRpcnMgWy1oXSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBbLW0gTU9ERV0gRElSIC4uLgorIAorLSAgIHBhdGhjb21wPQorLSAgIGZvciBkIGluICR7MSsiJEAifSA7IGRvCistICAgICBwYXRoY29tcD0iJHBhdGhjb21wJGQiCistICAgICBjYXNlICIkcGF0aGNvbXAiIGluCistICAgICAgIC0qICkgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKKy0gICAgIGVzYWMKKytDcmVhdGUgZWFjaCBkaXJlY3RvcnkgRElSICh3aXRoIG1vZGUgTU9ERSwgaWYgc3BlY2lmaWVkKSwgaW5jbHVkaW5nIGFsbAorK2xlYWRpbmcgZmlsZSBuYW1lIGNvbXBvbmVudHMuCisgCistICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKy0gICAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIgMT4mMgorLSAgICAgICAgbWtkaXIgIiRwYXRoY29tcCIgPiAvZGV2L251bGwgMj4mMSB8fCBsYXN0ZXJyPSQ/CistICAgICBmaQorK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorIAorLSAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisrIyBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyt3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKysgIGNhc2UgJDEgaW4KKysgICAgLWggfCAtLWhlbHAgfCAtLWgqKSAgICAgICAgICMgLWggZm9yIGhlbHAKKysgICAgICBlY2hvICIkdXNhZ2UiCisrICAgICAgZXhpdCAwCisrICAgICAgOzsKKysgICAgLW0pICAgICAgICAgICAgICAgICAgICAgICAgICMgLW0gUEVSTSBhcmcKKysgICAgICBzaGlmdAorKyAgICAgIHRlc3QgJCMgLWVxIDAgJiYgeyBlY2hvICIkdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorKyAgICAgIGRpcm1vZGU9JDEKKysgICAgICBzaGlmdAorKyAgICAgIDs7CisrICAgIC0tdmVyc2lvbikKKysgICAgICBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiIKKysgICAgICBleGl0IDAKKysgICAgICA7OworKyAgICAtLSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisrICAgICAgc2hpZnQKKysgICAgICBicmVhaworKyAgICAgIDs7CisrICAgIC0qKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHVua25vd24gb3B0aW9uCisrICAgICAgZWNobyAiJHVzYWdlIiAxPiYyCisrICAgICAgZXhpdCAxCisrICAgICAgOzsKKysgICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmlyc3Qgbm9uLW9wdCBhcmcKKysgICAgICBicmVhaworKyAgICAgIDs7CisrICBlc2FjCisrZG9uZQorKworK2ZvciBmaWxlCisrZG8KKysgIGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgorKyAgICBzaGlmdAorKyAgZWxzZQorKyAgICBicmVhaworKyAgZmkKKytkb25lCisrCisrY2FzZSAkIyBpbgorKyAgMCkgZXhpdCAwIDs7CisrZXNhYworKworKyMgU29sYXJpcyA4J3MgbWtkaXIgLXAgaXNuJ3QgdGhyZWFkLXNhZmUuICBJZiB5b3UgbWtkaXIgLXAgYS9iIGFuZAorKyMgbWtkaXIgLXAgYS9jIGF0IHRoZSBzYW1lIHRpbWUsIGJvdGggd2lsbCBkZXRlY3QgdGhhdCBhIGlzIG1pc3NpbmcsCisrIyBvbmUgd2lsbCBjcmVhdGUgYSwgdGhlbiB0aGUgb3RoZXIgd2lsbCB0cnkgdG8gY3JlYXRlIGEgYW5kIGRpZSB3aXRoCisrIyBhICJGaWxlIGV4aXN0cyIgZXJyb3IuICBUaGlzIGlzIGEgcHJvYmxlbSB3aGVuIGNhbGxpbmcgbWtpbnN0YWxsZGlycworKyMgZnJvbSBhIHBhcmFsbGVsIG1ha2UuICBXZSB1c2UgLS12ZXJzaW9uIGluIHRoZSBwcm9iZSB0byByZXN0cmljdAorKyMgb3Vyc2VsdmVzIHRvIEdOVSBta2Rpciwgd2hpY2ggaXMgdGhyZWFkLXNhZmUuCisrY2FzZSAkZGlybW9kZSBpbgorKyAgJycpCisrICAgIGlmIG1rZGlyIC1wIC0tdmVyc2lvbiAuID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICEgLWQgLi8tLXZlcnNpb247IHRoZW4KKysgICAgICBlY2hvICJta2RpciAtcCAtLSAkKiIKKysgICAgICBleGVjIG1rZGlyIC1wIC0tICIkQCIKKysgICAgZWxzZQorKyAgICAgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90CisrICAgICAgIyByZWNvZ25pemUgYW55IG9wdGlvbi4gIEl0IHdpbGwgaW50ZXJwcmV0IGFsbCBvcHRpb25zIGFzCisrICAgICAgIyBkaXJlY3RvcmllcyB0byBjcmVhdGUsIGFuZCB0aGVuIGFib3J0IGJlY2F1c2UgYC4nIGFscmVhZHkKKysgICAgICAjIGV4aXN0cy4KKysgICAgICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorKyAgICAgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KKysgICAgZmkKKysgICAgOzsKKysgICopCisrICAgIGlmIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS12ZXJzaW9uIC4gPi9kZXYvbnVsbCAyPiYxICYmCisrICAgICAgIHRlc3QgISAtZCAuLy0tdmVyc2lvbjsgdGhlbgorKyAgICAgIGVjaG8gIm1rZGlyIC1tICRkaXJtb2RlIC1wIC0tICQqIgorKyAgICAgIGV4ZWMgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAiJEAiCisrICAgIGVsc2UKKysgICAgICAjIENsZWFuIHVwIGFmdGVyIE5leHRTdGVwIGFuZCBPcGVuU3RlcCBta2Rpci4KKysgICAgICBmb3IgZCBpbiAuLy1tIC4vLXAgLi8tLXZlcnNpb24gIi4vJGRpcm1vZGUiOworKyAgICAgIGRvCisrICAgICAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCisrICAgICAgZG9uZQorKyAgICBmaQorKyAgICA7OworK2VzYWMKKysKKytmb3IgZmlsZQorK2RvCisrICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAorKyAgc2hpZnQKKysKKysgIHBhdGhjb21wPQorKyAgZm9yIGQKKysgIGRvCisrICAgIHBhdGhjb21wPSIkcGF0aGNvbXAkZCIKKysgICAgY2FzZSAkcGF0aGNvbXAgaW4KKysgICAgICAtKikgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKKysgICAgZXNhYworKworKyAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKysgICAgICBlY2hvICJta2RpciAkcGF0aGNvbXAiCisrCisrICAgICAgbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworKworKyAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorIAllcnJzdGF0dXM9JGxhc3RlcnIKKy0gICAgIGZpCisrICAgICAgZWxzZQorKwlpZiB0ZXN0ICEgLXogIiRkaXJtb2RlIjsgdGhlbgorKwkgIGVjaG8gImNobW9kICRkaXJtb2RlICRwYXRoY29tcCIKKysJICBsYXN0ZXJyPSIiCisrCSAgY2htb2QgIiRkaXJtb2RlIiAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisgCistICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKKy0gICBkb25lCisrCSAgaWYgdGVzdCAhIC16ICIkbGFzdGVyciI7IHRoZW4KKysJICAgIGVycnN0YXR1cz0kbGFzdGVycgorKwkgIGZpCisrCWZpCisrICAgICAgZmkKKysgICAgZmkKKysKKysgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCisrICBkb25lCisgZG9uZQorIAorIGV4aXQgJGVycnN0YXR1cworKworKyMgTG9jYWwgVmFyaWFibGVzOgorKyMgbW9kZTogc2hlbGwtc2NyaXB0CisrIyBzaC1pbmRlbnRhdGlvbjogMgorKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisrIyB0aW1lLXN0YW1wLWVuZDogIiQiCisrIyBFbmQ6CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL3BvL2JvbGRxdW90LnNlZAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvcG8vYm9sZHF1b3Quc2VkCTIwMDQtMDktMTIgMTQ6NDA6MzQuNzIzNjkyMTUyIC0wNDAwCitAQCAtMCwwICsxLDEwIEBACisrcy8iXChbXiJdKlwpIi/igJxcMeKAnS9nCisrcy9gXChbXmAnXSpcKScv4oCYXDHigJkvZworK3MvICdcKFteYCddKlwpJyAvIOKAmFwx4oCZIC9nCisrcy8gJ1woW15gJ10qXCknJC8g4oCYXDHigJkvZworK3MvXidcKFteYCddKlwpJyAv4oCYXDHigJkgL2cKKytzL+KAnOKAnS8iIi9nCisrcy/igJwv4oCcG1sxbS9nCisrcy/igJ0vG1swbeKAnS9nCisrcy/igJgv4oCYG1sxbS9nCisrcy/igJkvG1swbeKAmS9nCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL3BvL2NhdC1pZC10YmwuYwkxOTk4LTEyLTI5IDA0OjI0OjI0LjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvcG8vY2F0LWlkLXRibC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCitAQCAtMSwyMzQgKzAsMCBAQAorLS8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHBvMnRibC5zZWQgZnJvbSBscnpzei5wb3QuICAqLworLQorLSNpZiBIQVZFX0NPTkZJR19ICistIyBpbmNsdWRlIDxjb25maWcuaD4KKy0jZW5kaWYKKy0KKy0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIgorLQorLWNvbnN0IHN0cnVjdCBfbXNnX2VudCBfbXNnX3RibFtdID0geworLSAgeyIiLCAxfSwKKy0gIHsiaW9fbW9kZSgsMikgaW4gcmJzYi5jIG5vdCBpbXBsZW1lbnRlZFxuIiwgMn0sCistICB7ImNhdWdodCBzaWduYWwgJWQ7IGV4aXRpbmciLCAzfSwKKy0gIHsiY29tbWFuZCB0cmllcyIsIDR9LAorLSAgeyJwYWNrZXRsZW5ndGgiLCA1fSwKKy0gIHsicGFja2V0bGVuZ3RoIG91dCBvZiByYW5nZSAyNC4uJWxkIiwgNn0sCistICB7ImZyYW1lbGVuZ3RoIiwgN30sCistICB7ImZyYW1lbGVuZ3RoIG91dCBvZiByYW5nZSAzMi4uJWxkIiwgOH0sCistICB7Im1pbl9icHMiLCA5fSwKKy0gIHsibWluX2JwcyBtdXN0IGJlID49IDAiLCAxMH0sCistICB7Im1pbl9icHNfdGltZSIsIDExfSwKKy0gIHsibWluX2Jwc190aW1lIG11c3QgYmUgPiAxIiwgMTJ9LAorLSAgeyJob3VyIHRvIGxhcmdlICgwLi4yMykiLCAxM30sCistICB7InVucGFyc2FibGUgc3RvcCB0aW1lXG4iLCAxNH0sCistICB7Im1pbnV0ZSB0byBsYXJnZSAoMC4uNTkpIiwgMTV9LAorLSAgeyJzdG9wIHRpbWUgdG8gc21hbGwiLCAxNn0sCistICB7InN0b3AtYXQiLCAxN30sCistICB7InRpbWVvdXQiLCAxOH0sCistICB7InRpbWVvdXQgb3V0IG9mIHJhbmdlIDEwLi4xMDAwIiwgMTl9LAorLSAgeyJzZWN1cml0eSB2aW9sYXRpb246IGNhbid0IGRvIHRoYXQgdW5kZXIgcmVzdHJpY3RlZCBzaGVsbFxuIiwgMjB9LAorLSAgeyJ3aW5kb3cgc2l6ZSIsIDIxfSwKKy0gIHsiY2Fubm90IHR1cm5vZmYgc3lzbG9nIiwgMjJ9LAorLSAgeyJzdGFydHVwIGRlbGF5IiwgMjN9LAorLSAgeyJvdXQgb2YgbWVtb3J5IiwgMjR9LAorLSAgeyJ0aGlzIHByb2dyYW0gd2FzIG5ldmVyIGludGVuZGVkIHRvIGJlIHVzZWQgc2V0dWlkXG4iLCAyNX0sCistICB7Im5lZWQgYXQgbGVhc3Qgb25lIGZpbGUgdG8gc2VuZCIsIDI2fSwKKy0gIHsiQ2FuJ3Qgc2VuZCBjb21tYW5kIGluIHJlc3RyaWN0ZWQgbW9kZVxuIiwgMjd9LAorLSAgeyJob3N0bmFtZSB0b28gbG9uZ1xuIiwgMjh9LAorLSAgeyJpbGxlZ2FsIHNlcnZlciBhZGRyZXNzXG4iLCAyOX0sCistICB7ImNhbiByZWFkIG9ubHkgb25lIGZpbGUgZnJvbSBzdGRpbiIsIDMwfSwKKy0gIHsiVHJhbnNmZXIgaW5jb21wbGV0ZVxuIiwgMzF9LAorLSAgeyJUcmFuc2ZlciBjb21wbGV0ZVxuIiwgMzJ9LAorLSAgeyJzZW5kX3BzZXVkbyAlczogY2Fubm90IG9wZW4gdG1wZmlsZSAlczogJXMiLCAzM30sCistICB7InNlbmRfcHNldWRvICVzOiBjYW5ub3QgbHN0YXQgdG1wZmlsZSAlczogJXMiLCAzNH0sCistICB7InNlbmRfcHNldWRvICVzOiBhdm9pZGluZyBzeW1saW5rIHRyYXAiLCAzNX0sCistICB7InNlbmRfcHNldWRvICVzOiBjYW5ub3Qgd3JpdGUgdG8gdG1wZmlsZSAlczogJXMiLCAzNn0sCistICB7InNlbmRfcHNldWRvICVzOiBmYWlsZWQiLCAzN30sCistICB7InNlbmRfcHNldWRvICVzOiBvayIsIDM4fSwKKy0gIHsidGNwIHByb3RvY29sIGluaXQgZmFpbGVkXG4iLCAzOX0sCistICB7IkFuc3dlcmluZyBUSU1FU1lOQyBhdCAlcyIsIDQwfSwKKy0gIHsidGltZXpvbmUiLCA0MX0sCistICB7InRpbWV6b25lIHVua25vd24iLCA0Mn0sCistICB7IkNhbid0IG9wZW4gYW55IHJlcXVlc3RlZCBmaWxlcy4iLCA0M30sCistICB7InNlY3VyaXR5IHZpb2xhdGlvbjogbm90IGFsbG93ZWQgdG8gdXBsb2FkIGZyb20gJXMiLCA0NH0sCistICB7ImNhbm5vdCBvcGVuICVzIiwgNDV9LAorLSAgeyJpcyBub3QgYSBmaWxlOiAlcyIsIDQ2fSwKKy0gIHsiJXMvJXM6IGVycm9yIG9jY3VyZWQiLCA0N30sCistICB7InNraXBwZWQ6ICVzIiwgNDh9LAorLSAgeyIlcy8lczogc2tpcHBlZCIsIDQ5fSwKKy0gIHsiQnl0ZXMgU2VudDolN2xkICAgQlBTOiUtOGxkICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCA1MH0sCistICB7IlNlbmRpbmcgJXMsICVsZCBibG9ja3M6ICIsIDUxfSwKKy0gIHsiR2l2ZSB5b3VyIGxvY2FsIFhNT0RFTSByZWNlaXZlIGNvbW1hbmQgbm93LiIsIDUyfSwKKy0gIHsiU2VuZGluZzogJXNcbiIsIDUzfSwKKy0gIHsiVGltZW91dCBvbiBwYXRobmFtZSIsIDU0fSwKKy0gIHsiUmVjZWl2ZXIgQ2FuY2VsbGVkIiwgNTV9LAorLSAgeyJObyBBQ0sgb24gRU9UIiwgNTZ9LAorLSAgeyJYbW9kZW0gc2VjdG9ycy9rYnl0ZXMgc2VudDogJTNkLyUyZGsiLCA1N30sCistICB7Illtb2RlbSBzZWN0b3JzL2tieXRlcyBzZW50OiAlM2QvJTJkayIsIDU4fSwKKy0gIHsiQ2FuY2VsbGVkIiwgNTl9LAorLSAgeyJUaW1lb3V0IG9uIHNlY3RvciBBQ0siLCA2MH0sCistICB7Ik5BSyBvbiBzZWN0b3IiLCA2MX0sCistICB7IkdvdCBidXJzdCBmb3Igc2VjdG9yIEFDSyIsIDYyfSwKKy0gIHsiR290ICUwMnggZm9yIHNlY3RvciBBQ0siLCA2M30sCistICB7IlJldHJ5IENvdW50IEV4Y2VlZGVkIiwgNjR9LAorLSAgeyJUcnkgYCVzIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iLCA2NX0sCistICB7IiVzIHZlcnNpb24gJXNcbiIsIDY2fSwKKy0gIHsiVXNhZ2U6ICVzIFtvcHRpb25zXSBmaWxlIC4uLlxuIiwgNjd9LAorLSAgeyIgICBvcjogJXMgW29wdGlvbnNdIC17Y3xpfSBDT01NQU5EXG4iLCA2OH0sCistICB7IlNlbmQgZmlsZShzKSB3aXRoIFpNT0RFTS9ZTU9ERU0vWE1PREVNIHByb3RvY29sXG4iLCA2OX0sCistICB7IlwKKy0gICAgKFgpID0gb3B0aW9uIGFwcGxpZXMgdG8gWE1PREVNIG9ubHlcblwKKy0gICAgKFkpID0gb3B0aW9uIGFwcGxpZXMgdG8gWU1PREVNIG9ubHlcblwKKy0gICAgKFopID0gb3B0aW9uIGFwcGxpZXMgdG8gWk1PREVNIG9ubHlcbiIsIDcwfSwKKy0gIHsiXAorLSAgLSssIC0tYXBwZW5kICAgICAgICAgICAgICAgIGFwcGVuZCB0byBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlIChaKVxuXAorLSAgLTIsIC0tdHdvc3RvcCAgICAgICAgICAgICAgIHVzZSAyIHN0b3AgYml0c1xuXAorLSAgLTQsIC0tdHJ5LTRrICAgICAgICAgICAgICAgIGdvIHVwIHRvIDRLIGJsb2Nrc2l6ZVxuXAorLSAgICAgIC0tc3RhcnQtNGsgICAgICAgICAgICAgIHN0YXJ0IHdpdGggNEsgYmxvY2tzaXplIChkb2Vzbid0IHRyeSA4KVxuXAorLSAgLTgsIC0tdHJ5LThrICAgICAgICAgICAgICAgIGdvIHVwIHRvIDhLIGJsb2Nrc2l6ZVxuXAorLSAgICAgIC0tc3RhcnQtOGsgICAgICAgICAgICAgIHN0YXJ0IHdpdGggOEsgYmxvY2tzaXplXG5cCistICAtYSwgLS1hc2NpaSAgICAgICAgICAgICAgICAgQVNDSUkgdHJhbnNmZXIgKGNoYW5nZSBDUi9MRiB0byBMRilcblwKKy0gIC1iLCAtLWJpbmFyeSAgICAgICAgICAgICAgICBiaW5hcnkgdHJhbnNmZXJcblwKKy0gIC1CLCAtLWJ1ZnNpemUgTiAgICAgICAgICAgICBidWZmZXIgTiBieXRlcyAoTj09YXV0bzogYnVmZmVyIHdob2xlIGZpbGUpXG5cCistICAtYywgLS1jb21tYW5kIENPTU1BTkQgICAgICAgZXhlY3V0ZSByZW1vdGUgY29tbWFuZCBDT01NQU5EIChaKVxuXAorLSAgLUMsIC0tY29tbWFuZC10cmllcyBOICAgICAgIHRyeSBOIHRpbWVzIHRvIGV4ZWN1dGUgYSBjb21tYW5kIChaKVxuXAorLSAgLWQsIC0tZG90LXRvLXNsYXNoICAgICAgICAgIGNoYW5nZSAnLicgdG8gJy8nIGluIHBhdGhuYW1lcyAoWS9aKVxuXAorLSAgICAgIC0tZGVsYXktc3RhcnR1cCBOICAgICAgIHNsZWVwIE4gc2Vjb25kcyBiZWZvcmUgZG9pbmcgYW55dGhpbmdcblwKKy0gIC1lLCAtLWVzY2FwZSAgICAgICAgICAgICAgICBlc2NhcGUgYWxsIGNvbnRyb2wgY2hhcmFjdGVycyAoWilcblwKKy0gIC1FLCAtLXJlbmFtZSAgICAgICAgICAgICAgICBmb3JjZSByZWNlaXZlciB0byByZW5hbWUgZmlsZXMgaXQgYWxyZWFkeSBoYXNcblwKKy0gIC1mLCAtLWZ1bGwtcGF0aCAgICAgICAgICAgICBzZW5kIGZ1bGwgcGF0aG5hbWUgKFkvWilcblwKKy0gIC1pLCAtLWltbWVkaWF0ZS1jb21tYW5kIENNRCBzZW5kIHJlbW90ZSBDTUQsIHJldHVybiBpbW1lZGlhdGVseSAoWilcblwKKy0gIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIHVzYWdlIG1lc3NhZ2VcblwKKy0gIC1rLCAtLTFrICAgICAgICAgICAgICAgICAgICBzZW5kIDEwMjQgYnl0ZSBwYWNrZXRzIChYKVxuXAorLSAgLUwsIC0tcGFja2V0bGVuIE4gICAgICAgICAgIGxpbWl0IHN1YnBhY2tldCBsZW5ndGggdG8gTiBieXRlcyAoWilcblwKKy0gIC1sLCAtLWZyYW1lbGVuIE4gICAgICAgICAgICBsaW1pdCBmcmFtZSBsZW5ndGggdG8gTiBieXRlcyAobD49TCkgKFopXG5cCistICAtbSwgLS1taW4tYnBzIE4gICAgICAgICAgICAgc3RvcCB0cmFuc21pc3Npb24gaWYgQlBTIGJlbG93IE5cblwKKy0gIC1NLCAtLW1pbi1icHMtdGltZSBOICAgICAgICAgIGZvciBhdCBsZWFzdCBOIHNlY29uZHMgKGRlZmF1bHQ6IDEyMClcbiIsIDcxfSwKKy0gIHsiXAorLSAgLW4sIC0tbmV3ZXIgICAgICAgICAgICAgICAgIHNlbmQgZmlsZSBpZiBzb3VyY2UgbmV3ZXIgKFopXG5cCistICAtTiwgLS1uZXdlci1vci1sb25nZXIgICAgICAgc2VuZCBmaWxlIGlmIHNvdXJjZSBuZXdlciBvciBsb25nZXIgKFopXG5cCistICAtbywgLS0xNi1iaXQtY3JjICAgICAgICAgICAgdXNlIDE2IGJpdCBDUkMgaW5zdGVhZCBvZiAzMiBiaXQgQ1JDIChaKVxuXAorLSAgLU8sIC0tZGlzYWJsZS10aW1lb3V0cyAgICAgIGRpc2FibGUgdGltZW91dCBjb2RlLCB3YWl0IGZvcmV2ZXJcblwKKy0gIC1wLCAtLXByb3RlY3QgICAgICAgICAgICAgICBwcm90ZWN0IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUgKFopXG5cCistICAtciwgLS1yZXN1bWUgICAgICAgICAgICAgICAgcmVzdW1lIGludGVycnVwdGVkIGZpbGUgdHJhbnNmZXIgKFopXG5cCistICAtUiwgLS1yZXN0cmljdGVkICAgICAgICAgICAgcmVzdHJpY3RlZCwgbW9yZSBzZWN1cmUgbW9kZVxuXAorLSAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgIHF1aWV0IChubyBwcm9ncmVzcyByZXBvcnRzKVxuXAorLSAgLXMsIC0tc3RvcC1hdCB7SEg6TU18K059ICAgIHN0b3AgdHJhbnNtaXNzaW9uIGF0IEhIOk1NIG9yIGluIE4gc2Vjb25kc1xuXAorLSAgICAgIC0tdGNwICAgICAgICAgICAgICAgICAgIGJ1aWxkIGEgVENQIGNvbm5lY3Rpb24gdG8gdHJhbnNtaXQgZmlsZXNcblwKKy0gICAgICAtLXRjcC1zZXJ2ZXIgICAgICAgICAgICBvcGVuIHNvY2tldCwgd2FpdCBmb3IgY29ubmVjdGlvblxuXAorLSAgLXUsIC0tdW5saW5rICAgICAgICAgICAgICAgIHVubGluayBmaWxlIGFmdGVyIHRyYW5zbWlzc2lvblxuXAorLSAgLVUsIC0tdW5yZXN0cmljdCAgICAgICAgICAgIHR1cm4gb2ZmIHJlc3RyaWN0ZWQgbW9kZSAoaWYgYWxsb3dlZCB0bylcblwKKy0gIC12LCAtLXZlcmJvc2UgICAgICAgICAgICAgICBiZSB2ZXJib3NlLCBwcm92aWRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuXAorLSAgLXcsIC0td2luZG93c2l6ZSBOICAgICAgICAgIFdpbmRvdyBpcyBOIGJ5dGVzIChaKVxuXAorLSAgLVgsIC0teG1vZGVtICAgICAgICAgICAgICAgIHVzZSBYTU9ERU0gcHJvdG9jb2xcblwKKy0gIC15LCAtLW92ZXJ3cml0ZSAgICAgICAgICAgICBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXNcblwKKy0gIC1ZLCAtLW92ZXJ3cml0ZS1vci1za2lwICAgICBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMsIGVsc2Ugc2tpcFxuXAorLSAgICAgIC0teW1vZGVtICAgICAgICAgICAgICAgIHVzZSBZTU9ERU0gcHJvdG9jb2xcblwKKy0gIC1aLCAtLXptb2RlbSAgICAgICAgICAgICAgICB1c2UgWk1PREVNIHByb3RvY29sXG5cCistXG5cCistc2hvcnQgb3B0aW9ucyB1c2UgdGhlIHNhbWUgYXJndW1lbnRzIGFzIHRoZSBsb25nIG9uZXNcbiIsIDcyfSwKKy0gIHsiZ290IFpSUUlOSVQiLCA3M30sCistICB7ImdvdCBaQ0FOIiwgNzR9LAorLSAgeyJibGtsZW4gbm93ICVkXG4iLCA3NX0sCistICB7InpzZW5kZmRhdGE6IGJwcyByYXRlICVsZCBiZWxvdyBtaW4gJWxkIiwgNzZ9LAorLSAgeyJ6c2VuZGZkYXRhOiByZWFjaGVkIHN0b3AgdGltZSIsIDc3fSwKKy0gIHsiQnl0ZXMgU2VudDolN2xkLyU3bGQgICBCUFM6JS04bGQgRVRBICUwMmQ6JTAyZCAgIiwgNzh9LAorLSAgeyJjYWxjX2Jsa2xlbjogcmVkdWNlZCB0byAlZCBkdWUgdG8gZXJyb3JcbiIsIDc5fSwKKy0gIHsiY2FsY19ibGtsZW46IHJldHVybmVkIG9sZCB2YWx1ZSAlZCBkdWUgdG8gbG93IGJwZSBkaWZmXG4iLCA4MH0sCistICB7ImNhbGNfYmxrbGVuOiBvbGQgJWxkLCBuZXcgJWxkLCBkICVsZFxuIiwgODF9LAorLSAgeyJjYWxjX2Jsa2xlbjogY2FsYyB0b3RhbF9ieXRlcz0lbGQsIGJwZT0lbGQsIGVjPSVsZFxuIiwgODJ9LAorLSAgeyJjYWxjX2Jsa2xlbjogYmxrbGVuICVkLCBvayAlbGQsIGZhaWxlZCAlbGQgLT4gJWx1XG4iLCA4M30sCistICB7ImNhbGNfYmxrbGVuOiByZXR1cm5lZCAlZCBhcyBiZXN0XG4iLCA4NH0sCistICB7IlwKKy1cblwKKy1jb3VudGVtOiBUb3RhbCAlZCAlbGRcbiIsIDg1fSwKKy0gIHsiQmFkIGVzY2FwZSBzZXF1ZW5jZSAleCIsIDg2fSwKKy0gIHsiU2VuZGVyIENhbmNlbGVkIiwgODd9LAorLSAgeyJUSU1FT1VUIiwgODh9LAorLSAgeyJCYWQgZGF0YSBzdWJwYWNrZXQiLCA4OX0sCistICB7IkRhdGEgc3VicGFja2V0IHRvbyBsb25nIiwgOTB9LAorLSAgeyJHYXJiYWdlIGNvdW50IGV4Y2VlZGVkIiwgOTF9LAorLSAgeyJHb3QgJXMiLCA5Mn0sCistICB7IlJldHJ5ICVkOiAiLCA5M30sCistICB7ImRvbid0IGhhdmUgc2V0dGltZW9mZGF5LCB3aWxsIG5vdCBzZXQgdGltZVxuIiwgOTR9LAorLSAgeyJub3QgcnVubmluZyBhcyByb290ICh0aGlzIGlzIGdvb2QhKSwgY2FuIG5vdCBzZXQgdGltZVxuIiwgOTV9LAorLSAgeyJieXRlc19wZXJfZXJyb3IiLCA5Nn0sCistICB7ImJ5dGVzLXBlci1lcnJvciBzaG91bGQgYmUgPjEwMCIsIDk3fSwKKy0gIHsiT19TWU5DIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCIsIDk4fSwKKy0gIHsiZ2FyYmFnZSBvbiBjb21tYW5kbGluZSIsIDk5fSwKKy0gIHsiVXNhZ2U6ICVzIFtvcHRpb25zXSBbZmlsZW5hbWUuaWYueG1vZGVtXVxuIiwgMTAwfSwKKy0gIHsiUmVjZWl2ZSBmaWxlcyB3aXRoIFpNT0RFTS9ZTU9ERU0vWE1PREVNIHByb3RvY29sXG4iLCAxMDF9LAorLSAgeyJcCistICAtKywgLS1hcHBlbmQgICAgICAgICAgICAgICAgYXBwZW5kIHRvIGV4aXN0aW5nIGZpbGVzXG5cCistICAtYSwgLS1hc2NpaSAgICAgICAgICAgICAgICAgQVNDSUkgdHJhbnNmZXIgKGNoYW5nZSBDUi9MRiB0byBMRilcblwKKy0gIC1iLCAtLWJpbmFyeSAgICAgICAgICAgICAgICBiaW5hcnkgdHJhbnNmZXJcblwKKy0gIC1CLCAtLWJ1ZnNpemUgTiAgICAgICAgICAgICBidWZmZXIgTiBieXRlcyAoTj09YXV0bzogYnVmZmVyIHdob2xlIGZpbGUpXG5cCistICAtYywgLS13aXRoLWNyYyAgICAgICAgICAgICAgVXNlIDE2IGJpdCBDUkMgKFgpXG5cCistICAtQywgLS1hbGxvdy1yZW1vdGUtY29tbWFuZHMgYWxsb3cgZXhlY3V0aW9uIG9mIHJlbW90ZSBjb21tYW5kcyAoWilcblwKKy0gIC1ELCAtLW51bGwgICAgICAgICAgICAgICAgICB3cml0ZSBhbGwgcmVjZWl2ZWQgZGF0YSB0byAvZGV2L251bGxcblwKKy0gICAgICAtLWRlbGF5LXN0YXJ0dXAgTiAgICAgICBzbGVlcCBOIHNlY29uZHMgYmVmb3JlIGRvaW5nIGFueXRoaW5nXG5cCistICAtZSwgLS1lc2NhcGUgICAgICAgICAgICAgICAgRXNjYXBlIGNvbnRyb2wgY2hhcmFjdGVycyAoWilcblwKKy0gIC1FLCAtLXJlbmFtZSAgICAgICAgICAgICAgICByZW5hbWUgYW55IGZpbGVzIGFscmVhZHkgZXhpc3RpbmdcblwKKy0gICAgICAtLWVycm9ycyBOICAgICAgICAgICAgICBnZW5lcmF0ZSBDUkMgZXJyb3IgZXZlcnkgTiBieXRlcyAoZGVidWdnaW5nKVxuXAorLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgIEhlbHAsIHByaW50IHRoaXMgdXNhZ2UgbWVzc2FnZVxuXAorLSAgLW0sIC0tbWluLWJwcyBOICAgICAgICAgICAgIHN0b3AgdHJhbnNtaXNzaW9uIGlmIEJQUyBiZWxvdyBOXG5cCistICAtTSwgLS1taW4tYnBzLXRpbWUgTiAgICAgICAgICBmb3IgYXQgbGVhc3QgTiBzZWNvbmRzIChkZWZhdWx0OiAxMjApXG5cCistICAtTywgLS1kaXNhYmxlLXRpbWVvdXRzICAgICAgZGlzYWJsZSB0aW1lb3V0IGNvZGUsIHdhaXQgZm9yZXZlciBmb3IgZGF0YVxuXAorLSAgICAgIC0tby1zeW5jICAgICAgICAgICAgICAgIG9wZW4gb3V0cHV0IGZpbGUocykgaW4gc3luY2hyb25vdXMgd3JpdGUgbW9kZVxuXAorLSAgLXAsIC0tcHJvdGVjdCAgICAgICAgICAgICAgIHByb3RlY3QgZXhpc3RpbmcgZmlsZXNcblwKKy0gIC1xLCAtLXF1aWV0ICAgICAgICAgICAgICAgICBxdWlldCwgbm8gcHJvZ3Jlc3MgcmVwb3J0c1xuXAorLSAgLXIsIC0tcmVzdW1lICAgICAgICAgICAgICAgIHRyeSB0byByZXN1bWUgaW50ZXJydXB0ZWQgZmlsZSB0cmFuc2ZlciAoWilcblwKKy0gIC1SLCAtLXJlc3RyaWN0ZWQgICAgICAgICAgICByZXN0cmljdGVkLCBtb3JlIHNlY3VyZSBtb2RlXG5cCistICAtcywgLS1zdG9wLWF0IHtISDpNTXwrTn0gICAgc3RvcCB0cmFuc21pc3Npb24gYXQgSEg6TU0gb3IgaW4gTiBzZWNvbmRzXG5cCistICAtUywgLS10aW1lc3luYyAgICAgICAgICAgICAgcmVxdWVzdCByZW1vdGUgdGltZSAodHdpY2U6IHNldCBsb2NhbCB0aW1lKVxuXAorLSAgICAgIC0tc3lzbG9nWz1vZmZdICAgICAgICAgIHR1cm4gc3lzbG9nIG9uIG9yIG9mZiwgaWYgcG9zc2libGVcblwKKy0gIC10LCAtLXRpbWVvdXQgTiAgICAgICAgICAgICBzZXQgdGltZW91dCB0byBOIHRlbnRocyBvZiBhIHNlY29uZFxuXAorLSAgLXUsIC0ta2VlcC11cHBlcmNhc2UgICAgICAgIGtlZXAgdXBwZXIgY2FzZSBmaWxlbmFtZXNcblwKKy0gIC1VLCAtLXVucmVzdHJpY3QgICAgICAgICAgICBkaXNhYmxlIHJlc3RyaWN0ZWQgbW9kZSAoaWYgYWxsb3dlZCB0bylcblwKKy0gIC12LCAtLXZlcmJvc2UgICAgICAgICAgICAgICBiZSB2ZXJib3NlLCBwcm92aWRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuXAorLSAgLXcsIC0td2luZG93c2l6ZSBOICAgICAgICAgIFdpbmRvdyBpcyBOIGJ5dGVzIChaKVxuXAorLSAgLVggIC0teG1vZGVtICAgICAgICAgICAgICAgIHVzZSBYTU9ERU0gcHJvdG9jb2xcblwKKy0gIC15LCAtLW92ZXJ3cml0ZSAgICAgICAgICAgICBZZXMsIGNsb2JiZXIgZXhpc3RpbmcgZmlsZSBpZiBhbnlcblwKKy0gICAgICAtLXltb2RlbSAgICAgICAgICAgICAgICB1c2UgWU1PREVNIHByb3RvY29sXG5cCistICAtWiwgLS16bW9kZW0gICAgICAgICAgICAgICAgdXNlIFpNT0RFTSBwcm90b2NvbFxuXAorLVxuXAorLXNob3J0IG9wdGlvbnMgdXNlIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgbG9uZyBvbmVzXG4iLCAxMDJ9LAorLSAgeyIlcyB3YWl0aW5nIHRvIHJlY2VpdmUuIiwgMTAzfSwKKy0gIHsiXHJCeXRlcyByZWNlaXZlZDogJTdsZC8lN2xkICAgQlBTOiUtNmxkICAgICAgICAgICAgICAgIFxyXG4iLCAxMDR9LAorLSAgeyIlczogcmVhZHkgdG8gcmVjZWl2ZSAlcyIsIDEwNX0sCistICB7IlxyQnl0ZXMgcmVjZWl2ZWQ6ICU3bGQgICBCUFM6JS02bGQgICAgICAgICAgICAgICAgXHJcbiIsIDEwNn0sCistICB7IlwKKy1cclxuXAorLSVzOiAlcyByZW1vdmVkLlxyXG4iLCAxMDd9LAorLSAgeyJQYXRobmFtZSBmZXRjaCByZXR1cm5lZCBFT1QiLCAxMDh9LAorLSAgeyJSZWNlaXZlZCBkdXAgU2VjdG9yIiwgMTA5fSwKKy0gIHsiU3luYyBFcnJvciIsIDExMH0sCistICB7IkNSQyIsIDExMX0sCistICB7IkNoZWNrc3VtIiwgMTEyfSwKKy0gIHsiU2VjdG9yIG51bWJlciBnYXJibGVkIiwgMTEzfSwKKy0gIHsiU2VuZGVyIENhbmNlbGxlZCIsIDExNH0sCistICB7IkdvdCAwJW8gc2VjdG9yIGhlYWRlciIsIDExNX0sCistICB7ImZpbGUgbmFtZSBlbmRzIHdpdGggYSAvLCBza2lwcGVkOiAlc1xuIiwgMTE2fSwKKy0gIHsiem1hbmFnPSVkLCBMem1hbmFnPSVkXG4iLCAxMTd9LAorLSAgeyJ6Y29udj0lZFxuIiwgMTE4fSwKKy0gIHsiZmlsZSBleGlzdHMsIHNraXBwZWQ6ICVzXG4iLCAxMTl9LAorLSAgeyJUSU1FU1lOQzogaGVyZSAlbGQsIHJlbW90ZSAlbGQsIGRpZmYgJWxkIHNlY29uZHNcbiIsIDEyMH0sCistICB7IlRJTUVTWU5DOiBjYW5ub3Qgc2V0IHRpbWU6ICVzXG4iLCAxMjF9LAorLSAgeyJjYW5ub3QgdG1wZmlsZSgpIGZvciB0Y3AgcHJvdG9jb2wgc3luY2hyb25pemF0aW9uIiwgMTIyfSwKKy0gIHsiVG9waXBlIiwgMTIzfSwKKy0gIHsiUmVjZWl2aW5nOiAlc1xuIiwgMTI0fSwKKy0gIHsiQmxvY2tzIHJlY2VpdmVkOiAlZCIsIDEyNX0sCistICB7IiVzOiAlcyBleGlzdHNcbiIsIDEyNn0sCistICB7IiVzOlx0U2VjdXJpdHkgVmlvbGF0aW9uIiwgMTI3fSwKKy0gIHsicmVtb3RlIGNvbW1hbmQgZXhlY3V0aW9uIHJlcXVlc3RlZCIsIDEyOH0sCistICB7Im5vdCBleGVjdXRlZCIsIDEyOX0sCistICB7ImdvdCBaUklOSVQiLCAxMzB9LAorLSAgeyJTa2lwcGVkIiwgMTMxfSwKKy0gIHsicnpmaWxlOiBicHMgcmF0ZSAlbGQgYmVsb3cgbWluICVsZCIsIDEzMn0sCistICB7InJ6ZmlsZTogcmVhY2hlZCBzdG9wIHRpbWUiLCAxMzN9LAorLSAgeyJcckJ5dGVzIHJlY2VpdmVkOiAlN2xkLyU3bGQgICBCUFM6JS02bGQgRVRBICUwMmQ6JTAyZCAgIiwgMTM0fSwKKy0gIHsiZmdldHMgZm9yIHRjcCBwcm90b2NvbCBzeW5jaHJvbml6YXRpb24gZmFpbGVkOiAiLCAxMzV9LAorLSAgeyJmaWxlIGNsb3NlIGVycm9yIiwgMTM2fSwKKy19OworLQorLWludCBfbXNnX3RibF9sZW5ndGggPSAxMzY7CistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL3BvL0NoYW5nZUxvZwkxOTk4LTA0LTI2IDA5OjIwOjUyLjAwMDAwMDAwMCAtMDQwMAorKysrIGxyenN6LTAuMTIuMjAvcG8vQ2hhbmdlTG9nCTIwMDQtMDktMTIgMTQ6NDA6MzQuNzkzNjgxNTEyIC0wNDAwCitAQCAtMSwzICsxLDE1IEBACisrMjAwNC0wOS0xMiAgZ2V0dGV4dGl6ZSAgPGJ1Zy1nbnUtZ2V0dGV4dEBnbnUub3JnPgorKworKwkqIGJvbGRxdW90LnNlZDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogZW5AYm9sZHF1b3QuaGVhZGVyOiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBlbkBxdW90LmhlYWRlcjogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisrCSogaW5zZXJ0LWhlYWRlci5zaW46IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorKwkqIHF1b3Quc2VkOiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiByZW1vdmUtcG90Y2RhdGUuc2luOiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBSdWxlcy1xdW90OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKysJKiBjYXQtaWQtdGJsLmM6IFJlbW92ZSBmaWxlLgorKwkqIHN0YW1wLWNhdC1pZDogUmVtb3ZlIGZpbGUuCisrCisgLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgcG8ydGJsLnNlZCBmcm9tIGxyenN6LnBvdC4gICovCisgCisgI2lmIEhBVkVfQ09ORklHX0gKKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvcG8vZW5AYm9sZHF1b3QuaGVhZGVyCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9wby9lbkBib2xkcXVvdC5oZWFkZXIJMjAwNC0wOS0xMiAxNDo0MDozNC43MzE2OTA5MzYgLTA0MDAKK0BAIC0wLDAgKzEsMjUgQEAKKysjIEFsbCB0aGlzIGNhdGFsb2cgInRyYW5zbGF0ZXMiIGFyZSBxdW90YXRpb24gY2hhcmFjdGVycy4KKysjIFRoZSBtc2dpZHMgbXVzdCBiZSBBU0NJSSBhbmQgdGhlcmVmb3JlIGNhbm5vdCBjb250YWluIHJlYWwgcXVvdGF0aW9uCisrIyBjaGFyYWN0ZXJzLCBvbmx5IHN1YnN0aXR1dGVzIGxpa2UgZ3JhdmUgYWNjZW50ICgweDYwKSwgYXBvc3Ryb3BoZSAoMHgyNykKKysjIGFuZCBkb3VibGUgcXVvdGUgKDB4MjIpLiBUaGVzZSBzdWJzdGl0dXRlcyBsb29rIHN0cmFuZ2U7IHNlZQorKyMgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy9xdW90ZXMuaHRtbAorKyMKKysjIFRoaXMgY2F0YWxvZyB0cmFuc2xhdGVzIGdyYXZlIGFjY2VudCAoMHg2MCkgYW5kIGFwb3N0cm9waGUgKDB4MjcpIHRvCisrIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpLgorKyMgSXQgYWxzbyB0cmFuc2xhdGVzIHBhaXJzIG9mIGFwb3N0cm9waGUgKDB4MjcpIHRvCisrIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpCisrIyBhbmQgcGFpcnMgb2YgcXVvdGF0aW9uIG1hcmsgKDB4MjIpIHRvCisrIyBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyayAoVSsyMDFDKSBhbmQgcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUQpLgorKyMKKysjIFdoZW4gb3V0cHV0IHRvIGFuIFVURi04IHRlcm1pbmFsLCB0aGUgcXVvdGF0aW9uIGNoYXJhY3RlcnMgYXBwZWFyIHBlcmZlY3RseS4KKysjIFdoZW4gb3V0cHV0IHRvIGFuIElTTy04ODU5LTEgdGVybWluYWwsIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorKyMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMgKGJ5IGljb252IGluIGdsaWJjIDIuMiBvciBuZXdlcikgb3IgdG8KKysjIGdyYXZlL2FjdXRlIGFjY2VudCAoYnkgbGliaWNvbnYpLCBhbmQgdGhlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgYXJlCisrIyB0cmFuc2xpdGVyYXRlZCB0byAweDIyLgorKyMgV2hlbiBvdXRwdXQgdG8gYW4gQVNDSUkgdGVybWluYWwsIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorKyMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMsIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKysjIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCisrIworKyMgVGhpcyBjYXRhbG9nIGZ1cnRoZXJtb3JlIGRpc3BsYXlzIHRoZSB0ZXh0IGJldHdlZW4gdGhlIHF1b3RhdGlvbiBtYXJrcyBpbgorKyMgYm9sZCBmYWNlLCBhc3N1bWluZyB0aGUgVlQxMDAvWFRlcm0gZXNjYXBlIHNlcXVlbmNlcy4KKysjCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL3BvL2VuQHF1b3QuaGVhZGVyCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9wby9lbkBxdW90LmhlYWRlcgkyMDA0LTA5LTEyIDE0OjQwOjM0LjczNzY5MDAyNCAtMDQwMAorQEAgLTAsMCArMSwyMiBAQAorKyMgQWxsIHRoaXMgY2F0YWxvZyAidHJhbnNsYXRlcyIgYXJlIHF1b3RhdGlvbiBjaGFyYWN0ZXJzLgorKyMgVGhlIG1zZ2lkcyBtdXN0IGJlIEFTQ0lJIGFuZCB0aGVyZWZvcmUgY2Fubm90IGNvbnRhaW4gcmVhbCBxdW90YXRpb24KKysjIGNoYXJhY3RlcnMsIG9ubHkgc3Vic3RpdHV0ZXMgbGlrZSBncmF2ZSBhY2NlbnQgKDB4NjApLCBhcG9zdHJvcGhlICgweDI3KQorKyMgYW5kIGRvdWJsZSBxdW90ZSAoMHgyMikuIFRoZXNlIHN1YnN0aXR1dGVzIGxvb2sgc3RyYW5nZTsgc2VlCisrIyBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL3F1b3Rlcy5odG1sCisrIworKyMgVGhpcyBjYXRhbG9nIHRyYW5zbGF0ZXMgZ3JhdmUgYWNjZW50ICgweDYwKSBhbmQgYXBvc3Ryb3BoZSAoMHgyNykgdG8KKysjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkuCisrIyBJdCBhbHNvIHRyYW5zbGF0ZXMgcGFpcnMgb2YgYXBvc3Ryb3BoZSAoMHgyNykgdG8KKysjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkKKysjIGFuZCBwYWlycyBvZiBxdW90YXRpb24gbWFyayAoMHgyMikgdG8KKysjIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUMpIGFuZCByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxRCkuCisrIworKyMgV2hlbiBvdXRwdXQgdG8gYW4gVVRGLTggdGVybWluYWwsIHRoZSBxdW90YXRpb24gY2hhcmFjdGVycyBhcHBlYXIgcGVyZmVjdGx5LgorKyMgV2hlbiBvdXRwdXQgdG8gYW4gSVNPLTg4NTktMSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCisrIyB0cmFuc2xpdGVyYXRlZCB0byBhcG9zdHJvcGhlcyAoYnkgaWNvbnYgaW4gZ2xpYmMgMi4yIG9yIG5ld2VyKSBvciB0bworKyMgZ3JhdmUvYWN1dGUgYWNjZW50IChieSBsaWJpY29udiksIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKysjIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCisrIyBXaGVuIG91dHB1dCB0byBhbiBBU0NJSSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCisrIyB0cmFuc2xpdGVyYXRlZCB0byBhcG9zdHJvcGhlcywgYW5kIHRoZSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorKyMgdHJhbnNsaXRlcmF0ZWQgdG8gMHgyMi4KKysjCistLS0gbHJ6c3otMC4xMi4yMC5zYWZlL3BvL2luc2VydC1oZWFkZXIuc2luCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9wby9pbnNlcnQtaGVhZGVyLnNpbgkyMDA0LTA5LTEyIDE0OjQwOjM0Ljc0MzY4OTExMiAtMDQwMAorQEAgLTAsMCArMSwyMyBAQAorKyMgU2VkIHNjcmlwdCB0aGF0IGluc2VydHMgdGhlIGZpbGUgY2FsbGVkIEhFQURFUiBiZWZvcmUgdGhlIGhlYWRlciBlbnRyeS4KKysjCisrIyBBdCBlYWNoIG9jY3VycmVuY2Ugb2YgYSBsaW5lIHN0YXJ0aW5nIHdpdGggIm1zZ2lkICIsIHdlIGV4ZWN1dGUgdGhlIGZvbGxvd2luZworKyMgY29tbWFuZHMuIEF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlLCBpbnNlcnQgdGhlIGZpbGUuIEF0IHRoZSBmb2xsb3dpbmcKKysjIG9jY3VycmVuY2VzLCBkbyBub3RoaW5nLiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBmb2xsb3dpbmcKKysjIG9jY3VycmVuY2VzIGlzIGFjaGlldmVkIGJ5IGxvb2tpbmcgYXQgdGhlIGhvbGQgc3BhY2UuCisrL15tc2dpZCAveworK3gKKysjIFRlc3QgaWYgdGhlIGhvbGQgc3BhY2UgaXMgZW1wdHkuCisrcy9tL20vCisrdGEKKysjIFllcyBpdCB3YXMgZW1wdHkuIEZpcnN0IG9jY3VycmVuY2UuIFJlYWQgdGhlIGZpbGUuCisrciBIRUFERVIKKysjIE91dHB1dCB0aGUgZmlsZSdzIGNvbnRlbnRzIGJ5IHJlYWRpbmcgdGhlIG5leHQgbGluZS4gQnV0IGRvbid0IGxvc2UgdGhlCisrIyBjdXJyZW50IGxpbmUgd2hpbGUgZG9pbmcgdGhpcy4KKytnCisrTgorK2JiCisrOmEKKysjIFRoZSBob2xkIHNwYWNlIHdhcyBub25lbXB0eS4gRm9sbG93aW5nIG9jY3VycmVuY2VzLiBEbyBub3RoaW5nLgorK3gKKys6YgorK30KKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvcG8vTWFrZXZhcnMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL3BvL01ha2V2YXJzCTIwMDQtMDktMTIgMTQ6NDA6MzQuNzQ4Njg4MzUyIC0wNDAwCitAQCAtMCwwICsxLDQxIEBACisrIyBNYWtlZmlsZSB2YXJpYWJsZXMgZm9yIFBPIGRpcmVjdG9yeSBpbiBhbnkgcGFja2FnZSB1c2luZyBHTlUgZ2V0dGV4dC4KKysKKysjIFVzdWFsbHkgdGhlIG1lc3NhZ2UgZG9tYWluIGlzIHRoZSBzYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUuCisrRE9NQUlOID0gJChQQUNLQUdFKQorKworKyMgVGhlc2UgdHdvIHZhcmlhYmxlcyBkZXBlbmQgb24gdGhlIGxvY2F0aW9uIG9mIHRoaXMgZGlyZWN0b3J5LgorK3N1YmRpciA9IHBvCisrdG9wX2J1aWxkZGlyID0gLi4KKysKKysjIFRoZXNlIG9wdGlvbnMgZ2V0IHBhc3NlZCB0byB4Z2V0dGV4dC4KKytYR0VUVEVYVF9PUFRJT05TID0gLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fCisrCisrIyBUaGlzIGlzIHRoZSBjb3B5cmlnaHQgaG9sZGVyIHRoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBoZWFkZXIgb2YgdGhlCisrIyAkKERPTUFJTikucG90IGZpbGUuICBTZXQgdGhpcyB0byB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiB0aGUgc3Vycm91bmRpbmcKKysjIHBhY2thZ2UuICAoTm90ZSB0aGF0IHRoZSBtc2dzdHIgc3RyaW5ncywgZXh0cmFjdGVkIGZyb20gdGhlIHBhY2thZ2UncworKyMgc291cmNlcywgYmVsb25nIHRvIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHRoZSBwYWNrYWdlLikgIFRyYW5zbGF0b3JzIGFyZQorKyMgZXhwZWN0ZWQgdG8gdHJhbnNmZXIgdGhlIGNvcHlyaWdodCBmb3IgdGhlaXIgdHJhbnNsYXRpb25zIHRvIHRoaXMgcGVyc29uCisrIyBvciBlbnRpdHksIG9yIHRvIGRpc2NsYWltIHRoZWlyIGNvcHlyaWdodC4gIFRoZSBlbXB0eSBzdHJpbmcgc3RhbmRzIGZvcgorKyMgdGhlIHB1YmxpYyBkb21haW47IGluIHRoaXMgY2FzZSB0aGUgdHJhbnNsYXRvcnMgYXJlIGV4cGVjdGVkIHRvIGRpc2NsYWltCisrIyB0aGVpciBjb3B5cmlnaHQuCisrQ09QWVJJR0hUX0hPTERFUiA9IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKworKyMgVGhpcyBpcyB0aGUgZW1haWwgYWRkcmVzcyBvciBVUkwgdG8gd2hpY2ggdGhlIHRyYW5zbGF0b3JzIHNoYWxsIHJlcG9ydAorKyMgYnVncyBpbiB0aGUgdW50cmFuc2xhdGVkIHN0cmluZ3M6CisrIyAtIFN0cmluZ3Mgd2hpY2ggYXJlIG5vdCBlbnRpcmUgc2VudGVuY2VzLCBzZWUgdGhlIG1haW50YWluZXIgZ3VpZGVsaW5lcworKyMgICBpbiB0aGUgR05VIGdldHRleHQgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAnUHJlcGFyaW5nIFN0cmluZ3MnLgorKyMgLSBTdHJpbmdzIHdoaWNoIHVzZSB1bmNsZWFyIHRlcm1zIG9yIHJlcXVpcmUgYWRkaXRpb25hbCBjb250ZXh0IHRvIGJlCisrIyAgIHVuZGVyc3Rvb2QuCisrIyAtIFN0cmluZ3Mgd2hpY2ggbWFrZSBpbnZhbGlkIGFzc3VtcHRpb25zIGFib3V0IG5vdGF0aW9uIG9mIGRhdGUsIHRpbWUgb3IKKysjICAgbW9uZXkuCisrIyAtIFBsdXJhbGlzYXRpb24gcHJvYmxlbXMuCisrIyAtIEluY29ycmVjdCBFbmdsaXNoIHNwZWxsaW5nLgorKyMgLSBJbmNvcnJlY3QgZm9ybWF0dGluZy4KKysjIEl0IGNhbiBiZSB5b3VyIGVtYWlsIGFkZHJlc3MsIG9yIGEgbWFpbGluZyBsaXN0IGFkZHJlc3Mgd2hlcmUgdHJhbnNsYXRvcnMKKysjIGNhbiB3cml0ZSB0byB3aXRob3V0IGJlaW5nIHN1YnNjcmliZWQsIG9yIHRoZSBVUkwgb2YgYSB3ZWIgcGFnZSB0aHJvdWdoCisrIyB3aGljaCB0aGUgdHJhbnNsYXRvcnMgY2FuIGNvbnRhY3QgeW91LgorK01TR0lEX0JVR1NfQUREUkVTUyA9CisrCisrIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGxvY2FsZSBjYXRlZ29yaWVzLCBiZXlvbmQgTENfTUVTU0FHRVMsIGZvciB3aGljaCB0aGUKKysjIG1lc3NhZ2UgY2F0YWxvZ3Mgc2hhbGwgYmUgdXNlZC4gIEl0IGlzIHVzdWFsbHkgZW1wdHkuCisrRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMgPQorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9xdW90LnNlZAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvcG8vcXVvdC5zZWQJMjAwNC0wOS0xMiAxNDo0MDozNC43NTQ2ODc0NDAgLTA0MDAKK0BAIC0wLDAgKzEsNiBAQAorK3MvIlwoW14iXSpcKSIv4oCcXDHigJ0vZworK3MvYFwoW15gJ10qXCknL+KAmFwx4oCZL2cKKytzLyAnXChbXmAnXSpcKScgLyDigJhcMeKAmSAvZworK3MvICdcKFteYCddKlwpJyQvIOKAmFwx4oCZL2cKKytzL14nXChbXmAnXSpcKScgL+KAmFwx4oCZIC9nCisrcy/igJzigJ0vIiIvZworLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9yZW1vdmUtcG90Y2RhdGUuc2luCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgbHJ6c3otMC4xMi4yMC9wby9yZW1vdmUtcG90Y2RhdGUuc2luCTIwMDQtMDktMTIgMTQ6NDA6MzQuNzYyNjg2MjI0IC0wNDAwCitAQCAtMCwwICsxLDE5IEBACisrIyBTZWQgc2NyaXB0IHRoYXQgcmVtb3ZlIHRoZSBQT1QtQ3JlYXRpb24tRGF0ZSBsaW5lIGluIHRoZSBoZWFkZXIgZW50cnkKKysjIGZyb20gYSBQT1QgZmlsZS4KKysjCisrIyBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBmb2xsb3dpbmcgb2NjdXJyZW5jZXMgb2YgdGhlCisrIyBwYXR0ZXJuIGlzIGFjaGlldmVkIGJ5IGxvb2tpbmcgYXQgdGhlIGhvbGQgc3BhY2UuCisrL14iUE9ULUNyZWF0aW9uLURhdGU6IC4qIiQveworK3gKKysjIFRlc3QgaWYgdGhlIGhvbGQgc3BhY2UgaXMgZW1wdHkuCisrcy9QL1AvCisrdGEKKysjIFllcyBpdCB3YXMgZW1wdHkuIEZpcnN0IG9jY3VycmVuY2UuIFJlbW92ZSB0aGUgbGluZS4KKytnCisrZAorK2JiCisrOmEKKysjIFRoZSBob2xkIHNwYWNlIHdhcyBub25lbXB0eS4gRm9sbG93aW5nIG9jY3VycmVuY2VzLiBEbyBub3RoaW5nLgorK3gKKys6YgorK30KKy0tLSBscnpzei0wLjEyLjIwLnNhZmUvcG8vUnVsZXMtcXVvdAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIGxyenN6LTAuMTIuMjAvcG8vUnVsZXMtcXVvdAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljc3ODY4Mzc5MiAtMDQwMAorQEAgLTAsMCArMSw0NyBAQAorKyMgU3BlY2lhbCBNYWtlZmlsZSBydWxlcyBmb3IgRW5nbGlzaCBtZXNzYWdlIGNhdGFsb2dzIHdpdGggcXVvdGF0aW9uIG1hcmtzLgorKworK0RJU1RGSUxFUy5jb21tb24uZXh0cmExID0gcXVvdC5zZWQgYm9sZHF1b3Quc2VkIGVuQHF1b3QuaGVhZGVyIGVuQGJvbGRxdW90LmhlYWRlciBpbnNlcnQtaGVhZGVyLnNpbiBSdWxlcy1xdW90CisrCisrLlNVRkZJWEVTOiAuaW5zZXJ0LWhlYWRlciAucG8tdXBkYXRlLWVuCisrCisrZW5AcXVvdC5wby1jcmVhdGU6CisrCSQoTUFLRSkgZW5AcXVvdC5wby11cGRhdGUKKytlbkBib2xkcXVvdC5wby1jcmVhdGU6CisrCSQoTUFLRSkgZW5AYm9sZHF1b3QucG8tdXBkYXRlCisrCisrZW5AcXVvdC5wby11cGRhdGU6IGVuQHF1b3QucG8tdXBkYXRlLWVuCisrZW5AYm9sZHF1b3QucG8tdXBkYXRlOiBlbkBib2xkcXVvdC5wby11cGRhdGUtZW4KKysKKysuaW5zZXJ0LWhlYWRlci5wby11cGRhdGUtZW46CisrCUBsYW5nPWBlY2hvICRAIHwgc2VkIC1lICdzL1wucG8tdXBkYXRlLWVuJCQvLydgOyBcCisrCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgR0VUVEVYVExJQkRJUj1gY2QgJCh0b3Bfc3JjZGlyKS9zcmMgJiYgcHdkYDsgZXhwb3J0IEdFVFRFWFRMSUJESVI7IGZpOyBcCisrCXRtcGRpcj1gcHdkYDsgXAorKwllY2hvICIkJGxhbmc6IjsgXAorKwlsbD1gZWNobyAkJGxhbmcgfCBzZWQgLWUgJ3MvQC4qLy8nYDsgXAorKwlMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgXAorKwljZCAkKHNyY2Rpcik7IFwKKysJaWYgJChNU0dJTklUKSAtaSAkKERPTUFJTikucG90IC0tbm8tdHJhbnNsYXRvciAtbCAkJGxsIC1vIC0gMj4vZGV2L251bGwgfCBzZWQgLWYgJCR0bXBkaXIvJCRsYW5nLmluc2VydC1oZWFkZXIgfCAkKE1TR0NPTlYpIC10IFVURi04IHwgJChNU0dGSUxURVIpIHNlZCAtZiBgZWNobyAkJGxhbmcgfCBzZWQgLWUgJ3MvLipALy8nYC5zZWQgMj4vZGV2L251bGwgPiAkJHRtcGRpci8kJGxhbmcubmV3LnBvOyB0aGVuIFwKKysJICBpZiBjbXAgJCRsYW5nLnBvICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKysJICAgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKysJICBlbHNlIFwKKysJICAgIGlmIG12IC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gJCRsYW5nLnBvOyB0aGVuIFwKKysJICAgICAgOjsgXAorKwkgICAgZWxzZSBcCisrCSAgICAgIGVjaG8gImNyZWF0aW9uIG9mICQkbGFuZy5wbyBmYWlsZWQ6IGNhbm5vdCBtb3ZlICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gdG8gJCRsYW5nLnBvIiAxPiYyOyBcCisrCSAgICAgIGV4aXQgMTsgXAorKwkgICAgZmk7IFwKKysJICBmaTsgXAorKwllbHNlIFwKKysJICBlY2hvICJjcmVhdGlvbiBvZiAkJGxhbmcucG8gZmFpbGVkISIgMT4mMjsgXAorKwkgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKysJZmkKKysKKytlbkBxdW90Lmluc2VydC1oZWFkZXI6IGluc2VydC1oZWFkZXIuc2luCisrCXNlZCAtZSAnL14jL2QnIC1lICdzL0hFQURFUi9lbkBxdW90LmhlYWRlci9nJyAkKHNyY2RpcikvaW5zZXJ0LWhlYWRlci5zaW4gPiBlbkBxdW90Lmluc2VydC1oZWFkZXIKKysKKytlbkBib2xkcXVvdC5pbnNlcnQtaGVhZGVyOiBpbnNlcnQtaGVhZGVyLnNpbgorKwlzZWQgLWUgJy9eIy9kJyAtZSAncy9IRUFERVIvZW5AYm9sZHF1b3QuaGVhZGVyL2cnICQoc3JjZGlyKS9pbnNlcnQtaGVhZGVyLnNpbiA+IGVuQGJvbGRxdW90Lmluc2VydC1oZWFkZXIKKysKKyttb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcXVvdAorK21vc3RseWNsZWFuLXF1b3Q6CisrCXJtIC1mICouaW5zZXJ0LWhlYWRlcgorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9zdGFtcC1jYXQtaWQJMTk5OC0xMi0zMCAwMjo1MDowMS4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL3BvL3N0YW1wLWNhdC1pZAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorQEAgLTEgKzAsMCBAQAorLXRpbWVzdGFtcAorLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9zcmMvTWFrZWZpbGUuYW0JMTk5OC0xMi0yOCAwMzozODo0Ny4wMDAwMDAwMDAgLTA1MDAKKysrKyBscnpzei0wLjEyLjIwL3NyYy9NYWtlZmlsZS5hbQkyMDA0LTA5LTEyIDE0OjQwOjUzLjY2NTgxMjUxMiAtMDQwMAorQEAgLTIsMTIgKzIsMTIgQEAKKyBscnpfU09VUkNFUz1scnouYyB0aW1pbmcuYyB6cGVyci5jIHpyZWFkbGluZS5jIGNyY3RhYi5jIHJic2IuYyB6bS5jIHByb3RuYW1lLmMgdGNwLmMgbHN5c2xvZy5jIGNhbml0LmMKKyBsc3pfU09VUkNFUz1sc3ouYyB0aW1pbmcuYyB6cGVyci5jIHpyZWFkbGluZS5jIGNyY3RhYi5jIHJic2IuYyB6bS5jIHByb3RuYW1lLmMgdGNwLmMgbHN5c2xvZy5jIGNhbml0LmMKKyBub2luc3RfSEVBREVSUyA9IHRpbWluZy5oIHpnbG9iYWwuaCB6bW9kZW0uaAorLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAorK2RhdGFkaXIgPSAkKHByZWZpeCkvc2hhcmUKKyBsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorIENGTEFHUz1AQ0ZMQUdTQAorIERJU1RDTEVBTl9GSUxFUz1scnpzemJ1ZworIAorLUxEQUREID0gLi4vbGliL2xpYnptb2RlbS5hIEBJTlRMTElCU0AKKytMREFERCA9IC4uL2xpYi9saWJ6bW9kZW0uYSBATElCSU5UTEAKKyBBVVRPTUFLRV9PUFRJT05TPWFuc2kya25yCisgRVhUUkFfRElTVCA9IGFuc2kya25yLjEgYW5zaTJrbnIuYyBscnpzemJ1Zy5pbgorIElOQ0xVREVTID0gLUkuLiAtSSQoc3JjZGlyKSAtSSQodG9wX3NyY2Rpcikvc3JjIC1JLi4vaW50bCAtSSQodG9wX3NyY2RpcikvbGliCg==