LyogY29ubmVjdGlvbi5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uIHR5cGUNCiAqDQogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+DQogKg0KICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuDQogKg0KICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQNCiAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMNCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuDQogKg0KICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0DQogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQogKg0KICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlDQogKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUNCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQ0KICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLg0KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCiAqLw0KDQojaWZuZGVmIFBZU1FMSVRFX0NPTk5FQ1RJT05fSA0KI2RlZmluZSBQWVNRTElURV9DT05ORUNUSU9OX0gNCiNpbmNsdWRlICJQeXRob24uaCINCiNpbmNsdWRlICJweXRocmVhZC5oIg0KI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIg0KDQojaW5jbHVkZSAiY2FjaGUuaCINCiNpbmNsdWRlICJtb2R1bGUuaCINCg0KI2luY2x1ZGUgInNxbGl0ZTMuaCINCg0KdHlwZWRlZiBzdHJ1Y3QNCnsNCiAgICBQeU9iamVjdF9IRUFEDQogICAgc3FsaXRlMyogZGI7DQoNCiAgICAvKiAxIGlmIHdlIGFyZSBjdXJyZW50bHkgd2l0aGluIGEgdHJhbnNhY3Rpb24sIGkuIGUuIGlmIGEgQkVHSU4gaGFzIGJlZW4NCiAgICAgKiBpc3N1ZWQgKi8NCiAgICBpbnQgaW5UcmFuc2FjdGlvbjsNCg0KICAgIC8qIHRoZSB0eXBlIGRldGVjdGlvbiBtb2RlLiBPbmx5IDAsIFBBUlNFX0RFQ0xUWVBFUywgUEFSU0VfQ09MTkFNRVMgb3IgYQ0KICAgICAqIGJpdHdpc2UgY29tYmluYXRpb24gdGhlcmVvZiBtYWtlcyBzZW5zZSAqLw0KICAgIGludCBkZXRlY3RfdHlwZXM7DQoNCiAgICAvKiB0aGUgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzIGZvciBkYXRhYmFzZSBsb2NrcyAqLw0KICAgIGRvdWJsZSB0aW1lb3V0Ow0KDQogICAgLyogZm9yIGludGVybmFsIHVzZSBpbiB0aGUgdGltZW91dCBoYW5kbGVyOiB3aGVuIGRpZCB0aGUgdGltZW91dCBoYW5kbGVyDQogICAgICogZmlyc3QgZ2V0IGNhbGxlZCB3aXRoIGNvdW50PTA/ICovDQogICAgZG91YmxlIHRpbWVvdXRfc3RhcnRlZDsNCg0KICAgIC8qIE5vbmUgZm9yIGF1dG9jb21taXQsIG90aGVyd2lzZSBhIFB5U3RyaW5nIHdpdGggdGhlIGlzb2xhdGlvbiBsZXZlbCAqLw0KICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWw7DQoNCiAgICAvKiBOVUxMIGZvciBhdXRvY29tbWl0LCBvdGhlcndpc2UgYSBzdHJpbmcgd2l0aCB0aGUgQkVHSU4gc3RhdGVtZW50OyB3aWxsIGJlDQogICAgICogZnJlZWQgaW4gY29ubmVjdGlvbiBkZXN0cnVjdG9yICovDQogICAgY2hhciogYmVnaW5fc3RhdGVtZW50Ow0KDQogICAgLyogMSBpZiBhIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQgZm9yIGVhY2ggQVBJIGNhbGwgaWYgdGhlIGNvbm5lY3Rpb24gaXMNCiAgICAgKiB1c2VkIGZyb20gdGhlIHNhbWUgdGhyZWFkIGl0IHdhcyBjcmVhdGVkIGluICovDQogICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkOw0KDQogICAgaW50IGluaXRpYWxpemVkOw0KDQogICAgLyogdGhyZWFkIGlkZW50aWZpY2F0aW9uIG9mIHRoZSB0aHJlYWQgdGhlIGNvbm5lY3Rpb24gd2FzIGNyZWF0ZWQgaW4gKi8NCiAgICBsb25nIHRocmVhZF9pZGVudDsNCg0KICAgIHB5c3FsaXRlX0NhY2hlKiBzdGF0ZW1lbnRfY2FjaGU7DQoNCiAgICAvKiBMaXN0cyBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gc3RhdGVtZW50cyBhbmQgY3Vyc29ycyB1c2VkIHdpdGhpbiB0aGlzIGNvbm5lY3Rpb24gKi8NCiAgICBQeU9iamVjdCogc3RhdGVtZW50czsNCiAgICBQeU9iamVjdCogY3Vyc29yczsNCg0KICAgIC8qIENvdW50ZXJzIGZvciBob3cgbWFueSBzdGF0ZW1lbnRzL2N1cnNvcnMgd2VyZSBjcmVhdGVkIGluIHRoZSBjb25uZWN0aW9uLiBNYXkgYmUNCiAgICAgKiByZXNldCB0byAwIGF0IGNlcnRhaW4gaW50ZXJ2YWxzICovDQogICAgaW50IGNyZWF0ZWRfc3RhdGVtZW50czsNCiAgICBpbnQgY3JlYXRlZF9jdXJzb3JzOw0KDQogICAgUHlPYmplY3QqIHJvd19mYWN0b3J5Ow0KDQogICAgLyogRGV0ZXJtaW5lcyBob3cgYnl0ZXN0cmluZ3MgZnJvbSBTUUxpdGUgYXJlIGNvbnZlcnRlZCB0byBQeXRob24gb2JqZWN0czoNCiAgICAgKiAtIFB5VW5pY29kZV9UeXBlOiAgICAgICAgUHl0aG9uIFVuaWNvZGUgb2JqZWN0cyBhcmUgY29uc3RydWN0ZWQgZnJvbSBVVEYtOCBieXRlc3RyaW5ncw0KICAgICAqIC0gT3B0aW1pemVkVW5pY29kZTogICAgICBMaWtlIGJlZm9yZSwgYnV0IGZvciBBU0NJSSBkYXRhLCBvbmx5IFB5U3RyaW5ncyBhcmUgY3JlYXRlZC4NCiAgICAgKiAtIFB5U3RyaW5nX1R5cGU6ICAgICAgICAgUHlTdHJpbmdzIGFyZSBjcmVhdGVkIGFzLWlzLg0KICAgICAqIC0gQW55IGN1c3RvbSBjYWxsYWJsZTogICBBbnkgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGNhbGxhYmxlIGNhbGxlZCB3aXRoIHRoZSBieXRlc3RyaW5nDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHNpbmdsZSBwYXJhbWV0ZXIuDQogICAgICovDQogICAgUHlPYmplY3QqIHRleHRfZmFjdG9yeTsNCg0KICAgIC8qIHJlbWVtYmVyIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zL2NsYXNzZXMgdXNlZCBpbg0KICAgICAqIGNyZWF0ZV9mdW5jdGlvbi9jcmVhdGUvYWdncmVnYXRlLCB1c2UgdGhlc2UgYXMgZGljdGlvbmFyeSBrZXlzLCBzbyB3ZQ0KICAgICAqIGNhbiBrZWVwIHRoZSB0b3RhbCBzeXN0ZW0gcmVmY291bnQgY29uc3RhbnQgYnkgY2xlYXJpbmcgdGhhdCBkaWN0aW9uYXJ5DQogICAgICogaW4gY29ubmVjdGlvbl9kZWFsbG9jICovDQogICAgUHlPYmplY3QqIGZ1bmN0aW9uX3BpbmJvYXJkOw0KDQogICAgLyogYSBkaWN0aW9uYXJ5IG9mIHJlZ2lzdGVyZWQgY29sbGF0aW9uIG5hbWUgPT4gY29sbGF0aW9uIGNhbGxhYmxlIG1hcHBpbmdzICovDQogICAgUHlPYmplY3QqIGNvbGxhdGlvbnM7DQoNCiAgICAvKiBpZiBvdXIgY29ubmVjdGlvbiB3YXMgY3JlYXRlZCBmcm9tIGEgQVBTVyBjb25uZWN0aW9uLCB3ZSBrZWVwIGENCiAgICAgKiByZWZlcmVuY2UgdG8gdGhlIEFQU1cgY29ubmVjdGlvbiBhcm91bmQgYW5kIGdldCByaWQgb2YgaXQgaW4gb3VyDQogICAgICogZGVzdHJ1Y3RvciAqLw0KICAgIFB5T2JqZWN0KiBhcHN3X2Nvbm5lY3Rpb247DQoNCiAgICAvKiBFeGNlcHRpb24gb2JqZWN0cyAqLw0KICAgIFB5T2JqZWN0KiBXYXJuaW5nOw0KICAgIFB5T2JqZWN0KiBFcnJvcjsNCiAgICBQeU9iamVjdCogSW50ZXJmYWNlRXJyb3I7DQogICAgUHlPYmplY3QqIERhdGFiYXNlRXJyb3I7DQogICAgUHlPYmplY3QqIERhdGFFcnJvcjsNCiAgICBQeU9iamVjdCogT3BlcmF0aW9uYWxFcnJvcjsNCiAgICBQeU9iamVjdCogSW50ZWdyaXR5RXJyb3I7DQogICAgUHlPYmplY3QqIEludGVybmFsRXJyb3I7DQogICAgUHlPYmplY3QqIFByb2dyYW1taW5nRXJyb3I7DQogICAgUHlPYmplY3QqIE5vdFN1cHBvcnRlZEVycm9yOw0KfSBweXNxbGl0ZV9Db25uZWN0aW9uOw0KDQpleHRlcm4gUHlUeXBlT2JqZWN0IHB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlOw0KDQpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9hbGxvYyhQeVR5cGVPYmplY3QqIHR5cGUsIGludCBhd2FyZSk7DQp2b2lkIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZGVhbGxvYyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKTsNClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2N1cnNvcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7DQpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9jbG9zZShweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncyk7DQpQeU9iamVjdCogX3B5c3FsaXRlX2Nvbm5lY3Rpb25fYmVnaW4ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZik7DQpQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9jb21taXQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOw0KUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fcm9sbGJhY2socHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOw0KUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fbmV3KFB5VHlwZU9iamVjdCogdHlwZSwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrdyk7DQppbnQgcHlzcWxpdGVfY29ubmVjdGlvbl9pbml0KHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsNCg0KaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfY3Vyc29yKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIFB5T2JqZWN0KiBjdXJzb3IpOw0KaW50IHB5c3FsaXRlX2NoZWNrX3RocmVhZChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKTsNCmludCBweXNxbGl0ZV9jaGVja19jb25uZWN0aW9uKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbik7DQoNCmludCBweXNxbGl0ZV9jb25uZWN0aW9uX3NldHVwX3R5cGVzKHZvaWQpOw0KDQojZW5kaWYNCg==