Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCi8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLy8NCg0KdXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLklPOw0KdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KdXNpbmcgU3lzdGVtLlRleHQ7DQoNCg0KbmFtZXNwYWNlIERvdFpMaWINCnsNCg0KICAgICNyZWdpb24gSW50ZXJuYWwgdHlwZXMNCg0KICAgIC8vLyA8c3VtbWFyeT4NCiAgICAvLy8gRGVmaW5lcyBjb25zdGFudHMgZm9yIHRoZSB2YXJpb3VzIGZsdXNoIHR5cGVzIHVzZWQgd2l0aCB6bGliDQogICAgLy8vIDwvc3VtbWFyeT4NCiAgICBpbnRlcm5hbCBlbnVtIEZsdXNoVHlwZXMNCiAgICB7DQogICAgICAgIE5vbmUsICBQYXJ0aWFsLCAgU3luYywgIEZ1bGwsICBGaW5pc2gsICBCbG9jaw0KICAgIH0NCg0KICAgICNyZWdpb24gWlN0cmVhbSBzdHJ1Y3R1cmUNCiAgICAvLyBpbnRlcm5hbCBtYXBwaW5nIG9mIHRoZSB6bGliIHpzdHJlYW0gc3RydWN0dXJlIGZvciBtYXJzaGFsbGluZw0KICAgIFtTdHJ1Y3RMYXlvdXRBdHRyaWJ1dGUoTGF5b3V0S2luZC5TZXF1ZW50aWFsLCBQYWNrPTQsIFNpemU9MCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQ0KICAgIGludGVybmFsIHN0cnVjdCBaU3RyZWFtDQogICAgew0KICAgICAgICBwdWJsaWMgSW50UHRyIG5leHRfaW47DQogICAgICAgIHB1YmxpYyB1aW50IGF2YWlsX2luOw0KICAgICAgICBwdWJsaWMgdWludCB0b3RhbF9pbjsNCg0KICAgICAgICBwdWJsaWMgSW50UHRyIG5leHRfb3V0Ow0KICAgICAgICBwdWJsaWMgdWludCBhdmFpbF9vdXQ7DQogICAgICAgIHB1YmxpYyB1aW50IHRvdGFsX291dDsNCg0KICAgICAgICBbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBTdHIpXQ0KICAgICAgICBzdHJpbmcgbXNnOw0KICAgICAgICB1aW50IHN0YXRlOw0KDQogICAgICAgIHVpbnQgemFsbG9jOw0KICAgICAgICB1aW50IHpmcmVlOw0KICAgICAgICB1aW50IG9wYXF1ZTsNCg0KICAgICAgICBpbnQgZGF0YV90eXBlOw0KICAgICAgICBwdWJsaWMgdWludCBhZGxlcjsNCiAgICAgICAgdWludCByZXNlcnZlZDsNCiAgICB9DQoNCiAgICAjZW5kcmVnaW9uDQoNCiAgICAjZW5kcmVnaW9uDQoNCiAgICAjcmVnaW9uIFB1YmxpYyBlbnVtcw0KICAgIC8vLyA8c3VtbWFyeT4NCiAgICAvLy8gRGVmaW5lcyBjb25zdGFudHMgZm9yIHRoZSBhdmFpbGFibGUgY29tcHJlc3Npb24gbGV2ZWxzIGluIHpsaWINCiAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgIHB1YmxpYyBlbnVtIENvbXByZXNzTGV2ZWwgOiBpbnQNCiAgICB7DQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIHdpdGggYSByZWFzb25hYmxlIGNvbXByb21pc2UgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3BlZWQNCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgRGVmYXVsdCA9IC0xLA0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBObyBjb21wcmVzc2lvbiBhdCBhbGwuIFRoZSBkYXRhIGFyZSBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaC4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgTm9uZSA9IDAsDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFRoZSBtYXhpbXVtIGNvbXByZXNzaW9uIHJhdGUgYXZhaWxhYmxlLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBCZXN0ID0gOSwNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gVGhlIGZhc3Rlc3QgYXZhaWxhYmxlIGNvbXByZXNzaW9uIGxldmVsLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBGYXN0ZXN0ID0gMQ0KICAgIH0NCiAgICAjZW5kcmVnaW9uDQoNCiAgICAjcmVnaW9uIEV4Y2VwdGlvbiBjbGFzc2VzDQogICAgLy8vIDxzdW1tYXJ5Pg0KICAgIC8vLyBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIG9uIHRoZSB6bGliIGRsbA0KICAgIC8vLyA8L3N1bW1hcnk+DQogICAgcHVibGljIGNsYXNzIFpMaWJFeGNlcHRpb24gOiBBcHBsaWNhdGlvbkV4Y2VwdGlvbg0KICAgIHsNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iWkxpYkV4Y2VwdGlvbiIvPiBjbGFzcyB3aXRoIGEgc3BlY2lmaWVkDQogICAgICAgIC8vLyBlcnJvciBtZXNzYWdlIGFuZCBlcnJvciBjb2RlDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXJyb3JDb2RlIj5UaGUgemxpYiBlcnJvciBjb2RlIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb248L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1zZyI+QSBtZXNzYWdlIHRoYXQgKGhvcGVmdWxseSkgZGVzY3JpYmVzIHRoZSBlcnJvcjwvcGFyYW0+DQogICAgICAgIHB1YmxpYyBaTGliRXhjZXB0aW9uKGludCBlcnJvckNvZGUsIHN0cmluZyBtc2cpIDogYmFzZShTdHJpbmcuRm9ybWF0KCJaTGliIGVycm9yIHswfSB7MX0iLCBlcnJvckNvZGUsIG1zZykpDQogICAgICAgIHsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlpMaWJFeGNlcHRpb24iLz4gY2xhc3Mgd2l0aCBhIHNwZWNpZmllZA0KICAgICAgICAvLy8gZXJyb3IgY29kZQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yQ29kZSI+VGhlIHpsaWIgZXJyb3IgY29kZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uPC9wYXJhbT4NCiAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSkgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IiwgZXJyb3JDb2RlKSkNCiAgICAgICAgew0KICAgICAgICB9DQogICAgfQ0KICAgICNlbmRyZWdpb24NCg0KICAgICNyZWdpb24gSW50ZXJmYWNlcw0KDQogICAgLy8vIDxzdW1tYXJ5Pg0KICAgIC8vLyBEZWNsYXJlcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlcyBhIHJ1bm5pbmcgY2hlY2tzdW0gdG8gYmUgY2FsY3VsYXRlZA0KICAgIC8vLyA8L3N1bW1hcnk+DQogICAgcHVibGljIGludGVyZmFjZSBDaGVja3N1bUdlbmVyYXRvcg0KICAgIHsNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY2hlY2tzdW0NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgdWludCBWYWx1ZSB7IGdldDsgfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIENsZWFycyB0aGUgY3VycmVudCBjaGVja3N1bSB0byAwDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHZvaWQgUmVzZXQoKTsNCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggYW4gYXJyYXkgb2YgYnl0ZXMNCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KICAgICAgICB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSk7DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMNCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+V2hlcmUgaW4gPGM+ZGF0YTwvYz4gdG8gc3RhcnQgdXBkYXRpbmc8L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPlRoZSBzdW0gb2Ygb2Zmc2V0IGFuZCBjb3VudCBpcyBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIDxjPmRhdGE8L2M+PC9leGNlcHRpb24+DQogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPg0KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPk9mZnNldCBvciBjb3VudCBpcyBuZWdhdGl2ZS48L2V4Y2VwdGlvbj4NCiAgICAgICAgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCk7DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHRoZSBkYXRhIGZyb20gYSBzdHJpbmcNCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgc3RyaW5nIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQogICAgICAgIC8vLyA8cmVtYXJrcz5UaGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBjb252ZXJ0ZWQgYnkgdGhlIFVURi04IGVuY29kaW5nPC9yZW1hcmtzPg0KICAgICAgICB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSk7DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHRoZSBkYXRhIGZyb20gYSBzdHJpbmcsIHVzaW5nIGEgc3BlY2lmaWMgZW5jb2RpbmcNCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgc3RyaW5nIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jb2RpbmciPlRoZSBlbmNvZGluZyB0byB1c2U8L3BhcmFtPg0KICAgICAgICB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSwgRW5jb2RpbmcgZW5jb2RpbmcpOw0KICAgIH0NCg0KDQogICAgLy8vIDxzdW1tYXJ5Pg0KICAgIC8vLyBSZXByZXNlbnRzIHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCBmcm9tIGEgY29kZWMgd2hlbiBuZXcgZGF0YQ0KICAgIC8vLyBhcmUgYXZhaWxhYmxlLg0KICAgIC8vLyA8L3N1bW1hcnk+DQogICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJkYXRhIj5UaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBwcm9jZXNzZWQgZGF0YTwvcGFyYW1yZWY+DQogICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJzdGFydEluZGV4Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IHByb2Nlc3NlZCBieXRlIGluIDxjPmRhdGE8L2M+PC9wYXJhbXJlZj4NCiAgICAvLy8gPHBhcmFtcmVmIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBieXRlcyBhdmFpbGFibGU8L3BhcmFtcmVmPg0KICAgIC8vLyA8cmVtYXJrcz5PbiByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZCwgdGhlIGRhdGEgbWF5IGJlIG92ZXJ3cml0dGVuLCBzbyBncmFiIGl0IHdoaWxlIHlvdSBjYW4uDQogICAgLy8vIFlvdSBjYW5ub3QgYXNzdW1lIHRoYXQgc3RhcnRJbmRleCB3aWxsIGJlIHplcm8uDQogICAgLy8vIDwvcmVtYXJrcz4NCiAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBEYXRhQXZhaWxhYmxlSGFuZGxlcihieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCk7DQoNCiAgICAvLy8gPHN1bW1hcnk+DQogICAgLy8vIERlY2xhcmVzIG1ldGhvZHMgYW5kIGV2ZW50cyBmb3IgaW1wbGVtZW50aW5nIGNvbXByZXNzb3JzL2RlY29tcHJlc3NvcnMNCiAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29kZWMNCiAgICB7DQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIE9jY3VycyB3aGVuIG1vcmUgcHJvY2Vzc2VkIGRhdGEgYXJlIGF2YWlsYWJsZS4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgZXZlbnQgRGF0YUF2YWlsYWJsZUhhbmRsZXIgRGF0YUF2YWlsYWJsZTsNCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQogICAgICAgIHZvaWQgQWRkKGJ5dGVbXSBkYXRhKTsNCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQ8L3BhcmFtPg0KICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQogICAgICAgIHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOw0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHZvaWQgRmluaXNoKCk7DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gR2V0cyB0aGUgY2hlY2tzdW0gb2YgdGhlIGRhdGEgdGhhdCBoYXMgYmVlbiBhZGRlZCBzbyBmYXINCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgdWludCBDaGVja3N1bSB7IGdldDsgfQ0KDQoNCiAgICB9DQoNCiAgICAjZW5kcmVnaW9uDQoNCiAgICAjcmVnaW9uIENsYXNzZXMNCiAgICAvLy8gPHN1bW1hcnk+DQogICAgLy8vIEVuY2Fwc3VsYXRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBaTGliIGxpYnJhcnkNCiAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgIHB1YmxpYyBjbGFzcyBJbmZvDQogICAgew0KICAgICAgICAjcmVnaW9uIERMTCBpbXBvcnRzDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgemxpYkNvbXBpbGVGbGFncygpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHN0cmluZyB6bGliVmVyc2lvbigpOw0KICAgICAgICAjZW5kcmVnaW9uDQoNCiAgICAgICAgI3JlZ2lvbiBQcml2YXRlIHN0dWZmDQogICAgICAgIHByaXZhdGUgdWludCBfZmxhZ3M7DQoNCiAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRoYXQgdW5wYWNrcyBhIGJpdHNpemUgbWFzaw0KICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgYml0U2l6ZSh1aW50IGJpdHMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHN3aXRjaCAoYml0cykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiAxNjsNCiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiAzMjsNCiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiA2NDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfQ0KICAgICAgICAjZW5kcmVnaW9uDQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGUgPGM+SW5mbzwvYz4gY2xhc3MuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHB1YmxpYyBJbmZvKCkNCiAgICAgICAgew0KICAgICAgICAgICAgX2ZsYWdzID0gemxpYkNvbXBpbGVGbGFncygpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIGRlYnVnIGluZm8NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIGJvb2wgSGFzRGVidWdJbmZvIHsgZ2V0IHsgcmV0dXJuIDAgIT0gKF9mbGFncyAmIDB4MTAwKTsgfSB9DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIGFzc2VtYmx5IG9wdGltaXphdGlvbnMNCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIGJvb2wgVXNlc0Fzc2VtYmx5Q29kZSB7IGdldCB7IHJldHVybiAwICE9IChfZmxhZ3MgJiAweDIwMCk7IH0gfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHVuc2lnbmVkIGludCB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWINCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIGludCBTaXplT2ZVSW50IHsgZ2V0IHsgcmV0dXJuIGJpdFNpemUoX2ZsYWdzICYgMyk7IH0gfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHVuc2lnbmVkIGxvbmcgdGhhdCB3YXMgY29tcGlsZWQgaW50byBabGliDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mVUxvbmcgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDIpICYgMyk7IH0gfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHBvaW50ZXJzIHRoYXQgd2VyZSBjb21waWxlZCBpbnRvIFpsaWINCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIGludCBTaXplT2ZQb2ludGVyIHsgZ2V0IHsgcmV0dXJuIGJpdFNpemUoKF9mbGFncyA+PiA0KSAmIDMpOyB9IH0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSB6X29mZl90IHR5cGUgdGhhdCB3YXMgY29tcGlsZWQgaW50byBabGliDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mT2Zmc2V0IHsgZ2V0IHsgcmV0dXJuIGJpdFNpemUoKF9mbGFncyA+PiA2KSAmIDMpOyB9IH0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBHZXRzIHRoZSB2ZXJzaW9uIG9mIFpMaWIgYXMgYSBzdHJpbmcsIGUuZy4gIjEuMi4xIg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBWZXJzaW9uIHsgZ2V0IHsgcmV0dXJuIHpsaWJWZXJzaW9uKCk7IH0gfQ0KICAgIH0NCg0KICAgICNlbmRyZWdpb24NCg0KfQ0K