Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCi8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KLy8NCg0KdXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOw0KdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KDQpuYW1lc3BhY2UgRG90WkxpYg0Kew0KDQogICAgLy8vIDxzdW1tYXJ5Pg0KICAgIC8vLyBJbXBsZW1lbnRzIGEgZGF0YSBkZWNvbXByZXNzb3IsIHVzaW5nIHRoZSBpbmZsYXRlIGFsZ29yaXRobSBpbiB0aGUgWkxpYiBkbGwNCiAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgIHB1YmxpYyBjbGFzcyBJbmZsYXRlciA6IENvZGVjQmFzZQ0KCXsNCiAgICAgICAgI3JlZ2lvbiBEbGwgaW1wb3J0cw0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGluZmxhdGVJbml0XyhyZWYgWlN0cmVhbSBzeiwgc3RyaW5nIHZzLCBpbnQgc2l6ZSk7DQoNCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGluZmxhdGUocmVmIFpTdHJlYW0gc3osIGludCBmbHVzaCk7DQoNCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGluZmxhdGVSZXNldChyZWYgWlN0cmVhbSBzeik7DQoNCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGluZmxhdGVFbmQocmVmIFpTdHJlYW0gc3opOw0KICAgICAgICAjZW5kcmVnaW9uDQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gQ29uc3RydWN0cyBhbiBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxjPkluZmxhdGVyPC9jPg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgSW5mbGF0ZXIoKSA6IGJhc2UoKQ0KCQl7DQogICAgICAgICAgICBpbnQgcmV0dmFsID0gaW5mbGF0ZUluaXRfKHJlZiBfenRyZWFtLCBJbmZvLlZlcnNpb24sIE1hcnNoYWwuU2l6ZU9mKF96dHJlYW0pKTsNCiAgICAgICAgICAgIGlmIChyZXR2YWwgIT0gMCkNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWkxpYkV4Y2VwdGlvbihyZXR2YWwsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBpbmZsYXRlciIpOw0KDQogICAgICAgICAgICByZXNldE91dHB1dCgpOw0KICAgICAgICB9DQoNCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQ8L3BhcmFtPg0KICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQogICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGRhdGEuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsNCg0KICAgICAgICAgICAgaW50IHRvdGFsID0gY291bnQ7DQogICAgICAgICAgICBpbnQgaW5wdXRJbmRleCA9IG9mZnNldDsNCiAgICAgICAgICAgIGludCBlcnIgPSAwOw0KDQogICAgICAgICAgICB3aGlsZSAoZXJyID49IDAgJiYgaW5wdXRJbmRleCA8IHRvdGFsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvcHlJbnB1dChkYXRhLCBpbnB1dEluZGV4LCBNYXRoLk1pbih0b3RhbCAtIGlucHV0SW5kZXgsIGtCdWZmZXJTaXplKSk7DQogICAgICAgICAgICAgICAgZXJyID0gaW5mbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOw0KICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF96dHJlYW0uYXZhaWxfb3V0ID09IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5mbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpbnB1dEluZGV4ICs9IChpbnQpX3p0cmVhbS50b3RhbF9pbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7DQogICAgICAgIH0NCg0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZpbmlzaCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIGludCBlcnI7DQogICAgICAgICAgICBkbw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5GaW5pc2gpOw0KICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgd2hpbGUgKGVyciA9PSAwKTsNCiAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7DQogICAgICAgICAgICBpbmZsYXRlUmVzZXQocmVmIF96dHJlYW0pOw0KICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIENsb3NlcyB0aGUgaW50ZXJuYWwgemxpYiBpbmZsYXRlIHN0cmVhbQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBDbGVhblVwKCkgeyBpbmZsYXRlRW5kKHJlZiBfenRyZWFtKTsgfQ0KDQoNCgl9DQp9DQo=