LyoNCiAgICBGcmVlUlRPUyBWOC4yLjAgLSBDb3B5cmlnaHQgKEMpIDIwMTUgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuDQogICAgQWxsIHJpZ2h0cyByZXNlcnZlZA0KDQogICAgVklTSVQgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcgVE8gRU5TVVJFIFlPVSBBUkUgVVNJTkcgVEhFIExBVEVTVCBWRVJTSU9OLg0KDQogICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVSVE9TIGRpc3RyaWJ1dGlvbi4NCg0KICAgIEZyZWVSVE9TIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCiAgICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh2ZXJzaW9uIDIpIGFzIHB1Ymxpc2hlZCBieSB0aGUNCiAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gPj4hQU5EIE1PRElGSUVEIEJZITw8IHRoZSBGcmVlUlRPUyBleGNlcHRpb24uDQoNCgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICA+PiEgICBOT1RFOiBUaGUgbW9kaWZpY2F0aW9uIHRvIHRoZSBHUEwgaXMgaW5jbHVkZWQgdG8gYWxsb3cgeW91IHRvICAgICAhPDwNCiAgICA+PiEgICBkaXN0cmlidXRlIGEgY29tYmluZWQgd29yayB0aGF0IGluY2x1ZGVzIEZyZWVSVE9TIHdpdGhvdXQgYmVpbmcgICAhPDwNCiAgICA+PiEgICBvYmxpZ2VkIHRvIHByb3ZpZGUgdGhlIHNvdXJjZSBjb2RlIGZvciBwcm9wcmlldGFyeSBjb21wb25lbnRzICAgICAhPDwNCiAgICA+PiEgICBvdXRzaWRlIG9mIHRoZSBGcmVlUlRPUyBrZXJuZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPDwNCgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KICAgIEZyZWVSVE9TIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KICAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MNCiAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBGdWxsIGxpY2Vuc2UgdGV4dCBpcyBhdmFpbGFibGUgb24gdGhlIGZvbGxvd2luZw0KICAgIGxpbms6IGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExNC5odG1sDQoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgIEZyZWVSVE9TIHByb3ZpZGVzIGNvbXBsZXRlbHkgZnJlZSB5ZXQgcHJvZmVzc2lvbmFsbHkgZGV2ZWxvcGVkLCAgICAqDQogICAgICogICAgcm9idXN0LCBzdHJpY3RseSBxdWFsaXR5IGNvbnRyb2xsZWQsIHN1cHBvcnRlZCwgYW5kIGNyb3NzICAgICAgICAgICoNCiAgICAgKiAgICBwbGF0Zm9ybSBzb2Z0d2FyZSB0aGF0IGlzIG1vcmUgdGhhbiBqdXN0IHRoZSBtYXJrZXQgbGVhZGVyLCBpdCAgICAgKg0KICAgICAqICAgIGlzIHRoZSBpbmR1c3RyeSdzIGRlIGZhY3RvIHN0YW5kYXJkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBIZWxwIHlvdXJzZWxmIGdldCBzdGFydGVkIHF1aWNrbHkgd2hpbGUgc2ltdWx0YW5lb3VzbHkgaGVscGluZyAgICAgKg0KICAgICAqICAgIHRvIHN1cHBvcnQgdGhlIEZyZWVSVE9TIHByb2plY3QgYnkgcHVyY2hhc2luZyBhIEZyZWVSVE9TICAgICAgICAgICAqDQogICAgICogICAgdHV0b3JpYWwgYm9vaywgcmVmZXJlbmNlIG1hbnVhbCwgb3IgYm90aDogICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9Eb2N1bWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9GQVFIZWxwLmh0bWwgLSBIYXZpbmcgYSBwcm9ibGVtPyAgU3RhcnQgYnkgcmVhZGluZw0KCXRoZSBGQVEgcGFnZSAiTXkgYXBwbGljYXRpb24gZG9lcyBub3QgcnVuLCB3aGF0IGNvdWxkIGJlIHdyb25nPyIuICBIYXZlIHlvdQ0KCWRlZmluZWQgY29uZmlnQVNTRVJUKCk/DQoNCglodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9zdXBwb3J0IC0gSW4gcmV0dXJuIGZvciByZWNlaXZpbmcgdGhpcyB0b3AgcXVhbGl0eQ0KCWVtYmVkZGVkIHNvZnR3YXJlIGZvciBmcmVlIHdlIHJlcXVlc3QgeW91IGFzc2lzdCBvdXIgZ2xvYmFsIGNvbW11bml0eSBieQ0KCXBhcnRpY2lwYXRpbmcgaW4gdGhlIHN1cHBvcnQgZm9ydW0uDQoNCglodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy90cmFpbmluZyAtIEludmVzdGluZyBpbiB0cmFpbmluZyBhbGxvd3MgeW91ciB0ZWFtIHRvDQoJYmUgYXMgcHJvZHVjdGl2ZSBhcyBwb3NzaWJsZSBhcyBlYXJseSBhcyBwb3NzaWJsZS4gIE5vdyB5b3UgY2FuIHJlY2VpdmUNCglGcmVlUlRPUyB0cmFpbmluZyBkaXJlY3RseSBmcm9tIFJpY2hhcmQgQmFycnksIENFTyBvZiBSZWFsIFRpbWUgRW5naW5lZXJzDQoJTHRkLCBhbmQgdGhlIHdvcmxkJ3MgbGVhZGluZyBhdXRob3JpdHkgb24gdGhlIHdvcmxkJ3MgbGVhZGluZyBSVE9TLg0KDQogICAgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvcGx1cyAtIEEgc2VsZWN0aW9uIG9mIEZyZWVSVE9TIGVjb3N5c3RlbSBwcm9kdWN0cywNCiAgICBpbmNsdWRpbmcgRnJlZVJUT1MrVHJhY2UgLSBhbiBpbmRpc3BlbnNhYmxlIHByb2R1Y3Rpdml0eSB0b29sLCBhIERPUw0KICAgIGNvbXBhdGlibGUgRkFUIGZpbGUgc3lzdGVtLCBhbmQgb3VyIHRpbnkgdGhyZWFkIGF3YXJlIFVEUC9JUCBzdGFjay4NCg0KICAgIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL2xhYnMgLSBXaGVyZSBuZXcgRnJlZVJUT1MgcHJvZHVjdHMgZ28gdG8gaW5jdWJhdGUuDQogICAgQ29tZSBhbmQgdHJ5IEZyZWVSVE9TK1RDUCwgb3VyIG5ldyBvcGVuIHNvdXJjZSBUQ1AvSVAgc3RhY2sgZm9yIEZyZWVSVE9TLg0KDQogICAgaHR0cDovL3d3dy5PcGVuUlRPUy5jb20gLSBSZWFsIFRpbWUgRW5naW5lZXJzIGx0ZC4gbGljZW5zZSBGcmVlUlRPUyB0byBIaWdoDQogICAgSW50ZWdyaXR5IFN5c3RlbXMgbHRkLiB0byBzZWxsIHVuZGVyIHRoZSBPcGVuUlRPUyBicmFuZC4gIExvdyBjb3N0IE9wZW5SVE9TDQogICAgbGljZW5zZXMgb2ZmZXIgdGlja2V0ZWQgc3VwcG9ydCwgaW5kZW1uaWZpY2F0aW9uIGFuZCBjb21tZXJjaWFsIG1pZGRsZXdhcmUuDQoNCiAgICBodHRwOi8vd3d3LlNhZmVSVE9TLmNvbSAtIEhpZ2ggSW50ZWdyaXR5IFN5c3RlbXMgYWxzbyBwcm92aWRlIGEgc2FmZXR5DQogICAgZW5naW5lZXJlZCBhbmQgaW5kZXBlbmRlbnRseSBTSUwzIGNlcnRpZmllZCB2ZXJzaW9uIGZvciB1c2UgaW4gc2FmZXR5IGFuZA0KICAgIG1pc3Npb24gY3JpdGljYWwgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBwcm92YWJsZSBkZXBlbmRhYmlsaXR5Lg0KDQogICAgMSB0YWIgPT0gNCBzcGFjZXMhDQoqLw0KDQoNCi8qDQogKiBDcmVhdGVzIGFsbCB0aGUgZGVtbyBhcHBsaWNhdGlvbiB0YXNrcywgdGhlbiBzdGFydHMgdGhlIHNjaGVkdWxlci4gIFRoZSBXRUINCiAqIGRvY3VtZW50YXRpb24gcHJvdmlkZXMgbW9yZSBkZXRhaWxzIG9mIHRoZSBzdGFuZGFyZCBkZW1vIGFwcGxpY2F0aW9uIHRhc2tzDQogKiAod2hpY2gganVzdCBleGlzdCB0byB0ZXN0IHRoZSBrZXJuZWwgcG9ydCBhbmQgcHJvdmlkZSBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UNCiAqIGVhY2ggRnJlZVJUT1MgQVBJIGZ1bmN0aW9uKS4NCiAqDQogKiBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgZGVtbyB0YXNrcywgdGhlIGZvbGxvd2luZyB0YXNrcyBhbmQgdGVzdHMgYXJlDQogKiBkZWZpbmVkIGFuZC9vciBjcmVhdGVkIHdpdGhpbiB0aGlzIGZpbGU6DQogKg0KICogIkNoZWNrIiB0YXNrIC0gVGhpcyBvbmx5IGV4ZWN1dGVzIGV2ZXJ5IGZpdmUgc2Vjb25kcyBidXQgaGFzIHRoZSBoaWdoZXN0DQogKiBwcmlvcml0eSBzbyBpcyBndWFyYW50ZWVkIHRvIGdldCBwcm9jZXNzb3IgdGltZS4gIEl0cyBtYWluIGZ1bmN0aW9uIGlzIHRvDQogKiBjaGVjayB0aGF0IGFsbCB0aGUgc3RhbmRhcmQgZGVtbyB0YXNrcyBhcmUgc3RpbGwgb3BlcmF0aW9uYWwuIFRoZSBjaGVjayB0YXNrDQogKiB3aWxsIHRvZ2dsZSBMRUQgMyAoUEIxMSkgZXZlcnkgZml2ZSBzZWNvbmRzIHNvIGxvbmcgYXMgbm8gZXJyb3JzIGhhdmUgYmVlbg0KICogZGV0ZWN0ZWQuICBUaGUgdG9nZ2xlIHJhdGUgd2lsbCBpbmNyZWFzZSB0byBoYWxmIGEgc2Vjb25kIGlmIGFuIGVycm9yIGhhcw0KICogYmVlbiBmb3VuZCBpbiBhbnkgdGFzay4NCiAqDQogKiAiRWNobyIgdGFzayAtIFRoaXMgaXMgYSB2ZXJ5IGJhc2ljIHRhc2sgdGhhdCBzaW1wbHkgZWNob2VzIGFueSBjaGFyYWN0ZXJzDQogKiByZWNlaXZlZCBvbiBDT00wIChVU0FSVDEpLiAgVGhpcyBjYW4gYmUgdGVzdGVkIGJ5IHRyYW5zbWl0dGluZyBhIHRleHQgZmlsZQ0KICogZnJvbSBhIGR1bWIgdGVybWluYWwgdG8gdGhlIFNUTTMyIFVTQVJUIHRoZW4gb2JzZXJ2aW5nIG9yIGNhcHR1cmluZyB0aGUgdGV4dA0KICogdGhhdCBpcyBlY2hvZWQgYmFjay4gIE1pc3NpbmcgY2hhcmFjdGVycyB3aWxsIGJlIGFsbCB0aGUgbW9yZSBvYnZpb3VzIGlmIHRoZQ0KICogZmlsZSBjb250YWlucyBhIHNpbXBsZSByZXBlYXRpbmcgc3RyaW5nIG9mIGZpeGVkIHdpZHRoLg0KICoNCiAqIEN1cnJlbnRseSB0aGlzIGRlbW8gZG9lcyBub3QgaW5jbHVkZSBpbnRlcnJ1cHQgbmVzdGluZyBleGFtcGxlcy4gIEhpZ2gNCiAqIGZyZXF1ZW5jeSB0aW1lciBhbmQgc2ltcGxlciBuZXN0aW5nIGV4YW1wbGVzIGNhbiBiZSBmb3VuZCBpbiBtb3N0IENvcnRleC1NMw0KICogZGVtbyBhcHBsaWNhdGlvbnMuDQogKg0KICogVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluaXRpYWxpc2UsIHNldCBhbmQgY2xlYXIgTEVEIG91dHB1dHMgYXJlIG5vcm1hbGx5DQogKiBkZWZpbmVkIGluIHBhcnRlc3QuYy4gIFRoaXMgZGVtbyBpbmNsdWRlcyB0d28gcGFydGVzdCBmaWxlcywgb25lIHRoYXQgaXMNCiAqIGNvbmZpZ3VyZWQgZm9yIHVzZSB3aXRoIHRoZSBLZWlsIE1DQlNUTTMyIGV2YWx1YXRpb24gYm9hcmQgKGNhbGxlZA0KICogUGFyVGVzdF9NQ0JTVE0zMi5jKSBhbmQgb25lIHRoYXQgaXMgY29uZmlndXJlZCBmb3IgdXNlIHdpdGggdGhlIG9mZmljaWFsDQogKiBTVCBFdmFsIGJvYXJkIChjYWxsZWQgUGFyVGVzdF9TVF9FdmFsLmMpLiAgT25lIG9uZSBvZiB0aGVzZSBmaWxlcyBzaG91bGQgYmUNCiAqIGluY2x1ZGVkIGluIHRoZSBidWlsZCBhdCBhbnkgb25lIHRpbWUsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgaGFyZHdhcmUNCiAqIGFjdHVhbGx5IGJlaW5nIHVzZWQuDQogKi8NCg0KLyogU3RhbmRhcmQgaW5jbHVkZXMuICovDQojaW5jbHVkZSA8c3RyaW5nLmg+DQoNCi8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJGcmVlUlRPUy5oIg0KI2luY2x1ZGUgInRhc2suaCINCiNpbmNsdWRlICJxdWV1ZS5oIg0KDQovKiBMaWJyYXJ5IGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgInN0bTMyZjEweF9pdC5oIg0KDQovKiBEZW1vIGFwcCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJCbG9ja1EuaCINCiNpbmNsdWRlICJpbnRlZ2VyLmgiDQojaW5jbHVkZSAiZmxhc2guaCINCiNpbmNsdWRlICJwYXJ0ZXN0LmgiDQojaW5jbHVkZSAic2VtdGVzdC5oIg0KI2luY2x1ZGUgIkdlblFUZXN0LmgiDQojaW5jbHVkZSAiUVBlZWsuaCINCiNpbmNsdWRlICJyZWNtdXRleC5oIg0KDQovKiBEcml2ZXIgaW5jbHVkZXMuICovDQojaW5jbHVkZSAiU1RNMzJfVVNBUlQuaCINCg0KDQovKiBUaGUgdGltZSBiZXR3ZWVuIGN5Y2xlcyBvZiB0aGUgJ2NoZWNrJyB0YXNrIC0gd2hpY2ggZGVwZW5kcyBvbiB3aGV0aGVyIHRoZQ0KY2hlY2sgdGFzayBoYXMgZGV0ZWN0ZWQgYW4gZXJyb3Igb3Igbm90LiAqLw0KI2RlZmluZSBtYWluQ0hFQ0tfREVMQVlfTk9fRVJST1IJCQkoICggVGlja1R5cGVfdCApIDUwMDAgLyBwb3J0VElDS19QRVJJT0RfTVMgKQ0KI2RlZmluZSBtYWluQ0hFQ0tfREVMQVlfRVJST1IJCQkJKCAoIFRpY2tUeXBlX3QgKSA1MDAgLyBwb3J0VElDS19QRVJJT0RfTVMgKQ0KDQovKiBUaGUgTEVEIGNvbnRyb2xsZWQgYnkgdGhlICdjaGVjaycgdGFzay4gKi8NCiNkZWZpbmUgbWFpbkNIRUNLX0xFRAkJCQkJCSggMyApDQoNCi8qIFRhc2sgcHJpb3JpdGllcy4gKi8NCiNkZWZpbmUgbWFpblNFTV9URVNUX1BSSU9SSVRZCQkJCSggdHNrSURMRV9QUklPUklUWSArIDEgKQ0KI2RlZmluZSBtYWluQkxPQ0tfUV9QUklPUklUWQkJCQkoIHRza0lETEVfUFJJT1JJVFkgKyAyICkNCiNkZWZpbmUgbWFpbkNIRUNLX1RBU0tfUFJJT1JJVFkJCQkJKCB0c2tJRExFX1BSSU9SSVRZICsgMyApDQojZGVmaW5lIG1haW5GTEFTSF9UQVNLX1BSSU9SSVRZCQkJCSggdHNrSURMRV9QUklPUklUWSArIDIgKQ0KI2RlZmluZSBtYWluRUNIT19UQVNLX1BSSU9SSVRZCQkJCSggdHNrSURMRV9QUklPUklUWSArIDEgKQ0KI2RlZmluZSBtYWluSU5URUdFUl9UQVNLX1BSSU9SSVRZICAgICAgICAgICAoIHRza0lETEVfUFJJT1JJVFkgKQ0KI2RlZmluZSBtYWluR0VOX1FVRVVFX1RBU0tfUFJJT1JJVFkJCQkoIHRza0lETEVfUFJJT1JJVFkgKQ0KDQovKiBDT00gcG9ydCBhbmQgYmF1ZCByYXRlIHVzZWQgYnkgdGhlIGVjaG8gdGFzay4gKi8NCiNkZWZpbmUgbWFpbkNPTTAJCQkJCQkJKCAwICkNCiNkZWZpbmUgbWFpbkJBVURfUkFURQkJCQkJCSggMTE1MjAwICkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qDQogKiBDb25maWd1cmUgdGhlIGhhcmR3YXJlIGZvciB0aGUgZGVtby4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBIYXJkd2FyZSggdm9pZCApOw0KDQovKiBUaGUgJ2NoZWNrJyB0YXNrIGFzIGRlc2NyaWJlZCBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4gKi8NCnN0YXRpYyB2b2lkIHBydkNoZWNrVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICk7DQoNCi8qIEEgc2ltcGxlIHRhc2sgdGhhdCBlY2hvZXMgYWxsIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHJlY2VpdmVkIG9uIENPTTANCihVU0FSVDEpLiAqLw0Kc3RhdGljIHZvaWQgcHJ2VVNBUlRFY2hvVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQppbnQgbWFpbiggdm9pZCApDQp7DQojaWZkZWYgREVCVUcNCiAgZGVidWcoKTsNCiNlbmRpZg0KDQoJLyogU2V0IHVwIHRoZSBjbG9ja3MgYW5kIG1lbW9yeSBpbnRlcmZhY2UuICovDQoJcHJ2U2V0dXBIYXJkd2FyZSgpOw0KDQoJLyogU3RhcnQgdGhlIHN0YW5kYXJkIGRlbW8gdGFza3MuICBUaGVzZSBhcmUganVzdCBoZXJlIHRvIGV4ZXJjaXNlIHRoZQ0KCWtlcm5lbCBwb3J0IGFuZCBwcm92aWRlIGV4YW1wbGVzIG9mIGhvdyB0aGUgRnJlZVJUT1MgQVBJIGNhbiBiZSB1c2VkLiAqLw0KCXZTdGFydEJsb2NraW5nUXVldWVUYXNrcyggbWFpbkJMT0NLX1FfUFJJT1JJVFkgKTsNCiAgICB2U3RhcnRTZW1hcGhvcmVUYXNrcyggbWFpblNFTV9URVNUX1BSSU9SSVRZICk7DQogICAgdlN0YXJ0SW50ZWdlck1hdGhUYXNrcyggbWFpbklOVEVHRVJfVEFTS19QUklPUklUWSApOw0KICAgIHZTdGFydEdlbmVyaWNRdWV1ZVRhc2tzKCBtYWluR0VOX1FVRVVFX1RBU0tfUFJJT1JJVFkgKTsNCgl2U3RhcnRMRURGbGFzaFRhc2tzKCBtYWluRkxBU0hfVEFTS19QUklPUklUWSApOw0KICAgIHZTdGFydFF1ZXVlUGVla1Rhc2tzKCk7DQogICAgdlN0YXJ0UmVjdXJzaXZlTXV0ZXhUYXNrcygpOw0KDQoJLyogQ3JlYXRlIHRoZSAnZWNobycgdGFzaywgd2hpY2ggaXMgYWxzbyBkZWZpbmVkIHdpdGhpbiB0aGlzIGZpbGUuICovDQoJeFRhc2tDcmVhdGUoIHBydlVTQVJURWNob1Rhc2ssICJFY2hvIiwgY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFLCBOVUxMLCBtYWluRUNIT19UQVNLX1BSSU9SSVRZLCBOVUxMICk7DQoNCgkvKiBDcmVhdGUgdGhlICdjaGVjaycgdGFzaywgd2hpY2ggaXMgYWxzbyBkZWZpbmVkIHdpdGhpbiB0aGlzIGZpbGUuICovDQoJeFRhc2tDcmVhdGUoIHBydkNoZWNrVGFzaywgIkNoZWNrIiwgY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFLCBOVUxMLCBtYWluQ0hFQ0tfVEFTS19QUklPUklUWSwgTlVMTCApOw0KDQogICAgLyogU3RhcnQgdGhlIHNjaGVkdWxlci4gKi8NCgl2VGFza1N0YXJ0U2NoZWR1bGVyKCk7DQoNCiAgICAvKiBXaWxsIG9ubHkgZ2V0IGhlcmUgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBpZGxlDQogICAgdGFzay4gIFRoZSBpZGxlIHRhc2sgaXMgY3JlYXRlZCB3aXRoaW4gdlRhc2tTdGFydFNjaGVkdWxlcigpLiAqLw0KCWZvciggOzsgKTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBEZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuICovDQpzdGF0aWMgdm9pZCBwcnZDaGVja1Rhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApDQp7DQpUaWNrVHlwZV90IHhMYXN0RXhlY3V0aW9uVGltZTsNCnVuc2lnbmVkIGxvbmcgdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9OT19FUlJPUjsNCg0KCS8qIEp1c3QgdG8gcmVtb3ZlIHRoZSBjb21waWxlciB3YXJuaW5nIGFib3V0IHRoZSB1bnVzZWQgcGFyYW1ldGVyLiAqLw0KCSggdm9pZCApIHB2UGFyYW1ldGVyczsNCg0KCS8qIEluaXRpYWxpc2UgdGhlIHZhcmlhYmxlIHVzZWQgdG8gY29udHJvbCBvdXIgaXRlcmF0aW9uIHJhdGUgcHJpb3IgdG8NCglpdHMgZmlyc3QgdXNlLiAqLw0KCXhMYXN0RXhlY3V0aW9uVGltZSA9IHhUYXNrR2V0VGlja0NvdW50KCk7DQoNCglmb3IoIDs7ICkNCgl7DQoJCS8qIFdhaXQgdW50aWwgaXQgaXMgdGltZSB0byBydW4gdGhlIHRlc3RzIGFnYWluLiAqLw0KCQl2VGFza0RlbGF5VW50aWwoICZ4TGFzdEV4ZWN1dGlvblRpbWUsIHVsVGlja3NUb1dhaXQgKTsNCg0KCQkvKiBIYXMgYW4gZXJyb3IgYmVlbiBmb3VuZCBpbiBhbnkgdGFzaz8gKi8NCgkJaWYoIHhBcmVHZW5lcmljUXVldWVUYXNrc1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJCXsNCgkJCS8qIFJlZHVjZSB0aGUgdGltZSBiZXR3ZWVuIGN5Y2xlcyBvZiB0aGlzIHRhc2sgLSB3aGljaCBoYXMgdGhlDQoJCQllZmZlY3Qgb2YgaW5jcmVhc2luZyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgJ2NoZWNrJyBMRUQgdG9nZ2xlcyB0bw0KCQkJaW5kaWNhdGUgdGhlIGV4aXN0ZW5jZSBvZiBhbiBlcnJvciB0byBhbiBvYnNlcnZlci4gKi8NCgkJCXVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJCX0NCgkJZWxzZSBpZiggeEFyZVF1ZXVlUGVla1Rhc2tzU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkJew0KCQkJdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkJfQ0KCQllbHNlIGlmKCB4QXJlQmxvY2tpbmdRdWV1ZXNTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCQl7DQoJCQl1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCQl9DQoJICAgIGVsc2UgaWYoIHhBcmVTZW1hcGhvcmVUYXNrc1N0aWxsUnVubmluZygpICE9IHBkVFJVRSApDQoJICAgIHsNCgkgICAgICAgIHVsVGlja3NUb1dhaXQgPSBtYWluQ0hFQ0tfREVMQVlfRVJST1I7DQoJICAgIH0NCgkgICAgZWxzZSBpZiggeEFyZUludGVnZXJNYXRoc1Rhc2tTdGlsbFJ1bm5pbmcoKSAhPSBwZFRSVUUgKQ0KCSAgICB7DQoJICAgICAgICB1bFRpY2tzVG9XYWl0ID0gbWFpbkNIRUNLX0RFTEFZX0VSUk9SOw0KCSAgICB9DQoJICAgIGVsc2UgaWYoIHhBcmVSZWN1cnNpdmVNdXRleFRhc2tzU3RpbGxSdW5uaW5nKCkgIT0gcGRUUlVFICkNCgkgICAgew0KCSAgICAJdWxUaWNrc1RvV2FpdCA9IG1haW5DSEVDS19ERUxBWV9FUlJPUjsNCgkgICAgfQ0KDQoJCXZQYXJUZXN0VG9nZ2xlTEVEKCBtYWluQ0hFQ0tfTEVEICk7DQoJfQ0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIERlc2NyaWJlZCBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4gKi8NCnN0YXRpYyB2b2lkIHBydlVTQVJURWNob1Rhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApDQp7DQpzaWduZWQgY2hhciBjQ2hhcjsNCg0KLyogU3RyaW5nIGRlY2xhcmVkIHN0YXRpYyB0byBlbnN1cmUgaXQgZG9lcyBub3QgZW5kIHVwIG9uIHRoZSBzdGFjaywgbm8gbWF0dGVyDQp3aGF0IHRoZSBvcHRpbWlzYXRpb24gbGV2ZWwuICovDQpzdGF0aWMgY29uc3QgY2hhciAqcGNMb25naXNoU3RyaW5nID0NCiJBQkJBIHdhcyBhIFN3ZWRpc2ggcG9wIG11c2ljIGdyb3VwIGZvcm1lZCBpbiBTdG9ja2hvbG0gaW4gMTk3MiwgY29uc2lzdGluZyBvZiBBbm5pLUZyaWQgRnJpZGEgTHluZ3N0YWQsICINCiJCavZybiBVbHZhZXVzLCBCZW5ueSBBbmRlcnNzb24gYW5kIEFnbmV0aGEgRuRsdHNrb2cuIFRocm91Z2hvdXQgdGhlIGJhbmQncyBleGlzdGVuY2UsIEbkbHRza29nIGFuZCBVbHZhZXVzICINCiJ3ZXJlIGEgbWFycmllZCBjb3VwbGUsIGFzIHdlcmUgTHluZ3N0YWQgYW5kIEFuZGVyc3NvbiAtIGFsdGhvdWdoIGJvdGggY291cGxlcyBsYXRlciBkaXZvcmNlZC4gVGhleSBiZWNhbWUgb25lICINCiJvZiB0aGUgbW9zdCBjb21tZXJjaWFsbHkgc3VjY2Vzc2Z1bCBhY3RzIGluIHRoZSBoaXN0b3J5IG9mIHBvcHVsYXIgbXVzaWMsIGFuZCB0aGV5IHRvcHBlZCB0aGUgY2hhcnRzIHdvcmxkd2lkZSAiDQoiZnJvbSAxOTcyIHRvIDE5ODMuICBBQkJBIGdhaW5lZCBpbnRlcm5hdGlvbmFsIHBvcHVsYXJpdHkgZW1wbG95aW5nIGNhdGNoeSBzb25nIGhvb2tzLCBzaW1wbGUgbHlyaWNzLCBzb3VuZCAiDQoiZWZmZWN0cyAocmV2ZXJiLCBwaGFzaW5nKSBhbmQgYSBXYWxsIG9mIFNvdW5kIGFjaGlldmVkIGJ5IG92ZXJkdWJiaW5nIHRoZSBmZW1hbGUgc2luZ2Vycycgdm9pY2VzIGluIG11bHRpcGxlICINCiJoYXJtb25pZXMuIEFzIHRoZWlyIHBvcHVsYXJpdHkgZ3JldywgdGhleSB3ZXJlIHNvdWdodCBhZnRlciB0byB0b3VyIEV1cm9wZSwgQXVzdHJhbGlhLCBhbmQgTm9ydGggQW1lcmljYSwgZHJhd2luZyAiDQoiY3Jvd2RzIG9mIGFyZGVudCBmYW5zLCBub3RhYmx5IGluIEF1c3RyYWxpYS4gVG91cmluZyBiZWNhbWUgYSBjb250ZW50aW91cyBpc3N1ZSwgYmVpbmcgcGFydGljdWxhcmx5IGN1bWJlcnNvbWUgZm9yICINCiJG5Gx0c2tvZywgYnV0IHRoZXkgY29udGludWVkIHRvIHJlbGVhc2Ugc3R1ZGlvIGFsYnVtcyB0byB3aWRlc3ByZWFkIGNvbW1lcmNpYWwgc3VjY2Vzcy4gQXQgdGhlIGhlaWdodCBvZiB0aGVpciAiDQoicG9wdWxhcml0eSwgaG93ZXZlciwgYm90aCByZWxhdGlvbnNoaXBzIGJlZ2FuIHN1ZmZlcmluZyBzdHJhaW4gdGhhdCBsZWQgdWx0aW1hdGVseSB0byB0aGUgY29sbGFwc2Ugb2YgZmlyc3QgdGhlICINCiJVbHZhZXVzLUbkbHRza29nIG1hcnJpYWdlIChpbiAxOTc5KSBhbmQgdGhlbiBvZiB0aGUgQW5kZXJzc29uLUx5bmdzdGFkIG1hcnJpYWdlIGluIDE5ODEuIEluIHRoZSBsYXRlIDE5NzBzIGFuZCBlYXJseSAiDQoiMTk4MHMgdGhlc2UgcmVsYXRpb25zaGlwIGNoYW5nZXMgYmVnYW4gbWFuaWZlc3RpbmcgaW4gdGhlIGdyb3VwJ3MgbXVzaWMsIGFzIHRoZXkgcHJvZHVjZWQgbW9yZSB0aG91Z2h0ZnVsLCAiDQoiaW50cm9zcGVjdGl2ZSBseXJpY3Mgd2l0aCBkaWZmZXJlbnQgY29tcG9zaXRpb25zLiI7DQoNCgkvKiBKdXN0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLiAqLw0KCSggdm9pZCApIHB2UGFyYW1ldGVyczsNCg0KCS8qIEluaXRpYWxpc2UgQ09NMCwgd2hpY2ggaXMgVVNBUlQxIGFjY29yZGluZyB0byB0aGUgU1RNMzIgbGlicmFyaWVzLiAqLw0KCWxDT01Qb3J0SW5pdCggbWFpbkNPTTAsIG1haW5CQVVEX1JBVEUgKTsNCg0KCS8qIFRyeSBzZW5kaW5nIG91dCBhIHN0cmluZyBhbGwgaW4gb25lIGdvLCBhcyBhIHZlcnkgYmFzaWMgdGVzdCBvZiB0aGUNCiAgICBsU2VyaWFsUHV0U3RyaW5nKCkgZnVuY3Rpb24uICovDQogICAgbFNlcmlhbFB1dFN0cmluZyggbWFpbkNPTTAsIHBjTG9uZ2lzaFN0cmluZywgc3RybGVuKCBwY0xvbmdpc2hTdHJpbmcgKSApOw0KDQoJZm9yKCA7OyApDQoJew0KCQkvKiBCbG9jayB0byB3YWl0IGZvciBhIGNoYXJhY3RlciB0byBiZSByZWNlaXZlZCBvbiBDT00wLiAqLw0KCQl4U2VyaWFsR2V0Q2hhciggbWFpbkNPTTAsICZjQ2hhciwgcG9ydE1BWF9ERUxBWSApOw0KDQoJCS8qIFdyaXRlIHRoZSByZWNlaXZlZCBjaGFyYWN0ZXIgYmFjayB0byBDT00wLiAqLw0KCQl4U2VyaWFsUHV0Q2hhciggbWFpbkNPTTAsIGNDaGFyLCAwICk7DQoJfQ0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwSGFyZHdhcmUoIHZvaWQgKQ0Kew0KCS8qIFJDQyBzeXN0ZW0gcmVzZXQoZm9yIGRlYnVnIHB1cnBvc2UpLiAqLw0KCVJDQ19EZUluaXQgKCk7DQoNCiAgICAvKiBFbmFibGUgSFNFLiAqLw0KCVJDQ19IU0VDb25maWcoIFJDQ19IU0VfT04gKTsNCg0KCS8qIFdhaXQgdGlsbCBIU0UgaXMgcmVhZHkuICovDQoJd2hpbGUgKFJDQ19HZXRGbGFnU3RhdHVzKFJDQ19GTEFHX0hTRVJEWSkgPT0gUkVTRVQpOw0KDQogICAgLyogSENMSyA9IFNZU0NMSy4gKi8NCglSQ0NfSENMS0NvbmZpZyggUkNDX1NZU0NMS19EaXYxICk7DQoNCiAgICAvKiBQQ0xLMiAgPSBIQ0xLLiAqLw0KCVJDQ19QQ0xLMkNvbmZpZyggUkNDX0hDTEtfRGl2MSApOw0KDQogICAgLyogUENMSzEgID0gSENMSy8yLiAqLw0KCVJDQ19QQ0xLMUNvbmZpZyggUkNDX0hDTEtfRGl2MiApOw0KDQoJLyogQURDQ0xLID0gUENMSzIvNC4gKi8NCglSQ0NfQURDQ0xLQ29uZmlnKCBSQ0NfUENMSzJfRGl2NCApOw0KDQogICAgLyogRmxhc2ggMiB3YWl0IHN0YXRlLiAqLw0KCSooIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICogKTB4NDAwMjIwMDAgPSAweDAxOw0KDQoJLyogUExMQ0xLID0gOE1IeiAqIDkgPSA3MiBNSHogKi8NCglSQ0NfUExMQ29uZmlnKCBSQ0NfUExMU291cmNlX0hTRV9EaXYxLCBSQ0NfUExMTXVsXzkgKTsNCg0KICAgIC8qIEVuYWJsZSBQTEwuICovDQoJUkNDX1BMTENtZCggRU5BQkxFICk7DQoNCgkvKiBXYWl0IHRpbGwgUExMIGlzIHJlYWR5LiAqLw0KCXdoaWxlIChSQ0NfR2V0RmxhZ1N0YXR1cyhSQ0NfRkxBR19QTExSRFkpID09IFJFU0VUKTsNCg0KCS8qIFNlbGVjdCBQTEwgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4gKi8NCglSQ0NfU1lTQ0xLQ29uZmlnIChSQ0NfU1lTQ0xLU291cmNlX1BMTENMSyk7DQoNCgkvKiBXYWl0IHRpbGwgUExMIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4gKi8NCgl3aGlsZSAoUkNDX0dldFNZU0NMS1NvdXJjZSgpICE9IDB4MDgpOw0KDQoJLyogRW5hYmxlIEdQSU9BLCBHUElPQiwgR1BJT0MsIEdQSU9ELCBHUElPRSBhbmQgQUZJTyBjbG9ja3MgKi8NCglSQ0NfQVBCMlBlcmlwaENsb2NrQ21kKAlSQ0NfQVBCMlBlcmlwaF9HUElPQSB8IFJDQ19BUEIyUGVyaXBoX0dQSU9CIHxSQ0NfQVBCMlBlcmlwaF9HUElPQw0KCQkJCQkJCXwgUkNDX0FQQjJQZXJpcGhfR1BJT0QgfCBSQ0NfQVBCMlBlcmlwaF9HUElPRSB8IFJDQ19BUEIyUGVyaXBoX0FGSU8sIEVOQUJMRSApOw0KDQoJLyogU2V0IHRoZSBWZWN0b3IgVGFibGUgYmFzZSBhZGRyZXNzIGF0IDB4MDgwMDAwMDAuICovDQoJTlZJQ19TZXRWZWN0b3JUYWJsZSggTlZJQ19WZWN0VGFiX0ZMQVNILCAweDAgKTsNCg0KCU5WSUNfUHJpb3JpdHlHcm91cENvbmZpZyggTlZJQ19Qcmlvcml0eUdyb3VwXzQgKTsNCg0KCS8qIENvbmZpZ3VyZSBIQ0xLIGNsb2NrIGFzIFN5c1RpY2sgY2xvY2sgc291cmNlLiAqLw0KCVN5c1RpY2tfQ0xLU291cmNlQ29uZmlnKCBTeXNUaWNrX0NMS1NvdXJjZV9IQ0xLICk7DQoNCgkvKiBJbml0aWFsaXNlIHRoZSBJTyB1c2VkIGZvciB0aGUgTEVEIG91dHB1dHMuICovDQoJdlBhclRlc3RJbml0aWFsaXNlKCk7DQoNCgkvKiBTUEkyIFBlcmlwaCBjbG9jayBlbmFibGUgKi8NCglSQ0NfQVBCMVBlcmlwaENsb2NrQ21kKCBSQ0NfQVBCMVBlcmlwaF9TUEkyLCBFTkFCTEUgKTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp2b2lkIHZBcHBsaWNhdGlvblN0YWNrT3ZlcmZsb3dIb29rKCBUYXNrSGFuZGxlX3QgcHhUYXNrLCBjaGFyICpwY1Rhc2tOYW1lICkNCnsNCgkvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZ2V0IGNhbGxlZCBpZiBhIHRhc2sgb3ZlcmZsb3dzIGl0cyBzdGFjay4gICBJZiB0aGUNCglwYXJhbWV0ZXJzIGFyZSBjb3JydXB0IHRoZW4gaW5zcGVjdCBweEN1cnJlbnRUQ0IgdG8gZmluZCB3aGljaCB3YXMgdGhlDQoJb2ZmZW5kaW5nIHRhc2suICovDQoNCgkoIHZvaWQgKSBweFRhc2s7DQoJKCB2b2lkICkgcGNUYXNrTmFtZTsNCg0KCWZvciggOzsgKTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp2b2lkIGFzc2VydF9mYWlsZWQoIHVuc2lnbmVkIGNoYXIgKnB1Y0ZpbGUsIHVuc2lnbmVkIGxvbmcgdWxMaW5lICkNCnsNCgkoIHZvaWQgKSBwdWNGaWxlOw0KCSggdm9pZCApIHVsTGluZTsNCg0KCWZvciggOzsgKTsNCn0NCg0K