ZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0ZjhkZjNlLi41ZjFiOTY3IDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC03Myw2ICs3MywxNCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkFjY291bnRzVGVzdGVyIiBhbmRyb2lkOmxhYmVsPSJBY2NvdW50c1Rlc3RlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkRhdGFMaXN0Ij4KICAgICAgICAgPC9hY3Rpdml0eT4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iRGV0YWlscyI+CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYWNjb3VudF9saXN0X2NvbnRleHRfbWVudS54bWwgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYWNjb3VudF9saXN0X2NvbnRleHRfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlN2NhMQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9hY2NvdW50X2xpc3RfY29udGV4dF9tZW51LnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX3JlbW92ZV9hY2NvdW50IgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9yZW1vdmVfYWNjb3VudCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2dldF9hdXRoX3Rva2VuIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9nZXRfYXV0aF90b2tlbiIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2ludmFsaWRhdGVfYXV0aF90b2tlbiIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfaW52YWxpZGF0ZV9hdXRoX3Rva2VuIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfdXBkYXRlX2NyZWRlbnRpYWxzIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl91cGRhdGVfY3JlZGVudGlhbHMiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9jb25maXJtX2NyZWRlbnRpYWxzIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9jb25maXJtX2NyZWRlbnRpYWxzIiAvPgorCis8L21lbnU+CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYWNjb3VudHNfdGVzdGVyLnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9hY2NvdW50c190ZXN0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNWIwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYWNjb3VudHNfdGVzdGVyLnhtbApAQCAtMCwwICsxLDg0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FjY291bnRfdHlwZXNfc3Bpbm5lcl9sYWJlbCIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfc2VsZWN0X2FjY291bnRfdHlwZSIvPgorCisgICAgICAgICAgPFNwaW5uZXIgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYWNjb3VudF90eXBlc19zcGlubmVyIgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKyAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYXV0aGVudGljYXRvcnNfbGlzdCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIvPgorCisgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2dldF9hY2NvdW50c19ieV90eXBlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSIvPgorCisgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9nZXRfYWxsX2FjY291bnRzIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9nZXRfYWxsX2FjY291bnRzIi8+CisKKyAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYWRkX2FjY291bnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50Ii8+CisKKyAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfZWRpdF9wcm9wZXJ0aWVzIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9lZGl0X3Byb3BlcnRpZXMiLz4KKyAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYWNjb3VudHNfbGlzdCIKKyAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ii8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYXV0aGVudGljYXRvcnNfbGlzdF9pdGVtLnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9hdXRoZW50aWNhdG9yc19saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOWE4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYXV0aGVudGljYXRvcnNfbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFc21lcnRlYyBBRy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMWRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjFkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iOWRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iOWRpcCI+CisKKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2F1dGhlbnRpY2F0b3JfaWNvbiIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjlkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hdXRoZW50aWNhdG9yX2xhYmVsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxjZW50ZXJfdmVydGljYWwiIC8+Cis8L0xpbmVhckxheW91dD4KKwpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2dldF9hdXRoX3Rva2VuX3ZpZXcueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2dldF9hdXRoX3Rva2VuX3ZpZXcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzE1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvZ2V0X2F1dGhfdG9rZW5fdmlldy54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW5fZGlhbG9nX21lc3NhZ2UiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZW50ZXJfYXV0aF90b2tlbl90eXBlIiAvPgorCisgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2F1dGhfdG9rZW5fdHlwZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOm1pbldpZHRoPSIyNTBkaXAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsSG9yaXpvbnRhbGx5PSJ0cnVlIgorICAgICAgICAgICAgICBhbmRyb2lkOmNhcGl0YWxpemU9Im5vbmUiCisgICAgICAgICAgICAgIGFuZHJvaWQ6YXV0b1RleHQ9ImZhbHNlIi8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDRjODQ1NDguLmQzZjZhYTMgMTAwNjQ0Ci0tLSBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTEzMyw0ICsxMzMsMjEgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1fbGlzdF9oZWFkZXJfdGV4dCI+QXBwcyB1c2luZyBwZXJtaXNzaW9uICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNvdXJjZV91aWRfdGV4dCI+U291cmNlIHVpZCA6ICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNoYXJlZF9wa2dzX3RleHQiPlBhY2thZ2VzIGFjY2Vzc2luZyB2aWEgc2hhcmVkIHVpZCA6ICA8L3N0cmluZz4KKworICAgIDwhLS0gQWNjb3VudHNUZXN0ZXIgLS0+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfYXBwX25hbWUiPkFjY291bnRzIFRlc3Rlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2dldF9hY2NvdW50c19ieV90eXBlIj5HZXQgQWNjb3VudHMgQnkgVHlwZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2dldF9hbGxfYWNjb3VudHMiPkdldCBBbGwgQWNjb3VudHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9hZGRfYWNjb3VudCI+QWRkIEFjY291bnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9zZWxlY3RfYWNjb3VudF90eXBlIj5TZWxlY3QgQWNjb3VudCBUeXBlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfcHJvY2Vzc19uYW1lX2hlYWRlciI+UHJvY2VzcyBOYW1lOjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX3JlbW92ZV9hY2NvdW50Ij5yZW1vdmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9nZXRfYXV0aF90b2tlbiI+YXV0aGVudGljYXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfaW52YWxpZGF0ZV9hdXRoX3Rva2VuIj5pbnZhbGlkYXRlIHRva2VuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfYWNjb3VudF9jb250ZXh0X21lbnVfdGl0bGUiPmFjY291bnQgb3BlcmF0aW9uczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2RvX2dldF9hdXRoX3Rva2VuIj5Pazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2VudGVyX2F1dGhfdG9rZW5fdHlwZSI+RW50ZXIgdGhlIGF1dGh0b2tlbiB0eXBlOjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX3VwZGF0ZV9jcmVkZW50aWFscyI+VXBkYXRlIENyZWRlbnRpYWxzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfY29uZmlybV9jcmVkZW50aWFscyI+Q29uZmlybSBDcmVkZW50aWFsczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2VkaXRfcHJvcGVydGllcyI+RWRpdCBQcm9wZXJ0aWVzPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L0FjY291bnRzVGVzdGVyLmphdmEgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9BY2NvdW50c1Rlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjZjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9BY2NvdW50c1Rlc3Rlci5qYXZhCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kZXZlbG9wbWVudDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuKjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy4qOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lio7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuKjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEFjY291bnRzVGVzdGVyIGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBPbkFjY291bnRzVXBkYXRlZExpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjY291bnRzVGVzdGVyIjsKKyAgICBwcml2YXRlIFNwaW5uZXIgbUFjY291bnRUeXBlc1NwaW5uZXI7CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtQWNjb3VudHNMaXN0VmlldzsKKyAgICBwcml2YXRlIExpc3RWaWV3IG1BdXRoZW50aWNhdG9yc0xpc3RWaWV3OworICAgIHByaXZhdGUgQWNjb3VudE1hbmFnZXIgbUFjY291bnRNYW5hZ2VyOworICAgIHByaXZhdGUgU3RyaW5nIG1Mb25nUHJlc3NlZEFjY291bnQgPSBudWxsOworICAgIHByaXZhdGUgRnV0dXJlMUNhbGxiYWNrPEFjY291bnRbXT4gbUdldEFjY291bnRzQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTV9HT09HTEVfR0FJQSA9ICJjb20uZ29vZ2xlLkdBSUEiOworICAgIHByaXZhdGUgQXV0aGVudGljYXRvckRlc2NyaXB0aW9uW10gbUF1dGhlbnRpY2F0b3JEZXNjczsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfQVVUSF9UT0tFTl9ESUFMT0dfSUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfQ1JFREVOVElBTFNfRElBTE9HX0lEID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJREFURV9BVVRIX1RPS0VOX0RJQUxPR19JRCA9IDM7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1BY2NvdW50TWFuYWdlciA9IEFjY291bnRNYW5hZ2VyLmdldCh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWNjb3VudHNfdGVzdGVyKTsKKyAgICAgICAgQnV0dG9uQ2xpY2tMaXN0ZW5lciBidXR0b25DbGlja0xpc3RlbmVyID0gbmV3IEJ1dHRvbkNsaWNrTGlzdGVuZXIoKTsKKyAgICAgICAgbUdldEFjY291bnRzQ2FsbGJhY2sgPSBuZXcgRnV0dXJlMUNhbGxiYWNrPEFjY291bnRbXT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oRnV0dXJlMTxBY2NvdW50W10+IGZ1dHVyZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1HZXRBY2NvdW50c0NhbGxiYWNrOiBzdGFydGluZyIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEFjY291bnRbXSBhY2NvdW50cyA9IGZ1dHVyZS5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgb25BY2NvdW50c1VwZGF0ZWQoYWNjb3VudHMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkCisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1HZXRBY2NvdW50c0NhbGxiYWNrOiByZXF1ZXN0IHdhcyBjYW5jZWxlZCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtQWNjb3VudFR5cGVzU3Bpbm5lciA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfYWNjb3VudF90eXBlc19zcGlubmVyKTsKKyAgICAgICAgbUFjY291bnRzTGlzdFZpZXcgPSAoTGlzdFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmFjY291bnRzX3Rlc3Rlcl9hY2NvdW50c19saXN0KTsKKyAgICAgICAgbUF1dGhlbnRpY2F0b3JzTGlzdFZpZXcgPSAoTGlzdFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmFjY291bnRzX3Rlc3Rlcl9hdXRoZW50aWNhdG9yc19saXN0KTsKKyAgICAgICAgcmVnaXN0ZXJGb3JDb250ZXh0TWVudShtQWNjb3VudHNMaXN0Vmlldyk7CisgICAgICAgIGFzeW5jR2V0QXV0aGVudGljYXRvclR5cGVzKCk7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmFjY291bnRzX3Rlc3Rlcl9nZXRfYWxsX2FjY291bnRzKS5zZXRPbkNsaWNrTGlzdGVuZXIoYnV0dG9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmFjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSkuc2V0T25DbGlja0xpc3RlbmVyKAorICAgICAgICAgICAgICAgIGJ1dHRvbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfYWRkX2FjY291bnQpLnNldE9uQ2xpY2tMaXN0ZW5lcihidXR0b25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2VkaXRfcHJvcGVydGllcykuc2V0T25DbGlja0xpc3RlbmVyKGJ1dHRvbkNsaWNrTGlzdGVuZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF1dGhlbnRpY2F0b3JzQXJyYXlBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbj4geworICAgICAgICBwcm90ZWN0ZWQgTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbVJlc291cmNlID0gUi5sYXlvdXQuYXV0aGVudGljYXRvcnNfbGlzdF9pdGVtOworCisgICAgICAgIHB1YmxpYyBBdXRoZW50aWNhdG9yc0FycmF5QWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbltdIGl0ZW1zKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBtUmVzb3VyY2UsIGl0ZW1zKTsKKyAgICAgICAgICAgIG1JbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIFZpZXdIb2xkZXIgeworICAgICAgICAgICAgVGV4dFZpZXcgbGFiZWw7CisgICAgICAgICAgICBJbWFnZVZpZXcgaWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgLy8gQSBWaWV3SG9sZGVyIGtlZXBzIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4gdmlld3MgdG8gYXZvaWQgdW5uZWNjZXNzYXJ5IGNhbGxzCisgICAgICAgICAgICAvLyB0byBmaW5kVmlld0J5SWQoKSBvbiBlYWNoIHJvdy4KKyAgICAgICAgICAgIFZpZXdIb2xkZXIgaG9sZGVyOworCisgICAgICAgICAgICAvLyBXaGVuIGNvbnZlcnRWaWV3IGlzIG5vdCBudWxsLCB3ZSBjYW4gcmV1c2UgaXQgZGlyZWN0bHksIHRoZXJlIGlzIG5vIG5lZWQKKyAgICAgICAgICAgIC8vIHRvIHJlaW5mbGF0ZSBpdC4gV2Ugb25seSBpbmZsYXRlIGEgbmV3IFZpZXcgd2hlbiB0aGUgY29udmVydFZpZXcgc3VwcGxpZWQKKyAgICAgICAgICAgIC8vIGJ5IExpc3RWaWV3IGlzIG51bGwuCisgICAgICAgICAgICBpZiAoY29udmVydFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnZlcnRWaWV3ID0gbUluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuYXV0aGVudGljYXRvcnNfbGlzdF9pdGVtLCBudWxsKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgYSBWaWV3SG9sZGVyIGFuZCBzdG9yZSByZWZlcmVuY2VzIHRvIHRoZSB0d28gY2hpbGRyZW4gdmlld3MKKyAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIGJpbmQgZGF0YSB0by4KKyAgICAgICAgICAgICAgICBob2xkZXIgPSBuZXcgVmlld0hvbGRlcigpOworICAgICAgICAgICAgICAgIGhvbGRlci5sYWJlbCA9IChUZXh0VmlldykgY29udmVydFZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5pZC5hY2NvdW50c190ZXN0ZXJfYXV0aGVudGljYXRvcl9sYWJlbCk7CisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24gPSAoSW1hZ2VWaWV3KSBjb252ZXJ0Vmlldy5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgICAgICBSLmlkLmFjY291bnRzX3Rlc3Rlcl9hdXRoZW50aWNhdG9yX2ljb24pOworCisgICAgICAgICAgICAgICAgY29udmVydFZpZXcuc2V0VGFnKGhvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgVmlld0hvbGRlciBiYWNrIHRvIGdldCBmYXN0IGFjY2VzcyB0byB0aGUgVGV4dFZpZXcKKyAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIEltYWdlVmlldy4KKyAgICAgICAgICAgICAgICBob2xkZXIgPSAoVmlld0hvbGRlcikgY29udmVydFZpZXcuZ2V0VGFnKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbiBkZXNjID0gZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBkZXNjLnBhY2thZ2VOYW1lOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGF1dGhDb250ZXh0ID0gZ2V0Q29udGV4dCgpLmNyZWF0ZVBhY2thZ2VDb250ZXh0KHBhY2thZ2VOYW1lLCAwKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCB0ZXh0IGZpZWxkCisgICAgICAgICAgICAgICAgaG9sZGVyLmxhYmVsLnNldFRleHQoYXV0aENvbnRleHQuZ2V0U3RyaW5nKGRlc2MubGFiZWxJZCkpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IHJlc291cmNlIGljb24KKyAgICAgICAgICAgICAgICBob2xkZXIuaWNvbi5zZXRJbWFnZURyYXdhYmxlKGF1dGhDb250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKGRlc2MuaWNvbklkKSk7CisgICAgICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVycm9yIGdldHRpbmcgdGhlIFBhY2thZ2UgQ29udGV4dCBmb3IgIiArIHBhY2thZ2VOYW1lLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzeW5jR2V0QXV0aGVudGljYXRvclR5cGVzKCkgeworICAgICAgICBtQWNjb3VudE1hbmFnZXIuZ2V0QXV0aGVudGljYXRvclR5cGVzKG5ldyBHZXRBdXRoZW50aWNhdG9yc0NhbGxiYWNrKCksIG51bGwgLyogaGFuZGxlciAqLyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BY2NvdW50c1VwZGF0ZWQoQWNjb3VudFtdIGFjY291bnRzKSB7CisgICAgICAgIExvZy5kKFRBRywgIm9uQWNjb3VudHNVcGRhdGVkOiBcbiAgIiArIFRleHRVdGlscy5qb2luKCJcbiAgIiwgYWNjb3VudHMpKTsKKyAgICAgICAgU3RyaW5nW10gYWNjb3VudE5hbWVzID0gbmV3IFN0cmluZ1thY2NvdW50cy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjY291bnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhY2NvdW50TmFtZXNbaV0gPSBhY2NvdW50c1tpXS5tTmFtZTsKKyAgICAgICAgfQorICAgICAgICBBcnJheUFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyID0KKyAgICAgICAgICAgICAgICBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4oQWNjb3VudHNUZXN0ZXIudGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgYWNjb3VudE5hbWVzKTsKKyAgICAgICAgbUFjY291bnRzTGlzdFZpZXcuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIGZpbmFsIEhhbmRsZXIgbWFpbkhhbmRsZXIgPSBuZXcgSGFuZGxlcihnZXRNYWluTG9vcGVyKCkpOworICAgICAgICBtQWNjb3VudE1hbmFnZXIuYWRkT25BY2NvdW50c1VwZGF0ZWRMaXN0ZW5lcih0aGlzLCBtYWluSGFuZGxlciwKKyAgICAgICAgICAgICAgICB0cnVlIC8qIHVwZGF0ZUltbWVkaWF0ZWx5ICovKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworICAgICAgICBtQWNjb3VudE1hbmFnZXIucmVtb3ZlT25BY2NvdW50c1VwZGF0ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBjbGFzcyBCdXR0b25DbGlja0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgaWYgKFIuaWQuYWNjb3VudHNfdGVzdGVyX2dldF9hbGxfYWNjb3VudHMgPT0gdi5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmdldEFjY291bnRzKG1HZXRBY2NvdW50c0NhbGxiYWNrLCBudWxsIC8qIGhhbmRsZXIgKi8pOworICAgICAgICAgICAgfSBlbHNlIGlmIChSLmlkLmFjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSA9PSB2LmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGdldFNlbGVjdGVkQXV0aGVudGljYXRvcigpLnR5cGU7CisgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmdldEFjY291bnRzQnlUeXBlKG1HZXRBY2NvdW50c0NhbGxiYWNrLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUi5pZC5hY2NvdW50c190ZXN0ZXJfYWRkX2FjY291bnQgPT0gdi5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgRnV0dXJlMkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEZ1dHVyZTJDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTIgZnV0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmtleVNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFjY291bnQgYWRkZWQ6ICIgKyBidW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZEFjY291bnQgd2FzIGNhbmNlbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkQWNjb3VudCBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF1dGhlbnRpY2F0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZEFjY291bnQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5hZGRBY2NvdW50KGdldFNlbGVjdGVkQXV0aGVudGljYXRvcigpLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGF1dGhUb2tlblR5cGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHJlcXVpcmVkRmVhdHVyZXMgKi8sIG51bGwgLyogb3B0aW9ucyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjY291bnRzVGVzdGVyLnRoaXMsIGNhbGxiYWNrLCBudWxsIC8qIGhhbmRsZXIgKi8pOworICAgICAgICAgICAgfSBlbHNlIGlmIChSLmlkLmFjY291bnRzX3Rlc3Rlcl9lZGl0X3Byb3BlcnRpZXMgPT0gdi5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmVkaXRQcm9wZXJ0aWVzKGdldFNlbGVjdGVkQXV0aGVudGljYXRvcigpLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBuZXcgRWRpdFByb3BlcnRpZXNDYWxsYmFjaygpLCBudWxsIC8qIGhhbmRsZXIgKi8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB1bmtub3duIGJ1dHRvbgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFZGl0UHJvcGVydGllc0NhbGxiYWNrIGltcGxlbWVudHMgRnV0dXJlMkNhbGxiYWNrIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZWRpdFByb3BlcnRpZXMgc3VjY2VlZGVkOiAiICsgYnVuZGxlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVkaXRQcm9wZXJ0aWVzIHdhcyBjYW5jZWxlZCIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZWRpdFByb3BlcnRpZXMgZmFpbGVkOiAiLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZWRpdFByb3BlcnRpZXMgZmFpbGVkOiAiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbiBnZXRTZWxlY3RlZEF1dGhlbnRpY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBtQXV0aGVudGljYXRvckRlc2NzW21BY2NvdW50VHlwZXNTcGlubmVyLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCldOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LAorICAgICAgICAgICAgQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIG1lbnUuc2V0SGVhZGVyVGl0bGUoUi5zdHJpbmcuYWNjb3VudHNfdGVzdGVyX2FjY291bnRfY29udGV4dF9tZW51X3RpdGxlKTsKKworICAgICAgICBBZGFwdGVyVmlldy5BZGFwdGVyQ29udGV4dE1lbnVJbmZvIGluZm8gPSAoQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbyltZW51SW5mbzsKKworICAgICAgICBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRNZW51SW5mbGF0ZXIoKTsKKyAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY2NvdW50X2xpc3RfY29udGV4dF9tZW51LCBtZW51KTsKKyAgICAgICAgbUxvbmdQcmVzc2VkQWNjb3VudCA9ICgoVGV4dFZpZXcpaW5mby50YXJnZXRWaWV3KS5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRleHRJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbS5nZXRJdGVtSWQoKSA9PSBSLmlkLmFjY291bnRzX3Rlc3Rlcl9yZW1vdmVfYWNjb3VudCkgeworICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLnJlbW92ZUFjY291bnQobnVsbCAvKiBjYWxsYmFjayAqLywgbmV3IEFjY291bnQobUxvbmdQcmVzc2VkQWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgQ09NX0dPT0dMRV9HQUlBKSwgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmdldEl0ZW1JZCgpID09IFIuaWQuYWNjb3VudHNfdGVzdGVyX2dldF9hdXRoX3Rva2VuKSB7CisgICAgICAgICAgICBzaG93RGlhbG9nKEdFVF9BVVRIX1RPS0VOX0RJQUxPR19JRCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5nZXRJdGVtSWQoKSA9PSBSLmlkLmFjY291bnRzX3Rlc3Rlcl9pbnZhbGlkYXRlX2F1dGhfdG9rZW4pIHsKKyAgICAgICAgICAgIHNob3dEaWFsb2coSU5WQUxJREFURV9BVVRIX1RPS0VOX0RJQUxPR19JRCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5nZXRJdGVtSWQoKSA9PSBSLmlkLmFjY291bnRzX3Rlc3Rlcl91cGRhdGVfY3JlZGVudGlhbHMpIHsKKyAgICAgICAgICAgIHNob3dEaWFsb2coVVBEQVRFX0NSRURFTlRJQUxTX0RJQUxPR19JRCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5nZXRJdGVtSWQoKSA9PSBSLmlkLmFjY291bnRzX3Rlc3Rlcl9jb25maXJtX2NyZWRlbnRpYWxzKSB7CisgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuY29uZmlybUNyZWRlbnRpYWxzKG5ldyBBY2NvdW50KG1Mb25nUHJlc3NlZEFjY291bnQsIENPTV9HT09HTEVfR0FJQSksCisgICAgICAgICAgICAgICAgICAgIEFjY291bnRzVGVzdGVyLnRoaXMsIG5ldyBDb25maXJtQ3JlZGVudGlhbHNDYWxsYmFjaygpLCBudWxsIC8qIGhhbmRsZXIgKi8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEaWFsb2cgb25DcmVhdGVEaWFsb2coZmluYWwgaW50IGlkKSB7CisgICAgICAgIGlmIChpZCA9PSBHRVRfQVVUSF9UT0tFTl9ESUFMT0dfSUQgfHwgaWQgPT0gSU5WQUxJREFURV9BVVRIX1RPS0VOX0RJQUxPR19JRAorICAgICAgICAgICAgICAgIHx8IGlkID09IFVQREFURV9DUkVERU5USUFMU19ESUFMT0dfSUQpIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IExheW91dEluZmxhdGVyLmZyb20odGhpcykuaW5mbGF0ZShSLmxheW91dC5nZXRfYXV0aF90b2tlbl92aWV3LCBudWxsKTsKKyAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5hY2NvdW50c190ZXN0ZXJfZG9fZ2V0X2F1dGhfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0VGV4dCB2YWx1ZSA9IChFZGl0VGV4dCkgdmlldy5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmlkLmFjY291bnRzX3Rlc3Rlcl9hdXRoX3Rva2VuX3R5cGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUgPSB2YWx1ZS5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdXR1cmUyQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgRnV0dXJlMkNhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oRnV0dXJlMiBmdXR1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IGZ1dHVyZS5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUua2V5U2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGlhbG9nICIgKyBpZCArICIgc3VjY2VzczogIiArIGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGlhbG9nICIgKyBpZCArICIgY2FuY2VsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJkaWFsb2cgIiArIGlkICsgIiBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF1dGhlbnRpY2F0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImRpYWxvZyAiICsgaWQgKyAiIGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQgPSBuZXcgQWNjb3VudChtTG9uZ1ByZXNzZWRBY2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0dPT0dMRV9HQUlBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT0gR0VUX0FVVEhfVE9LRU5fRElBTE9HX0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5nZXRBdXRoVG9rZW4oYWNjb3VudCwgYXV0aFRva2VuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGxvZ2luT3B0aW9ucyAqLywgQWNjb3VudHNUZXN0ZXIudGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IElOVkFMSURBVEVfQVVUSF9UT0tFTl9ESUFMT0dfSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmdldEF1dGhUb2tlbihhY2NvdW50LCBhdXRoVG9rZW5UeXBlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2V0QW5kSW52YWxpZGF0ZUF1dGhUb2tlbkNhbGxiYWNrKCksIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci51cGRhdGVDcmVkZW50aWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlblR5cGUsIG51bGwgLyogbG9naW5PcHRpb25zICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY291bnRzVGVzdGVyLnRoaXMsIGNhbGxiYWNrLCBudWxsIC8qIGhhbmRsZXIgKi8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnVpbGRlci5zZXRWaWV3KHZpZXcpOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uQ3JlYXRlRGlhbG9nKGlkKTsKKyAgICB9CisKKyAgICBGdXR1cmUyQ2FsbGJhY2sgbmV3QWNjb3VudHNDYWxsYmFjayhTdHJpbmcgdHlwZSwgU3RyaW5nW10gZmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHZXRBY2NvdW50c0NhbGxiYWNrKHR5cGUsIGZlYXR1cmVzKTsKKyAgICB9CisKKyAgICBjbGFzcyBHZXRBY2NvdW50c0NhbGxiYWNrIGltcGxlbWVudHMgRnV0dXJlMkNhbGxiYWNrIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gbUZlYXR1cmVzOworICAgICAgICBmaW5hbCBTdHJpbmcgbUFjY291bnRUeXBlOworCisgICAgICAgIHB1YmxpYyBHZXRBY2NvdW50c0NhbGxiYWNrKFN0cmluZyB0eXBlLCBTdHJpbmdbXSBmZWF0dXJlcykgeworICAgICAgICAgICAgbUZlYXR1cmVzID0gZmVhdHVyZXM7CisgICAgICAgICAgICBtQWNjb3VudFR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTIgZnV0dXJlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJHZXRBY2NvdW50c0NhbGxiYWNrOiB0eXBlICIgKyBtQWNjb3VudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBmZWF0dXJlcyAiCisgICAgICAgICAgICAgICAgICAgICsgKG1GZWF0dXJlcyA9PSBudWxsID8gIm5vbmUiIDogVGV4dFV0aWxzLmpvaW4oIiwiLCBtRmVhdHVyZXMpKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ1bmRsZSByZXN1bHQgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgUGFyY2VsYWJsZVtdIGFjY291bnRzID0gcmVzdWx0LmdldFBhcmNlbGFibGVBcnJheShDb25zdGFudHMuQUNDT1VOVFNfS0VZKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmb3VuZCAiICsgYWNjb3VudHMubGVuZ3RoICsgIiBhY2NvdW50cyIpOworICAgICAgICAgICAgICAgIGZvciAoUGFyY2VsYWJsZSBhY2NvdW50IDogYWNjb3VudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiICAiICsgYWNjb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWx1cmUiLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsdXJlIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsdXJlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGdXR1cmUyQ2FsbGJhY2sgbmV3QXV0aFRva2Vuc0NhbGxiYWNrKFN0cmluZyB0eXBlLCBTdHJpbmcgYXV0aFRva2VuVHlwZSwgU3RyaW5nW10gZmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHZXRBdXRoVG9rZW5DYWxsYmFjayh0eXBlLCBhdXRoVG9rZW5UeXBlLCBmZWF0dXJlcyk7CisgICAgfQorCisgICAgY2xhc3MgR2V0QXV0aFRva2VuQ2FsbGJhY2sgaW1wbGVtZW50cyBGdXR1cmUyQ2FsbGJhY2sgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBtRmVhdHVyZXM7CisgICAgICAgIGZpbmFsIFN0cmluZyBtQWNjb3VudFR5cGU7CisgICAgICAgIGZpbmFsIFN0cmluZyBtQXV0aFRva2VuVHlwZTsKKworICAgICAgICBwdWJsaWMgR2V0QXV0aFRva2VuQ2FsbGJhY2soU3RyaW5nIHR5cGUsIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBTdHJpbmdbXSBmZWF0dXJlcykgeworICAgICAgICAgICAgbUZlYXR1cmVzID0gZmVhdHVyZXM7CisgICAgICAgICAgICBtQWNjb3VudFR5cGUgPSB0eXBlOworICAgICAgICAgICAgbUF1dGhUb2tlblR5cGUgPSBhdXRoVG9rZW5UeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTIgZnV0dXJlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJHZXRBdXRoVG9rZW5DYWxsYmFjazogdHlwZSAiICsgbUFjY291bnRUeXBlCisgICAgICAgICAgICAgICAgICAgICsgIiwgZmVhdHVyZXMgIgorICAgICAgICAgICAgICAgICAgICArIChtRmVhdHVyZXMgPT0gbnVsbCA/ICJub25lIiA6IFRleHRVdGlscy5qb2luKCIsIiwgbUZlYXR1cmVzKSkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgcmVzdWx0ID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIHJlc3VsdC5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICIgIHJlc3VsdDogIiArIHJlc3VsdCk7CisgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbHVyZSIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWx1cmUiLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEF1dGhlbnRpY2F0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWx1cmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgR2V0QW5kSW52YWxpZGF0ZUF1dGhUb2tlbkNhbGxiYWNrIGltcGxlbWVudHMgRnV0dXJlMkNhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTIgZnV0dXJlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlbiA9IGJ1bmRsZS5nZXRTdHJpbmcoQ29uc3RhbnRzLkFVVEhUT0tFTl9LRVkpOworICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5pbnZhbGlkYXRlQXV0aFRva2VuKG5ldyBGdXR1cmUxQ2FsbGJhY2s8Vm9pZD4oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUxPFZvaWQ+IGZ1dHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCBDT01fR09PR0xFX0dBSUEsIGF1dGhUb2tlbiwgbnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW52YWxpZGF0ZTogaW50ZXJydXB0ZWQgd2hpbGUgZ2V0dGluZyBhdXRoVG9rZW4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbnZhbGlkYXRlOiBlcnJvciBnZXR0aW5nIGF1dGhUb2tlbiIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoQXV0aGVudGljYXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW52YWxpZGF0ZTogZXJyb3IgZ2V0dGluZyBhdXRoVG9rZW4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbmZpcm1DcmVkZW50aWFsc0NhbGxiYWNrIGltcGxlbWVudHMgRnV0dXJlMkNhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTIgZnV0dXJlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgYnVuZGxlLmtleVNldCgpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNvbmZpcm1DcmVkZW50aWFscyBzdWNjZXNzOiAiICsgYnVuZGxlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjb25maXJtQ3JlZGVudGlhbHMgY2FuY2VsZWQiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEF1dGhlbnRpY2F0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNvbmZpcm1DcmVkZW50aWFscyBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjb25maXJtQ3JlZGVudGlhbHMgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEdldEF1dGhlbnRpY2F0b3JzQ2FsbGJhY2sgaW1wbGVtZW50cyBGdXR1cmUxQ2FsbGJhY2s8QXV0aGVudGljYXRvckRlc2NyaXB0aW9uW10+IHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTE8QXV0aGVudGljYXRvckRlc2NyaXB0aW9uW10+IGZ1dHVyZSkgeworICAgICAgICAgICAgaWYgKGlzRmluaXNoaW5nKCkpIHJldHVybjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUF1dGhlbnRpY2F0b3JEZXNjcyA9IGZ1dHVyZS5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbbUF1dGhlbnRpY2F0b3JEZXNjcy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUF1dGhlbnRpY2F0b3JEZXNjcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGF1dGhDb250ZXh0OworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aENvbnRleHQgPSBjcmVhdGVQYWNrYWdlQ29udGV4dChtQXV0aGVudGljYXRvckRlc2NzW2ldLnBhY2thZ2VOYW1lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5hbWVzW2ldID0gYXV0aENvbnRleHQuZ2V0U3RyaW5nKG1BdXRoZW50aWNhdG9yRGVzY3NbaV0ubGFiZWxJZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQXJyYXlBZGFwdGVyPFN0cmluZz4gYWRhcHRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4oQWNjb3VudHNUZXN0ZXIudGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX3NwaW5uZXJfaXRlbSwgbmFtZXMpOworICAgICAgICAgICAgICAgIG1BY2NvdW50VHlwZXNTcGlubmVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKKyAgICAgICAgICAgICAgICBtQXV0aGVudGljYXRvcnNMaXN0Vmlldy5zZXRBZGFwdGVyKG5ldyBBdXRoZW50aWNhdG9yc0FycmF5QWRhcHRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjY291bnRzVGVzdGVyLnRoaXMsIG1BdXRoZW50aWNhdG9yRGVzY3MpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCB3YXMgY2FuY2VsZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9BbmRyb2lkLm1rIGIvYXBwcy9UZXJtL0FuZHJvaWQubWsKaW5kZXggODQzYWVjNS4uOWZmNmMwZCAxMDA2NDQKLS0tIGEvYXBwcy9UZXJtL0FuZHJvaWQubWsKKysrIGIvYXBwcy9UZXJtL0FuZHJvaWQubWsKQEAgLTEsMyArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBUaGlzIG1ha2VmaWxlIHNob3dzIGhvdyB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBhbiBhY3Rpdml0eSB0aGF0CisjIGJ1bmRsZXMgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBjYWxscyBpdCB1c2luZyBKTkkuCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC03LDQgKzMwLDExIEBACiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXJtCiAKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnRlcm0KKwogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQWxzbyBidWlsZCBhbGwgb2YgdGhlIHN1Yi10YXJnZXRzIHVuZGVyIHRoaXMgb25lOiB0aGUgc2hhcmVkIGxpYnJhcnkuCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL2puaS9BbmRyb2lkLm1rIGIvYXBwcy9UZXJtL2puaS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTRhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL1Rlcm0vam5pL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBUaGlzIG1ha2VmaWxlIHN1cHBsaWVzIHRoZSBydWxlcyBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IG9mIEpOSSBjb2RlIGZvcgorIyB1c2UgYnkgb3VyIGV4YW1wbGUgb2YgaG93IHRvIGJ1bmRsZSBhIHNoYXJlZCBsaWJyYXJ5IHdpdGggYW4gQVBLLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKKworIyBUaGlzIGlzIHRoZSB0YXJnZXQgYmVpbmcgYnVpbHQuCitMT0NBTF9NT0RVTEU6PSBsaWJ0ZXJtCisKKworIyBBbGwgb2YgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IHdlIHdpbGwgY29tcGlsZS4KK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgdGVybUV4ZWMuY3BwCisKKyMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnV0aWxzCisKKyMgTm8gc3RhdGljIGxpYnJhcmllcy4KK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KKworIyBBbHNvIG5lZWQgdGhlIEpOSSBoZWFkZXJzLgorTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChKTklfSF9JTkNMVURFKQorCisjIE5vIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MuCitMT0NBTF9DRkxBR1MgKz0KKworIyBEb24ndCBwcmVsaW5rIHRoaXMgbGlicmFyeS4gIEZvciBtb3JlIGVmZmljaWVudCBjb2RlLCB5b3UgbWF5IHdhbnQKKyMgdG8gYWRkIHRoaXMgbGlicmFyeSB0byB0aGUgcHJlbGluayBtYXAgYW5kIHNldCB0aGlzIHRvIHRydWUuIEhvd2V2ZXIsCisjIGl0J3MgZGlmZmljdWx0IHRvIGRvIHRoaXMgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcGxpZWQgYXMKKyMgcGFydCBvZiBhIHN5c3RlbSBpbWFnZS4KKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL2puaS90ZXJtRXhlYy5jcHAgYi9hcHBzL1Rlcm0vam5pL3Rlcm1FeGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDY2NmNjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9UZXJtL2puaS90ZXJtRXhlYy5jcHAKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFeGVjIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorCitzdGF0aWMgamNsYXNzIGNsYXNzX2ZpbGVEZXNjcmlwdG9yOworc3RhdGljIGpmaWVsZElEIGZpZWxkX2ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3I7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9maWxlRGVzY3JpcHRvcl9pbml0OworCisKK2NsYXNzIFN0cmluZzggeworcHVibGljOgorICAgIFN0cmluZzgoKSB7CisgICAgICAgIG1TdHJpbmcgPSAwOworICAgIH0KKyAgICAKKyAgICB+U3RyaW5nOCgpIHsKKyAgICAgICAgaWYgKG1TdHJpbmcpIHsKKyAgICAgICAgICAgIGZyZWUobVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldChjb25zdCBjaGFyMTZfdCogbywgc2l6ZV90IG51bUNoYXJzKSB7CisgICAgICAgIG1TdHJpbmcgPSAoY2hhciopIG1hbGxvYyhudW1DaGFycyArIDEpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNoYXJzOyBpKyspIHsKKyAgICAgICAgICAgIG1TdHJpbmdbaV0gPSAoY2hhcikgb1tpXTsKKyAgICAgICAgfQorICAgICAgICBtU3RyaW5nW251bUNoYXJzXSA9ICdcMCc7CisgICAgfQorICAgIAorICAgIGNvbnN0IGNoYXIqIHN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1TdHJpbmc7CisgICAgfQorcHJpdmF0ZToKKyAgICBjaGFyKiBtU3RyaW5nOworfTsKKworc3RhdGljIGludCBjcmVhdGVfc3VicHJvY2Vzcyhjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZzAsIGNvbnN0IGNoYXIgKmFyZzEsCisgICAgaW50KiBwUHJvY2Vzc0lkKQoreworICAgIGNoYXIgKmRldm5hbWU7CisgICAgaW50IHB0bTsKKyAgICBwaWRfdCBwaWQ7CisKKyAgICBwdG0gPSBvcGVuKCIvZGV2L3B0bXgiLCBPX1JEV1IpOyAvLyB8IE9fTk9DVFRZKTsKKyAgICBpZihwdG0gPCAwKXsKKyAgICAgICAgTE9HRSgiWyBjYW5ub3Qgb3BlbiAvZGV2L3B0bXggLSAlcyBdXG4iLHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmNudGwocHRtLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworICAgIGlmKGdyYW50cHQocHRtKSB8fCB1bmxvY2twdChwdG0pIHx8CisgICAgICAgKChkZXZuYW1lID0gKGNoYXIqKSBwdHNuYW1lKHB0bSkpID09IDApKXsKKyAgICAgICAgTE9HRSgiWyB0cm91YmxlIHdpdGggL2Rldi9wdG14IC0gJXMgXVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBwaWQgPSBmb3JrKCk7CisgICAgaWYocGlkIDwgMCkgeworICAgICAgICBMT0dFKCItIGZvcmsgZmFpbGVkOiAlcyAtXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYocGlkID09IDApeworICAgICAgICBjbG9zZShwdG0pOworCisgICAgICAgIGludCBwdHM7CisKKyAgICAgICAgc2V0c2lkKCk7CisgICAgICAgIAorICAgICAgICBwdHMgPSBvcGVuKGRldm5hbWUsIE9fUkRXUik7CisgICAgICAgIGlmKHB0cyA8IDApIGV4aXQoLTEpOworCisgICAgICAgIGR1cDIocHRzLCAwKTsKKyAgICAgICAgZHVwMihwdHMsIDEpOworICAgICAgICBkdXAyKHB0cywgMik7CisKKyAgICAgICAgZXhlY2woY21kLCBjbWQsIGFyZzAsIGFyZzEsIE5VTEwpOworICAgICAgICBleGl0KC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqcFByb2Nlc3NJZCA9IChpbnQpIHBpZDsKKyAgICAgICAgcmV0dXJuIHB0bTsKKyAgICB9Cit9CisKKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9vc19FeGVjX2NyZWF0ZVN1YlByb2Nlc3MoSk5JRW52ICplbnYsIGpvYmplY3QgY2xhenosCisgICAganN0cmluZyBjbWQsIGpzdHJpbmcgYXJnMCwganN0cmluZyBhcmcxLCBqaW50QXJyYXkgcHJvY2Vzc0lkQXJyYXkpCit7CisgICAgY29uc3QgamNoYXIqIHN0ciA9IGNtZCA/IGVudi0+R2V0U3RyaW5nQ3JpdGljYWwoY21kLCAwKSA6IDA7CisgICAgU3RyaW5nOCBjbWRfODsKKyAgICBpZiAoc3RyKSB7CisgICAgICAgIGNtZF84LnNldChzdHIsIGVudi0+R2V0U3RyaW5nTGVuZ3RoKGNtZCkpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDcml0aWNhbChjbWQsIHN0cik7CisgICAgfQorCisgICAgc3RyID0gYXJnMCA/IGVudi0+R2V0U3RyaW5nQ3JpdGljYWwoYXJnMCwgMCkgOiAwOworICAgIGNvbnN0IGNoYXIqIGFyZzBTdHIgPSAwOworICAgIFN0cmluZzggYXJnMF84OworICAgIGlmIChzdHIpIHsKKyAgICAgICAgYXJnMF84LnNldChzdHIsIGVudi0+R2V0U3RyaW5nTGVuZ3RoKGFyZzApKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ3JpdGljYWwoYXJnMCwgc3RyKTsKKyAgICAgICAgYXJnMFN0ciA9IGFyZzBfOC5zdHJpbmcoKTsKKyAgICB9CisKKyAgICBzdHIgPSBhcmcxID8gZW52LT5HZXRTdHJpbmdDcml0aWNhbChhcmcxLCAwKSA6IDA7CisgICAgY29uc3QgY2hhciogYXJnMVN0ciA9IDA7CisgICAgU3RyaW5nOCBhcmcxXzg7CisgICAgaWYgKHN0cikgeworICAgICAgICBhcmcxXzguc2V0KHN0ciwgZW52LT5HZXRTdHJpbmdMZW5ndGgoYXJnMSkpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDcml0aWNhbChhcmcxLCBzdHIpOworICAgICAgICBhcmcxU3RyID0gYXJnMV84LnN0cmluZygpOworICAgIH0KKworICAgIGludCBwcm9jSWQ7CisgICAgaW50IHB0bSA9IGNyZWF0ZV9zdWJwcm9jZXNzKGNtZF84LnN0cmluZygpLCBhcmcwU3RyLCBhcmcxU3RyLCAmcHJvY0lkKTsKKyAgICAKKyAgICBpZiAocHJvY2Vzc0lkQXJyYXkpIHsKKyAgICAgICAgaW50IHByb2NJZExlbiA9IGVudi0+R2V0QXJyYXlMZW5ndGgocHJvY2Vzc0lkQXJyYXkpOworICAgICAgICBpZiAocHJvY0lkTGVuID4gMCkgeworICAgICAgICAgICAgamJvb2xlYW4gaXNDb3B5OworICAgIAorICAgICAgICAgICAgaW50KiBwUHJvY0lkID0gKGludCopIGVudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChwcm9jZXNzSWRBcnJheSwgJmlzQ29weSk7CisgICAgICAgICAgICBpZiAocFByb2NJZCkgeworICAgICAgICAgICAgICAgICpwUHJvY0lkID0gcHJvY0lkOworICAgICAgICAgICAgICAgIGVudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwocHJvY2Vzc0lkQXJyYXksIHBQcm9jSWQsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGpvYmplY3QgcmVzdWx0ID0gZW52LT5OZXdPYmplY3QoY2xhc3NfZmlsZURlc2NyaXB0b3IsIG1ldGhvZF9maWxlRGVzY3JpcHRvcl9pbml0KTsKKyAgICAKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBjcmVhdGUgYSBGaWxlRGVzY3JpcHRvci4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQocmVzdWx0LCBmaWVsZF9maWxlRGVzY3JpcHRvcl9kZXNjcmlwdG9yLCBwdG0pOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfb3NfRXhlY19zZXRQdHlXaW5kb3dTaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsYXp6LAorICAgIGpvYmplY3QgZmlsZURlc2NyaXB0b3IsIGppbnQgcm93LCBqaW50IGNvbCwgamludCB4cGl4ZWwsIGppbnQgeXBpeGVsKQoreworICAgIGludCBmZDsKKyAgICBzdHJ1Y3Qgd2luc2l6ZSBzejsKKworICAgIGZkID0gZW52LT5HZXRJbnRGaWVsZChmaWxlRGVzY3JpcHRvciwgZmllbGRfZmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvcik7CisKKyAgICBpZiAoZW52LT5FeGNlcHRpb25PY2N1cnJlZCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBzei53c19yb3cgPSByb3c7CisgICAgc3oud3NfY29sID0gY29sOworICAgIHN6LndzX3hwaXhlbCA9IHhwaXhlbDsKKyAgICBzei53c195cGl4ZWwgPSB5cGl4ZWw7CisgICAgCisgICAgaW9jdGwoZmQsIFRJT0NTV0lOU1osICZzeik7Cit9CisKK3N0YXRpYyBpbnQgYW5kcm9pZF9vc19FeGVjX3dhaXRGb3IoSk5JRW52ICplbnYsIGpvYmplY3QgY2xhenosCisgICAgamludCBwcm9jSWQpIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHdhaXRwaWQocHJvY0lkLCAmc3RhdHVzLCAwKTsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKyAgICAgICAgcmVzdWx0ID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9vc19FeGVjX2Nsb3NlKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsYXp6LCBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIGludCBmZDsKKyAgICBzdHJ1Y3Qgd2luc2l6ZSBzejsKKworICAgIGZkID0gZW52LT5HZXRJbnRGaWVsZChmaWxlRGVzY3JpcHRvciwgZmllbGRfZmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvcik7CisKKyAgICBpZiAoZW52LT5FeGNlcHRpb25PY2N1cnJlZCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBjbG9zZShmZCk7Cit9CisKKworc3RhdGljIGludCByZWdpc3Rlcl9GaWxlRGVzY3JpcHRvcihKTklFbnYgKmVudikKK3sKKyAgICBjbGFzc19maWxlRGVzY3JpcHRvciA9IGVudi0+RmluZENsYXNzKCJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CisKKyAgICBpZiAoY2xhc3NfZmlsZURlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGphdmEvaW8vRmlsZURlc2NyaXB0b3IiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZpZWxkX2ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3IgPSBlbnYtPkdldEZpZWxkSUQoY2xhc3NfZmlsZURlc2NyaXB0b3IsICJkZXNjcmlwdG9yIiwgIkkiKTsKKworICAgIGlmIChmaWVsZF9maWxlRGVzY3JpcHRvcl9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBGaWxlRGVzY3JpcHRvci5kZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZXRob2RfZmlsZURlc2NyaXB0b3JfaW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhc3NfZmlsZURlc2NyaXB0b3IsICI8aW5pdD4iLCAiKClWIik7CisgICAgaWYgKG1ldGhvZF9maWxlRGVzY3JpcHRvcl9pbml0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBGaWxlRGVzY3JpcHRvci5pbml0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgfQorICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqY2xhc3NQYXRoTmFtZSA9ICJjb20vYW5kcm9pZC90ZXJtL0V4ZWMiOworCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZF90YWJsZVtdID0geworICAgIHsgImNyZWF0ZVN1YnByb2Nlc3MiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tJKUxqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOyIsCisgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19FeGVjX2NyZWF0ZVN1YlByb2Nlc3MgfSwKKyAgICB7ICJzZXRQdHlXaW5kb3dTaXplIiwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtJSUlJKVYiLAorICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRXhlY19zZXRQdHlXaW5kb3dTaXplfSwKKyAgICB7ICJ3YWl0Rm9yIiwgIihJKUkiLAorICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRXhlY193YWl0Rm9yfSwKKyAgICB7ICJjbG9zZSIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLAorICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRXhlY19jbG9zZX0KK307CisKKy8qCisgKiBSZWdpc3RlciBzZXZlcmFsIG5hdGl2ZSBtZXRob2RzIGZvciBvbmUgY2xhc3MuCisgKi8KK3N0YXRpYyBpbnQgcmVnaXN0ZXJOYXRpdmVNZXRob2RzKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBjbGFzc05hbWUsCisgICAgSk5JTmF0aXZlTWV0aG9kKiBnTWV0aG9kcywgaW50IG51bU1ldGhvZHMpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcyhjbGFzc05hbWUpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5hdGl2ZSByZWdpc3RyYXRpb24gdW5hYmxlIHRvIGZpbmQgY2xhc3MgJyVzJyIsIGNsYXNzTmFtZSk7CisgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgfQorICAgIGlmIChlbnYtPlJlZ2lzdGVyTmF0aXZlcyhjbGF6eiwgZ01ldGhvZHMsIG51bU1ldGhvZHMpIDwgMCkgeworICAgICAgICBMT0dFKCJSZWdpc3Rlck5hdGl2ZXMgZmFpbGVkIGZvciAnJXMnIiwgY2xhc3NOYW1lKTsKKyAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gSk5JX1RSVUU7Cit9CisKKy8qCisgKiBSZWdpc3RlciBuYXRpdmUgbWV0aG9kcyBmb3IgYWxsIGNsYXNzZXMgd2Uga25vdyBhYm91dC4KKyAqCisgKiByZXR1cm5zIEpOSV9UUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgcmVnaXN0ZXJOYXRpdmVzKEpOSUVudiogZW52KQoreworICBpZiAoIXJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGNsYXNzUGF0aE5hbWUsIG1ldGhvZF90YWJsZSwgCisgICAgICAgICAgICAgICAgIHNpemVvZihtZXRob2RfdGFibGUpIC8gc2l6ZW9mKG1ldGhvZF90YWJsZVswXSkpKSB7CisgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgfQorCisgIHJldHVybiBKTklfVFJVRTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgVk0gd2hlbiB0aGUgc2hhcmVkIGxpYnJhcnkgaXMgZmlyc3QgbG9hZGVkLgorICovCisgCit0eXBlZGVmIHVuaW9uIHsKKyAgICBKTklFbnYqIGVudjsKKyAgICB2b2lkKiB2ZW52OworfSBVbmlvbkpOSUVudlRvVm9pZDsKKworamludCBKTklfT25Mb2FkKEphdmFWTSogdm0sIHZvaWQqIHJlc2VydmVkKSB7CisgICAgVW5pb25KTklFbnZUb1ZvaWQgdWVudjsKKyAgICB1ZW52LnZlbnYgPSBOVUxMOworICAgIGppbnQgcmVzdWx0ID0gLTE7CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIAorICAgIExPR0koIkpOSV9PbkxvYWQiKTsKKworICAgIGlmICh2bS0+R2V0RW52KCZ1ZW52LnZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBHZXRFbnYgZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgZW52ID0gdWVudi5lbnY7CisgICAgCisgICAgaWYgKChyZXN1bHQgPSByZWdpc3Rlcl9GaWxlRGVzY3JpcHRvcihlbnYpKSA8IDApIHsKKyAgICAgICAgTE9HRSgiRVJST1I6IHJlZ2lzdGVyRmlsZURlc2NyaXB0b3IgZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXJOYXRpdmVzKGVudikgIT0gSk5JX1RSVUUpIHsKKyAgICAgICAgTE9HRSgiRVJST1I6IHJlZ2lzdGVyTmF0aXZlcyBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICAKKyAgICByZXN1bHQgPSBKTklfVkVSU0lPTl8xXzQ7CisgICAgCitiYWlsOgorICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vc3JjL2NvbS9hbmRyb2lkL3Rlcm0vRXhlYy5qYXZhIGIvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL0V4ZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTNhY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL0V4ZWMuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXJtOworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBhIHN1YnByb2Nlc3MuCisgKiA8cD4KKyAqIE5vdGU6IFRoZSBuYXRpdmUgbWV0aG9kcyBhY2Nlc3MgYSBwYWNrYWdlLXByaXZhdGUKKyAqIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZmllbGQgdG8gZ2V0IGFuZCBzZXQgdGhlIHJhdyBMaW51eAorICogZmlsZSBkZXNjcmlwdG9yLiBUaGlzIG1pZ2h0IGJyZWFrIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICogamF2YS5pby5GaWxlRGVzY3JpcHRvciBpcyBjaGFuZ2VkLgorICovCisKK3B1YmxpYyBjbGFzcyBFeGVjCit7CisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJ0ZXJtIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc3VicHJvY2Vzcy4gRGlmZmVycyBmcm9tIGphdmEubGFuZy5Qcm9jZXNzQnVpbGRlciBpbgorICAgICAqIHRoYXQgYSBwdHkgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzdWJwcm9jZXNzLgorICAgICAqIDxwPgorICAgICAqIENhbGxlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIEV4ZWMuY2xvc2UoKSBvbiB0aGUgcmV0dXJuZWQKKyAgICAgKiBmaWxlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gYXJnMCBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNvbW1hbmQsIG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIGFyZzEgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgY29tbWFuZCwgbWF5IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gcHJvY2Vzc0lkIEEgb25lLWVsZW1lbnQgYXJyYXkgdG8gd2hpY2ggdGhlIHByb2Nlc3MgSUQgb2YgdGhlCisgICAgICogc3RhcnRlZCBwcm9jZXNzIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHN0YXJ0ZWQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIEZpbGVEZXNjcmlwdG9yIGNyZWF0ZVN1YnByb2Nlc3MoCisgICAgICAgIFN0cmluZyBjbWQsIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgaW50W10gcHJvY2Vzc0lkKTsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aWRvdyBzaXplIGZvciBhIGdpdmVuIHB0eS4gQWxsb3dzIHByb2dyYW1zCisgICAgICogY29ubmVjdGVkIHRvIHRoZSBwdHkgbGVhcm4gaG93IGxhcmdlIHRoZWlyIHNjcmVlbiBpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFB0eVdpbmRvd1NpemUoRmlsZURlc2NyaXB0b3IgZmQsCisgICAgICAgaW50IHJvdywgaW50IGNvbCwgaW50IHhwaXhlbCwgaW50IHlwaXhlbCk7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiByZWNlaXZlciB0byBmaW5pc2ggZXhlY3V0aW5nLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZXhpdCB2YWx1ZSBvZiB0aGUgUHJvY2VzcyBiZWluZyB3YWl0ZWQgb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCB3YWl0Rm9yKGludCBwcm9jZXNzSWQpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjbG9zZShGaWxlRGVzY3JpcHRvciBmZCk7Cit9CisKZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9UZXJtLmphdmEgYi9hcHBzL1Rlcm0vc3JjL2NvbS9hbmRyb2lkL3Rlcm0vVGVybS5qYXZhCmluZGV4IDM0Y2Q3ZTEuLjYwNDFiYWYgMTAwNjQ0Ci0tLSBhL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9UZXJtLmphdmEKKysrIGIvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL1Rlcm0uamF2YQpAQCAtMTYsNiArMTYsMTIgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC50ZXJtOwogCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0zNSw3ICs0MSw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5FeGVjOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwpAQCAtNTQsMTIgKzU5LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRXh0cmFjdGVkVGV4dFJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIAotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQogLyoqCiAgKiBBIHRlcm1pbmFsIGVtdWxhdG9yIGFjdGl2aXR5LgogICovCkBAIC05NiwxMCArOTUsNyBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIHBzZXVkby10ZWxldHlwZSAocHR5KSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB3ZSB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aAotICAgICAqIGFub3RoZXIgcHJvY2VzcywgdHlwaWNhbGx5IGEgc2hlbGwuIEN1cnJlbnRseSB3ZSBqdXN0IHVzZSB0aGlzIHRvIGdldCB0aGUKLSAgICAgKiBtVGVybUluIC8gbVRlcm1PdXQgZmlsZSBkZXNjcmlwdG9ycywgYnV0IHdoZW4gd2UgaW1wbGVtZW50IHJlc2l6aW5nIG9mCi0gICAgICogdGhlIHRlcm1pbmFsIHdlIHdpbGwgbmVlZCBpdCB0byBpc3N1ZSB0aGUgaW9jdGwgdG8gaW5mb3JtIHRoZSBvdGhlcgotICAgICAqIHByb2Nlc3MgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSB0ZXJtaW5hbCBzaXplLgorICAgICAqIGFub3RoZXIgcHJvY2VzcywgdHlwaWNhbGx5IGEgc2hlbGwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvciBtVGVybUZkOwogCkBAIC0xODgsNiArMTg0LDE1IEBACiAgICAgICAgIHVwZGF0ZVByZWZzKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgaWYgKG1UZXJtRmQgIT0gbnVsbCkgeworICAgICAgICAgICAgRXhlYy5jbG9zZShtVGVybUZkKTsKKyAgICAgICAgICAgIG1UZXJtRmQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewogICAgICAgICBpbnRbXSBwcm9jZXNzSWQgPSBuZXcgaW50WzFdOwogCmRpZmYgLS1naXQgYS9idWlsZC90b29scy9tYWtlX3dpbmRvd3Nfc2RrLnNoIGIvYnVpbGQvdG9vbHMvbWFrZV93aW5kb3dzX3Nkay5zaAppbmRleCA5YTQwZTdhLi4zM2Q2YzQ2IDEwMDc1NQotLS0gYS9idWlsZC90b29scy9tYWtlX3dpbmRvd3Nfc2RrLnNoCisrKyBiL2J1aWxkL3Rvb2xzL21ha2Vfd2luZG93c19zZGsuc2gKQEAgLTEsMTEgKzEsMTcgQEAKICMhL2Jpbi9iYXNoCiAjIFF1aWNrIHNlbWktYXV0byBmaWxlIHRvIGJ1aWxkIFdpbmRvd3MgU0RLIHRvb2xzLgogIwotIyBMaW1pdGF0aW9uczoKKyMgTGltaXRhdGlvbnMgYW5kIHJlcXVpcmVtZW50czoKICMgLSBFeHBlY3RzIHRoZSBlbXVsYXRvciBoYXMgYmVlbiBidWlsdCBmaXJzdCwgd2lsbCBwaWNrIGl0IHVwIGZyb20gcHJlYnVpbHQuCiAjIC0gUnVuIGluIEN5Z3dpbgotIyAtIE5lZWRzIEN5Z3dpbiBwYWNrYWdlIHppcAogIyAtIEV4cGVjdHMgdG8gaGF2ZSBvbmUgb2YgdGhlIGV4aXN0aW5nIFNESyAoRGFyd2luIG9yIExpbnV4KSB0byBidWlsZCB0aGUgV2luZG93cyBvbmUKKyMgLSBOZWVkcyBDeWd3aW4gcGFja2FnZXM6IGF1dG9jb25mLCBiaXNvbiwgY3VybCwgZmxleCwgZ2NjLCBnKyssIGdpdCwKKyMgICBnbnVwZywgbWFrZSwgbWluZ3ctemxpYiwgcHl0aG9uLCB6aXAsIHVuemlwCisjIC0gTXVzdCBOT1QgaGF2ZSBjeWd3aW4gcGFja2FnZSByZWFkbGluZSAoaXRzIEdQTCBsaWNlbnNlIG1pZ2h0IHRhaW50IHRoZSBTREsgaWYKKyMgICBpdCBnZXRzIGNvbXBpbGVkIGluKQorIyAtIERvZXMgbm90IG5lZWQgYSBKYXZhIERldmVsb3BtZW50IEtpdCBvciBhbnkgb3RoZXIgdG9vbHMgb3V0c2lkZSBvZiBjeWd3aW4uCisjIC0gSWYgeW91IHRoaW5rIHlvdSBtYXkgaGF2ZSBXaW5kb3dzIHZlcnNpb25zIG9mIHRvb2xzIChlLmcuIG1ha2UpIGluc3RhbGxlZCwgaXQgbWF5CisjICAgcmVkdWNlIGNvbmZ1c2lvbiBsZXZlbHMgdG8gJ2V4cG9ydCBQQVRIPS91c3IvYmluJwogCiBzZXQgLWUgICMgRmFpbCB0aGlzIHNjcmlwdCBhcyBzb29uIGFzIGEgY29tbWFuZCBmYWlscyAtLSBmYWlsIGVhcmx5LCBmYWlsIGZhc3QKIApAQCAtNTksNiArNjUsMTAgQEAKICAgICAgICAgIyBTREsgbnVtYmVyIGlmIHlvdSB3YW50LCBidXQgbm90IGFmdGVyLCBlLmcgdGhlc2UgYXJlIHZhbGlkOgogICAgICAgICAjICAgIGFuZHJvaWRfc2RrXzQyNDJfcGxhdGZvcm0uemlwIG9yIGJsYWhfNDJfLnppcAogICAgICAgICAjCisgICAgICAgICMgTm90ZSB0aGF0IHRoZSByb290IGRpcmVjdG9yeSBuYW1lIGluIHRoZSB6aXAgbXVzdCBtYXRjaCB0aGUgemlwCisgICAgICAgICMgbmFtZSwgdG9vLCBzbyB0aGVyZSdzIG5vIHBvaW50IGp1c3QgY2hhbmdpbmcgdGhlIHppcCBuYW1lIHRvIG1hdGNoCisgICAgICAgICMgdGhlIGFib3ZlIGZvcm1hdC4KKyAgICAgICAgIwogICAgICAgICAjIFNES19OVU1CRVIgd2lsbCBiZSBlbXB0eSBpZiBub3RoaW5nIG1hdGNoZWQuCiAgICAgICAgIGZpbGVuYW1lPWBiYXNlbmFtZSAiJFNES19aSVAiYAogICAgICAgICBTREtfTlVNQkVSPWBlY2hvICRmaWxlbmFtZSB8IHNlZCAtbiAncy9eLipfXChbXl8uL11cK1wpX1teXy5dKlwuLiokL1wxL3AnYApkaWZmIC0tZ2l0IGEvZW11bGF0b3Iva2V5bWFwcy9BVlJDUC5rbCBiL2VtdWxhdG9yL2tleW1hcHMvQVZSQ1Aua2wKaW5kZXggZDBlYmExMC4uZWQ3NTM3ZSAxMDA2NDQKLS0tIGEvZW11bGF0b3Iva2V5bWFwcy9BVlJDUC5rbAorKysgYi9lbXVsYXRvci9rZXltYXBzL0FWUkNQLmtsCkBAIC0xLDQgKzEsNSBAQAota2V5IDE2NCAgIE1FRElBX1BMQVlfUEFVU0UgICAgV0FLRQora2V5IDIwMCAgIE1FRElBX1BMQVlfUEFVU0UgICAgV0FLRQora2V5IDIwMSAgIE1FRElBX1BMQVlfUEFVU0UgICAgV0FLRQoga2V5IDEyOCAgIE1FRElBX1NUT1AgICAgICAgICAgV0FLRQoga2V5IDE2MyAgIE1FRElBX05FWFQgICAgICAgICAgV0FLRQoga2V5IDE2NSAgIE1FRElBX1BSRVZJT1VTICAgICAgV0FLRQpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL2RtdHJhY2UuY3BwIGIvZW11bGF0b3IvcXRvb2xzL2RtdHJhY2UuY3BwCmluZGV4IDZkOTI1MGEuLmM0ODZjNWYgMTAwNjQ0Ci0tLSBhL2VtdWxhdG9yL3F0b29scy9kbXRyYWNlLmNwcAorKysgYi9lbXVsYXRvci9xdG9vbHMvZG10cmFjZS5jcHAKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJkbXRyYWNlLmgiCiAKIHN0YXRpYyBjb25zdCBzaG9ydCBrVmVyc2lvbiA9IDI7CkBAIC0xNjMsNyArMTY0LDcgQEAKICAgICAvLyAgIHNpZyA9ICIoKUkiCiAKICAgICAvLyBGaW5kIHRoZSBmaXJzdCBwYXJlbnRoZXNpcywgdGhlIHN0YXJ0IG9mIHRoZSBzaWduYXR1cmUuCi0gICAgY2hhciAqcGFyZW4gPSBzdHJjaHIobmFtZSwgJygnKTsKKyAgICBjaGFyICpwYXJlbiA9IChjaGFyKilzdHJjaHIobmFtZSwgJygnKTsKIAogICAgIC8vIElmIG5vdCBmb3VuZCwgdGhlbiBhZGQgdGhlIG9yaWdpbmFsIG5hbWUuCiAgICAgaWYgKHBhcmVuID09IE5VTEwpIHsKQEAgLTE4MCw3ICsxODEsNyBAQAogICAgICpwYXJlbiA9IDA7CiAKICAgICAvLyBTZWFyY2ggZm9yIHRoZSBsYXN0IHBlcmlvZCwgdGhlIHN0YXJ0IG9mIHRoZSBtZXRob2QgbmFtZQotICAgIGNoYXIgKmRvdCA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKyAgICBjaGFyICpkb3QgPSAoY2hhciopc3RycmNocihuYW1lLCAnLicpOwogCiAgICAgLy8gSWYgbm90IGZvdW5kLCB0aGVuIGFkZCB0aGUgb3JpZ2luYWwgbmFtZS4KICAgICBpZiAoZG90ID09IE5VTEwgfHwgZG90ID09IG5hbWUpIHsKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy90cmFjZV9yZWFkZXIuY3BwIGIvZW11bGF0b3IvcXRvb2xzL3RyYWNlX3JlYWRlci5jcHAKaW5kZXggZDJhZjY0Zi4uNDdiNWQ5MyAxMDA2NDQKLS0tIGEvZW11bGF0b3IvcXRvb2xzL3RyYWNlX3JlYWRlci5jcHAKKysrIGIvZW11bGF0b3IvcXRvb2xzL3RyYWNlX3JlYWRlci5jcHAKQEAgLTEwMDksMTAgKzEwMDksMTAgQEAKIC8vIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KIHN0YXRpYyBjaGFyICpFeHRyYWN0RGV4UGF0aEZyb21NbWFwKGNvbnN0IGNoYXIgKm1tYXBfcGF0aCkKIHsKLSAgICBjaGFyICplbmQgPSByaW5kZXgobW1hcF9wYXRoLCAnQCcpOworICAgIGNvbnN0IGNoYXIgKmVuZCA9IHJpbmRleChtbWFwX3BhdGgsICdAJyk7CiAgICAgaWYgKGVuZCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBjaGFyICpzdGFydCA9IHJpbmRleChtbWFwX3BhdGgsICcvJyk7CisgICAgY29uc3QgY2hhciAqc3RhcnQgPSByaW5kZXgobW1hcF9wYXRoLCAnLycpOwogICAgIGlmIChzdGFydCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CmRpZmYgLS1naXQgYS9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoIGIvaWRlL2VjbGlwc2UvLmNsYXNzcGF0aAppbmRleCA3MWU4ZDI5Li45Njc5N2U3IDEwMDY0NAotLS0gYS9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoCisrKyBiL2lkZS9lY2xpcHNlLy5jbGFzc3BhdGgKQEAgLTI4LDggKzI4LDYgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9wcm92aWRlcnMvSW1Qcm92aWRlci9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9wcm92aWRlcnMvTWVkaWFQcm92aWRlci9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9wcm92aWRlcnMvVGVsZXBob255UHJvdmlkZXIvc3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idmVuZG9yL2dvb2dsZS9hcHBzL1N0cmVldC9zcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2ZW5kb3IvZ29vZ2xlL2FwcHMvWW91VHViZS9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvYXd0Ii8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2NtZHMvYW0vc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2NtZHMvaW5wdXQvc3JjIi8+CkBAIC0zOSw2ICszNyw3IEBACiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2NvcmUvY29uZmlnL3NkayIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9ncmFwaGljcy9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2ltL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uva2V5c3RvcmUvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9sb2NhdGlvbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uvb3BlbmdsL2phdmEiLz4KQEAgLTQ5LDYgKzQ4LDcgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdGVsZXBob255L2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdGVzdC1ydW5uZXIiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdHRzL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdnBuL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uvd2lmaS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9wb2xpY2llcy9iYXNlL3Bob25lIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMiLz4KQEAgLTk0LDcgKzk0LDcgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJkYWx2aWsvbGliY29yZS94LW5ldC9zcmMvbWFpbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGFsdmlrL2xpYmNvcmUveG1sL3NyYy9tYWluL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BcGlEZW1vc19pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9Ccm93c2VyX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0VtYWlsX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0lNX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL011c2ljX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL1Bob25lX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgpAQCAtMTA0LDcgKzEwNCw3IEBACiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy9sb2NhdGlvbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy9tZWRpYS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy90ZWxlcGhvbnkvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvdHRzL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3Zwbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy93aWZpL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9SIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXh0ZXJuYWwvdGFnc291cC9zcmMiLz4KQEAgLTExNCw2ICsxMTQsNiBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImV4dGVybmFsL2dvb2dsZWNsaWVudC9nb29nbGVjbGllbnQtbGliLmphciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9nb29nbGUtZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvamF2YWxpYi5qYXIiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZ29vZ2xlbG9naW4tY2xpZW50X2ludGVybWVkaWF0ZXMvamF2YWxpYi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJwYWNrYWdlcy9hcHBzL0NhbGN1bGF0b3IvYXJpdHktMS4zLjEuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0icGFja2FnZXMvYXBwcy9DYWxjdWxhdG9yL2FyaXR5LTEuMy4zLmphciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9hbmRyb2lkX3N0dWJzX2N1cnJlbnRfaW50ZXJtZWRpYXRlcy9jbGFzc2VzIi8+CiA8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmYjM0YWZhLi45ZDI1NTEyIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNTYyLDYgKzE1NjIsMTMgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuZ3JhcGhpY3MuQ29sb3JGaWx0ZXJzIiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcy9Db2xvckZpbHRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5DcmVhdGVCaXRtYXAiIGFuZHJvaWQ6bGFiZWw9IkdyYXBoaWNzL0NyZWF0ZUJpdG1hcCI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfb2ZmLnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19vZmYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZDM4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfb24ucG5nIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFhYzFkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2lyY2xlX25vcm1hbC5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2lyY2xlX25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1YWYxYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaXJjbGVfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fZGVmYXVsdF9ub3JtYWwuOS5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fZGVmYXVsdF9ub3JtYWwuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkNWNjZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9kZWZhdWx0X25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvQ29sb3JGaWx0ZXJzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvQ29sb3JGaWx0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkMThiYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9ncmFwaGljcy9Db2xvckZpbHRlcnMuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmdyYXBoaWNzOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLio7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS4qOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuKjsKKworcHVibGljIGNsYXNzIENvbG9yRmlsdGVycyBleHRlbmRzIEdyYXBoaWNzQWN0aXZpdHkgeworICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNhbXBsZVZpZXcodGhpcykpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2FtcGxlVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIEFjdGl2aXR5IG1BY3Rpdml0eTsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtRHJhd2FibGU7CisgICAgICAgIHByaXZhdGUgRHJhd2FibGVbXSBtRHJhd2FibGVzOworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQyOworICAgICAgICBwcml2YXRlIGZsb2F0IG1QYWludFRleHRPZmZzZXQ7CisgICAgICAgIHByaXZhdGUgaW50W10gbUNvbG9yczsKKyAgICAgICAgcHJpdmF0ZSBQb3J0ZXJEdWZmLk1vZGVbXSBtTW9kZXM7CisgICAgICAgIHByaXZhdGUgaW50IG1Nb2RlSW5kZXg7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb1RoZVJpZ2h0KERyYXdhYmxlIGN1cnIsIERyYXdhYmxlIHByZXYpIHsKKyAgICAgICAgICAgIFJlY3QgciA9IHByZXYuZ2V0Qm91bmRzKCk7CisgICAgICAgICAgICBpbnQgeCA9IHIucmlnaHQgKyAxMjsKKyAgICAgICAgICAgIGludCBjZW50ZXIgPSAoci50b3AgKyByLmJvdHRvbSkgPj4gMTsKKyAgICAgICAgICAgIGludCBoID0gY3Vyci5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKyAgICAgICAgICAgIGludCB5ID0gY2VudGVyIC0gKGggPj4gMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGN1cnIuc2V0Qm91bmRzKHgsIHksIHggKyBjdXJyLmdldEludHJpbnNpY1dpZHRoKCksIHkgKyBoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTYW1wbGVWaWV3KEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgICAgICBzdXBlcihhY3Rpdml0eSk7CisgICAgICAgICAgICBtQWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGFjdGl2aXR5OworICAgICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtRHJhd2FibGUgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuYnRuX2RlZmF1bHRfbm9ybWFsKTsKKyAgICAgICAgICAgIG1EcmF3YWJsZS5zZXRCb3VuZHMoMCwgMCwgMTUwLCA0OCk7CisgICAgICAgICAgICBtRHJhd2FibGUuc2V0RGl0aGVyKHRydWUpOworCisgICAgICAgICAgICBpbnRbXSByZXNJRHMgPSBuZXcgaW50W10geworICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuYnRuX2NpcmNsZV9ub3JtYWwsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5idG5fY2hlY2tfb2ZmLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuYnRuX2NoZWNrX29uCisgICAgICAgICAgICB9OworICAgICAgICAgICAgbURyYXdhYmxlcyA9IG5ldyBEcmF3YWJsZVtyZXNJRHMubGVuZ3RoXTsKKyAgICAgICAgICAgIERyYXdhYmxlIHByZXYgPSBtRHJhd2FibGU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc0lEcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1EcmF3YWJsZXNbaV0gPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKHJlc0lEc1tpXSk7CisgICAgICAgICAgICAgICAgbURyYXdhYmxlc1tpXS5zZXREaXRoZXIodHJ1ZSk7CisgICAgICAgICAgICAgICAgYWRkVG9UaGVSaWdodChtRHJhd2FibGVzW2ldLCBwcmV2KTsKKyAgICAgICAgICAgICAgICBwcmV2ID0gbURyYXdhYmxlc1tpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbVBhaW50LnNldFRleHRTaXplKDE2KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRUZXh0QWxpZ24oUGFpbnQuQWxpZ24uQ0VOVEVSKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVBhaW50MiA9IG5ldyBQYWludChtUGFpbnQpOworICAgICAgICAgICAgbVBhaW50Mi5zZXRBbHBoYSg2NCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzIGZtID0gbVBhaW50LmdldEZvbnRNZXRyaWNzKCk7CisgICAgICAgICAgICBtUGFpbnRUZXh0T2Zmc2V0ID0gKGZtLmRlc2NlbnQgKyBmbS5hc2NlbnQpICogMC41ZjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUNvbG9ycyA9IG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAweENDMDAwMEZGLAorICAgICAgICAgICAgICAgIDB4ODgwMDAwRkYsCisgICAgICAgICAgICAgICAgMHg0NDAwMDBGRiwKKyAgICAgICAgICAgICAgICAweEZGQ0NDQ0ZGLAorICAgICAgICAgICAgICAgIDB4RkY4ODg4RkYsCisgICAgICAgICAgICAgICAgMHhGRjQ0NDRGRiwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIG1Nb2RlcyA9IG5ldyBQb3J0ZXJEdWZmLk1vZGVbXSB7CisgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19BVE9QLAorICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5NVUxUSVBMWSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtTW9kZUluZGV4ID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN3YXBQYWludENvbG9ycygpIHsKKyAgICAgICAgICAgIGlmIChtUGFpbnQuZ2V0Q29sb3IoKSA9PSAweEZGMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4RkZGRkZGRkYpOworICAgICAgICAgICAgICAgIG1QYWludDIuc2V0Q29sb3IoMHhGRjAwMDAwMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweEZGMDAwMDAwKTsKKyAgICAgICAgICAgICAgICBtUGFpbnQyLnNldENvbG9yKDB4RkZGRkZGRkYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBhaW50Mi5zZXRBbHBoYSg2NCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZSgpIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5zZXRUaXRsZShtTW9kZXNbbU1vZGVJbmRleF0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmF3U2FtcGxlKENhbnZhcyBjYW52YXMsIENvbG9yRmlsdGVyIGZpbHRlcikgeworICAgICAgICAgICAgUmVjdCByID0gbURyYXdhYmxlLmdldEJvdW5kcygpOworICAgICAgICAgICAgZmxvYXQgeCA9IChyLmxlZnQgKyByLnJpZ2h0KSAqIDAuNWY7CisgICAgICAgICAgICBmbG9hdCB5ID0gKHIudG9wICsgci5ib3R0b20pICogMC41ZiAtIG1QYWludFRleHRPZmZzZXQ7CisKKyAgICAgICAgICAgIG1EcmF3YWJsZS5zZXRDb2xvckZpbHRlcihmaWx0ZXIpOworICAgICAgICAgICAgbURyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiTGFiZWwiLCB4KzEsIHkrMSwgbVBhaW50Mik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkxhYmVsIiwgeCwgeSwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChEcmF3YWJsZSBkciA6IG1EcmF3YWJsZXMpIHsKKyAgICAgICAgICAgICAgICBkci5zZXRDb2xvckZpbHRlcihmaWx0ZXIpOworICAgICAgICAgICAgICAgIGRyLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd0NvbG9yKDB4RkZDQ0NDQ0MpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDgsIDEyKTsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbG9yIDogbUNvbG9ycykgeworICAgICAgICAgICAgICAgIENvbG9yRmlsdGVyIGZpbHRlcjsKKyAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vZGVzW21Nb2RlSW5kZXhdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHJhd1NhbXBsZShjYW52YXMsIGZpbHRlcik7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCA1NSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmbG9hdCB4ID0gZXZlbnQuZ2V0WCgpOworICAgICAgICAgICAgZmxvYXQgeSA9IGV2ZW50LmdldFkoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG1vZGUgZXZlcnkgb3RoZXIgdGltZSB3ZSBjaGFuZ2UgcGFpbnQgY29sb3JzCisgICAgICAgICAgICAgICAgICAgIGlmIChtUGFpbnQuZ2V0Q29sb3IoKSA9PSAweEZGRkZGRkZGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTW9kZUluZGV4ID0gKG1Nb2RlSW5kZXggKyAxKSAlIG1Nb2Rlcy5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUaXRsZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3YXBQYWludENvbG9ycygpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9BbmRyb2lkLm1rIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwNDdkNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhcHBsaWNhdGlvbgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFNhbXBsZUJyb3dzZXJQbHVnaW4KKworTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlic2FtcGxlcGx1Z2luCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIEFsc28gYnVpbGQgYWxsIG9mIHRoZSBzdWItdGFyZ2V0cyB1bmRlciB0aGlzIG9uZTogdGhlIHNoYXJlZCBsaWJyYXJ5LgoraW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTZiNWRiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5zYW1wbGVwbHVnaW4iCisgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLndlYmtpdC5wZXJtaXNzaW9uLlBMVUdJTiIvPgorCisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMyIgLz4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9zYW1wbGVfYnJvd3Nlcl9wbHVnaW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9zYW1wbGVfYnJvd3Nlcl9wbHVnaW4iPgorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9IlNhbXBsZVBsdWdpbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQuUExVR0lOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTk9USUNFIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvQW5kcm9pZC5tayBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjlhNmZkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTkgQEAKKyMjCisjIworIyMgQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMjCisjIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyMgYXJlIG1ldDoKKyMjICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMjCisjIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorIyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisjIyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyMgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorIyMgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCW1haW4uY3BwIFwKKwlQbHVnaW5PYmplY3QuY3BwIFwKKwlhbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcCBcCisJYXVkaW8vQXVkaW9QbHVnaW4uY3BwIFwKKwliYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwIFwKKwlmb3JtL0Zvcm1QbHVnaW4uY3BwIFwKKwlzdXJmYWNlL1N1cmZhY2VQbHVnaW4uY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChMT0NBTF9QQVRIKSBcCisJJChMT0NBTF9QQVRIKS9hbmltYXRpb24gXAorCSQoTE9DQUxfUEFUSCkvYXVkaW8gXAorCSQoTE9DQUxfUEFUSCkvYmFja2dyb3VuZCBcCisJJChMT0NBTF9QQVRIKS9mb3JtIFwKKwkkKExPQ0FMX1BBVEgpL3N1cmZhY2UgXAorCWV4dGVybmFsL3dlYmtpdC9XZWJDb3JlL2JyaWRnZSBcCisJZXh0ZXJuYWwvd2Via2l0L1dlYkNvcmUvcGx1Z2lucyBcCisJZXh0ZXJuYWwvd2Via2l0L1dlYkNvcmUvcGxhdGZvcm0vYW5kcm9pZC9KYXZhVk0gXAorCWV4dGVybmFsL3dlYmtpdC9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX1NSQ19GSUxFUykKK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIAorTE9DQUxfUFJFTElOS19NT0RVTEU6PWZhbHNlCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU0hBUkVEX0xJQlJBUklFUworCitMT0NBTF9NT0RVTEU6PSBsaWJzYW1wbGVwbHVnaW4KKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmNWU3YwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyBJTVBPUlRBTlQ6ICBUaGlzIEFwcGxlIHNvZnR3YXJlIGlzIHN1cHBsaWVkIHRvIHlvdSBieSBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgaW4KKyBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwgaW5zdGFsbGF0aW9uLAorIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIEFwcGxlIHNvZnR3YXJlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UKKyB0ZXJtcy4gIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvcgorIHJlZGlzdHJpYnV0ZSB0aGlzIEFwcGxlIHNvZnR3YXJlLgorCisgSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgc3ViamVjdCB0byB0aGVzZQorIHRlcm1zLCBBcHBsZSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgdW5kZXIgQXBwbGXVcyBjb3B5cmlnaHRzIGluCisgdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZAorIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeQorIGZvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dAorIG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwKKyBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzCisgb3IgbG9nb3Mgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIHRoZSBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiBFeGNlcHQgYXMgZXhwcmVzc2x5Cisgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgQXBwbGUKKyBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIKKyBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZSBTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgorCisgVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTyBXQVJSQU5USUVTLAorIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsCisgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBTT0ZUV0FSRSBPUiBJVFMKKyBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCisKKyBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMCisgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAgICAgICAgICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLAorIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQKKyBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SCisgT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKK3N0YXRpYyB2b2lkIHBsdWdpbkludmFsaWRhdGUoTlBPYmplY3QgKm9iaik7CitzdGF0aWMgYm9vbCBwbHVnaW5IYXNQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7CitzdGF0aWMgYm9vbCBwbHVnaW5IYXNNZXRob2QoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOworc3RhdGljIGJvb2wgcGx1Z2luR2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIE5QVmFyaWFudCAqdmFyaWFudCk7CitzdGF0aWMgYm9vbCBwbHVnaW5TZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICp2YXJpYW50KTsKK3N0YXRpYyBib29sIHBsdWdpbkludm9rZShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpOworc3RhdGljIGJvb2wgcGx1Z2luSW52b2tlRGVmYXVsdChOUE9iamVjdCAqb2JqLCBjb25zdCBOUFZhcmlhbnQgKmFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50LCBOUFZhcmlhbnQgKnJlc3VsdCk7CitzdGF0aWMgTlBPYmplY3QgKnBsdWdpbkFsbG9jYXRlKE5QUCBucHAsIE5QQ2xhc3MgKnRoZUNsYXNzKTsKK3N0YXRpYyB2b2lkIHBsdWdpbkRlYWxsb2NhdGUoTlBPYmplY3QgKm9iaik7CitzdGF0aWMgYm9vbCBwbHVnaW5SZW1vdmVQcm9wZXJ0eShOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciBuYW1lKTsKK3N0YXRpYyBib29sIHBsdWdpbkVudW1lcmF0ZShOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciAqKnZhbHVlLCB1aW50MzJfdCAqY291bnQpOworCisKKworc3RhdGljIE5QQ2xhc3MgcGx1Z2luQ2xhc3MgPSB7CisgICAgTlBfQ0xBU1NfU1RSVUNUX1ZFUlNJT04sCisgICAgcGx1Z2luQWxsb2NhdGUsCisgICAgcGx1Z2luRGVhbGxvY2F0ZSwKKyAgICBwbHVnaW5JbnZhbGlkYXRlLAorICAgIHBsdWdpbkhhc01ldGhvZCwKKyAgICBwbHVnaW5JbnZva2UsCisgICAgcGx1Z2luSW52b2tlRGVmYXVsdCwKKyAgICBwbHVnaW5IYXNQcm9wZXJ0eSwKKyAgICBwbHVnaW5HZXRQcm9wZXJ0eSwKKyAgICBwbHVnaW5TZXRQcm9wZXJ0eSwKKyAgICBwbHVnaW5SZW1vdmVQcm9wZXJ0eSwKKyAgICBwbHVnaW5FbnVtZXJhdGUKK307CisKK05QQ2xhc3MgKmdldFBsdWdpbkNsYXNzKHZvaWQpCit7CisgICAgcmV0dXJuICZwbHVnaW5DbGFzczsKK30KKworc3RhdGljIGJvb2wgaWRlbnRpZmllcnNJbml0aWFsaXplZCA9IGZhbHNlOworCisjZGVmaW5lIElEX1RFU1RGSUxFX1BST1BFUlRZICAgICAgICAgICAgMAorI2RlZmluZSBOVU1fUFJPUEVSVFlfSURFTlRJRklFUlMgICAgICAgIDEKKworc3RhdGljIE5QSWRlbnRpZmllciBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzW05VTV9QUk9QRVJUWV9JREVOVElGSUVSU107CitzdGF0aWMgY29uc3QgTlBVVEY4ICpwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJOYW1lc1tOVU1fUFJPUEVSVFlfSURFTlRJRklFUlNdID0geworICAgICJ0ZXN0ZmlsZSIKK307CisKKyNkZWZpbmUgSURfR0VUVEVTVEZJTEVfTUVUSE9EICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTlVNX01FVEhPRF9JREVOVElGSUVSUyAgICAgICAgICAgICAgICAgIDEKKworc3RhdGljIE5QSWRlbnRpZmllciBwbHVnaW5NZXRob2RJZGVudGlmaWVyc1tOVU1fTUVUSE9EX0lERU5USUZJRVJTXTsKK3N0YXRpYyBjb25zdCBOUFVURjggKnBsdWdpbk1ldGhvZElkZW50aWZpZXJOYW1lc1tOVU1fTUVUSE9EX0lERU5USUZJRVJTXSA9IHsKKyAgICAiZ2V0VGVzdEZpbGUiCit9OworCitzdGF0aWMgdm9pZCBpbml0aWFsaXplSWRlbnRpZmllcnModm9pZCkKK3sKKyAgICBicm93c2VyLT5nZXRzdHJpbmdpZGVudGlmaWVycyhwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJOYW1lcywgTlVNX1BST1BFUlRZX0lERU5USUZJRVJTLCBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzKTsKKyAgICBicm93c2VyLT5nZXRzdHJpbmdpZGVudGlmaWVycyhwbHVnaW5NZXRob2RJZGVudGlmaWVyTmFtZXMsIE5VTV9NRVRIT0RfSURFTlRJRklFUlMsIHBsdWdpbk1ldGhvZElkZW50aWZpZXJzKTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luSGFzUHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9QUk9QRVJUWV9JREVOVElGSUVSUzsgaSsrKQorICAgICAgICBpZiAobmFtZSA9PSBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzW2ldKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5IYXNNZXRob2QoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9NRVRIT0RfSURFTlRJRklFUlM7IGkrKykKKyAgICAgICAgaWYgKG5hbWUgPT0gcGx1Z2luTWV0aG9kSWRlbnRpZmllcnNbaV0pCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpbkdldFByb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBOUFZhcmlhbnQgKnZhcmlhbnQpCit7CisgICAgUGx1Z2luT2JqZWN0ICpwbHVnaW4gPSAoUGx1Z2luT2JqZWN0ICopb2JqOworICAgIGlmIChuYW1lID09IHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnNbSURfVEVTVEZJTEVfUFJPUEVSVFldKSB7CisgICAgICAgIEJPT0xFQU5fVE9fTlBWQVJJQU5UKHRydWUsICp2YXJpYW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luU2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqdmFyaWFudCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpbkludm9rZShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpCit7CisgICAgUGx1Z2luT2JqZWN0ICpwbHVnaW4gPSAoUGx1Z2luT2JqZWN0ICopb2JqOworICAgIGlmIChuYW1lID09IHBsdWdpbk1ldGhvZElkZW50aWZpZXJzW0lEX0dFVFRFU1RGSUxFX01FVEhPRF0pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luSW52b2tlRGVmYXVsdChOUE9iamVjdCAqb2JqLCBjb25zdCBOUFZhcmlhbnQgKmFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50LCBOUFZhcmlhbnQgKnJlc3VsdCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdpbkludmFsaWRhdGUoTlBPYmplY3QgKm9iaikKK3sKKyAgICAvLyBSZWxlYXNlIGFueSByZW1haW5pbmcgcmVmZXJlbmNlcyB0byBKYXZhU2NyaXB0IG9iamVjdHMuCit9CisKK3N0YXRpYyBOUE9iamVjdCAqcGx1Z2luQWxsb2NhdGUoTlBQIG5wcCwgTlBDbGFzcyAqdGhlQ2xhc3MpCit7CisgICAgUGx1Z2luT2JqZWN0ICpuZXdJbnN0YW5jZSA9IChQbHVnaW5PYmplY3QqKSBtYWxsb2Moc2l6ZW9mKFBsdWdpbk9iamVjdCkpOworICAgIG5ld0luc3RhbmNlLT5oZWFkZXIuX2NsYXNzID0gdGhlQ2xhc3M7CisgICAgbmV3SW5zdGFuY2UtPmhlYWRlci5yZWZlcmVuY2VDb3VudCA9IDE7CisKKyAgICBpZiAoIWlkZW50aWZpZXJzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWRlbnRpZmllcnNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIGluaXRpYWxpemVJZGVudGlmaWVycygpOworICAgIH0KKworICAgIG5ld0luc3RhbmNlLT5ucHAgPSBucHA7CisKKyAgICByZXR1cm4gJm5ld0luc3RhbmNlLT5oZWFkZXI7Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdpbkRlYWxsb2NhdGUoTlBPYmplY3QgKm9iaikKK3sKKyAgICBmcmVlKG9iaik7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpblJlbW92ZVByb3BlcnR5KE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyIG5hbWUpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5FbnVtZXJhdGUoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgKip2YWx1ZSwgdWludDMyX3QgKmNvdW50KQoreworICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGEwOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIGluCisgY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsIGluc3RhbGxhdGlvbiwKKyBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZSBjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlCisgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IKKyByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KKworIEluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHN1YmplY3QgdG8gdGhlc2UKKyB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMgY29weXJpZ2h0cyBpbgorIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdhcmUgKHRoZSAiQXBwbGUgU29mdHdhcmUiKSwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSBhbmQKKyByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkKKyBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQKKyBtb2RpZmljYXRpb25zLCB5b3UgbXVzdCByZXRhaW4gdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsCisgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEFwcGxlIFNvZnR3YXJlLiAgTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcworIG9yIGxvZ29zIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyB0aGUgQXBwbGUgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBBcHBsZS4gRXhjZXB0IGFzIGV4cHJlc3NseQorIHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IEFwcGxlCisgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyCisgZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUgU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KKworIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8gV0FSUkFOVElFUywKKyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBOT04tSU5GUklOR0VNRU5ULAorIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTCisgVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgorCisgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTAorIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgICAgICAgICAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwKKyBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBBUFBMRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5ECisgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUgorIE9USEVSV0lTRSwgRVZFTiBJRiBBUFBMRSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFBsdWdpbk9iamVjdF9fREVGSU5FRAorI2RlZmluZSBQbHVnaW5PYmplY3RfX0RFRklORUQKKworI2luY2x1ZGUgIm1haW4uaCIKKworY2xhc3MgU3ViUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBTdWJQbHVnaW4oTlBQIGluc3QpIDogbV9pbnN0KGluc3QpIHt9CisgICAgdmlydHVhbCB+U3ViUGx1Z2luKCkge30KKyAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKSA9IDA7CisKKyAgICBOUFAgaW5zdCgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdDsgfQorCitwcml2YXRlOgorICAgIE5QUCBtX2luc3Q7Cit9OworCitlbnVtIFBsdWdpblR5cGVzIHsKKyAgICBrQW5pbWF0aW9uX1BsdWdpblR5cGUgID0gMSwKKyAgICBrQXVkaW9fUGx1Z2luVHlwZSAgICAgID0gMiwKKyAgICBrQmFja2dyb3VuZF9QbHVnaW5UeXBlID0gMywKKyAgICBrRm9ybV9QbHVnaW5UeXBlICAgICAgID0gNCwKKyAgICBrVGV4dF9QbHVnaW5UeXBlICAgICAgID0gNSwKKyAgICBrUGFpbnRfUGx1Z2luVHlwZSAgICAgID0gNiwKKyAgICBrU3VyZmFjZV9QbHVnaW5UeXBlICAgID0gNywKK307Cit0eXBlZGVmIHVpbnQzMl90IFBsdWdpblR5cGU7CisKK3R5cGVkZWYgc3RydWN0IFBsdWdpbk9iamVjdCB7CisgICAgTlBPYmplY3QgaGVhZGVyOworICAgIE5QUCBucHA7CisgICAgTlBXaW5kb3cqIHdpbmRvdzsKKworICAgIFBsdWdpblR5cGUgcGx1Z2luVHlwZTsKKyAgICBTdWJQbHVnaW4qIGFjdGl2ZVBsdWdpbjsKKworfSBQbHVnaW5PYmplY3Q7CisKK05QQ2xhc3MgKmdldFBsdWdpbkNsYXNzKHZvaWQpOworCisjZW5kaWYgLy8gUGx1Z2luT2JqZWN0X19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2FuaW1hdGlvbi9BbmltYXRpb25QbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI2NDUxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcApAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJBbmltYXRpb25QbHVnaW4uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gTlBOZXRzY2FwZUZ1bmNzKiAgICAgICAgYnJvd3NlcjsKK2V4dGVybiBBTlBMb2dJbnRlcmZhY2VWMCAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICBnQ2FudmFzSTsKK2V4dGVybiBBTlBQYWludEludGVyZmFjZVYwICAgICBnUGFpbnRJOworZXh0ZXJuIEFOUFBhdGhJbnRlcmZhY2VWMCAgICAgIGdQYXRoSTsKK2V4dGVybiBBTlBUeXBlZmFjZUludGVyZmFjZVYwICBnVHlwZWZhY2VJOworZXh0ZXJuIEFOUFdpbmRvd0ludGVyZmFjZVYwICAgIGdXaW5kb3dJOworCitzdGF0aWMgdm9pZCBpbnZhbChOUFAgaW5zdGFuY2UpIHsKKyAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7Cit9CisKK3N0YXRpYyB1aW50MTYgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CisgICAgaW50IGl4ID0gKGludClyb3VuZGYoeCkgKyBpbnNldDsKKyAgICBpZiAoaXggPCAwKSB7CisgICAgICAgIGl4ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNj4oaXgpOworfQorCitzdGF0aWMgdm9pZCBpbnZhbChOUFAgaW5zdGFuY2UsIGNvbnN0IEFOUFJlY3RGJiByLCBib29sIGRvQUEpIHsKKyAgICBjb25zdCBpbnQgaW5zZXQgPSBkb0FBID8gLTEgOiAwOworCisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSByZWludGVycHJldF9jYXN0PFBsdWdpbk9iamVjdCo+KGluc3RhbmNlLT5wZGF0YSk7CisgICAgTlBSZWN0IGludmFsOworICAgIGludmFsLmxlZnQgPSBybmQxNihyLmxlZnQsIGluc2V0KTsKKyAgICBpbnZhbC50b3AgPSBybmQxNihyLnRvcCwgaW5zZXQpOworICAgIGludmFsLnJpZ2h0ID0gcm5kMTYoci5yaWdodCwgLWluc2V0KTsKKyAgICBpbnZhbC5ib3R0b20gPSBybmQxNihyLmJvdHRvbSwgLWluc2V0KTsKKyAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgJmludmFsKTsKK30KKwordWludDMyX3QgZ2V0TVNlY3MoKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgICAgcmV0dXJuICh1aW50MzJfdCkgKHR2LnR2X3NlYyAqIDEwMDAgKyB0di50dl91c2VjIC8gMTAwMCApOyAvLyBtaWNyb3NlY29uZHMgdG8gbWlsbGlzZWNvbmRzCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQmFsbEFuaW1hdGlvbjo6QmFsbEFuaW1hdGlvbihOUFAgaW5zdCkgOiBTdWJQbHVnaW4oaW5zdCkgeworICAgIG1feCA9IG1feSA9IDA7CisgICAgbV9keCA9IDcgKiBTQ0FMRTsKKyAgICBtX2R5ID0gNSAqIFNDQUxFOworICAgIG1fc2Nyb2xsWCA9IG1fc2Nyb2xsWSA9IG1fc2NyZWVuVyA9IG1fc2NyZWVuSCA9IDA7CisgICAgbV96b29tID0gMTsKKworICAgIG1lbXNldCgmbV9vdmFsLCAwLCBzaXplb2YobV9vdmFsKSk7CisKKyAgICBtX3BhaW50ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludCwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnQsIDB4RkZGRjAwMDApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUobV9wYWludCwgMjQpOworCisgICAgQU5QVHlwZWZhY2UqIHRmID0gZ1R5cGVmYWNlSS5jcmVhdGVGcm9tTmFtZSgic2VyaWYiLCBrSXRhbGljX0FOUFR5cGVmYWNlU3R5bGUpOworICAgIGdQYWludEkuc2V0VHlwZWZhY2UobV9wYWludCwgdGYpOworICAgIGdUeXBlZmFjZUkudW5yZWYodGYpOworCisgICAgLy9yZWdpc3RlciBmb3Iga2V5IGFuZCB0b3VjaCBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga0tleV9BTlBFdmVudEZsYWcgfCBrVG91Y2hfQU5QRXZlbnRGbGFnIHwga1Zpc2libGVSZWN0X0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coaW5zdCwga0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KK30KKworQmFsbEFuaW1hdGlvbjo6fkJhbGxBbmltYXRpb24oKSB7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50KTsKK30KKworc3RhdGljIHZvaWQgYm91bmNlKGZsb2F0KiB4LCBmbG9hdCogZHgsIGNvbnN0IGZsb2F0IG1heCkgeworICAgICp4ICs9ICpkeDsKKyAgICBpZiAoKnggPCAwKSB7CisgICAgICAgICp4ID0gMDsKKyAgICAgICAgaWYgKCpkeCA8IDApIHsKKyAgICAgICAgICAgICpkeCA9IC0qZHg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCp4ID4gbWF4KSB7CisgICAgICAgICp4ID0gbWF4OworICAgICAgICBpZiAoKmR4ID4gMCkgeworICAgICAgICAgICAgKmR4ID0gLSpkeDsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCYWxsQW5pbWF0aW9uOjpzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwgbW9kZWwpIHsKKyAgICByZXR1cm4gKG1vZGVsID09IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsKTsKK30KKwordm9pZCBCYWxsQW5pbWF0aW9uOjpkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCkgeworICAgIEFOUENhbnZhcyogY2FudmFzID0gZ0NhbnZhc0kubmV3Q2FudmFzKCZiaXRtYXApOworCisgICAgQU5QUmVjdEYgY2xpcFI7CisgICAgY2xpcFIubGVmdCA9IGNsaXAubGVmdDsKKyAgICBjbGlwUi50b3AgPSBjbGlwLnRvcDsKKyAgICBjbGlwUi5yaWdodCA9IGNsaXAucmlnaHQ7CisgICAgY2xpcFIuYm90dG9tID0gY2xpcC5ib3R0b207CisgICAgZ0NhbnZhc0kuY2xpcFJlY3QoY2FudmFzLCAmY2xpcFIpOworCisgICAgZHJhdyhjYW52YXMpOworICAgIGdDYW52YXNJLmRlbGV0ZUNhbnZhcyhjYW52YXMpOworfQorCit2b2lkIEJhbGxBbmltYXRpb246OmRyYXcoQU5QQ2FudmFzKiBjYW52YXMpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOworICAgIGNvbnN0IGZsb2F0IE9XID0gMjA7CisgICAgY29uc3QgZmxvYXQgT0ggPSAyMDsKKyAgICBjb25zdCBpbnQgVyA9IG9iai0+d2luZG93LT53aWR0aDsKKyAgICBjb25zdCBpbnQgSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7CisKKyAgICBpbnZhbChpbnN0YW5jZSwgbV9vdmFsLCB0cnVlKTsgIC8vIGludmFsIHRoZSBvbGQKKyAgICBtX292YWwubGVmdCA9IG1feDsKKyAgICBtX292YWwudG9wID0gbV95OworICAgIG1fb3ZhbC5yaWdodCA9IG1feCArIE9XOworICAgIG1fb3ZhbC5ib3R0b20gPSBtX3kgKyBPSDsKKyAgICBpbnZhbChpbnN0YW5jZSwgbV9vdmFsLCB0cnVlKTsgIC8vIGludmFsIHRoZSBuZXcKKworICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIDB4RkZGRkZGRkYpOworCisgICAgLy8gdGVzdCBvdXQgdGhlIFBhdGggQVBJCisgICAgeworICAgICAgICBBTlBQYXRoKiBwYXRoID0gZ1BhdGhJLm5ld1BhdGgoKTsKKworICAgICAgICBmbG9hdCBjeCA9IFcgKiAwLjVmOworICAgICAgICBmbG9hdCBjeSA9IEggKiAwLjVmOworICAgICAgICBnUGF0aEkubW92ZVRvKHBhdGgsIDAsIDApOworICAgICAgICBnUGF0aEkucXVhZFRvKHBhdGgsIGN4LCBjeSwgVywgMCk7CisgICAgICAgIGdQYXRoSS5xdWFkVG8ocGF0aCwgY3gsIGN5LCBXLCBIKTsKKyAgICAgICAgZ1BhdGhJLnF1YWRUbyhwYXRoLCBjeCwgY3ksIDAsIEgpOworICAgICAgICBnUGF0aEkucXVhZFRvKHBhdGgsIGN4LCBjeSwgMCwgMCk7CisKKyAgICAgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50LCAweEZGMDAwMEZGKTsKKyAgICAgICAgZ0NhbnZhc0kuZHJhd1BhdGgoY2FudmFzLCBwYXRoLCBtX3BhaW50KTsKKworICAgICAgICBBTlBSZWN0RiBib3VuZHM7CisgICAgICAgIG1lbXNldCgmYm91bmRzLCAwLCBzaXplb2YoYm91bmRzKSk7CisgICAgICAgIGdQYXRoSS5nZXRCb3VuZHMocGF0aCwgJmJvdW5kcyk7CisjaWYgMAorICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiZHJhd3BhdGg6IGNlbnRlciAlZyAlZyBib3VuZHMgWyVnICVnICVnICVnXVxuIiwKKyAgICAgICAgICAgICAgICAgIGN4LCBjeSwKKyAgICAgICAgICAgICAgICAgIGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20pOworI2VuZGlmCisgICAgICAgIGdQYXRoSS5kZWxldGVQYXRoKHBhdGgpOworICAgIH0KKworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludCwgMHhGRkZGMDAwMCk7CisgICAgZ0NhbnZhc0kuZHJhd092YWwoY2FudmFzLCAmbV9vdmFsLCBtX3BhaW50KTsKKworICAgIGJvdW5jZSgmbV94LCAmbV9keCwgb2JqLT53aW5kb3ctPndpZHRoIC0gT1cpOworICAgIGJvdW5jZSgmbV95LCAmbV9keSwgb2JqLT53aW5kb3ctPmhlaWdodCAtIE9IKTsKKworICAgIGlmIChtVW5pY2hhcikgeworICAgICAgICBBTlBGb250TWV0cmljcyBmbTsKKyAgICAgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhtX3BhaW50LCAmZm0pOworCisgICAgICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludCwgMHhGRjAwMDBGRik7CisgICAgICAgIGNoYXIgYyA9IHN0YXRpY19jYXN0PGNoYXI+KG1VbmljaGFyKTsKKyAgICAgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCAmYywgMSwgMTAsIC1mbS5mVG9wLCBtX3BhaW50KTsKKyAgICB9Cit9CisKK3ZvaWQgQmFsbEFuaW1hdGlvbjo6Y2VudGVyUGx1Z2luT25TY3JlZW4oKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKyAgICBOUFdpbmRvdyAqd2luZG93ID0gb2JqLT53aW5kb3c7CisKKyAgICAvL2ZpbmQgZ2xvYmFsICh4LHkpIGNvb3JkaW5hdGVzIGZvciBjZW50ZXIgb2YgdGhlIHBsdWdpbgorICAgIGludCBwbHVnaW5DZW50ZXJYID0gd2luZG93LT54ICsgKHdpbmRvdy0+d2lkdGggLyAyKTsKKyAgICBpbnQgcGx1Z2luQ2VudGVyWSA9IHdpbmRvdy0+eSArICh3aW5kb3ctPmhlaWdodCAvIDIpOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgUGx1Z2luIENlbnRlcjogJWQsJWQgOiAlZCwlZCIsCisgICAgICAgICAgICAgIGluc3RhbmNlLCBwbHVnaW5DZW50ZXJYLCBwbHVnaW5DZW50ZXJZLCB3aW5kb3ctPngsIHdpbmRvdy0+eSk7CisKKyAgICAvL2ZpbmQgZ2xvYmFsICh4LHkpIGNvb3JkaW5hdGVzIGZvciBjZW50ZXIgb2YgdGhlIHZpc2libGUgc2NyZWVuCisgICAgaW50IHNjcmVlbkNlbnRlclggPSBtX3Njcm9sbFggKyAobV9zY3JlZW5XIC8gMik7CisgICAgaW50IHNjcmVlbkNlbnRlclkgPSBtX3Njcm9sbFkgKyAobV9zY3JlZW5IIC8gMik7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBTY3JlZW4gQ2VudGVyOiAlZCwlZCA6ICVkLCVkIiwKKyAgICAgICAgICAgICAgaW5zdGFuY2UsIHNjcmVlbkNlbnRlclgsIHNjcmVlbkNlbnRlclksIG1fc2Nyb2xsWCwgbV9zY3JvbGxZKTsKKworICAgIC8vY29tcHV0ZSB0aGUgZGVsdGEgb2YgdGhlIHR3byBjb29yZGluYXRlcworICAgIGludCBkZWx0YVggPSBwbHVnaW5DZW50ZXJYIC0gc2NyZWVuQ2VudGVyWDsKKyAgICBpbnQgZGVsdGFZID0gcGx1Z2luQ2VudGVyWSAtIHNjcmVlbkNlbnRlclk7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBDZW50ZXJpbmc6ICVkLCVkIDogJWQsJWQiLAorICAgICAgICAgICAgICBpbnN0YW5jZSwgZGVsdGFYLCBkZWx0YVksIG1fc2Nyb2xsWCArIGRlbHRhWCwgbV9zY3JvbGxZICsgZGVsdGFZKTsKKworICAgIC8vbW92ZSB0aGUgdmlzaWJsZSBzY3JlZW4KKyAgICAvL3dlYnZpZXdDb3JlLi4uCisgICAgLy8gKG1fc2Nyb2xsWCArIGRlbHRhWCwgbV9zY3JvbGxZICsgZGVsdGFZKQorICAgIGdXaW5kb3dJLnNjcm9sbFRvKGluc3RhbmNlLCBtX3Njcm9sbFggKyBkZWx0YVgsIG1fc2Nyb2xsWSArIGRlbHRhWSk7CisKK30KKworaW50MTYgQmFsbEFuaW1hdGlvbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIHN3aXRjaCAoZXZ0LT5ldmVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5kcmF3Lm1vZGVsKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDoKKyAgICAgICAgICAgICAgICAgICAgZHJhd1BsdWdpbihldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcCwgZXZ0LT5kYXRhLmRyYXcuY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8vIHVua25vd24gZHJhd2luZyBtb2RlbAorICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2Uga0tleV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmtleS5hY3Rpb24gPT0ga0Rvd25fQU5QS2V5QWN0aW9uKSB7CisgICAgICAgICAgICAgICAgbVVuaWNoYXIgPSBldnQtPmRhdGEua2V5LnVuaWNoYXI7CisgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgImJhbGwgZG93bmtleSBldmVudCIpOworICAgICAgICAgICAgICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICAgaWYgKGtEb3duX0FOUFRvdWNoQWN0aW9uID09IGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgY2VudGVyUGx1Z2luT25TY3JlZW4oKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgY2FzZSBrVmlzaWJsZVJlY3RfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgIG1fc2Nyb2xsWCA9IGV2dC0+ZGF0YS52aXNpYmxlUmVjdC5yZWN0LmxlZnQ7CisgICAgICAgICAgICAgbV9zY3JvbGxZID0gZXZ0LT5kYXRhLnZpc2libGVSZWN0LnJlY3QudG9wOworICAgICAgICAgICAgIG1fc2NyZWVuVyA9IGV2dC0+ZGF0YS52aXNpYmxlUmVjdC5yZWN0LnJpZ2h0IC0gbV9zY3JvbGxYOworICAgICAgICAgICAgIG1fc2NyZWVuSCA9IGV2dC0+ZGF0YS52aXNpYmxlUmVjdC5yZWN0LmJvdHRvbSAtIG1fc2Nyb2xsWTsKKyAgICAgICAgICAgICBtX3pvb20gPSBldnQtPmRhdGEudmlzaWJsZVJlY3Quem9vbVNjYWxlOworICAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICJ6b29tIGV2ZW50ICVnIiwgbV96b29tKTsKKyAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsgICAvLyB1bmtub3duIG9yIHVuaGFuZGxlZCBldmVudAorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2FuaW1hdGlvbi9BbmltYXRpb25QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRmOTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJQbHVnaW5PYmplY3QuaCIKKworI2lmbmRlZiBwbHVnaW5HcmFwaGljc19fREVGSU5FRAorI2RlZmluZSBwbHVnaW5HcmFwaGljc19fREVGSU5FRAorCitjbGFzcyBCYWxsQW5pbWF0aW9uIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgQmFsbEFuaW1hdGlvbihOUFAgaW5zdCk7CisgICAgdmlydHVhbCB+QmFsbEFuaW1hdGlvbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7Citwcml2YXRlOgorICAgIHZvaWQgZHJhdyhBTlBDYW52YXMqKTsKKyAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKKyAgICB2b2lkIGNlbnRlclBsdWdpbk9uU2NyZWVuKCk7CisKKyAgICBmbG9hdCBtX3g7CisgICAgZmxvYXQgbV95OworICAgIGZsb2F0IG1fZHg7CisgICAgZmxvYXQgbV9keTsKKworICAgIGludDMyX3QgbVVuaWNoYXI7CisKKyAgICBBTlBSZWN0RiAgICBtX292YWw7CisgICAgQU5QUGFpbnQqICAgbV9wYWludDsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBTQ0FMRSA9IDAuMTsKKworICAgIGludCBtX3Njcm9sbFg7CisgICAgaW50IG1fc2Nyb2xsWTsKKyAgICBpbnQgbV9zY3JlZW5IOworICAgIGludCBtX3NjcmVlblc7CisgICAgZmxvYXQgbV96b29tOworfTsKKwordWludDMyX3QgZ2V0TVNlY3MoKTsKKworI2VuZGlmIC8vIHBsdWdpbkdyYXBoaWNzX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDM0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJBdWRpb1BsdWdpbi5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QQXVkaW9UcmFja0ludGVyZmFjZVYwIGdTb3VuZEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CisKKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlKSB7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworfQorCitzdGF0aWMgdWludDE2IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgeworICAgIGludCBpeCA9IChpbnQpcm91bmRmKHgpICsgaW5zZXQ7CisgICAgaWYgKGl4IDwgMCkgeworICAgICAgICBpeCA9IDA7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KGl4KTsKK30KKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlLCBjb25zdCBBTlBSZWN0RiYgciwgYm9vbCBkb0FBKSB7CisgICAgY29uc3QgaW50IGluc2V0ID0gZG9BQSA/IC0xIDogMDsKKworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOworICAgIE5QUmVjdCBpbnZhbDsKKyAgICBpbnZhbC5sZWZ0ID0gcm5kMTYoci5sZWZ0LCBpbnNldCk7CisgICAgaW52YWwudG9wID0gcm5kMTYoci50b3AsIGluc2V0KTsKKyAgICBpbnZhbC5yaWdodCA9IHJuZDE2KHIucmlnaHQsIC1pbnNldCk7CisgICAgaW52YWwuYm90dG9tID0gcm5kMTYoci5ib3R0b20sIC1pbnNldCk7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsICZpbnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvQ2FsbGJhY2soQU5QQXVkaW9FdmVudCBldnQsIHZvaWQqIHVzZXIsIEFOUEF1ZGlvQnVmZmVyKiBidWZmZXIpIHsKKyAgICBzd2l0Y2ggKGV2dCkgeworICAgICAgICBjYXNlIGtNb3JlRGF0YV9BTlBBdWRpb0V2ZW50OiB7CisgICAgICAgICAgICBTb3VuZFBsYXkqIHBsYXkgPSByZWludGVycHJldF9jYXN0PFNvdW5kUGxheSo+KHVzZXIpOworICAgICAgICAgICAgc2l6ZV90IGFtb3VudCA9IGZyZWFkKGJ1ZmZlci0+YnVmZmVyRGF0YSwgMSwgYnVmZmVyLT5zaXplLCBwbGF5LT5maWxlKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFtb3VudDsKKyAgICAgICAgICAgIGlmIChhbW91bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGdTb3VuZEkuc3RvcChwbGF5LT50cmFjayk7CisgICAgICAgICAgICAgICAgZmNsb3NlKHBsYXktPmZpbGUpOworICAgICAgICAgICAgICAgIHBsYXktPmZpbGUgPSBOVUxMOworICAgICAgICAgICAgICAgIC8vIFRPRE8gbmVlZCB0byBub3RpZnkgb3VyIG1haW4gdGhyZWFkIHRvIGRlbGV0ZSB0aGUgdHJhY2sgbm93CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwbGF5LT5maWxlU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIHdlIG5lZWQgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBwcm9ncmVzcyB2YWx1ZQorICAgICAgICAgICAgICAgIHBsYXktPnByb2dyZXNzID0gMTsKKyAgICAgICAgICAgICAgICBpbnZhbChwbGF5LT5pbnN0YW5jZSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBdWRpb1BsdWdpbjo6QXVkaW9QbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIGNvbnN0IGNoYXIgcGF0aFtdID0gIi9zZGNhcmQvc2FtcGxlLnJhdyI7CisKKyAgICAvLyBvcGVuIGEgZmlsZSBzdHJlYW0KKyAgICBGSUxFKiBmID0gZm9wZW4ocGF0aCwgInIiKTsKKyAgICBnTG9nSS5sb2coaW5zdCwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0gcGF0aCAlcyBGSUxFICVwIiwgcGF0aCwgZik7CisKKyAgICAvLyBzZXR1cCBvdXIgcHJpdmF0ZSBhdWRpbyBzdHJ1Y3QncyBkZWZhdWx0IHZhbHVlcworICAgIG1fc291bmRQbGF5ID0gbmV3IFNvdW5kUGxheTsKKyAgICBtX3NvdW5kUGxheS0+aW5zdGFuY2UgPSBpbnN0OworICAgIG1fc291bmRQbGF5LT5wcm9ncmVzcyA9IDA7CisgICAgbV9zb3VuZFBsYXktPmZpbGVTaXplID0gMDsKKyAgICBtX3NvdW5kUGxheS0+ZmlsZSA9IGY7CisgICAgbV9zb3VuZFBsYXktPnRyYWNrID0gTlVMTDsKKworICAgIC8vIGNyZWF0ZSB0aGUgYXVkaW8gdHJhY2sKKyAgICBpZiAoZikgeworICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2sgPSBnU291bmRJLm5ld1RyYWNrKDQ0MTAwLCBrUENNMTZCaXRfQU5QU2FtcGxlRm9ybWF0LCAyLCBhdWRpb0NhbGxiYWNrLCBtX3NvdW5kUGxheSk7CisgICAgICAgIGlmICghbV9zb3VuZFBsYXktPnRyYWNrKSB7CisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICBtX3NvdW5kUGxheS0+ZmlsZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBnZXQgdGhlIGF1ZGlvIGZpbGUncyBzaXplCisgICAgaW50IGZpbGVEZXNjcmlwdG9yID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisgICAgc3RydWN0IHN0YXQgZmlsZVN0YXR1czsKKworICAgIGlmKGZpbGVEZXNjcmlwdG9yIDw9IDApIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiZm9wZW4gZXJyb3IiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZnN0YXQoZmlsZURlc2NyaXB0b3IsICZmaWxlU3RhdHVzKSAhPSAwKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRGVidWdfQU5QTG9nVHlwZSwgIkZpbGUgU2l6ZTogJWQiLCBmaWxlU3RhdHVzLnN0X3NpemUpOworICAgICAgICBtX3NvdW5kUGxheS0+ZmlsZVNpemUgPSBmaWxlU3RhdHVzLnN0X3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiZnN0YXQgZXJyb3IiKTsKKyAgICB9CisKKyAgICAvLyBjb25maWd1cmUgdGhlIFVJIGVsZW1lbnRzCisgICAgbV9hY3RpdmVUb3VjaCA9IGZhbHNlOworCisgICAgbWVtc2V0KCZtX3RyYWNrUmVjdCwgMCwgc2l6ZW9mKG1fdHJhY2tSZWN0KSk7CisgICAgbWVtc2V0KCZtX3BsYXlSZWN0LCAgMCwgc2l6ZW9mKG1fcGxheVJlY3QpKTsKKyAgICBtZW1zZXQoJm1fcGF1c2VSZWN0LCAwLCBzaXplb2YobV9wYXVzZVJlY3QpKTsKKyAgICBtZW1zZXQoJm1fc3RvcFJlY3QsICAwLCBzaXplb2YobV9zdG9wUmVjdCkpOworCisgICAgbV9wYWludFRyYWNrID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFRyYWNrLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUcmFjaykgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50VHJhY2ssIDB4RkZDMEMwQzApOworCisgICAgbV9wYWludFJlY3QgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50UmVjdCwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50UmVjdCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50UmVjdCwgMHhGRkE4QThBOCk7CisKKyAgICBtX3BhaW50VGV4dCA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRUZXh0LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUZXh0KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRUZXh0LCAweEZGMkY0RjRGKTsKKyAgICBnUGFpbnRJLnNldFRleHRTaXplKG1fcGFpbnRUZXh0LCAxOCk7CisKKyAgICBtX3BhaW50VHJhY2tQcm9ncmVzcyA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRUcmFja1Byb2dyZXNzLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUcmFja1Byb2dyZXNzKSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRUcmFja1Byb2dyZXNzLCAweEZGNTQ1NDU0KTsKKworICAgIG1fcGFpbnRBY3RpdmVSZWN0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludEFjdGl2ZVJlY3QsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludEFjdGl2ZVJlY3QpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludEFjdGl2ZVJlY3QsIDB4RkY1NDU0NTQpOworCisgICAgQU5QVHlwZWZhY2UqIHRmID0gZ1R5cGVmYWNlSS5jcmVhdGVGcm9tTmFtZSgic2VyaWYiLCBrSXRhbGljX0FOUFR5cGVmYWNlU3R5bGUpOworICAgIGdQYWludEkuc2V0VHlwZWZhY2UobV9wYWludFRleHQsIHRmKTsKKyAgICBnVHlwZWZhY2VJLnVucmVmKHRmKTsKKworICAgIC8vcmVnaXN0ZXIgZm9yIHRvdWNoIGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrVG91Y2hfQU5QRXZlbnRGbGFnOworICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdCwga0FjY2VwdEV2ZW50c19BTlBTZXRWYWx1ZSwgJmZsYWdzKTsKKyAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNlbGVjdGluZyBpbnB1dCBldmVudHMuIik7CisgICAgfQorfQorCitBdWRpb1BsdWdpbjo6fkF1ZGlvUGx1Z2luKCkgeworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludFRyYWNrKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRSZWN0KTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRUZXh0KTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRUcmFja1Byb2dyZXNzKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRBY3RpdmVSZWN0KTsKKyAgICBpZihtX3NvdW5kUGxheS0+dHJhY2spCisgICAgICAgIGdTb3VuZEkuZGVsZXRlVHJhY2sobV9zb3VuZFBsYXktPnRyYWNrKTsKKyAgICBkZWxldGUgbV9zb3VuZFBsYXk7Cit9CisKK2Jvb2wgQXVkaW9QbHVnaW46OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCkgeworICAgIEFOUENhbnZhcyogY2FudmFzID0gZ0NhbnZhc0kubmV3Q2FudmFzKCZiaXRtYXApOworCisgICAgQU5QUmVjdEYgY2xpcFI7CisgICAgY2xpcFIubGVmdCA9IGNsaXAubGVmdDsKKyAgICBjbGlwUi50b3AgPSBjbGlwLnRvcDsKKyAgICBjbGlwUi5yaWdodCA9IGNsaXAucmlnaHQ7CisgICAgY2xpcFIuYm90dG9tID0gY2xpcC5ib3R0b207CisgICAgZ0NhbnZhc0kuY2xpcFJlY3QoY2FudmFzLCAmY2xpcFIpOworCisgICAgZHJhdyhjYW52YXMpOworICAgIGdDYW52YXNJLmRlbGV0ZUNhbnZhcyhjYW52YXMpOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpkcmF3KEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJEcmF3aW5nIik7CisKKyAgICBjb25zdCBmbG9hdCB0cmFja0hlaWdodCA9IDMwOworICAgIGNvbnN0IGZsb2F0IGJ1dHRvbldpZHRoID0gNjA7CisgICAgY29uc3QgZmxvYXQgYnV0dG9uSGVpZ2h0ID0gMzA7CisgICAgY29uc3QgaW50IFcgPSBvYmotPndpbmRvdy0+d2lkdGg7CisgICAgY29uc3QgaW50IEggPSBvYmotPndpbmRvdy0+aGVpZ2h0OworCisgICAgLy8gY29sb3IgdGhlIHBsdWdpbiBjYW52YXMKKyAgICBnQ2FudmFzSS5kcmF3Q29sb3IoY2FudmFzLCAweEZGQ0RDRENEKTsKKworICAgIC8vIGdldCBmb250IG1ldHJpY3MKKyAgICBBTlBGb250TWV0cmljcyBmb250TWV0cmljczsKKyAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKG1fcGFpbnRUZXh0LCAmZm9udE1ldHJpY3MpOworCisgICAgLy8gZHJhdyB0aGUgdHJhY2sgYm94ICgxIHB4IGZyb20gdGhlIGVkZ2UpCisgICAgbV90cmFja1JlY3QubGVmdCA9IDE7CisgICAgbV90cmFja1JlY3QudG9wID0gMTsKKyAgICBtX3RyYWNrUmVjdC5yaWdodCA9IFcgLSAyOworICAgIG1fdHJhY2tSZWN0LmJvdHRvbSA9IDEgKyB0cmFja0hlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3RyYWNrUmVjdCwgbV9wYWludFRyYWNrKTsKKworICAgIC8vIGRyYXcgdGhlIHByb2dyZXNzIGJhcgorICAgIGlmIChtX3NvdW5kUGxheS0+cHJvZ3Jlc3MgPiAwKSB7CisgICAgICAgIC8vIFRPRE8gbmVlZCB0byBkcmF3IHByb2dyZXNzIGJhciB0byBjb3ZlciB0aGUgcHJvcGVyIHBlcmNlbnRhZ2Ugb2YgdGhlIHRyYWNrIGJhcgorICAgICAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3RyYWNrUmVjdCwgbV9wYWludFRyYWNrUHJvZ3Jlc3MpOworICAgIH0KKworICAgIC8vIGRyYXcgdGhlIHBsYXkgYm94ICh1bmRlciB0cmFjayBib3gpCisgICAgbV9wbGF5UmVjdC5sZWZ0ID0gbV90cmFja1JlY3QubGVmdCArIDU7CisgICAgbV9wbGF5UmVjdC50b3AgPSBtX3RyYWNrUmVjdC5ib3R0b20gKyAxMDsKKyAgICBtX3BsYXlSZWN0LnJpZ2h0ID0gbV9wbGF5UmVjdC5sZWZ0ICsgYnV0dG9uV2lkdGg7CisgICAgbV9wbGF5UmVjdC5ib3R0b20gPSBtX3BsYXlSZWN0LnRvcCArIGJ1dHRvbkhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3BsYXlSZWN0LCBnZXRQYWludCgmbV9wbGF5UmVjdCkpOworICAgIC8vIGRyYXcgdGhlIHBsYXkgYm94ICh1bmRlciB0cmFjayBib3gpCisgICAgY29uc3QgY2hhciBwbGF5VGV4dFtdID0gIlBsYXkiOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgcGxheVRleHQsIHNpemVvZihwbGF5VGV4dCktMSwgbV9wbGF5UmVjdC5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX3BsYXlSZWN0LnRvcCAtIGZvbnRNZXRyaWNzLmZUb3AsIG1fcGFpbnRUZXh0KTsKKworICAgIC8vIGRyYXcgdGhlIHBhdXNlIGJveCAodW5kZXIgdHJhY2sgYm94KQorICAgIG1fcGF1c2VSZWN0LmxlZnQgPSBtX3BsYXlSZWN0LnJpZ2h0ICsgMjA7CisgICAgbV9wYXVzZVJlY3QudG9wID0gbV90cmFja1JlY3QuYm90dG9tICsgMTA7CisgICAgbV9wYXVzZVJlY3QucmlnaHQgPSBtX3BhdXNlUmVjdC5sZWZ0ICsgYnV0dG9uV2lkdGg7CisgICAgbV9wYXVzZVJlY3QuYm90dG9tID0gbV9wYXVzZVJlY3QudG9wICsgYnV0dG9uSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fcGF1c2VSZWN0LCBnZXRQYWludCgmbV9wYXVzZVJlY3QpKTsKKyAgICAvLyBkcmF3IHRoZSB0ZXh0IGluIHRoZSBwYXVzZSBib3gKKyAgICBjb25zdCBjaGFyIHBhdXNlVGV4dFtdID0gIlBhdXNlIjsKKyAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIHBhdXNlVGV4dCwgc2l6ZW9mKHBhdXNlVGV4dCktMSwgbV9wYXVzZVJlY3QubGVmdCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgbV9wYXVzZVJlY3QudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFRleHQpOworCisgICAgLy8gZHJhdyB0aGUgc3RvcCBib3ggKHVuZGVyIHRyYWNrIGJveCkKKyAgICBtX3N0b3BSZWN0LmxlZnQgPSBtX3BhdXNlUmVjdC5yaWdodCArIDIwOworICAgIG1fc3RvcFJlY3QudG9wID0gbV90cmFja1JlY3QuYm90dG9tICsgMTA7CisgICAgbV9zdG9wUmVjdC5yaWdodCA9IG1fc3RvcFJlY3QubGVmdCArIGJ1dHRvbldpZHRoOworICAgIG1fc3RvcFJlY3QuYm90dG9tID0gbV9zdG9wUmVjdC50b3AgKyBidXR0b25IZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9zdG9wUmVjdCwgZ2V0UGFpbnQoJm1fc3RvcFJlY3QpKTsKKyAgICAvLyBkcmF3IHRoZSB0ZXh0IGluIHRoZSBwYXVzZSBib3gKKyAgICBjb25zdCBjaGFyIHN0b3BUZXh0W10gPSAiU3RvcCI7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBzdG9wVGV4dCwgc2l6ZW9mKHN0b3BUZXh0KS0xLCBtX3N0b3BSZWN0LmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIG1fc3RvcFJlY3QudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFRleHQpOworfQorCitBTlBQYWludCogQXVkaW9QbHVnaW46OmdldFBhaW50KEFOUFJlY3RGKiBpbnB1dCkgeworICAgIHJldHVybiAoaW5wdXQgPT0gbV9hY3RpdmVSZWN0KSA/IG1fcGFpbnRBY3RpdmVSZWN0IDogbV9wYWludFJlY3Q7Cit9CisKK2ludDE2IEF1ZGlvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXcubW9kZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOgorICAgICAgICAgICAgICAgICAgICBkcmF3UGx1Z2luKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLCBldnQtPmRhdGEuZHJhdy5jbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrVG91Y2hfQU5QRXZlbnRUeXBlOiB7CisgICAgICAgICAgICBpbnQgeCA9IGV2dC0+ZGF0YS50b3VjaC54OworICAgICAgICAgICAgaW50IHkgPSBldnQtPmRhdGEudG91Y2gueTsKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uKSB7CisKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoUmVjdCA9IHZhbGlkVG91Y2goeCx5KTsKKyAgICAgICAgICAgICAgICBpZihtX2FjdGl2ZVRvdWNoUmVjdCkgeworICAgICAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGtVcF9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uICYmIG1fYWN0aXZlVG91Y2gpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVUb3VjaCh4LCB5KTsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtDYW5jZWxfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbikgeworICAgICAgICAgICAgICAgIG1fYWN0aXZlVG91Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KKwordm9pZCBBdWRpb1BsdWdpbjo6aW52YWxBY3RpdmVSZWN0KCkgeworCit9CisKK0FOUFJlY3RGKiBBdWRpb1BsdWdpbjo6dmFsaWRUb3VjaChpbnQgeCwgaW50IHkpIHsKKworICAgIGlmIChtX3BsYXlSZWN0LmxlZnQgJiYgeCA8IG1fcGxheVJlY3QucmlnaHQgJiYgeSA+IG1fcGxheVJlY3QudG9wICYmIHkgPCBtX3BsYXlSZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3BsYXlSZWN0OworICAgIGVsc2UgaWYgKG1fcGF1c2VSZWN0LmxlZnQgJiYgeCA8IG1fcGF1c2VSZWN0LnJpZ2h0ICYmIHkgPiBtX3BhdXNlUmVjdC50b3AgJiYgeSA8IG1fcGF1c2VSZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3BhdXNlUmVjdDsKKyAgICBlbHNlIGlmICh4ID4gbV9zdG9wUmVjdC5sZWZ0ICYmIHggPCBtX3N0b3BSZWN0LnJpZ2h0ICYmIHkgPiBtX3N0b3BSZWN0LnRvcCAmJiB5IDwgbV9zdG9wUmVjdC5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9zdG9wUmVjdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpoYW5kbGVUb3VjaChpbnQgeCwgaW50IHkpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICAvLyBpZiB0aGUgdHJhY2sgaXMgbnVsbCB0aGVuIHJldHVybgorICAgIGlmIChOVUxMID09IG1fc291bmRQbGF5LT50cmFjaykgeworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSAlcCB1bmFibGUgdG8gY3JlYXRlIHRyYWNrIiwKKyAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudFJlY3QgbWF0Y2hlcyB0aGUgYWN0aXZlUmVjdAorICAgIEFOUFJlY3RGKiBjdXJyZW50UmVjdCA9IHZhbGlkVG91Y2goeCx5KTsKKyAgICBpZiAobV9hY3RpdmVUb3VjaFJlY3QgIT0gY3VycmVudFJlY3QpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjdXJyZW50UmVjdCA9PSAmbV9wbGF5UmVjdCkgeworCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIHN0YXJ0aW5nIHRyYWNrICglZCkiLAorICAgICAgICAgICAgICAgICAgbV9zb3VuZFBsYXktPnRyYWNrLCBnU291bmRJLmlzU3RvcHBlZChtX3NvdW5kUGxheS0+dHJhY2spKTsKKworICAgICAgICBpZiAoZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5zdGFydChtX3NvdW5kUGxheS0+dHJhY2spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJlbnRSZWN0ID09ICZtX3BhdXNlUmVjdCkgeworCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIHBhdXNpbmcgdHJhY2sgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2ssIGdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpOworCisgICAgICAgIGlmICghZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5wYXVzZShtX3NvdW5kUGxheS0+dHJhY2spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJlbnRSZWN0ID09ICZtX3N0b3BSZWN0KSB7CisKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgc3RvcHBpbmcgdHJhY2sgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2ssIGdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpOworCisgICAgICAgIGlmICghZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5zdG9wKG1fc291bmRQbGF5LT50cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fc291bmRQbGF5LT5maWxlKSB7CisgICAgICAgICAgICBmc2VlayhtX3NvdW5kUGxheS0+ZmlsZSwgMCwgU0VFS19TRVQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gc2V0IHRoZSBjdXJyZW50UmVjdCB0byBiZSB0aGUgYWN0aXZlUmVjdAorICAgIG1fYWN0aXZlUmVjdCA9IGN1cnJlbnRSZWN0OworICAgIGludmFsKGluc3RhbmNlKTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjlkMzNhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hdWRpby9BdWRpb1BsdWdpbi5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBhdWRpb1BsdWdpbl9fREVGSU5FRAorI2RlZmluZSBhdWRpb1BsdWdpbl9fREVGSU5FRAorCitzdHJ1Y3QgU291bmRQbGF5IHsKKyAgICBOUFAgICAgICAgICAgICAgaW5zdGFuY2U7CisgICAgQU5QQXVkaW9UcmFjayogIHRyYWNrOworICAgIEZJTEUqICAgICAgICAgICBmaWxlOworICAgIGludCAgICAgICAgICAgICBmaWxlU2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgcHJvZ3Jlc3M7IC8vIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwCit9OworCitjbGFzcyBBdWRpb1BsdWdpbiA6IHB1YmxpYyBTdWJQbHVnaW4geworcHVibGljOgorICAgIEF1ZGlvUGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5BdWRpb1BsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7Citwcml2YXRlOgorICAgIHZvaWQgZHJhdyhBTlBDYW52YXMqKTsKKyAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKKworICAgIHZvaWQgaGFuZGxlVG91Y2goaW50IHgsIGludCB5KTsKKyAgICB2b2lkIGludmFsQWN0aXZlUmVjdCgpOworICAgIEFOUFBhaW50KiBnZXRQYWludChBTlBSZWN0RiopOworICAgIEFOUFJlY3RGKiB2YWxpZFRvdWNoKGludCB4LCBpbnQgeSk7CisKKyAgICBBTlBSZWN0RiAgICBtX3RyYWNrUmVjdDsKKyAgICBBTlBSZWN0RiAgICBtX3BsYXlSZWN0OworICAgIEFOUFJlY3RGICAgIG1fcGF1c2VSZWN0OworICAgIEFOUFJlY3RGICAgIG1fc3RvcFJlY3Q7CisKKyAgICBBTlBQYWludCogICBtX3BhaW50VHJhY2s7CisgICAgQU5QUGFpbnQqICAgbV9wYWludFJlY3Q7CisgICAgQU5QUGFpbnQqICAgbV9wYWludFRleHQ7CisKKyAgICBBTlBQYWludCogICBtX3BhaW50VHJhY2tQcm9ncmVzczsKKyAgICBBTlBQYWludCogICBtX3BhaW50QWN0aXZlUmVjdDsKKworICAgIFNvdW5kUGxheSogIG1fc291bmRQbGF5OworCisgICAgYm9vbCAgICAgICAgbV9hY3RpdmVUb3VjaDsKKyAgICBBTlBSZWN0RiogICBtX2FjdGl2ZVRvdWNoUmVjdDsKKyAgICBBTlBSZWN0RiogICBtX2FjdGl2ZVJlY3Q7Cit9OworCisjZW5kaWYgLy8gYXVkaW9QbHVnaW5fX0RFRklORUQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWY1OGNmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwCkBAIC0wLDAgKzEsMzEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIkJhY2tncm91bmRQbHVnaW4uaCIKKyNpbmNsdWRlICJhbmRyb2lkX25wYXBpLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QQml0bWFwSW50ZXJmYWNlVjAgICAgZ0JpdG1hcEk7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgZ0xvZ0k7CitleHRlcm4gQU5QQ2FudmFzSW50ZXJmYWNlVjAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBQYXRoSW50ZXJmYWNlVjAgICAgICBnUGF0aEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgZ1R5cGVmYWNlSTsKKworZXh0ZXJuIHVpbnQzMl90IGdldE1TZWNzKCk7CisKKyNkZWZpbmUgQVJSQVlfQ09VTlQoYXJyYXkpICAgICAgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQorCisvLyNkZWZpbmUgTE9HX0VSUk9SKGluc3QsIHN0cmluZywgcGFyYW1zLi4uKSBnTG9nSS5sb2coaW5zdCwga0Vycm9yX0FOUExvZ1R5cGUsIChsb2dfcHJlZml4ICsgc3RyaW5nKSwgaW5zdCwgcGFyYW1zKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JhY2tncm91bmRQbHVnaW46OkJhY2tncm91bmRQbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIG1fcGFpbnQgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludCwgMHhGRkZGMDAwMCk7CisgICAgZ1BhaW50SS5zZXRUZXh0U2l6ZShtX3BhaW50LCAxNik7CisKKyAgICBBTlBUeXBlZmFjZSogdGYgPSBnVHlwZWZhY2VJLmNyZWF0ZUZyb21OYW1lKCJzZXJpZiIsIGtJdGFsaWNfQU5QVHlwZWZhY2VTdHlsZSk7CisgICAgZ1BhaW50SS5zZXRUeXBlZmFjZShtX3BhaW50LCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL2luaXRpYWxpemUgdmFyaWFibGVzCisgICAgbUZpbmlzaGVkU3RhZ2VPbmUgICA9IGZhbHNlOworICAgIG1GaW5pc2hlZFN0YWdlVHdvICAgPSBmYWxzZTsKKyAgICBtRmluaXNoZWRTdGFnZVRocmVlID0gZmFsc2U7CisKKyAgICAvLyB0ZXN0IGJhc2ljIHBsdWdpbiBmdW5jdGlvbmFsaXR5CisgICAgdGVzdF9sb2dnaW5nKCk7IC8vIGFuZHJvaWQgbG9nZ2luZworICAgIHRlc3RfdGltZXJzKCk7ICAvLyBwbHVnaW4gdGltZXJzCisgICAgdGVzdF9iaXRtYXBzKCk7IC8vIGFuZHJvaWQgYml0bWFwcworfQorCitCYWNrZ3JvdW5kUGx1Z2luOjp+QmFja2dyb3VuZFBsdWdpbigpIHsKK30KKworYm9vbCBCYWNrZ3JvdW5kUGx1Z2luOjpzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwgbW9kZWwpIHsKKyAgICByZXR1cm4gKG1vZGVsID09IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsKTsKK30KKwordm9pZCBCYWNrZ3JvdW5kUGx1Z2luOjpkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCkgeworICAgIEFOUENhbnZhcyogY2FudmFzID0gZ0NhbnZhc0kubmV3Q2FudmFzKCZiaXRtYXApOworCisgICAgQU5QUmVjdEYgY2xpcFI7CisgICAgY2xpcFIubGVmdCA9IGNsaXAubGVmdDsKKyAgICBjbGlwUi50b3AgPSBjbGlwLnRvcDsKKyAgICBjbGlwUi5yaWdodCA9IGNsaXAucmlnaHQ7CisgICAgY2xpcFIuYm90dG9tID0gY2xpcC5ib3R0b207CisgICAgZ0NhbnZhc0kuY2xpcFJlY3QoY2FudmFzLCAmY2xpcFIpOworCisgICAgZHJhdyhjYW52YXMpOworICAgIGdDYW52YXNJLmRlbGV0ZUNhbnZhcyhjYW52YXMpOworfQorCit2b2lkIEJhY2tncm91bmRQbHVnaW46OmRyYXcoQU5QQ2FudmFzKiBjYW52YXMpIHsKKworICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIDB4RkZGRkZGRkYpOworCisgICAgQU5QRm9udE1ldHJpY3MgZm07CisgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhtX3BhaW50LCAmZm0pOworCisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50LCAweEZGMDAwMEZGKTsKKyAgICBjb25zdCBjaGFyIGNbXSA9ICJUaGlzIGlzIGEgYmFja2dyb3VuZCBwbHVnaW4uIjsKKyAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIGMsIHNpemVvZihjKS0xLCAxMCwgLWZtLmZUb3AsIG1fcGFpbnQpOworfQorCitpbnQxNiBCYWNrZ3JvdW5kUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXcubW9kZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOgorICAgICAgICAgICAgICAgICAgICB0ZXN0X2JpdG1hcF90cmFuc3BhcmVuY3koZXZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZHJhd1BsdWdpbihldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcCwgZXZ0LT5kYXRhLmRyYXcuY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8vIHVua25vd24gZHJhd2luZyBtb2RlbAorICAgICAgICAgICAgfQorICAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB0aGUgcGx1Z2luIGRpZCBub3QgcmVxdWVzdCB0b3VjaCBldmVudHMiLCBpbnN0YW5jZSk7CisgICAgICAgIGNhc2Uga0tleV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB0aGUgcGx1Z2luIGRpZCBub3QgcmVxdWVzdCBrZXkgZXZlbnRzIiwgaW5zdGFuY2UpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExPR0dJTkcgVEVTVFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfbG9nZ2luZygpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICAvL0xPR19FUlJPUihpbnN0YW5jZSwgIiAtLS0tLS0gJXAgVGVzdGluZyBMb2cgRXJyb3IiLCBpbnN0YW5jZSk7CisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVGVzdGluZyBMb2cgRXJyb3IiLCBpbnN0YW5jZSk7CisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrV2FybmluZ19BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIExvZyBXYXJuaW5nIiwgaW5zdGFuY2UpOworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIFRlc3RpbmcgTG9nIERlYnVnIiwgaW5zdGFuY2UpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUSU1FUiBURVNUUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFRJTUVSX0lOVEVSVkFMICAgICA1MAorc3RhdGljIHZvaWQgdGltZXJfb25lc2hvdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKTsKK3N0YXRpYyB2b2lkIHRpbWVyX3JlcGVhdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKTsKK3N0YXRpYyB2b2lkIHRpbWVyX25ldmVyZmlyZXMoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCk7CitzdGF0aWMgdm9pZCB0aW1lcl9sYXRlbmN5KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpOworCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfdGltZXJzKCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIC8vU2V0dXAgdGhlIHRlc3RpbmcgY291bnRlcnMKKyAgICBtVGltZXJSZXBlYXRDb3VudCA9IDU7CisgICAgbVRpbWVyTGF0ZW5jeUNvdW50ID0gNTsKKworICAgIC8vIHRlc3QgZm9yIGJvZ3VzIHRpbWVySUQKKyAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIDk5OTk5OSk7CisgICAgLy8gdGVzdCBvbmUtc2hvdAorICAgIGJyb3dzZXItPnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIDEwMCwgZmFsc2UsIHRpbWVyX29uZXNob3QpOworICAgIC8vIHRlc3QgcmVwZWF0CisgICAgYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgNTAsIHRydWUsIHRpbWVyX3JlcGVhdCk7CisgICAgLy8gdGVzdCB0aW1lciBsYXRlbmN5CisgICAgYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgVElNRVJfSU5URVJWQUwsIHRydWUsIHRpbWVyX2xhdGVuY3kpOworICAgIG1TdGFydFRpbWUgPSBtUHJldlRpbWUgPSBnZXRNU2VjcygpOworICAgIC8vIHRlc3QgdW5zY2hlZHVsZSBpbW1lZGlhdGVseQorICAgIHVpbnQzMiBpZCA9IGJyb3dzZXItPnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIDEwMCwgZmFsc2UsIHRpbWVyX25ldmVyZmlyZXMpOworICAgIGJyb3dzZXItPnVuc2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgaWQpOworICAgIC8vIHRlc3QgZG91YmxlIHVuc2NoZWR1bGUgKHNob3VsZCBiZSBuby1vcCkKKyAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIGlkKTsKKworfQorCitzdGF0aWMgdm9pZCB0aW1lcl9vbmVzaG90KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpIHsKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLS0tLS0gb25lc2hvdCB0aW1lclxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX3JlcGVhdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKSB7CisgICAgQmFja2dyb3VuZFBsdWdpbiAqb2JqID0gKChCYWNrZ3JvdW5kUGx1Z2luKikgKChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGEpLT5hY3RpdmVQbHVnaW4pOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0tLS0tIHJlcGVhdCB0aW1lciAlZFxuIiwKKyAgICAgICAgICAgICAgb2JqLT5tVGltZXJSZXBlYXRDb3VudCk7CisgICAgaWYgKC0tb2JqLT5tVGltZXJSZXBlYXRDb3VudCA9PSAwKSB7CisgICAgICAgIGJyb3dzZXItPnVuc2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgdGltZXJJRCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0aW1lcl9uZXZlcmZpcmVzKE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpIHsKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLS0tLS0gdGltZXJfbmV2ZXJmaXJlcyEhIVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2xhdGVuY3koTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworICAgIEJhY2tncm91bmRQbHVnaW4gKm9iaiA9ICgoQmFja2dyb3VuZFBsdWdpbiopICgoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhKS0+YWN0aXZlUGx1Z2luKTsKKworICAgIG9iai0+bVRpbWVyTGF0ZW5jeUN1cnJlbnRDb3VudCArPSAxOworCisgICAgdWludDMyX3Qgbm93ID0gZ2V0TVNlY3MoKTsKKyAgICB1aW50MzJfdCBpbnRlcnZhbCA9IG5vdyAtIG9iai0+bVByZXZUaW1lOworICAgIHVpbnQzMl90IGR1ciA9IG5vdyAtIG9iai0+bVN0YXJ0VGltZTsKKyAgICB1aW50MzJfdCBleHBlY3RlZER1ciA9IG9iai0+bVRpbWVyTGF0ZW5jeUN1cnJlbnRDb3VudCAqIFRJTUVSX0lOVEVSVkFMOworICAgIGludDMyX3QgZHJpZnQgPSBkdXIgLSBleHBlY3RlZER1cjsKKyAgICBpbnQzMl90IGF2Z0RyaWZ0ID0gZHJpZnQgLyBvYmotPm1UaW1lckxhdGVuY3lDdXJyZW50Q291bnQ7CisKKyAgICBvYmotPm1QcmV2VGltZSA9IG5vdzsKKworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsCisgICAgICAgICAgICAgICItLS0tLS0tLSBsYXRlbmN5IHRlc3Q6IFslM2RdIGludGVydmFsICVkIGV4cGVjdGVkICVkLCB0b3RhbCAlZCBleHBlY3RlZCAlZCwgZHJpZnQgJWQgYXZnICVkXG4iLAorICAgICAgICAgICAgICBvYmotPm1UaW1lckxhdGVuY3lDdXJyZW50Q291bnQsIGludGVydmFsLCBUSU1FUl9JTlRFUlZBTCwgZHVyLAorICAgICAgICAgICAgICBleHBlY3RlZER1ciwgZHJpZnQsIGF2Z0RyaWZ0KTsKKworICAgIGlmICgtLW9iai0+bVRpbWVyTGF0ZW5jeUNvdW50ID09IDApIHsKKyAgICAgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCB0aW1lcklEKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJJVE1BUCBURVNUUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCB0ZXN0X2Zvcm1hdHMoTlBQIGluc3RhbmNlKTsKKwordm9pZCBCYWNrZ3JvdW5kUGx1Z2luOjp0ZXN0X2JpdG1hcHMoKSB7CisgICAgdGVzdF9mb3JtYXRzKHRoaXMtPmluc3QoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfZm9ybWF0cyhOUFAgaW5zdGFuY2UpIHsKKworICAgIC8vIFRPRE8gcHVsbCBuYW1lcyBmcm9tIGVudW0gaW4gbnBhcGkgaW5zdGVhZCBvZiBoYXJkY29kaW5nIHRoZW0KKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgQU5QQml0bWFwRm9ybWF0IGZGb3JtYXQ7CisgICAgICAgIGNvbnN0IGNoYXIqICAgICBmTmFtZTsKKyAgICB9IGdSZWNzW10gPSB7CisgICAgICAgIHsga1Vua25vd25fQU5QQml0bWFwRm9ybWF0LCAgICJ1bmtub3duIiB9LAorICAgICAgICB7IGtSR0JBXzg4ODhfQU5QQml0bWFwRm9ybWF0LCAiODg4OCIgfSwKKyAgICAgICAgeyBrUkdCXzU2NV9BTlBCaXRtYXBGb3JtYXQsICAgIjU2NSIgfSwKKyAgICB9OworCisgICAgQU5QUGl4ZWxQYWNraW5nIHBhY2tpbmc7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9DT1VOVChnUmVjcyk7IGkrKykgeworICAgICAgICBpZiAoZ0JpdG1hcEkuZ2V0UGl4ZWxQYWNraW5nKGdSZWNzW2ldLmZGb3JtYXQsICZwYWNraW5nKSkgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAicGl4ZWwgZm9ybWF0IFslZF0gJXMgaGFzIHBhY2tpbmcgQVJHQiBbJWQgJWRdIFslZCAlZF0gWyVkICVkXSBbJWQgJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGdSZWNzW2ldLmZGb3JtYXQsIGdSZWNzW2ldLmZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHBhY2tpbmcuQVNoaWZ0LCBwYWNraW5nLkFCaXRzLAorICAgICAgICAgICAgICAgICAgICAgIHBhY2tpbmcuUlNoaWZ0LCBwYWNraW5nLlJCaXRzLAorICAgICAgICAgICAgICAgICAgICAgIHBhY2tpbmcuR1NoaWZ0LCBwYWNraW5nLkdCaXRzLAorICAgICAgICAgICAgICAgICAgICAgIHBhY2tpbmcuQlNoaWZ0LCBwYWNraW5nLkJCaXRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgInBpeGVsIGZvcm1hdCBbJWRdICVzIGhhcyBubyBwYWNraW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGdSZWNzW2ldLmZGb3JtYXQsIGdSZWNzW2ldLmZOYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCYWNrZ3JvdW5kUGx1Z2luOjp0ZXN0X2JpdG1hcF90cmFuc3BhcmVuY3koY29uc3QgQU5QRXZlbnQqIGV2dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIC8vIGNoZWNrIGRlZmF1bHQgJiBzZXQgdHJhbnNwYXJlbnQKKyAgICBpZiAoIW1GaW5pc2hlZFN0YWdlT25lKSB7CisKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIkJFR0lOOiB0ZXN0aW5nIGJpdG1hcCB0cmFuc3BhcmVuY3kiKTsKKworICAgICAgICAvL2NoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcyBub3QgdHJhbnNwYXJlbnQKKyAgICAgICAgaWYgKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLmZvcm1hdCA9PSBrUkdCQV84ODg4X0FOUEJpdG1hcEZvcm1hdCkgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgImJpdG1hcCBkZWZhdWx0IGZvcm1hdCBpcyB0cmFuc3BhcmVudCIpOworICAgICAgICB9CisKKyAgICAgICAgLy9tYWtlIGl0IHRyYW5zcGFyZW50IChhbnkgbm9uLW51bGwgdmFsdWUgd2lsbCBzZXQgaXQgdG8gdHJ1ZSkKKyAgICAgICAgYm9vbCB2YWx1ZSA9IHRydWU7CisgICAgICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdGFuY2UsIE5QUFZwbHVnaW5UcmFuc3BhcmVudEJvb2wsICZ2YWx1ZSk7CisgICAgICAgIGlmIChlcnIgIT0gTlBFUlJfTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZXR0aW5nIHRyYW5zcGFyZW5jeS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIG1GaW5pc2hlZFN0YWdlT25lID0gdHJ1ZTsKKyAgICAgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworICAgIH0KKyAgICAvLyBjaGVjayB0cmFuc3BhcmVudCAmIHNldCBvcGFxdWUKKyAgICBlbHNlIGlmICghbUZpbmlzaGVkU3RhZ2VUd28pIHsKKworICAgICAgICAvL2NoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcyB0cmFuc3BhcmVudAorICAgICAgICBpZiAoZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0ICE9IGtSR0JBXzg4ODhfQU5QQml0bWFwRm9ybWF0KSB7CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiYml0bWFwIGRpZCBub3QgY2hhbmdlIHRvIHRyYW5zcGFyZW50IGZvcm1hdCIpOworICAgICAgICB9CisKKyAgICAgICAgLy9tYWtlIGl0IG9wYXF1ZQorICAgICAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3RhbmNlLCBOUFBWcGx1Z2luVHJhbnNwYXJlbnRCb29sLCBOVUxMKTsKKyAgICAgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNldHRpbmcgdHJhbnNwYXJlbmN5LiIpOworICAgICAgICB9CisKKyAgICAgICAgbUZpbmlzaGVkU3RhZ2VUd28gPSB0cnVlOworICAgIH0KKyAgICAvLyBjaGVjayBvcGFxdWUKKyAgICBlbHNlIGlmICghbUZpbmlzaGVkU3RhZ2VUaHJlZSkgeworCisgICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIG5vdCB0cmFuc3BhcmVudAorICAgICAgICBpZiAoZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0ID09IGtSR0JBXzg4ODhfQU5QQml0bWFwRm9ybWF0KSB7CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiYml0bWFwIGRlZmF1bHQgZm9ybWF0IGlzIHRyYW5zcGFyZW50Iik7CisgICAgICAgIH0KKworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiRU5EOiB0ZXN0aW5nIGJpdG1hcCB0cmFuc3BhcmVuY3kiKTsKKworICAgICAgICBtRmluaXNoZWRTdGFnZVRocmVlID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODkzYzlkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCisjaWZuZGVmIGJhY2tncm91bmRQbHVnaW5fX0RFRklORUQKKyNkZWZpbmUgYmFja2dyb3VuZFBsdWdpbl9fREVGSU5FRAorCitjbGFzcyBCYWNrZ3JvdW5kUGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgQmFja2dyb3VuZFBsdWdpbihOUFAgaW5zdCk7CisgICAgdmlydHVhbCB+QmFja2dyb3VuZFBsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisKKyAgICAvLyBUaW1lciBUZXN0aW5nIFZhcmlhYmxlcworICAgIHVpbnQzMl90IG1TdGFydFRpbWU7CisgICAgdWludDMyX3QgbVByZXZUaW1lOworICAgIGludCAgICAgIG1UaW1lclJlcGVhdENvdW50OworICAgIGludCAgICAgIG1UaW1lckxhdGVuY3lDb3VudDsKKyAgICBpbnQgICAgICBtVGltZXJMYXRlbmN5Q3VycmVudENvdW50OworCisgICAgLy8gQml0bWFwIFRyYW5zcGFyZW5jeSBWYXJpYWJsZXMKKyAgICBib29sIG1GaW5pc2hlZFN0YWdlT25lOyAgIC8vIGNoZWNrIGRlZmF1bHQgJiBzZXQgdHJhbnNwYXJlbnQKKyAgICBib29sIG1GaW5pc2hlZFN0YWdlVHdvOyAgIC8vIGNoZWNrIHRyYW5zcGFyZW50ICYgc2V0IG9wYXF1ZQorICAgIGJvb2wgbUZpbmlzaGVkU3RhZ2VUaHJlZTsgLy8gY2hlY2sgb3BhcXVlCisKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOworICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOworCisgICAgQU5QUGFpbnQqICAgbV9wYWludDsKKworICAgIHZvaWQgdGVzdF9sb2dnaW5nKCk7CisgICAgdm9pZCB0ZXN0X3RpbWVycygpOworICAgIHZvaWQgdGVzdF9iaXRtYXBzKCk7CisgICAgdm9pZCB0ZXN0X2JpdG1hcF90cmFuc3BhcmVuY3koY29uc3QgQU5QRXZlbnQqIGV2dCk7CisKK307CisKKyNlbmRpZiAvLyBiYWNrZ3JvdW5kUGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiNGM2YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcApAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJGb3JtUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CitleHRlcm4gQU5QV2luZG93SW50ZXJmYWNlVjAgICAgIGdXaW5kb3dJOworCisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSkgeworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKK30KKworc3RhdGljIHVpbnQxNiBybmQxNihmbG9hdCB4LCBpbnQgaW5zZXQpIHsKKyAgICBpbnQgaXggPSAoaW50KXJvdW5kZih4KSArIGluc2V0OworICAgIGlmIChpeCA8IDApIHsKKyAgICAgICAgaXggPSAwOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2PihpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QUmVjdEYmIHIsIGJvb2wgZG9BQSkgeworICAgIGNvbnN0IGludCBpbnNldCA9IGRvQUEgPyAtMSA6IDA7CisKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBOUFJlY3QgaW52YWw7CisgICAgaW52YWwubGVmdCA9IHJuZDE2KHIubGVmdCwgaW5zZXQpOworICAgIGludmFsLnRvcCA9IHJuZDE2KHIudG9wLCBpbnNldCk7CisgICAgaW52YWwucmlnaHQgPSBybmQxNihyLnJpZ2h0LCAtaW5zZXQpOworICAgIGludmFsLmJvdHRvbSA9IHJuZDE2KHIuYm90dG9tLCAtaW5zZXQpOworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCAmaW52YWwpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0Zvcm1QbHVnaW46OkZvcm1QbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIG1faGFzRm9jdXMgPSBmYWxzZTsKKyAgICBtX2FjdGl2ZUlucHV0ID0gTlVMTDsKKworICAgIG1lbXNldCgmbV91c2VybmFtZUlucHV0LCAwLCBzaXplb2YobV91c2VybmFtZUlucHV0KSk7CisgICAgbWVtc2V0KCZtX3Bhc3N3b3JkSW5wdXQsIDAsIHNpemVvZihtX3Bhc3N3b3JkSW5wdXQpKTsKKworICAgIG1fdXNlcm5hbWVJbnB1dC50ZXh0WzBdID0gJ1wwJzsKKyAgICBtX3VzZXJuYW1lSW5wdXQuY2hhclB0ciA9IDA7CisKKyAgICBtX3Bhc3N3b3JkSW5wdXQudGV4dFswXSA9ICdcMCc7CisgICAgbV9wYXNzd29yZElucHV0LmNoYXJQdHIgPSAwOworCisgICAgbV9wYWludElucHV0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludElucHV0LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRJbnB1dCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50SW5wdXQsIDB4RkZGRkZGRkYpOworCisgICAgbV9wYWludEFjdGl2ZSA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRBY3RpdmUsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludEFjdGl2ZSkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50QWN0aXZlLCAweEZGRkZGRjAwKTsKKworICAgIG1fcGFpbnRUZXh0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFRleHQsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludFRleHQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludFRleHQsIDB4RkYwMDAwMDApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUobV9wYWludFRleHQsIDE4KTsKKworICAgIEFOUFR5cGVmYWNlKiB0ZiA9IGdUeXBlZmFjZUkuY3JlYXRlRnJvbU5hbWUoInNlcmlmIiwga0l0YWxpY19BTlBUeXBlZmFjZVN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFR5cGVmYWNlKG1fcGFpbnRUZXh0LCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL3JlZ2lzdGVyIGZvciBrZXkgYW5kIHZpc2libGVSZWN0IGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrS2V5X0FOUEV2ZW50RmxhZyB8IGtWaXNpYmxlUmVjdF9BTlBFdmVudEZsYWc7CisgICAgTlBFcnJvciBlcnIgPSBicm93c2VyLT5zZXR2YWx1ZShpbnN0LCBrQWNjZXB0RXZlbnRzX0FOUFNldFZhbHVlLCAmZmxhZ3MpOworICAgIGlmIChlcnIgIT0gTlBFUlJfTk9fRVJST1IpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiRXJyb3Igc2VsZWN0aW5nIGlucHV0IGV2ZW50cy4iKTsKKyAgICB9Cit9CisKK0Zvcm1QbHVnaW46On5Gb3JtUGx1Z2luKCkgeworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludElucHV0KTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRBY3RpdmUpOworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludFRleHQpOworfQorCitib29sIEZvcm1QbHVnaW46OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIEZvcm1QbHVnaW46OmRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKSB7CisgICAgQU5QQ2FudmFzKiBjYW52YXMgPSBnQ2FudmFzSS5uZXdDYW52YXMoJmJpdG1hcCk7CisKKyAgICBBTlBSZWN0RiBjbGlwUjsKKyAgICBjbGlwUi5sZWZ0ID0gY2xpcC5sZWZ0OworICAgIGNsaXBSLnRvcCA9IGNsaXAudG9wOworICAgIGNsaXBSLnJpZ2h0ID0gY2xpcC5yaWdodDsKKyAgICBjbGlwUi5ib3R0b20gPSBjbGlwLmJvdHRvbTsKKyAgICBnQ2FudmFzSS5jbGlwUmVjdChjYW52YXMsICZjbGlwUik7CisKKyAgICBkcmF3KGNhbnZhcyk7CisgICAgZ0NhbnZhc0kuZGVsZXRlQ2FudmFzKGNhbnZhcyk7Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6ZHJhdyhBTlBDYW52YXMqIGNhbnZhcykgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisKKyAgICBjb25zdCBmbG9hdCBpbnB1dFdpZHRoID0gNjA7CisgICAgY29uc3QgZmxvYXQgaW5wdXRIZWlnaHQgPSAzMDsKKyAgICBjb25zdCBpbnQgVyA9IG9iai0+d2luZG93LT53aWR0aDsKKyAgICBjb25zdCBpbnQgSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7CisKKyAgICAvLyBjb2xvciB0aGUgcGx1Z2luIGNhbnZhcworICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIChtX2hhc0ZvY3VzKSA/IDB4RkZDRENEQ0QgOiAweEZGNTQ1NDU0KTsKKworICAgIC8vIGRyYXcgdGhlIHVzZXJuYW1lIGJveCAoNSBweCBmcm9tIHRoZSB0b3AgZWRnZSkKKyAgICBtX3VzZXJuYW1lSW5wdXQucmVjdC5sZWZ0ID0gNTsKKyAgICBtX3VzZXJuYW1lSW5wdXQucmVjdC50b3AgPSA1OworICAgIG1fdXNlcm5hbWVJbnB1dC5yZWN0LnJpZ2h0ID0gVyAtIDU7CisgICAgbV91c2VybmFtZUlucHV0LnJlY3QuYm90dG9tID0gbV91c2VybmFtZUlucHV0LnJlY3QudG9wICsgaW5wdXRIZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV91c2VybmFtZUlucHV0LnJlY3QsIGdldFBhaW50KCZtX3VzZXJuYW1lSW5wdXQpKTsKKyAgICBkcmF3VGV4dChjYW52YXMsIG1fdXNlcm5hbWVJbnB1dCk7CisKKyAgICAvLyBkcmF3IHRoZSBwYXNzd29yZCBib3ggKDUgcHggZnJvbSB0aGUgYm90dG9tIGVkZ2UpCisgICAgbV9wYXNzd29yZElucHV0LnJlY3QubGVmdCA9IDU7CisgICAgbV9wYXNzd29yZElucHV0LnJlY3QudG9wID0gSCAtIChpbnB1dEhlaWdodCArIDUpOworICAgIG1fcGFzc3dvcmRJbnB1dC5yZWN0LnJpZ2h0ID0gVyAtIDU7CisgICAgbV9wYXNzd29yZElucHV0LnJlY3QuYm90dG9tID0gbV9wYXNzd29yZElucHV0LnJlY3QudG9wICsgaW5wdXRIZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9wYXNzd29yZElucHV0LnJlY3QsIGdldFBhaW50KCZtX3Bhc3N3b3JkSW5wdXQpKTsKKyAgICBkcmF3UGFzc3dvcmQoY2FudmFzLCBtX3Bhc3N3b3JkSW5wdXQpOworCisgICAgLy9pbnZhbGlkYXRlIHRoZSBjYW52YXMKKyAgICAvL2ludmFsKGluc3RhbmNlKTsKK30KKworQU5QUGFpbnQqIEZvcm1QbHVnaW46OmdldFBhaW50KFRleHRJbnB1dCogaW5wdXQpIHsKKyAgICByZXR1cm4gKGlucHV0ID09IG1fYWN0aXZlSW5wdXQpID8gbV9wYWludEFjdGl2ZSA6IG1fcGFpbnRJbnB1dDsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpkcmF3VGV4dChBTlBDYW52YXMqIGNhbnZhcywgVGV4dElucHV0IHRleHRJbnB1dCkgeworCisgICAgLy8gZ2V0IGZvbnQgbWV0cmljcworICAgIEFOUEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOworICAgIGdQYWludEkuZ2V0Rm9udE1ldHJpY3MobV9wYWludFRleHQsICZmb250TWV0cmljcyk7CisKKyAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIHRleHRJbnB1dC50ZXh0LCB0ZXh0SW5wdXQuY2hhclB0ciwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW5wdXQucmVjdC5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW5wdXQucmVjdC5ib3R0b20gLSBmb250TWV0cmljcy5mQm90dG9tLCBtX3BhaW50VGV4dCk7Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6ZHJhd1Bhc3N3b3JkKEFOUENhbnZhcyogY2FudmFzLCBUZXh0SW5wdXQgcGFzc3dvcmRJbnB1dCkgeworCisgICAgLy8gZ2V0IGZvbnQgbWV0cmljcworICAgIEFOUEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOworICAgIGdQYWludEkuZ2V0Rm9udE1ldHJpY3MobV9wYWludFRleHQsICZmb250TWV0cmljcyk7CisKKyAgICAvLyBjb21wdXQgdGhlIGNpcmNsZSBkaW1lbnNpb25zIGFuZCBpbml0aWFsIGxvY2F0aW9uCisgICAgZmxvYXQgaW5pdGlhbFggPSBwYXNzd29yZElucHV0LnJlY3QubGVmdCArIDU7CisgICAgZmxvYXQgb3ZhbEJvdHRvbSA9IHBhc3N3b3JkSW5wdXQucmVjdC5ib3R0b20gLSAyOworICAgIGZsb2F0IG92YWxUb3AgPSBvdmFsQm90dG9tIC0gKGZvbnRNZXRyaWNzLmZCb3R0b20gLSBmb250TWV0cmljcy5mVG9wKTsKKyAgICBmbG9hdCBvdmFsV2lkdGggPSBvdmFsQm90dG9tIC0gb3ZhbFRvcDsKKyAgICBmbG9hdCBvdmFsU3BhY2luZyA9IDM7CisKKyAgICAvLyBkcmF3IGNpcmNsZXMgaW5zdGVhZCBvZiB0aGUgYWN0dWFsIHRleHQKKyAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgcGFzc3dvcmRJbnB1dC5jaGFyUHRyOyB4KyspIHsKKyAgICAgICAgQU5QUmVjdEYgb3ZhbDsKKyAgICAgICAgb3ZhbC5sZWZ0ID0gaW5pdGlhbFggKyAoKG92YWxXaWR0aCArIG92YWxTcGFjaW5nKSAqIChmbG9hdCkgeCk7CisgICAgICAgIG92YWwucmlnaHQgPSBvdmFsLmxlZnQgKyBvdmFsV2lkdGg7CisgICAgICAgIG92YWwudG9wID0gb3ZhbFRvcDsKKyAgICAgICAgb3ZhbC5ib3R0b20gPSBvdmFsQm90dG9tOworICAgICAgICBnQ2FudmFzSS5kcmF3T3ZhbChjYW52YXMsICZvdmFsLCBtX3BhaW50VGV4dCk7CisgICAgfQorfQorCitpbnQxNiBGb3JtUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXcubW9kZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOgorICAgICAgICAgICAgICAgICAgICBkcmF3UGx1Z2luKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLCBldnQtPmRhdGEuZHJhdy5jbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtMaWZlY3ljbGVfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgaWYgKGV2dC0+ZGF0YS5saWZlY3ljbGUuYWN0aW9uID09IGtMb3NlRm9jdXNfQU5QTGlmZWN5Y2xlQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBMb29zaW5nIEZvY3VzIiwgaW5zdGFuY2UpOworCisgICAgICAgICAgICAgICAgaWYgKG1fYWN0aXZlSW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUga2V5Ym9hcmQKKyAgICAgICAgICAgICAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9yZXNldCB0aGUgYWN0aXZlSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgbV9hY3RpdmVJbnB1dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbV9oYXNGb2N1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludmFsKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGV2dC0+ZGF0YS5saWZlY3ljbGUuYWN0aW9uID09IGtHYWluRm9jdXNfQU5QTGlmZWN5Y2xlQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBHYWluaW5nIEZvY3VzIiwgaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIG1faGFzRm9jdXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGludmFsKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga01vdXNlX0FOUEV2ZW50VHlwZTogeworCisgICAgICAgICAgICBpbnQgeCA9IGV2dC0+ZGF0YS5tb3VzZS54OworICAgICAgICAgICAgaW50IHkgPSBldnQtPmRhdGEubW91c2UueTsKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBNb3VzZUFjdGlvbiA9PSBldnQtPmRhdGEubW91c2UuYWN0aW9uKSB7CisKKyAgICAgICAgICAgICAgICBUZXh0SW5wdXQqIGN1cnJlbnRJbnB1dCA9IHZhbGlkVGFwKHgseSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudElucHV0KQorICAgICAgICAgICAgICAgICAgICBnV2luZG93SS5zaG93S2V5Ym9hcmQoaW5zdGFuY2UsIHRydWUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fYWN0aXZlSW5wdXQpCisgICAgICAgICAgICAgICAgICAgIGdXaW5kb3dJLnNob3dLZXlib2FyZChpbnN0YW5jZSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbnB1dCAhPSBtX2FjdGl2ZUlucHV0KQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2hBY3RpdmVJbnB1dChjdXJyZW50SW5wdXQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga0tleV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmtleS5hY3Rpb24gPT0ga0Rvd25fQU5QS2V5QWN0aW9uKSB7CisKKyAgICAgICAgICAgICAgICAvL2hhbmRsZSBuYXZpZ2F0aW9uIGtleXMKKyAgICAgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmtleS5uYXRpdmVDb2RlID49IGtEcGFkVXBfQU5QS2V5Q29kZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXZ0LT5kYXRhLmtleS5uYXRpdmVDb2RlIDw9IGtEcGFkQ2VudGVyX0FOUEtleUNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU5hdmlnYXRpb24oZXZ0LT5kYXRhLmtleS5uYXRpdmVDb2RlKSA/IDEgOiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX2FjdGl2ZUlucHV0KSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRJbnB1dChtX2FjdGl2ZUlucHV0LCBldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5LnVuaWNoYXIpOworICAgICAgICAgICAgICAgICAgICBpbnZhbChpbnN0YW5jZSwgbV9hY3RpdmVJbnB1dC0+cmVjdCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgY2FzZSBrVmlzaWJsZVJlY3RfQU5QRXZlbnRUeXBlOiB7CisKKyAgICAgICAgICAgIGludCBvbGRTY3JlZW5XID0gbV92aXNpYmxlUmVjdC5yaWdodCAtIG1fdmlzaWJsZVJlY3QubGVmdDsKKyAgICAgICAgICAgIGludCBvbGRTY3JlZW5IID0gbV92aXNpYmxlUmVjdC5ib3R0b20gLSBtX3Zpc2libGVSZWN0LnRvcDsKKworICAgICAgICAgICAgbV92aXNpYmxlUmVjdCA9IGV2dC0+ZGF0YS52aXNpYmxlUmVjdC5yZWN0OworCisgICAgICAgICAgICBpbnQgbmV3U2NyZWVuVyA9IG1fdmlzaWJsZVJlY3QucmlnaHQgLSBtX3Zpc2libGVSZWN0LmxlZnQ7CisgICAgICAgICAgICBpbnQgbmV3U2NyZWVuSCA9IG1fdmlzaWJsZVJlY3QuYm90dG9tIC0gbV92aXNpYmxlUmVjdC50b3A7CisKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZUlucHV0ICYmIChvbGRTY3JlZW5XICE9IG5ld1NjcmVlblcgfHwgb2xkU2NyZWVuSCAhPSBuZXdTY3JlZW5IKSkKKyAgICAgICAgICAgICAgICBzY3JvbGxJbnRvVmlldyhtX2FjdGl2ZUlucHV0KTsKKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6c3dpdGNoQWN0aXZlSW5wdXQoVGV4dElucHV0KiBuZXdJbnB1dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIGlmIChtX2FjdGl2ZUlucHV0KQorICAgICAgICBpbnZhbChpbnN0YW5jZSwgbV9hY3RpdmVJbnB1dC0+cmVjdCwgdHJ1ZSk7IC8vIGludmFsIHRoZSBvbGQKKworICAgIG1fYWN0aXZlSW5wdXQgPSBuZXdJbnB1dDsgLy8gc2V0IHRoZSBuZXcgYWN0aXZlIGlucHV0CisKKyAgICBpZiAobV9hY3RpdmVJbnB1dCkKKyAgICAgICAgaW52YWwoaW5zdGFuY2UsIG1fYWN0aXZlSW5wdXQtPnJlY3QsIHRydWUpOyAvLyBpbnZhbCB0aGUgbmV3Cit9CisKK2Jvb2wgRm9ybVBsdWdpbjo6aGFuZGxlTmF2aWdhdGlvbihBTlBLZXlDb2RlIGtleUNvZGUpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIFJlY3ZkIE5hdiBLZXkgJWQiLCBpbnN0YW5jZSwga2V5Q29kZSk7CisKKyAgICBpZiAoIW1fYWN0aXZlSW5wdXQpIHsKKyAgICAgICAgc3dpdGNoQWN0aXZlSW5wdXQoJm1fdXNlcm5hbWVJbnB1dCk7CisgICAgICAgIHNjcm9sbEludG9WaWV3KG1fYWN0aXZlSW5wdXQpOworICAgIH0KKyAgICBlbHNlIGlmIChtX2FjdGl2ZUlucHV0ID09ICZtX3VzZXJuYW1lSW5wdXQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0ga0RwYWREb3duX0FOUEtleUNvZGUpIHsKKyAgICAgICAgICAgIHN3aXRjaEFjdGl2ZUlucHV0KCZtX3Bhc3N3b3JkSW5wdXQpOworICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcobV9hY3RpdmVJbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoa2V5Q29kZSA9PSBrRHBhZENlbnRlcl9BTlBLZXlDb2RlKQorICAgICAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCBmYWxzZSk7CisgICAgICAgIGVsc2UgaWYgKGtleUNvZGUgPT0ga0RwYWRVcF9BTlBLZXlDb2RlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmIChtX2FjdGl2ZUlucHV0ID09ICZtX3Bhc3N3b3JkSW5wdXQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0ga0RwYWRVcF9BTlBLZXlDb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2hBY3RpdmVJbnB1dCgmbV91c2VybmFtZUlucHV0KTsKKyAgICAgICAgICAgIHNjcm9sbEludG9WaWV3KG1fYWN0aXZlSW5wdXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGtleUNvZGUgPT0ga0RwYWRDZW50ZXJfQU5QS2V5Q29kZSkKKyAgICAgICAgICAgIGdXaW5kb3dJLnNob3dLZXlib2FyZChpbnN0YW5jZSwgZmFsc2UpOworICAgICAgICBlbHNlIGlmIChrZXlDb2RlID09IGtEcGFkRG93bl9BTlBLZXlDb2RlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvcm1QbHVnaW46OmhhbmRsZVRleHRJbnB1dChUZXh0SW5wdXQqIGlucHV0LCBBTlBLZXlDb2RlIGtleUNvZGUsIGludDMyX3QgdW5pY2hhcikgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIC8vbWFrZSBzdXJlIHRoZSBpbnB1dCBmaWVsZCBpcyBpbiB2aWV3CisgICAgc2Nyb2xsSW50b1ZpZXcoaW5wdXQpOworCisgICAgLy9oYW5kbGUgdGhlIGRlbGV0ZSBvcGVyYXRpb24KKyAgICBpZiAoa2V5Q29kZSA9PSBrRGVsX0FOUEtleUNvZGUpIHsKKyAgICAgICAgaWYgKGlucHV0LT5jaGFyUHRyID4gMCkgeworICAgICAgICAgICAgaW5wdXQtPmNoYXJQdHItLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9jaGVjayB0byBzZWUgdGhhdCB0aGUgaW5wdXQgaXMgbm90IGZ1bGwKKyAgICBpZiAoaW5wdXQtPmNoYXJQdHIgPj0gKHNpemVvZihpbnB1dC0+dGV4dCkgLSAxKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy9hZGQgdGhlIGNoYXJhY3RlcgorICAgIGlucHV0LT50ZXh0W2lucHV0LT5jaGFyUHRyXSA9IHN0YXRpY19jYXN0PGNoYXI+KHVuaWNoYXIpOworICAgIGlucHV0LT5jaGFyUHRyKys7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIFRleHQ6ICAlYyIsIGluc3RhbmNlLCB1bmljaGFyKTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpzY3JvbGxJbnRvVmlldyhUZXh0SW5wdXQqIGlucHV0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKyAgICBOUFdpbmRvdyAqd2luZG93ID0gb2JqLT53aW5kb3c7CisKKyAgICAvLyBmaW5kIHRoZSB0ZXh0SW5wdXQncyBnbG9iYWwgcmVjdCBjb29yZGluYXRlcworICAgIEFOUFJlY3RJIGlucHV0UmVjdDsKKyAgICBpbnB1dFJlY3QubGVmdCA9IHdpbmRvdy0+eCArIGlucHV0LT5yZWN0LmxlZnQ7CisgICAgaW5wdXRSZWN0LnRvcCA9IHdpbmRvdy0+eSArIGlucHV0LT5yZWN0LnRvcDsKKyAgICBpbnB1dFJlY3QucmlnaHQgPSBpbnB1dFJlY3QubGVmdCArIChpbnB1dC0+cmVjdC5yaWdodCAtIGlucHV0LT5yZWN0LmxlZnQpOworICAgIGlucHV0UmVjdC5ib3R0b20gPSBpbnB1dFJlY3QudG9wICsgKGlucHV0LT5yZWN0LmJvdHRvbSAtIGlucHV0LT5yZWN0LnRvcCk7CisKKyAgICAvLyBpZiB0aGUgcmVjdCBpcyBjb250YWluZWQgd2l0aGluIHZpc2libGUgd2luZG93IHRoZW4gZG8gbm90aGluZworICAgIGlmIChpbnB1dFJlY3QubGVmdCA+IG1fdmlzaWJsZVJlY3QubGVmdAorICAgICAgICAgICAgJiYgaW5wdXRSZWN0LnJpZ2h0IDwgbV92aXNpYmxlUmVjdC5yaWdodAorICAgICAgICAgICAgJiYgaW5wdXRSZWN0LnRvcCA+IG1fdmlzaWJsZVJlY3QudG9wCisgICAgICAgICAgICAmJiBpbnB1dFJlY3QuYm90dG9tIDwgbV92aXNpYmxlUmVjdC5ib3R0b20pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGZpbmQgdGhlIGdsb2JhbCAoeCx5KSBjb29yZGluYXRlcyBmb3IgY2VudGVyIG9mIHRoZSB0ZXh0SW5wdXQKKyAgICBpbnQgaW5wdXRDZW50ZXJYID0gaW5wdXRSZWN0LmxlZnQgKyAoKGlucHV0UmVjdC5yaWdodCAtIGlucHV0UmVjdC5sZWZ0KS8yKTsKKyAgICBpbnQgaW5wdXRDZW50ZXJZID0gaW5wdXRSZWN0LnRvcCArICgoaW5wdXRSZWN0LmJvdHRvbSAtIGlucHV0UmVjdC50b3ApLzIpOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgSW5wdXQgQ2VudGVyOiAlZCwlZCA6ICVkLCVkIiwKKyAgICAgICAgICAgICAgaW5zdGFuY2UsIGlucHV0Q2VudGVyWCwgaW5wdXRDZW50ZXJZLCB3aW5kb3ctPngsIHdpbmRvdy0+eSk7CisKKyAgICAvL2ZpbmQgZ2xvYmFsICh4LHkpIGNvb3JkaW5hdGVzIGZvciBjZW50ZXIgb2YgdGhlIHZpc2libGUgc2NyZWVuCisgICAgaW50IHNjcmVlbkNlbnRlclggPSBtX3Zpc2libGVSZWN0LmxlZnQgKyAoKG1fdmlzaWJsZVJlY3QucmlnaHQgLSBtX3Zpc2libGVSZWN0LmxlZnQpLzIpOworICAgIGludCBzY3JlZW5DZW50ZXJZID0gbV92aXNpYmxlUmVjdC50b3AgKyAoKG1fdmlzaWJsZVJlY3QuYm90dG9tIC0gbV92aXNpYmxlUmVjdC50b3ApLzIpOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgU2NyZWVuIENlbnRlcjogJWQsJWQgOiAlZCwlZCIsCisgICAgICAgICAgICAgIGluc3RhbmNlLCBzY3JlZW5DZW50ZXJYLCBzY3JlZW5DZW50ZXJZLCBtX3Zpc2libGVSZWN0LmxlZnQsIG1fdmlzaWJsZVJlY3QudG9wKTsKKworICAgIC8vY29tcHV0ZSB0aGUgZGVsdGEgb2YgdGhlIHR3byBjb29yZGluYXRlcworICAgIGludCBkZWx0YVggPSBpbnB1dENlbnRlclggLSBzY3JlZW5DZW50ZXJYOworICAgIGludCBkZWx0YVkgPSBpbnB1dENlbnRlclkgLSBzY3JlZW5DZW50ZXJZOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgQ2VudGVyaW5nOiAlZCwlZCA6ICVkLCVkIiwKKyAgICAgICAgICAgICAgaW5zdGFuY2UsIGRlbHRhWCwgZGVsdGFZLCBtX3Zpc2libGVSZWN0LmxlZnQgKyBkZWx0YVgsIG1fdmlzaWJsZVJlY3QudG9wICsgZGVsdGFZKTsKKworICAgIC8vbW92ZSB0aGUgdmlzaWJsZSBzY3JlZW4KKyAgICBnV2luZG93SS5zY3JvbGxUbyhpbnN0YW5jZSwgbV92aXNpYmxlUmVjdC5sZWZ0ICsgZGVsdGFYLCBtX3Zpc2libGVSZWN0LnRvcCArIGRlbHRhWSk7CisKK30KKworVGV4dElucHV0KiBGb3JtUGx1Z2luOjp2YWxpZFRhcChpbnQgeCwgaW50IHkpIHsKKworICAgIGlmICh4ID4gbV91c2VybmFtZUlucHV0LnJlY3QubGVmdCAmJiB4IDwgbV91c2VybmFtZUlucHV0LnJlY3QucmlnaHQgJiYKKyAgICAgICAgeSA+IG1fdXNlcm5hbWVJbnB1dC5yZWN0LnRvcCAmJiB5IDwgbV91c2VybmFtZUlucHV0LnJlY3QuYm90dG9tKQorICAgICAgICByZXR1cm4gJm1fdXNlcm5hbWVJbnB1dDsKKyAgICBlbHNlIGlmICh4ID5tX3Bhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ICYmIHggPCBtX3Bhc3N3b3JkSW5wdXQucmVjdC5yaWdodCAmJgorICAgICAgICAgICAgIHkgPiBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgJiYgeSA8IG1fcGFzc3dvcmRJbnB1dC5yZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3Bhc3N3b3JkSW5wdXQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWZmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKKyNpZm5kZWYgZm9ybVBsdWdpbl9fREVGSU5FRAorI2RlZmluZSBmb3JtUGx1Z2luX19ERUZJTkVECisKK3N0cnVjdCBUZXh0SW5wdXQgeworICAgIEFOUFJlY3RGICAgIHJlY3Q7CisgICAgY2hhciAgICAgICAgdGV4dFszMF07CisgICAgdWludDMyX3QgICAgY2hhclB0cjsKK307CisKK2NsYXNzIEZvcm1QbHVnaW4gOiBwdWJsaWMgU3ViUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBGb3JtUGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5Gb3JtUGx1Z2luKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCk7CisgICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOworICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOworCisgICAgYm9vbCAgICAgICAgbV9oYXNGb2N1czsKKworICAgIFRleHRJbnB1dCogIG1fYWN0aXZlSW5wdXQ7CisgICAgVGV4dElucHV0ICAgbV91c2VybmFtZUlucHV0OworICAgIFRleHRJbnB1dCAgIG1fcGFzc3dvcmRJbnB1dDsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRJbnB1dDsKKyAgICBBTlBQYWludCogICBtX3BhaW50QWN0aXZlOworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRUZXh0OworCisgICAgQU5QUmVjdEkgICAgbV92aXNpYmxlUmVjdDsKKworICAgIHZvaWQgZHJhd1RleHQoQU5QQ2FudmFzKiwgVGV4dElucHV0KTsKKyAgICB2b2lkIGRyYXdQYXNzd29yZChBTlBDYW52YXMqLCBUZXh0SW5wdXQpOworCisgICAgYm9vbCBoYW5kbGVOYXZpZ2F0aW9uKEFOUEtleUNvZGUga2V5Q29kZSk7CisgICAgdm9pZCBoYW5kbGVUZXh0SW5wdXQoVGV4dElucHV0KiBpbnB1dCwgQU5QS2V5Q29kZSBrZXlDb2RlLCBpbnQzMl90IHVuaWNoYXIpOworICAgIHZvaWQgc2Nyb2xsSW50b1ZpZXcoVGV4dElucHV0KiBpbnB1dCk7CisgICAgdm9pZCBzd2l0Y2hBY3RpdmVJbnB1dChUZXh0SW5wdXQqIGlucHV0KTsKKworICAgIEFOUFBhaW50KiBnZXRQYWludChUZXh0SW5wdXQqKTsKKyAgICBUZXh0SW5wdXQqIHZhbGlkVGFwKGludCB4LCBpbnQgeSk7CisKK307CisKKyNlbmRpZiAvLyBmb3JtUGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTdkMDQyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJQbHVnaW5PYmplY3QuaCIKKyNpbmNsdWRlICJBbmltYXRpb25QbHVnaW4uaCIKKyNpbmNsdWRlICJBdWRpb1BsdWdpbi5oIgorI2luY2x1ZGUgIkJhY2tncm91bmRQbHVnaW4uaCIKKyNpbmNsdWRlICJGb3JtUGx1Z2luLmgiCisjaW5jbHVkZSAiU3VyZmFjZVBsdWdpbi5oIgorI2luY2x1ZGUgImFuZHJvaWRfbnBhcGkuaCIKKworTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyOworI2RlZmluZSBFWFBPUlQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKworTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTYgbW9kZSwgaW50MTYgYXJnYywKKyAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7CitOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKK05QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOworTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLAorICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpOworTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbik7CitpbnQzMiAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7CitpbnQzMiAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLAorICAgICAgICB2b2lkKiBidWZmZXIpOwordm9pZCAgICBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwordm9pZCAgICBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KTsKK2ludDE2ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwordm9pZCAgICBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sCisgICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOworTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOworTlBFcnJvciBOUFBfU2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOworCitleHRlcm4gIkMiIHsKK0VYUE9SVCBOUEVycm9yIE5QX0luaXRpYWxpemUoTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyRnVuY3MsIE5QUGx1Z2luRnVuY3MqIHBsdWdpbkZ1bmNzLCB2b2lkICpqYXZhX2Vudiwgdm9pZCAqYXBwbGljYXRpb25fY29udGV4dCk7CitFWFBPUlQgTlBFcnJvciBOUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7CitFWFBPUlQgY29uc3QgY2hhciogTlBfR2V0TUlNRURlc2NyaXB0aW9uKHZvaWQpOworRVhQT1JUIHZvaWQgTlBfU2h1dGRvd24odm9pZCk7Cit9OworCitBTlBBdWRpb1RyYWNrSW50ZXJmYWNlVjAgICAgZ1NvdW5kSTsKK0FOUEJpdG1hcEludGVyZmFjZVYwICAgICAgICBnQml0bWFwSTsKK0FOUENhbnZhc0ludGVyZmFjZVYwICAgICAgICBnQ2FudmFzSTsKK0FOUExvZ0ludGVyZmFjZVYwICAgICAgICAgICBnTG9nSTsKK0FOUFBhaW50SW50ZXJmYWNlVjAgICAgICAgICBnUGFpbnRJOworQU5QUGF0aEludGVyZmFjZVYwICAgICAgICAgIGdQYXRoSTsKK0FOUFN1cmZhY2VJbnRlcmZhY2VWMCAgICAgICBnU3VyZmFjZUk7CitBTlBUeXBlZmFjZUludGVyZmFjZVYwICAgICAgZ1R5cGVmYWNlSTsKK0FOUFdpbmRvd0ludGVyZmFjZVYwICAgICAgICBnV2luZG93STsKKworI2RlZmluZSBBUlJBWV9DT1VOVChhcnJheSkgICAgICAoc2l6ZW9mKGFycmF5KSAvIHNpemVvZihhcnJheVswXSkpCisjZGVmaW5lIERFQlVHX1BMVUdJTl9FVkVOVFMgICAgIDAKKworTlBFcnJvciBOUF9Jbml0aWFsaXplKE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlckZ1bmNzLCBOUFBsdWdpbkZ1bmNzKiBwbHVnaW5GdW5jcywgdm9pZCAqamF2YV9lbnYsIHZvaWQgKmFwcGxpY2F0aW9uX2NvbnRleHQpCit7CisgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBmdW5jdGlvbiB0YWJsZSBlcXVhbCBvciBsYXJnZXIgdGhhbiB3ZSBhcmUgYnVpbHQgYWdhaW5zdC4KKyAgICBpZiAoYnJvd3NlckZ1bmNzLT5zaXplIDwgc2l6ZW9mKE5QTmV0c2NhcGVGdW5jcykpIHsKKyAgICAgICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgfQorCisgICAgLy8gQ29weSB0aGUgZnVuY3Rpb24gdGFibGUgKHN0cnVjdHVyZSkKKyAgICBicm93c2VyID0gKE5QTmV0c2NhcGVGdW5jcyopIG1hbGxvYyhzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSk7CisgICAgbWVtY3B5KGJyb3dzZXIsIGJyb3dzZXJGdW5jcywgc2l6ZW9mKE5QTmV0c2NhcGVGdW5jcykpOworCisgICAgLy8gQnVpbGQgdGhlIHBsdWdpbiBmdW5jdGlvbiB0YWJsZQorICAgIHBsdWdpbkZ1bmNzLT52ZXJzaW9uID0gMTE7CisgICAgcGx1Z2luRnVuY3MtPnNpemUgPSBzaXplb2YocGx1Z2luRnVuY3MpOworICAgIHBsdWdpbkZ1bmNzLT5uZXdwID0gTlBQX05ldzsKKyAgICBwbHVnaW5GdW5jcy0+ZGVzdHJveSA9IE5QUF9EZXN0cm95OworICAgIHBsdWdpbkZ1bmNzLT5zZXR3aW5kb3cgPSBOUFBfU2V0V2luZG93OworICAgIHBsdWdpbkZ1bmNzLT5uZXdzdHJlYW0gPSBOUFBfTmV3U3RyZWFtOworICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95c3RyZWFtID0gTlBQX0Rlc3Ryb3lTdHJlYW07CisgICAgcGx1Z2luRnVuY3MtPmFzZmlsZSA9IE5QUF9TdHJlYW1Bc0ZpbGU7CisgICAgcGx1Z2luRnVuY3MtPndyaXRlcmVhZHkgPSBOUFBfV3JpdGVSZWFkeTsKKyAgICBwbHVnaW5GdW5jcy0+d3JpdGUgPSAoTlBQX1dyaXRlUHJvY1B0cilOUFBfV3JpdGU7CisgICAgcGx1Z2luRnVuY3MtPnByaW50ID0gTlBQX1ByaW50OworICAgIHBsdWdpbkZ1bmNzLT5ldmVudCA9IE5QUF9IYW5kbGVFdmVudDsKKyAgICBwbHVnaW5GdW5jcy0+dXJsbm90aWZ5ID0gTlBQX1VSTE5vdGlmeTsKKyAgICBwbHVnaW5GdW5jcy0+Z2V0dmFsdWUgPSBOUFBfR2V0VmFsdWU7CisgICAgcGx1Z2luRnVuY3MtPnNldHZhbHVlID0gTlBQX1NldFZhbHVlOworCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIE5QTlZhcmlhYmxlICAgICB2OworICAgICAgICB1aW50MzJfdCAgICAgICAgc2l6ZTsKKyAgICAgICAgQU5QSW50ZXJmYWNlKiAgIGk7CisgICAgfSBnUGFpcnNbXSA9IHsKKyAgICAgICAgeyBrQXVkaW9UcmFja0ludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgIHNpemVvZihnU291bmRJKSwgICAgJmdTb3VuZEkgfSwKKyAgICAgICAgeyBrQml0bWFwSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgIHNpemVvZihnQml0bWFwSSksICAgJmdCaXRtYXBJIH0sCisgICAgICAgIHsga0NhbnZhc0ludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICBzaXplb2YoZ0NhbnZhc0kpLCAgICZnQ2FudmFzSSB9LAorICAgICAgICB7IGtMb2dJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICAgICAgc2l6ZW9mKGdMb2dJKSwgICAgICAmZ0xvZ0kgfSwKKyAgICAgICAgeyBrUGFpbnRJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICAgIHNpemVvZihnUGFpbnRJKSwgICAgJmdQYWludEkgfSwKKyAgICAgICAgeyBrUGF0aEludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICAgIHNpemVvZihnUGF0aEkpLCAgICAgJmdQYXRoSSB9LAorICAgICAgICB7IGtTdXJmYWNlSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgc2l6ZW9mKGdTdXJmYWNlSSksICAmZ1N1cmZhY2VJIH0sCisgICAgICAgIHsga1R5cGVmYWNlSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICBzaXplb2YoZ1BhaW50SSksICAgICZnVHlwZWZhY2VJIH0sCisgICAgICAgIHsga1dpbmRvd0ludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICBzaXplb2YoZ1dpbmRvd0kpLCAgICZnV2luZG93SSB9LAorICAgIH07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9DT1VOVChnUGFpcnMpOyBpKyspIHsKKyAgICAgICAgZ1BhaXJzW2ldLmktPmluU2l6ZSA9IGdQYWlyc1tpXS5zaXplOworICAgICAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPmdldHZhbHVlKE5VTEwsIGdQYWlyc1tpXS52LCBnUGFpcnNbaV0uaSk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK3ZvaWQgTlBfU2h1dGRvd24odm9pZCkKK3sKKworfQorCitjb25zdCBjaGFyICpOUF9HZXRNSU1FRGVzY3JpcHRpb24odm9pZCkKK3sKKyAgICByZXR1cm4gImFwcGxpY2F0aW9uL3gtdGVzdGJyb3dzZXJwbHVnaW46dHN0OlRlc3QgcGx1Z2luIG1pbWV0eXBlIGlzIGFwcGxpY2F0aW9uL3gtdGVzdGJyb3dzZXJwbHVnaW4iOworfQorCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorICAgICAgICAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpCit7CisKKyAgICAvKiBCRUdJTjogU1RBTkRBUkQgUExVR0lOIEZSQU1FV09SSyAqLworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gTlVMTDsKKworICAgIC8vIFNjcmlwdGluZyBmdW5jdGlvbnMgYXBwZWFyZWQgaW4gTlBBUEkgdmVyc2lvbiAxNAorICAgIGlmIChicm93c2VyLT52ZXJzaW9uID49IDE0KSB7CisgICAgaW5zdGFuY2UtPnBkYXRhID0gYnJvd3Nlci0+Y3JlYXRlb2JqZWN0IChpbnN0YW5jZSwgZ2V0UGx1Z2luQ2xhc3MoKSk7CisgICAgb2JqID0gc3RhdGljX2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBiemVybyhvYmosIHNpemVvZigqb2JqKSk7CisgICAgfQorICAgIC8qIEVORDogU1RBTkRBUkQgUExVR0lOIEZSQU1FV09SSyAqLworCisgICAgLy8gc2VsZWN0IHRoZSBwbHVnaW5UeXBlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJnbltpXSwgIlBsdWdpblR5cGUiKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIkFuaW1hdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga0FuaW1hdGlvbl9QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEJhbGxBbmltYXRpb24oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQXVkaW8iKSkgeworICAgICAgICAgICAgICAgIG9iai0+cGx1Z2luVHlwZSA9IGtBdWRpb19QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEF1ZGlvUGx1Z2luKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIkJhY2tncm91bmQiKSkgeworICAgICAgICAgICAgICAgIG9iai0+cGx1Z2luVHlwZSA9IGtCYWNrZ3JvdW5kX1BsdWdpblR5cGU7CisgICAgICAgICAgICAgICAgb2JqLT5hY3RpdmVQbHVnaW4gPSBuZXcgQmFja2dyb3VuZFBsdWdpbihpbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJGb3JtIikpIHsKKyAgICAgICAgICAgICAgICBvYmotPnBsdWdpblR5cGUgPSBrRm9ybV9QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEZvcm1QbHVnaW4oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiUkdCQV9TdXJmYWNlIikpIHsKKyAgICAgICAgICAgICAgICBvYmotPnBsdWdpblR5cGUgPSBrU3VyZmFjZV9QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IFN1cmZhY2VQbHVnaW4oaW5zdGFuY2UsIGtSR0JBX0FOUFN1cmZhY2VUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tLS0gJXAgUGx1Z2luVHlwZSBpcyAlZCIsIGluc3RhbmNlLCBvYmotPnBsdWdpblR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiBubyBwbHVnaW5UeXBlIGlzIHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgdG8gQW5pbWF0aW9uCisgICAgaWYgKCFvYmotPnBsdWdpblR5cGUpIHsKKyAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga0FuaW1hdGlvbl9QbHVnaW5UeXBlOworICAgICAgICBvYmotPmFjdGl2ZVBsdWdpbiA9IG5ldyBCYWxsQW5pbWF0aW9uKGluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvLyBzZWxlY3QgdGhlIGRyYXdpbmcgbW9kZWwgYmFzZWQgb24gdXNlciBpbnB1dAorICAgIEFOUERyYXdpbmdNb2RlbCBtb2RlbCA9IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJnbltpXSwgIkRyYXdpbmdNb2RlbCIpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQml0bWFwIikpIHsKKyAgICAgICAgICAgICAgICBtb2RlbCA9IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiU3VyZmFjZSIpKSB7CisgICAgICAgICAgICAgICBtb2RlbCA9IGtTdXJmYWNlX0FOUERyYXdpbmdNb2RlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tLS0gJXAgRHJhd2luZ01vZGVsIGlzICVkIiwgaW5zdGFuY2UsIG1vZGVsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2hlY2sgdG8gZW5zdXJlIHRoZSBwbHVnaW5UeXBlIHN1cHBvcnRzIHRoZSBtb2RlbAorICAgIGlmICghb2JqLT5hY3RpdmVQbHVnaW4tPnN1cHBvcnRzRHJhd2luZ01vZGVsKG1vZGVsKSkgeworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLS0tICVwIFVuc3VwcG9ydGVkIERyYXdpbmdNb2RlbCAoJWQpIiwgaW5zdGFuY2UsIG1vZGVsKTsKKyAgICAgICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgfQorCisgICAgLy8gbm90aWZ5IHRoZSBwbHVnaW4gQVBJIG9mIHRoZSBkcmF3aW5nIG1vZGVsIHdlIHdpc2ggdG8gdXNlCisgICAgTlBFcnJvciBlcnIgPSBicm93c2VyLT5zZXR2YWx1ZShpbnN0YW5jZSwga1JlcXVlc3REcmF3aW5nTW9kZWxfQU5QU2V0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4obW9kZWwpKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJyZXF1ZXN0IG1vZGVsICVkIGVyciAlZCIsIG1vZGVsLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKK30KKworTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSkKK3sKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisgICAgZGVsZXRlIG9iai0+YWN0aXZlUGx1Z2luOworCisgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KQoreworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIC8vIERvIG5vdGhpbmcgaWYgYnJvd3NlciBkaWRuJ3Qgc3VwcG9ydCBOUE5fQ3JlYXRlT2JqZWN0IHdoaWNoIHdvdWxkIGhhdmUgY3JlYXRlZCB0aGUgUGx1Z2luT2JqZWN0LgorICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICBvYmotPndpbmRvdyA9IHdpbmRvdzsKKyAgICB9CisKKyAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKQoreworICAgICpzdHlwZSA9IE5QX0FTRklMRU9OTFk7CisgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKQoreworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKK30KKworaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQoreworICAgIHJldHVybiAwOworfQorCitpbnQzMiBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwgdm9pZCogYnVmZmVyKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSkKK3sKK30KKwordm9pZCBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KQoreworfQorCitpbnQxNiBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKK3sKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKKworI2lmIERFQlVHX1BMVUdJTl9FVkVOVFMKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgorCisgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmRyYXcubW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpIHsKKworICAgICAgICAgICAgICAgIHN0YXRpYyBBTlBCaXRtYXBGb3JtYXQgY3VycmVudEZvcm1hdCA9IC0xOworICAgICAgICAgICAgICAgIGlmIChldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQgIT0gY3VycmVudEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rm9ybWF0ID0gZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBEcmF3IChiaXRtYXApIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGlwPSVkLCVkLCVkLCVkIGZvcm1hdD0lZCIsIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmRyYXcuY2xpcC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmRyYXcuY2xpcC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEuZHJhdy5jbGlwLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmRyYXcuY2xpcC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0tleV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBLZXkgYWN0aW9uPSVkIgorICAgICAgICAgICAgICAgICAgICAgICIgY29kZT0lZCB2Y29kZT0lZCB1bmljaGFyPSVkIHJlcGVhdD0lZCBtb2RzPSV4IiwgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS5hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS5uYXRpdmVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkudmlydHVhbENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS51bmljaGFyLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkucmVwZWF0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS5tb2RpZmllcnMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrTGlmZWN5Y2xlX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIExpZmVjeWNsZSBhY3Rpb249JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBUb3VjaCBhY3Rpb249JWQgWyVkICVkXSIsCisgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24sIGV2dC0+ZGF0YS50b3VjaC54LAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS50b3VjaC55KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBrTW91c2VfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgTW91c2UgYWN0aW9uPSVkIFslZCAlZF0iLAorICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBldnQtPmRhdGEubW91c2UuYWN0aW9uLCBldnQtPmRhdGEubW91c2UueCwKKyAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEubW91c2UueSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2Uga1Zpc2libGVSZWN0X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIFZpc2libGVSZWN0IFslZCAlZCAlZCAlZF0iLAorICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBldnQtPmRhdGEudmlzaWJsZVJlY3QucmVjdC5sZWZ0LCBldnQtPmRhdGEudmlzaWJsZVJlY3QucmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLnZpc2libGVSZWN0LnJlY3QucmlnaHQsIGV2dC0+ZGF0YS52aXNpYmxlUmVjdC5yZWN0LmJvdHRvbSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0gJXAgVW5rbm93biBFdmVudCBbJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5ldmVudFR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisKKyAgICBpZighb2JqLT5hY3RpdmVQbHVnaW4pIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgInRoZSBhY3RpdmUgcGx1Z2luIGlzIG51bGwuIik7CisgICAgICAgIHJldHVybiAwOyAvLyB1bmtub3duIG9yIHVuaGFuZGxlZCBldmVudAorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9iai0+YWN0aXZlUGx1Z2luLT5oYW5kbGVFdmVudChldnQpOworICAgIH0KK30KKwordm9pZCBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogdXJsLCBOUFJlYXNvbiByZWFzb24sIHZvaWQqIG5vdGlmeURhdGEpCit7CisKK30KKworRVhQT1JUIE5QRXJyb3IgTlBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpIHsKKworICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luTmFtZVN0cmluZykgeworICAgICAgICBjb25zdCBjaGFyICoqc3RyID0gKGNvbnN0IGNoYXIgKiopdmFsdWU7CisgICAgICAgICpzdHIgPSAiVGVzdCBQbHVnaW4iOworICAgICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKHZhcmlhYmxlID09IE5QUFZwbHVnaW5EZXNjcmlwdGlvblN0cmluZykgeworICAgICAgICBjb25zdCBjaGFyICoqc3RyID0gKGNvbnN0IGNoYXIgKiopdmFsdWU7CisgICAgICAgICpzdHIgPSAiRGVzY3JpcHRpb24gb2YgVGVzdCBQbHVnaW4iOworICAgICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Cit9CisKK05QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKQoreworICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luU2NyaXB0YWJsZU5QT2JqZWN0KSB7CisgICAgICAgIHZvaWQgKip2ID0gKHZvaWQgKiopdmFsdWU7CisgICAgICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgICAgICBpZiAob2JqKQorICAgICAgICAgICAgYnJvd3Nlci0+cmV0YWlub2JqZWN0KChOUE9iamVjdCopb2JqKTsKKworICAgICAgICAqdiA9IG9iajsKKyAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9TZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTMyOTExCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxucGFwaS5oPgorI2luY2x1ZGUgPG5wZnVuY3Rpb25zLmg+CisjaW5jbHVkZSA8bnBydW50aW1lLmg+CisjaW5jbHVkZSAiYW5kcm9pZF9ucGFwaS5oIgorCitleHRlcm4gTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9zdXJmYWNlL1N1cmZhY2VQbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9zdXJmYWNlL1N1cmZhY2VQbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmU5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3N1cmZhY2UvU3VyZmFjZVBsdWdpbi5jcHAKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJTdXJmYWNlUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgZ0xvZ0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBTdXJmYWNlSW50ZXJmYWNlVjAgICBnU3VyZmFjZUk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgZ1R5cGVmYWNlSTsKK2V4dGVybiBBTlBXaW5kb3dJbnRlcmZhY2VWMCAgICBnV2luZG93STsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTdXJmYWNlUGx1Z2luOjpTdXJmYWNlUGx1Z2luKE5QUCBpbnN0LCBBTlBTdXJmYWNlVHlwZSBzdXJmYWNlVHlwZSkgOiBTdWJQbHVnaW4oaW5zdCkgeworCisgICAgbV9zdXJmYWNlID0gZ1N1cmZhY2VJLm5ld1N1cmZhY2UoaW5zdCwgc3VyZmFjZVR5cGUpOworCisgICAgaWYoIW1fc3VyZmFjZSkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSVwIFVuYWJsZSB0byBjcmVhdGUgc3VyZmFjZSAoJWQpIiwgaW5zdCwgc3VyZmFjZVR5cGUpOworfQorCitTdXJmYWNlUGx1Z2luOjp+U3VyZmFjZVBsdWdpbigpIHsKKyAgICBpZiAobV9zdXJmYWNlKQorICAgICAgICBnU3VyZmFjZUkuZGVsZXRlU3VyZmFjZShtX3N1cmZhY2UpOworfQorCitib29sIFN1cmZhY2VQbHVnaW46OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga1N1cmZhY2VfQU5QRHJhd2luZ01vZGVsKTsKK30KKwordm9pZCBTdXJmYWNlUGx1Z2luOjpkcmF3KCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisKKyAgICBBTlBCaXRtYXAgYml0bWFwOworCisgICAgYm9vbCB2YWx1ZSA9IGdTdXJmYWNlSS5sb2NrKG1fc3VyZmFjZSwgJmJpdG1hcCwgTlVMTCk7CisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBsb2NraW5nOiAlYiIsIGluc3RhbmNlLCB2YWx1ZSk7CisgICAgZ1N1cmZhY2VJLnVubG9jayhtX3N1cmZhY2UpOworfQorCitpbnQxNiBTdXJmYWNlUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXcubW9kZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtTdXJmYWNlX0FOUERyYXdpbmdNb2RlbDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3VyZmFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvc3VyZmFjZS9TdXJmYWNlUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3N1cmZhY2UvU3VyZmFjZVBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWY4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3N1cmZhY2UvU3VyZmFjZVBsdWdpbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKKyNpZm5kZWYgc3VyZmFjZVBsdWdpbl9fREVGSU5FRAorI2RlZmluZSBzdXJmYWNlUGx1Z2luX19ERUZJTkVECisKK2NsYXNzIFN1cmZhY2VQbHVnaW4gOiBwdWJsaWMgU3ViUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBTdXJmYWNlUGx1Z2luKE5QUCBpbnN0LCBBTlBTdXJmYWNlVHlwZSBzdXJmYWNlVHlwZSk7CisgICAgdmlydHVhbCB+U3VyZmFjZVBsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7Citwcml2YXRlOgorICAgIHZvaWQgZHJhdygpOworICAgIEFOUFN1cmZhY2UqIG1fc3VyZmFjZTsKKworfTsKKyNlbmRpZiAvLyBzdXJmYWNlUGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL2RyYXdhYmxlL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL2RyYXdhYmxlL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDdjNzlkMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9yZXMvZHJhd2FibGUvc2FtcGxlX2Jyb3dzZXJfcGx1Z2luLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOGRkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyZXNvdXJjZXM+CisgICA8c3RyaW5nIG5hbWU9InNhbXBsZV9icm93c2VyX3BsdWdpbiI+U2FtcGxlIEJyb3dzZXIgUGx1Z2luPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL1NhbXBsZVBsdWdpbi5qYXZhIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vU2FtcGxlUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4Y2U5NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL1NhbXBsZVBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKKworcHVibGljIGNsYXNzIFNhbXBsZVBsdWdpbiBleHRlbmRzIFNlcnZpY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L0FuZHJvaWQubWsgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjJjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTIgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGaXhlZEdyaWRMYXlvdXQKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2QzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQiCisgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5GaXhlZEdyaWRMYXlvdXRUZXN0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+IApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvcmVzL2RyYXdhYmxlL2J1Z2Ryb2lkLnBuZyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9kcmF3YWJsZS9idWdkcm9pZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1NDg0YQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9kcmF3YWJsZS9idWdkcm9pZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvcmVzL2xheW91dC9tYWluLnhtbCBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9sYXlvdXQvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlMmQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9sYXlvdXQvbWFpbi54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxjb20uZXhhbXBsZS5hbmRyb2lkLmZpeGVkZ3JpZGxheW91dC5GaXhlZEdyaWRMYXlvdXQKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZ3JpZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICBhcHA6Y2VsbFdpZHRoPSI4MGRwIgorICAgICAgICBhcHA6Y2VsbEhlaWdodD0iMTAwZHAiCisgICAgICAgID4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2J1Z2Ryb2lkIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYnVnZHJvaWQiCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9idWdkcm9pZCIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2J1Z2Ryb2lkIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYnVnZHJvaWQiCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9idWdkcm9pZCIKKyAgICAgICAgLz4KKzwvY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQuRml4ZWRHcmlkTGF5b3V0PgorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy92YWx1ZXMvYXR0cnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODdkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMCwwICsxLDcgQEAKKzxyZXNvdXJjZXM+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkZpeGVkR3JpZExheW91dCI+CisgICAgICAgIDxhdHRyIG5hbWU9ImNlbGxXaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImNlbGxIZWlnaHQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NjNjNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5GaXhlZEdyaWRMYXlvdXRUZXN0PC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2ZpeGVkZ3JpZGxheW91dC9GaXhlZEdyaWRMYXlvdXQuamF2YSBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2ZpeGVkZ3JpZGxheW91dC9GaXhlZEdyaWRMYXlvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTMxNTdmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvZml4ZWRncmlkbGF5b3V0L0ZpeGVkR3JpZExheW91dC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmZpeGVkZ3JpZGxheW91dDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CisKKy8qKgorICogQSBsYXlvdXQgdGhhdCBhcnJhbmdlcyBpdHMgY2hpbGRyZW4gaW4gYSBncmlkLiAgVGhlIHNpemUgb2YgdGhlCisgKiBjZWxscyBpcyBzZXQgYnkgdGhlIHtAbGluayAjc2V0Q2VsbFNpemV9IG1ldGhvZCBhbmQgdGhlCisgKiBhbmRyb2lkOmNlbGxfd2lkdGggYW5kIGFuZHJvaWQ6Y2VsbF9oZWlnaHQgYXR0cmlidXRlcyBpbiBYTUwuCisgKiBUaGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaXMgZGV0ZXJtaW5lZCBhdCBydW50aW1lLiAgRWFjaAorICogY2VsbCBjb250YWlucyBleGFjdGx5IG9uZSB2aWV3LCBhbmQgdGhleSBmbG93IGluIHRoZSBuYXR1cmFsCisgKiBjaGlsZCBvcmRlciAodGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZCwgb3IgdGhlIGluZGV4CisgKiBpbiB7QGxpbmsgI2FkZFZpZXdBdH0uICBWaWV3cyBjYW4gbm90IHNwYW4gbXVsdGlwbGUgY2VsbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBGaXhlZEdyaWRMYXlvdXQgZXh0ZW5kcyBWaWV3R3JvdXAgeworICAgIGludCBtQ2VsbFdpZHRoOworICAgIGludCBtQ2VsbEhlaWdodDsKKworICAgIHB1YmxpYyBGaXhlZEdyaWRMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBGaXhlZEdyaWRMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIC8vIFJlYWQgdGhlIHJlc291cmNlIGF0dHJpYnV0ZXMuCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRycywgUi5zdHlsZWFibGUuRml4ZWRHcmlkTGF5b3V0KTsKKyAgICAgICAgbUNlbGxXaWR0aCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkZpeGVkR3JpZExheW91dF9jZWxsV2lkdGgsIC0xKTsKKyAgICAgICAgbUNlbGxIZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5GaXhlZEdyaWRMYXlvdXRfY2VsbEhlaWdodCwgLTEpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDZWxsV2lkdGgoaW50IHB4KSB7CisgICAgICAgIG1DZWxsV2lkdGggPSBweDsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENlbGxIZWlnaHQoaW50IHB4KSB7CisgICAgICAgIG1DZWxsSGVpZ2h0ID0gcHg7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgY2VsbFdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhtQ2VsbFdpZHRoLAorICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkFUX01PU1QpOworICAgICAgICBpbnQgY2VsbEhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobUNlbGxIZWlnaHQsCisgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpbmRleD0wOyBpbmRleDxjb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaW5kZXgpOworICAgICAgICAgICAgY2hpbGQubWVhc3VyZShjZWxsV2lkdGhTcGVjLCBjZWxsSGVpZ2h0U3BlYyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVXNlIHRoZSBzaXplIG91ciBwYXJlbnRzIGdhdmUgdXMKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24ocmVzb2x2ZVNpemUobUNlbGxXaWR0aCpjb3VudCwgd2lkdGhNZWFzdXJlU3BlYyksCisgICAgICAgICAgICAgICAgcmVzb2x2ZVNpemUobUNlbGxIZWlnaHQqY291bnQsIGhlaWdodE1lYXN1cmVTcGVjKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgY2VsbFdpZHRoID0gbUNlbGxXaWR0aDsKKyAgICAgICAgaW50IGNlbGxIZWlnaHQgPSBtQ2VsbEhlaWdodDsKKyAgICAgICAgaW50IGNvbHVtbnMgPSAociAtIGwpIC8gY2VsbFdpZHRoOworICAgICAgICBpZiAoY29sdW1ucyA8IDApIHsKKyAgICAgICAgICAgIGNvbHVtbnMgPSAxOworICAgICAgICB9CisgICAgICAgIGludCB4ID0gMDsKKyAgICAgICAgaW50IHkgPSAwOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXg9MDsgaW5kZXg8Y291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGluZGV4KTsKKworICAgICAgICAgICAgaW50IHcgPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgaCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisKKyAgICAgICAgICAgIGludCBsZWZ0ID0geCArICgoY2VsbFdpZHRoLXcpLzIpOworICAgICAgICAgICAgaW50IHRvcCA9IHkgKyAoKGNlbGxIZWlnaHQtaCkvMik7CisKKyAgICAgICAgICAgIGNoaWxkLmxheW91dChsZWZ0LCB0b3AsIGxlZnQrdywgdG9wK2gpOworICAgICAgICAgICAgaWYgKGkgPj0gKGNvbHVtbnMtMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgcm93CisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgeSArPSBjZWxsSGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgeCArPSBjZWxsV2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2ZpeGVkZ3JpZGxheW91dC9GaXhlZEdyaWRMYXlvdXRUZXN0LmphdmEgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9maXhlZGdyaWRsYXlvdXQvRml4ZWRHcmlkTGF5b3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzlkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9maXhlZGdyaWRsYXlvdXQvRml4ZWRHcmlkTGF5b3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIEZpeGVkR3JpZExheW91dFRlc3QgZXh0ZW5kcyBBY3Rpdml0eQoreworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CisKKyAgICAgICAgRml4ZWRHcmlkTGF5b3V0IGdyaWQgPSAoRml4ZWRHcmlkTGF5b3V0KWZpbmRWaWV3QnlJZChSLmlkLmdyaWQpOworICAgICAgICBncmlkLnNldENlbGxXaWR0aCg4MCk7CisgICAgICAgIGdyaWQuc2V0Q2VsbEhlaWdodCg4MCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9BbmRyb2lkLm1rIGIvc2ltdWxhdG9yL2FwcC9BbmRyb2lkLm1rCmluZGV4IGM2ZTFkMTQuLjNjZTdjZDUgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvQW5kcm9pZC5taworKysgYi9zaW11bGF0b3IvYXBwL0FuZHJvaWQubWsKQEAgLTI0LDEyICsyNCwxNSBAQAogCVBob25lQ29sbGVjdGlvbi5jcHAgXAogCVBob25lRGF0YS5jcHAgXAogCVBob25lV2luZG93LmNwcCBcCisJUGlwZS5jcHAgXAogCVByZWZlcmVuY2VzLmNwcCBcCiAJUHJlZnNEaWFsb2cuY3BwIFwKIAlQcm9wZXJ0eVNlcnZlci5jcHAgXAogCVNlbWFwaG9yZS5jcHAgXAogCVNobWVtLmNwcCBcCi0JVXNlckV2ZW50LmNwcAorCVVzZXJFdmVudC5jcHAgXAorCWV4ZWN1dGFibGVwYXRoX2xpbnV4LmNwcCBcCisJcG9ydGVkLmNwcAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKIAlsaWJ0aW55eG1sCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL0xvYWRhYmxlSW1hZ2UuY3BwIGIvc2ltdWxhdG9yL2FwcC9Mb2FkYWJsZUltYWdlLmNwcAppbmRleCBlNWJkMGYzLi41MTMxNjViIDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL0xvYWRhYmxlSW1hZ2UuY3BwCisrKyBiL3NpbXVsYXRvci9hcHAvTG9hZGFibGVJbWFnZS5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlICJBc3NldFN0cmVhbS5oIgogI2luY2x1ZGUgIk15QXBwLmgiCiAKLSNpbmNsdWRlIDx1dGlscy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL0xvY2FsQmlDaGFubmVsLmggYi9zaW11bGF0b3IvYXBwL0xvY2FsQmlDaGFubmVsLmgKaW5kZXggY2UwNGJjMC4uYTRmNGQ2MiAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9Mb2NhbEJpQ2hhbm5lbC5oCisrKyBiL3NpbXVsYXRvci9hcHAvTG9jYWxCaUNoYW5uZWwuaApAQCAtMTAsNyArMTAsNyBAQAogI2Vycm9yIERPIE5PVCBVU0UgVEhJUyBGSUxFIElOIFRIRSBERVZJQ0UgQlVJTEQKICNlbmRpZgogCi0jaW5jbHVkZSA8dXRpbHMvUGlwZS5oPgorI2luY2x1ZGUgIlBpcGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL01lc3NhZ2VTdHJlYW0uaCBiL3NpbXVsYXRvci9hcHAvTWVzc2FnZVN0cmVhbS5oCmluZGV4IGRlOWMzOTguLjgyYTliNGMgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvTWVzc2FnZVN0cmVhbS5oCisrKyBiL3NpbXVsYXRvci9hcHAvTWVzc2FnZVN0cmVhbS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjZXJyb3IgRE8gTk9UIFVTRSBUSElTIEZJTEUgSU4gVEhFIERFVklDRSBCVUlMRAogI2VuZGlmCiAKLSNpbmNsdWRlIDx1dGlscy9QaXBlLmg+CisjaW5jbHVkZSAiUGlwZS5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGN1dGlscy91aW8uaD4KIApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9NeUFwcC5jcHAgYi9zaW11bGF0b3IvYXBwL015QXBwLmNwcAppbmRleCAzMTNlNDRkLi5mZDYxMGIxIDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL015QXBwLmNwcAorKysgYi9zaW11bGF0b3IvYXBwL015QXBwLmNwcApAQCAtMTYsNyArMTYsNyBAQAogCiAjaW5jbHVkZSAiTWFpbkZyYW1lLmgiCiAjaW5jbHVkZSAiTXlBcHAuaCIKLSNpbmNsdWRlIDx1dGlscy9leGVjdXRhYmxlcGF0aC5oPgorI2luY2x1ZGUgImV4ZWN1dGFibGVwYXRoLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9QaG9uZUNvbGxlY3Rpb24uY3BwIGIvc2ltdWxhdG9yL2FwcC9QaG9uZUNvbGxlY3Rpb24uY3BwCmluZGV4IDVjZGRmYTguLmUxODgyY2MgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvUGhvbmVDb2xsZWN0aW9uLmNwcAorKysgYi9zaW11bGF0b3IvYXBwL1Bob25lQ29sbGVjdGlvbi5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlICJQaG9uZURhdGEuaCIKICNpbmNsdWRlICJNeUFwcC5oIgogCi0jaW5jbHVkZSA8dXRpbHMuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL1Bob25lRGF0YS5jcHAgYi9zaW11bGF0b3IvYXBwL1Bob25lRGF0YS5jcHAKaW5kZXggNDg2MTRmZC4uZjE1ZGYyYiAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9QaG9uZURhdGEuY3BwCisrKyBiL3NpbXVsYXRvci9hcHAvUGhvbmVEYXRhLmNwcApAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgIlBob25lQ29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIk15QXBwLmgiCiAKLSNpbmNsdWRlIDx1dGlscy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCiAjaW5jbHVkZSA8dXRpbHMvQXNzZXRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL1Bob25lRGF0YS5oIGIvc2ltdWxhdG9yL2FwcC9QaG9uZURhdGEuaAppbmRleCBjN2Y0NzMyLi4yZDcwMDNhIDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL1Bob25lRGF0YS5oCisrKyBiL3NpbXVsYXRvci9hcHAvUGhvbmVEYXRhLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlICJQaG9uZUJ1dHRvbi5oIgogI2luY2x1ZGUgIkxvYWRhYmxlSW1hZ2UuaCIKICNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotI2luY2x1ZGUgPHV0aWxzLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKIAogCiAvKgpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9QaXBlLmNwcCBiL3NpbXVsYXRvci9hcHAvUGlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjZTc5MAotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci9hcHAvUGlwZS5jcHAKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLworLy8gVW5pZGlyZWN0aW9uYWwgcGlwZS4KKy8vCisKKyNpbmNsdWRlICJQaXBlLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxmY250bC5oPgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NvbnN0IHVuc2lnbmVkIGxvbmcga0ludmFsaWRIYW5kbGUgPSAodW5zaWduZWQgbG9uZykgLTE7CisKKworLyoKKyAqIENvbnN0cnVjdG9yLiAgRG8gbGl0dGxlLgorICovCitQaXBlOjpQaXBlKHZvaWQpCisgICAgOiBtUmVhZE5vbkJsb2NraW5nKGZhbHNlKSwgbVJlYWRIYW5kbGUoa0ludmFsaWRIYW5kbGUpLAorICAgICAgbVdyaXRlSGFuZGxlKGtJbnZhbGlkSGFuZGxlKQoreworfQorCisvKgorICogRGVzdHJ1Y3Rvci4gIFVzZSB0aGUgc3lzdGVtLWFwcHJvcHJpYXRlIGNsb3NlIGNhbGwuCisgKi8KK1BpcGU6On5QaXBlKHZvaWQpCit7CisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICBpZiAobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFDbG9zZUhhbmRsZSgoSEFORExFKW1SZWFkSGFuZGxlKSkKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLCAiZmFpbGVkIGNsb3NpbmcgcmVhZCBoYW5kbGUgKCVsZClcbiIsCisgICAgICAgICAgICAgICAgbVJlYWRIYW5kbGUpOworICAgIH0KKyAgICBpZiAobVdyaXRlSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKSB7CisgICAgICAgIEZsdXNoRmlsZUJ1ZmZlcnMoKEhBTkRMRSltV3JpdGVIYW5kbGUpOworICAgICAgICBpZiAoIUNsb3NlSGFuZGxlKChIQU5ETEUpbVdyaXRlSGFuZGxlKSkKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLCAiZmFpbGVkIGNsb3Npbmcgd3JpdGUgaGFuZGxlICglbGQpXG4iLAorICAgICAgICAgICAgICAgIG1Xcml0ZUhhbmRsZSk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpIHsKKyAgICAgICAgaWYgKGNsb3NlKChpbnQpIG1SZWFkSGFuZGxlKSAhPSAwKQorICAgICAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsICJmYWlsZWQgY2xvc2luZyByZWFkIGZkICglZClcbiIsCisgICAgICAgICAgICAgICAgKGludCkgbVJlYWRIYW5kbGUpOworICAgIH0KKyAgICBpZiAobVdyaXRlSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKSB7CisgICAgICAgIGlmIChjbG9zZSgoaW50KSBtV3JpdGVIYW5kbGUpICE9IDApCisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwgImZhaWxlZCBjbG9zaW5nIHdyaXRlIGZkICglZClcbiIsCisgICAgICAgICAgICAgICAgKGludCkgbVdyaXRlSGFuZGxlKTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIENyZWF0ZSB0aGUgcGlwZS4KKyAqCisgKiBVc2UgdGhlIFBPU0lYIHN0dWZmIGZvciBldmVyeXRoaW5nIGJ1dCBXaW5kb3dzLgorICovCitib29sIFBpcGU6OmNyZWF0ZSh2b2lkKQoreworICAgIGFzc2VydChtUmVhZEhhbmRsZSA9PSBrSW52YWxpZEhhbmRsZSk7CisgICAgYXNzZXJ0KG1Xcml0ZUhhbmRsZSA9PSBrSW52YWxpZEhhbmRsZSk7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIC8qIHdlIHVzZSB0aGlzIGFjcm9zcyBwcm9jZXNzZXMsIHNvIHRoZXkgbmVlZCB0byBiZSBpbmhlcml0YWJsZSAqLworICAgIEhBTkRMRSBoYW5kbGVzWzJdOworICAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgc2FBdHRyOworCisgICAgc2FBdHRyLm5MZW5ndGggPSBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUyk7CisgICAgc2FBdHRyLmJJbmhlcml0SGFuZGxlID0gVFJVRTsKKyAgICBzYUF0dHIubHBTZWN1cml0eURlc2NyaXB0b3IgPSBOVUxMOworCisgICAgaWYgKCFDcmVhdGVQaXBlKCZoYW5kbGVzWzBdLCAmaGFuZGxlc1sxXSwgJnNhQXR0ciwgMCkpIHsKKyAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAidW5hYmxlIHRvIGNyZWF0ZSBwaXBlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtUmVhZEhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKSBoYW5kbGVzWzBdOworICAgIG1Xcml0ZUhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKSBoYW5kbGVzWzFdOworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICBpbnQgZmRzWzJdOworCisgICAgaWYgKHBpcGUoZmRzKSAhPSAwKSB7CisgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgInVuYWJsZSB0byBjcmVhdGUgcGlwZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbVJlYWRIYW5kbGUgPSBmZHNbMF07CisgICAgbVdyaXRlSGFuZGxlID0gZmRzWzFdOworICAgIHJldHVybiB0cnVlOworI2VuZGlmCit9CisKKy8qCisgKiBDcmVhdGUgYSAiaGFsZiBwaXBlIi4gIFBsZWFzZSwgbm8gU2Vnd2F5IHJpZGluZy4KKyAqLworYm9vbCBQaXBlOjpjcmVhdGVSZWFkZXIodW5zaWduZWQgbG9uZyBoYW5kbGUpCit7CisgICAgbVJlYWRIYW5kbGUgPSBoYW5kbGU7CisgICAgYXNzZXJ0KG1Xcml0ZUhhbmRsZSA9PSBrSW52YWxpZEhhbmRsZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBDcmVhdGUgYSAiaGFsZiBwaXBlIiBmb3Igd3JpdGluZy4KKyAqLworYm9vbCBQaXBlOjpjcmVhdGVXcml0ZXIodW5zaWduZWQgbG9uZyBoYW5kbGUpCit7CisgICAgbVdyaXRlSGFuZGxlID0gaGFuZGxlOworICAgIGFzc2VydChtUmVhZEhhbmRsZSA9PSBrSW52YWxpZEhhbmRsZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBSZXR1cm4gInRydWUiIGlmIGNyZWF0ZSgpIGhhcyBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHkuCisgKi8KK2Jvb2wgUGlwZTo6aXNDcmVhdGVkKHZvaWQpCit7CisgICAgLy8gb25lIG9yIHRoZSBvdGhlciBzaG91bGQgYmUgb3BlbgorICAgIHJldHVybiAobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUgfHwgbVdyaXRlSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKTsKK30KKworCisvKgorICogUmVhZCBkYXRhIGZyb20gdGhlIHBpcGUuCisgKgorICogRm9yIExpbnV4IGFuZCBEYXJ3aW4sIGp1c3QgY2FsbCByZWFkKCkuICBGb3IgV2luZG93cywgaW1wbGVtZW50CisgKiBub24tYmxvY2tpbmcgcmVhZHMgYnkgY2FsbGluZyBQZWVrTmFtZWRQaXBlIGZpcnN0LgorICovCitpbnQgUGlwZTo6cmVhZCh2b2lkKiBidWYsIGludCBjb3VudCkKK3sKKyAgICBhc3NlcnQobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICBEV09SRCB0b3RhbEJ5dGVzQXZhaWwgPSBjb3VudDsKKyAgICBEV09SRCBieXRlc1JlYWQ7CisKKyAgICBpZiAobVJlYWROb25CbG9ja2luZykgeworICAgICAgICAvLyB1c2UgUGVla05hbWVkUGlwZSB0byBhZGp1c3QgcmVhZCBjb3VudCBleHBlY3RhdGlvbnMKKyAgICAgICAgaWYgKCFQZWVrTmFtZWRQaXBlKChIQU5ETEUpIG1SZWFkSGFuZGxlLCBOVUxMLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICZ0b3RhbEJ5dGVzQXZhaWwsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJQZWVrTmFtZWRQaXBlIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodG90YWxCeXRlc0F2YWlsID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIVJlYWRGaWxlKChIQU5ETEUpIG1SZWFkSGFuZGxlLCBidWYsIHRvdGFsQnl0ZXNBdmFpbCwgJmJ5dGVzUmVhZCwKKyAgICAgICAgICAgIE5VTEwpKQorICAgIHsKKyAgICAgICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfSEFORExFX0VPRiB8fCBlcnIgPT0gRVJST1JfQlJPS0VOX1BJUEUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAiUmVhZEZpbGUgZmFpbGVkIChlcnI9JWxkKVxuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAoaW50KSBieXRlc1JlYWQ7CisjZWxzZQorICAgIGludCBjYzsKKyAgICBjYyA9IDo6cmVhZChtUmVhZEhhbmRsZSwgYnVmLCBjb3VudCk7CisgICAgaWYgKGNjIDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBjYzsKKyNlbmRpZgorfQorCisvKgorICogV3JpdGUgZGF0YSB0byB0aGUgcGlwZS4KKyAqCisgKiBQT1NJWCBzeXN0ZW1zIGFyZSB0cml2aWFsLCBXaW5kb3dzIHVzZXMgYSBkaWZmZXJlbnQgY2FsbCBhbmQgZG9lc24ndAorICogaGFuZGxlIG5vbi1ibG9ja2luZyB3cml0ZXMuCisgKgorICogSWYgd2UgYWRkIG5vbi1ibG9ja2luZyBzdXBwb3J0IGhlcmUsIHdlIHByb2JhYmx5IHdhbnQgdG8gbWFrZSBpdCBhbgorICogYWxsLW9yLW5vdGhpbmcgd3JpdGUuCisgKgorICogRE8gTk9UIHVzZSBMT0coKSBoZXJlLCB3ZSBjb3VsZCBiZSB3cml0aW5nIGEgbG9nIG1lc3NhZ2UuCisgKi8KK2ludCBQaXBlOjp3cml0ZShjb25zdCB2b2lkKiBidWYsIGludCBjb3VudCkKK3sKKyAgICBhc3NlcnQobVdyaXRlSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgRFdPUkQgYnl0ZXNXcml0dGVuOworCisgICAgaWYgKG1Xcml0ZU5vbkJsb2NraW5nKSB7CisgICAgICAgIC8vIEJVRzogY2FuJ3QgdXNlIFBlZWtOYW1lZFBpcGUoKSB0byBnZXQgdGhlIGFtb3VudCBvZiBzcGFjZQorICAgICAgICAvLyBsZWZ0LiAgTG9va3MgbGlrZSB3ZSBuZWVkIHRvIHVzZSAib3ZlcmxhcHBlZCBJL08iIGZ1bmN0aW9ucy4KKyAgICAgICAgLy8gSSBqdXN0IGRvbid0IGNhcmUgdGhhdCBtdWNoLgorICAgIH0KKworICAgIGlmICghV3JpdGVGaWxlKChIQU5ETEUpIG1Xcml0ZUhhbmRsZSwgYnVmLCBjb3VudCwgJmJ5dGVzV3JpdHRlbiwgTlVMTCkpIHsKKyAgICAgICAgLy8gY2FuJ3QgTE9HLCB1c2Ugc3RkZXJyCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV3JpdGVGaWxlIGZhaWxlZCAoZXJyPSVsZClcbiIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAoaW50KSBieXRlc1dyaXR0ZW47CisjZWxzZQorICAgIGludCBjYzsKKyAgICBjYyA9IDo6d3JpdGUobVdyaXRlSGFuZGxlLCBidWYsIGNvdW50KTsKKyAgICBpZiAoY2MgPCAwICYmIGVycm5vID09IEVBR0FJTikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNjOworI2VuZGlmCit9CisKKy8qCisgKiBGaWd1cmUgb3V0IGlmIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIG9uIHRoZSByZWFkIGZkLgorICoKKyAqIFdlIHJldHVybiAidHJ1ZSIgb24gZXJyb3IgYmVjYXVzZSB3ZSB3YW50IHRoZSBjYWxsZXIgdG8gdHJ5IHRvIHJlYWQKKyAqIGZyb20gdGhlIHBpcGUuICBUaGV5J2xsIG5vdGljZSB0aGUgcmVhZCBmYWlsdXJlIGFuZCBkbyBzb21ldGhpbmcKKyAqIGFwcHJvcHJpYXRlLgorICovCitib29sIFBpcGU6OnJlYWRSZWFkeSh2b2lkKQoreworICAgIGFzc2VydChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSk7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIERXT1JEIHRvdGFsQnl0ZXNBdmFpbDsKKworICAgIGlmICghUGVla05hbWVkUGlwZSgoSEFORExFKSBtUmVhZEhhbmRsZSwgTlVMTCwgMCwgTlVMTCwKKyAgICAgICAgICAgICZ0b3RhbEJ5dGVzQXZhaWwsIE5VTEwpKQorICAgIHsKKyAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAiUGVla05hbWVkUGlwZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gKHRvdGFsQnl0ZXNBdmFpbCAhPSAwKTsKKyNlbHNlCisgICAgZXJybm8gPSAwOworICAgIGZkX3NldCByZWFkZmRzOworICAgIHN0cnVjdCB0aW1ldmFsIHR2ID0geyAwLCAwIH07CisgICAgaW50IGNjOworCisgICAgRkRfWkVSTygmcmVhZGZkcyk7CisgICAgRkRfU0VUKG1SZWFkSGFuZGxlLCAmcmVhZGZkcyk7CisKKyAgICBjYyA9IHNlbGVjdChtUmVhZEhhbmRsZSsxLCAmcmVhZGZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKyAgICBpZiAoY2MgPCAwKSB7CisgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgInNlbGVjdCgpIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoY2MgPT0gMCkgeworICAgICAgICAvKiB0aW1lZCBvdXQsIG5vdGhpbmcgYXZhaWxhYmxlICovCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGNjID09IDEpIHsKKyAgICAgICAgLyogb3VyIGZkIGlzIHJlYWR5ICovCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgIkhVSD8gc2VsZWN0KCkgcmV0dXJuZWQgPiAxXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBFbmFibGUgb3IgZGlzYWJsZSBub24tYmxvY2tpbmcgbW9kZSBmb3IgdGhlIHJlYWQgZGVzY3JpcHRvci4KKyAqCisgKiBOT1RFOiB0aGUgY2FsbHMgc3VjY2VlZCB1bmRlciBNYWMgT1MgWCwgYnV0IHRoZSBwaXBlIGRvZXNuJ3QgYXBwZWFyIHRvCisgKiBhY3R1YWxseSBiZSBpbiBub24tYmxvY2tpbmcgbW9kZS4gIElmIHRoaXMgbWF0dGVycyAtLSBpLmUuIHlvdSdyZSBub3QKKyAqIHVzaW5nIGEgc2VsZWN0KCkgY2FsbCAtLSBwdXQgYSBjYWxsIHRvIHJlYWRSZWFkeSgpIGluIGZyb250IG9mIHRoZQorICogOjpyZWFkKCkgY2FsbCwgd2l0aCBhIFBJUEVfTk9OQkxPQ0tfQlJPS0VOICNpZmRlZiBpbiB0aGUgTWFrZWZpbGUgZm9yCisgKiBEYXJ3aW4uCisgKi8KK2Jvb2wgUGlwZTo6c2V0UmVhZE5vbkJsb2NraW5nKGJvb2wgdmFsKQoreworICAgIGFzc2VydChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSk7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIC8vIG5vdGhpbmcgdG8gZG8KKyNlbHNlCisgICAgaW50IGZsYWdzOworCisgICAgaWYgKGZjbnRsKG1SZWFkSGFuZGxlLCBGX0dFVEZMLCAmZmxhZ3MpID09IC0xKSB7CisgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgImNvdWxkbid0IGdldCBmbGFncyBmb3IgcGlwZSByZWFkIGZkXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmFsKQorICAgICAgICBmbGFncyB8PSBPX05PTkJMT0NLOworICAgIGVsc2UKKyAgICAgICAgZmxhZ3MgJj0gfihPX05PTkJMT0NLKTsKKyAgICBpZiAoZmNudGwobVJlYWRIYW5kbGUsIEZfU0VURkwsICZmbGFncykgPT0gLTEpIHsKKyAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAiY291bGRuJ3Qgc2V0IGZsYWdzIGZvciBwaXBlIHJlYWQgZmRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisKKyAgICBtUmVhZE5vbkJsb2NraW5nID0gdmFsOworICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogRW5hYmxlIG9yIGRpc2FibGUgbm9uLWJsb2NraW5nIG1vZGUgZm9yIHRoZSB3cml0ZSBkZXNjcmlwdG9yLgorICoKKyAqIEFzIHdpdGggc2V0UmVhZE5vbkJsb2NraW5nKCksIHRoaXMgZG9lcyBub3Qgd29yayBvbiB0aGUgTWFjLgorICovCitib29sIFBpcGU6OnNldFdyaXRlTm9uQmxvY2tpbmcoYm9vbCB2YWwpCit7CisgICAgYXNzZXJ0KG1Xcml0ZUhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSk7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIC8vIG5vdGhpbmcgdG8gZG8KKyNlbHNlCisgICAgaW50IGZsYWdzOworCisgICAgaWYgKGZjbnRsKG1Xcml0ZUhhbmRsZSwgRl9HRVRGTCwgJmZsYWdzKSA9PSAtMSkgeworICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwKKyAgICAgICAgICAgICJXYXJuaW5nOiBjb3VsZG4ndCBnZXQgZmxhZ3MgZm9yIHBpcGUgd3JpdGUgZmQgKGVycm5vPSVkKVxuIiwKKyAgICAgICAgICAgIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmFsKQorICAgICAgICBmbGFncyB8PSBPX05PTkJMT0NLOworICAgIGVsc2UKKyAgICAgICAgZmxhZ3MgJj0gfihPX05PTkJMT0NLKTsKKyAgICBpZiAoZmNudGwobVdyaXRlSGFuZGxlLCBGX1NFVEZMLCAmZmxhZ3MpID09IC0xKSB7CisgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLAorICAgICAgICAgICAgIldhcm5pbmc6IGNvdWxkbid0IHNldCBmbGFncyBmb3IgcGlwZSB3cml0ZSBmZCAoZXJybm89JWQpXG4iLAorICAgICAgICAgICAgZXJybm8pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisKKyAgICBtV3JpdGVOb25CbG9ja2luZyA9IHZhbDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFNwZWNpZnkgd2hldGhlciBhIGZpbGUgZGVzY3JpcHRvciBjYW4gYmUgaW5oZXJpdGVkIGJ5IGEgY2hpbGQgcHJvY2Vzcy4KKyAqIFVuZGVyIExpbnV4IHRoaXMgbWVhbnMgc2V0dGluZyB0aGUgY2xvc2Utb24tZXhlYyBmbGFnLCB1bmRlciBXaW5kb3dzCisgKiB0aGlzIGlzIFNldEhhbmRsZUluZm9ybWF0aW9uKEhBTkRMRV9GTEFHX0lOSEVSSVQpLgorICovCitib29sIFBpcGU6OmRpc2FsbG93UmVhZEluaGVyaXQodm9pZCkKK3sKKyAgICBpZiAobVJlYWRIYW5kbGUgPT0ga0ludmFsaWRIYW5kbGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgaWYgKFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpIG1SZWFkSGFuZGxlLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKSA9PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIGlmIChmY250bCgoaW50KSBtUmVhZEhhbmRsZSwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgIT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9Citib29sIFBpcGU6OmRpc2FsbG93V3JpdGVJbmhlcml0KHZvaWQpCit7CisgICAgaWYgKG1Xcml0ZUhhbmRsZSA9PSBrSW52YWxpZEhhbmRsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICBpZiAoU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSkgbVdyaXRlSGFuZGxlLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKSA9PSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIGlmIChmY250bCgoaW50KSBtV3JpdGVIYW5kbGUsIEZfU0VURkQsIEZEX0NMT0VYRUMpICE9IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogQ2xvc2UgcmVhZCBkZXNjcmlwdG9yLgorICovCitib29sIFBpcGU6OmNsb3NlUmVhZCh2b2lkKQoreworICAgIGlmIChtUmVhZEhhbmRsZSA9PSBrSW52YWxpZEhhbmRsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICBpZiAobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFDbG9zZUhhbmRsZSgoSEFORExFKW1SZWFkSGFuZGxlKSkgeworICAgICAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsICJmYWlsZWQgY2xvc2luZyByZWFkIGhhbmRsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIGlmIChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSkgeworICAgICAgICBpZiAoY2xvc2UoKGludCkgbVJlYWRIYW5kbGUpICE9IDApIHsKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLCAiZmFpbGVkIGNsb3NpbmcgcmVhZCBmZFxuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBtUmVhZEhhbmRsZSA9IGtJbnZhbGlkSGFuZGxlOworICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogQ2xvc2Ugd3JpdGUgZGVzY3JpcHRvci4KKyAqLworYm9vbCBQaXBlOjpjbG9zZVdyaXRlKHZvaWQpCit7CisgICAgaWYgKG1Xcml0ZUhhbmRsZSA9PSBrSW52YWxpZEhhbmRsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICBpZiAobVdyaXRlSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKSB7CisgICAgICAgIGlmICghQ2xvc2VIYW5kbGUoKEhBTkRMRSltV3JpdGVIYW5kbGUpKSB7CisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwgImZhaWxlZCBjbG9zaW5nIHdyaXRlIGhhbmRsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIGlmIChtV3JpdGVIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpIHsKKyAgICAgICAgaWYgKGNsb3NlKChpbnQpIG1Xcml0ZUhhbmRsZSkgIT0gMCkgeworICAgICAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsICJmYWlsZWQgY2xvc2luZyB3cml0ZSBmZFxuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBtV3JpdGVIYW5kbGUgPSBrSW52YWxpZEhhbmRsZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIEdldCB0aGUgcmVhZCBoYW5kbGUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgUGlwZTo6Z2V0UmVhZEhhbmRsZSh2b2lkKQoreworICAgIGFzc2VydChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSk7CisKKyAgICByZXR1cm4gbVJlYWRIYW5kbGU7Cit9CisKKy8qCisgKiBHZXQgdGhlIHdyaXRlIGhhbmRsZS4KKyAqLwordW5zaWduZWQgbG9uZyBQaXBlOjpnZXRXcml0ZUhhbmRsZSh2b2lkKQoreworICAgIGFzc2VydChtV3JpdGVIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpOworCisgICAgcmV0dXJuIG1Xcml0ZUhhbmRsZTsKK30KKwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9QaXBlLmggYi9zaW11bGF0b3IvYXBwL1BpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA0MTY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL2FwcC9QaXBlLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLworLy8gRklGTyBJL08uCisvLworI2lmbmRlZiBfTElCU19VVElMU19QSVBFX0gKKyNkZWZpbmUgX0xJQlNfVVRJTFNfUElQRV9ICisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyNlcnJvciBETyBOT1QgVVNFIFRISVMgRklMRSBJTiBUSEUgREVWSUNFIEJVSUxECisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorICogU2ltcGxlIGFub255bW91cyB1bmlkaXJlY3Rpb25hbCBwaXBlLgorICoKKyAqIFRoZSBwcmltYXJ5IGdvYWwgaXMgdG8gY3JlYXRlIGFuIGltcGxlbWVudGF0aW9uIHdpdGggbWluaW1hbCBvdmVyaGVhZAorICogdW5kZXIgTGludXguICBNYWtpbmcgV2luZG93cywgTWFjIE9TIFgsIGFuZCBMaW51eCBhbGwgd29yayB0aGUgc2FtZSB3YXkKKyAqIGlzIGEgc2Vjb25kYXJ5IGdvYWwuICBQYXJ0IG9mIHRoaXMgZ29hbCBpcyB0byBoYXZlIHNvbWV0aGluZyB0aGF0IGNhbgorICogYmUgZmVkIHRvIGEgc2VsZWN0KCkgY2FsbCwgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIHNsZWVwIGluIHRoZQorICoga2VybmVsIHVudGlsIHNvbWV0aGluZyBpbnRlcmVzdGluZyBoYXBwZW5zLgorICovCitjbGFzcyBQaXBlIHsKK3B1YmxpYzoKKyAgICBQaXBlKHZvaWQpOworICAgIHZpcnR1YWwgflBpcGUodm9pZCk7CisKKyAgICAvKiBDcmVhdGUgdGhlIHBpcGUgKi8KKyAgICBib29sIGNyZWF0ZSh2b2lkKTsKKworICAgIC8qIENyZWF0ZSBhIHJlYWQtb25seSBwaXBlLCB1c2luZyB0aGUgc3VwcGxpZWQgaGFuZGxlIGFzIHJlYWQgaGFuZGxlICovCisgICAgYm9vbCBjcmVhdGVSZWFkZXIodW5zaWduZWQgbG9uZyBoYW5kbGUpOworICAgIC8qIENyZWF0ZSBhIHdyaXRlLW9ubHkgcGlwZSwgdXNpbmcgdGhlIHN1cHBsaWVkIGhhbmRsZSBhcyB3cml0ZSBoYW5kbGUgKi8KKyAgICBib29sIGNyZWF0ZVdyaXRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSk7CisKKyAgICAvKiBJcyB0aGlzIG9iamVjdCByZWFkeSB0byBnbz8gKi8KKyAgICBib29sIGlzQ3JlYXRlZCh2b2lkKTsKKworICAgIC8qCisgICAgICogUmVhZCAiY291bnQiIGJ5dGVzIGZyb20gdGhlIHBpcGUuICBSZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSByZWFkLAorICAgICAqIG9yIDAgaWYgbm8gZGF0YSBhdmFpbGFibGUgYW5kIHdlJ3JlIG5vbi1ibG9ja2luZy4KKyAgICAgKiBSZXR1cm5zIC0xIG9uIGVycm9yLgorICAgICAqLworICAgIGludCByZWFkKHZvaWQqIGJ1ZiwgaW50IGNvdW50KTsKKworICAgIC8qCisgICAgICogV3JpdGUgImNvdW50IiBieXRlcyBpbnRvIHRoZSBwaXBlLiAgUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwKKyAgICAgKiBvciAwIGlmIHRoZXJlJ3Mgbm8gcm9vbSBmb3IgbW9yZSBkYXRhIGFuZCB3ZSdyZSBub24tYmxvY2tpbmcuCisgICAgICogUmV0dXJucyAtMSBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCogYnVmLCBpbnQgY291bnQpOworCisgICAgLyogUmV0dXJucyAidHJ1ZSIgaWYgZGF0YSBpcyBhdmFpbGFibGUgdG8gcmVhZCAqLworICAgIGJvb2wgcmVhZFJlYWR5KHZvaWQpOworCisgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgbm9uLWJsb2NraW5nIEkvTyBmb3IgcmVhZHMgKi8KKyAgICBib29sIHNldFJlYWROb25CbG9ja2luZyhib29sIHZhbCk7CisgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgbm9uLWJsb2NraW5nIEkvTyBmb3Igd3JpdGVzLiAgT25seSB3b3JrcyBvbiBMaW51eC4gKi8KKyAgICBib29sIHNldFdyaXRlTm9uQmxvY2tpbmcoYm9vbCB2YWwpOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGhhbmRsZS4gIE9ubHkgdXNlZnVsIGluIHNvbWUgcGxhdGZvcm0tc3BlY2lmaWMgc2l0dWF0aW9ucy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGdldFJlYWRIYW5kbGUodm9pZCk7CisgICAgdW5zaWduZWQgbG9uZyBnZXRXcml0ZUhhbmRsZSh2b2lkKTsKKworICAgIC8qCisgICAgICogTW9kaWZ5IGluaGVyaXRhbmNlLCBpLmUuIHdoZXRoZXIgb3Igbm90IGEgY2hpbGQgcHJvY2VzcyB3aWxsIGdldAorICAgICAqIGNvcGllcyBvZiB0aGUgZGVzY3JpcHRvcnMuICBTeXN0ZW1zIHdpdGggZm9yaytleGVjIGFsbG93IHVzIHRvIGNsb3NlCisgICAgICogdGhlIGRlc2NyaXB0b3JzIGJlZm9yZSBsYXVuY2hpbmcgdGhlIGNoaWxkIHByb2Nlc3MsIGJ1dCBXaW4zMgorICAgICAqIGRvZXNuJ3QgYWxsb3cgaXQuCisgICAgICovCisgICAgYm9vbCBkaXNhbGxvd1JlYWRJbmhlcml0KHZvaWQpOworICAgIGJvb2wgZGlzYWxsb3dXcml0ZUluaGVyaXQodm9pZCk7CisKKyAgICAvKgorICAgICAqIENsb3NlIG9uZSBzaWRlIG9yIHRoZSBvdGhlci4gIFVzZWZ1bCBpbiB0aGUgcGFyZW50IGFmdGVyIGxhdW5jaGluZworICAgICAqIGEgY2hpbGQgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBib29sIGNsb3NlUmVhZCh2b2lkKTsKKyAgICBib29sIGNsb3NlV3JpdGUodm9pZCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCAgICBtUmVhZE5vbkJsb2NraW5nOworICAgIGJvb2wgICAgbVdyaXRlTm9uQmxvY2tpbmc7CisKKyAgICB1bnNpZ25lZCBsb25nIG1SZWFkSGFuZGxlOworICAgIHVuc2lnbmVkIGxvbmcgbVdyaXRlSGFuZGxlOworfTsKKworfTsgLy8gYW5kcm9pZAorCisjZW5kaWYgLy8gX0xJQlNfVVRJTFNfUElQRV9ICmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL1VzZXJFdmVudE1lc3NhZ2UuaCBiL3NpbXVsYXRvci9hcHAvVXNlckV2ZW50TWVzc2FnZS5oCmluZGV4IDRhNjZjYzIuLjliOTRlYTcgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvVXNlckV2ZW50TWVzc2FnZS5oCisrKyBiL3NpbXVsYXRvci9hcHAvVXNlckV2ZW50TWVzc2FnZS5oCkBAIC02LDcgKzYsNyBAQAogI2lmbmRlZiBfU0lNX1VTRVJfRVZFTlRfTUVTU0FHRV9ICiAjZGVmaW5lIF9TSU1fVVNFUl9FVkVOVF9NRVNTQUdFX0gKIAotI2luY2x1ZGUgPHV0aWxzLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKICNpbmNsdWRlICJMb2dNZXNzYWdlLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoLmggYi9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5OTgyZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGguaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfU0lNX0VYRUNVVEFCTEVQQVRIX0gKKyNkZWZpbmUgX1NJTV9FWEVDVVRBQkxFUEFUSF9ICisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLy8gcmV0dXJucyB0aGUgcGF0aCB0byB0aGlzIGV4ZWN1dGFibGUKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCit2b2lkIGV4ZWN1dGFibGVwYXRoKGNoYXIgc1tQQVRIX01BWF0pOworCisjZW5kaWYgLy8gX1NJTV9FWEVDVVRBQkxFUEFUSF9ICmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoX2Rhcndpbi5jcHAgYi9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoX2Rhcndpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjMWMxOAotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGhfZGFyd2luLmNwcApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4ZWN1dGFibGVwYXRoLmgiCisjaW1wb3J0IDxDYXJib24vQ2FyYm9uLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3ZvaWQgZXhlY3V0YWJsZXBhdGgoY2hhciBzW1BBVEhfTUFYXSkKK3sKKyAgICBQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKKyAgICBHZXRDdXJyZW50UHJvY2VzcygmcHNuKTsKKyAgICBDRkRpY3Rpb25hcnlSZWYgZGljdDsKKyAgICBkaWN0ID0gUHJvY2Vzc0luZm9ybWF0aW9uQ29weURpY3Rpb25hcnkoJnBzbiwgMHhmZmZmZmZmZik7CisgICAgQ0ZTdHJpbmdSZWYgdmFsdWUgPSAoQ0ZTdHJpbmdSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUoZGljdCwKKyAgICAgICAgICAgICAgICBDRlNUUigiQ0ZCdW5kbGVFeGVjdXRhYmxlIikpOworICAgIENGU3RyaW5nR2V0Q1N0cmluZyh2YWx1ZSwgcywgUEFUSF9NQVgrMSwga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKK30KKwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aF9saW51eC5jcHAgYi9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoX2xpbnV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGEzYTJiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aF9saW51eC5jcHAKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleGVjdXRhYmxlcGF0aC5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3ZvaWQgZXhlY3V0YWJsZXBhdGgoY2hhciBleGVbUEFUSF9NQVhdKQoreworICAgIGNoYXIgcHJvY1sxMDBdOworICAgIHNwcmludGYocHJvYywgIi9wcm9jLyVkL2V4ZSIsIGdldHBpZCgpKTsKKyAgICAKKyAgICBpbnQgZXJyID0gcmVhZGxpbmsocHJvYywgZXhlLCBQQVRIX01BWCk7Cit9CisKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvcG9ydGVkLmNwcCBiL3NpbXVsYXRvci9hcHAvcG9ydGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzJiMzAyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL2FwcC9wb3J0ZWQuY3BwCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8KKy8vIFBvcnRzIG9mIHN0YW5kYXJkIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGV4aXN0IG9uIGEgc3BlY2lmaWMgcGxhdGZvcm0uCisvLworLy8gTm90ZSB0aGVzZSBhcmUgTk9UIGluIHRoZSAiYW5kcm9pZCIgbmFtZXNwYWNlLgorLy8KKyNpbmNsdWRlICJwb3J0ZWQuaCIKKworI2lmIGRlZmluZWQoTkVFRF9HRVRUSU1FT0ZEQVkpIHx8IGRlZmluZWQoTkVFRF9VU0xFRVApCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKE5FRURfR0VUVElNRU9GREFZKQorLyoKKyAqIFJlcGxhY2VtZW50IGdldHRpbWVvZmRheSgpIGZvciBXaW5kb3dzIGVudmlyb25tZW50cyAocHJpbWFyaWx5IE1pbkdXKS4KKyAqCisgKiBJZ25vcmVzICJ0eiIuCisgKi8KK2ludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHB0diwgc3RydWN0IHRpbWV6b25lKiB0eikKK3sKKyAgICBsb25nIGxvbmcgbnNUaW1lOyAgIC8vIHRpbWUgaW4gMTAwbnMgdW5pdHMgc2luY2UgSmFuIDEgMTYwMQorICAgIEZJTEVUSU1FIGZ0OworCisgICAgaWYgKHR6ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gb2ggd2VsbAorICAgIH0KKworICAgIDo6R2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoJmZ0KTsKKyAgICBuc1RpbWUgPSAobG9uZyBsb25nKSBmdC5kd0hpZ2hEYXRlVGltZSA8PCAzMiB8CisgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnQuZHdMb3dEYXRlVGltZTsKKyAgICAvLyBjb252ZXJ0IHRvIHRpbWUgaW4gdXNlYyBzaW5jZSBKYW4gMSAxOTcwCisgICAgcHR2LT50dl91c2VjID0gKGxvbmcpICgobnNUaW1lIC8gMTBMTCkgJSAxMDAwMDAwTEwpOworICAgIHB0di0+dHZfc2VjID0gKGxvbmcpICgobnNUaW1lIC0gMTE2NDQ0NzM2MDAwMDAwMDAwTEwpIC8gMTAwMDAwMDBMTCk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChORUVEX1VTTEVFUCkKKy8vCisvLyBSZXBsYWNlbWVudCB1c2xlZXAgZm9yIFdpbmRvd3MgZW52aXJvbm1lbnRzIChwcmltYXJpbHkgTWluR1cpLgorLy8KK3ZvaWQgdXNsZWVwKHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKyAgICAvLyBXaW4zMiBBUEkgZnVuY3Rpb24gU2xlZXAoKSB0YWtlcyBtaWxsaXNlY29uZHMKKyAgICA6OlNsZWVwKCh1c2VjICsgNTAwKSAvIDEwMDApOworfQorI2VuZGlmCisKKyNpZiAwIC8vZGVmaW5lZChORUVEX1BJUEUpCisvLworLy8gUmVwbGFjZW1lbnQgcGlwZSgpIGNvbW1hbmQgZm9yIE1pbkdXCisvLworLy8gVGhlIF9PX05PSU5IRVJJVCBmbGFnIHNldHMgYkluaGVyaXRIYW5kbGUgdG8gRkFMU0UgaW4gdGhlCisvLyBTZWN1cml0eUF0dHJpYnV0ZXMgYXJndW1lbnQgdG8gQ3JlYXRlUGlwZSgpLiAgVGhpcyBtZWFucyB0aGUgaGFuZGxlcworLy8gYXJlbid0IGluaGVyaXRlZCB3aGVuIGEgbmV3IHByb2Nlc3MgaXMgY3JlYXRlZC4gIFRoZSBleGFtcGxlcyBJJ3ZlIHNlZW4KKy8vIHVzZSBpdCwgcG9zc2libHkgYmVjYXVzZSB0aGVyZSdzIGEgbG90IG9mIGp1bmsgZ29pbmcgb24gYmVoaW5kIHRoZQorLy8gc2NlbmVzLiAgKEknbSBhc3N1bWluZyAicHJvY2VzcyIgYW5kICJ0aHJlYWQiIGFyZSBkaWZmZXJlbnQgaGVyZSwgc28KKy8vIHdlIHNob3VsZCBiZSBva2F5IHNwaW5uaW5nIHVwIGEgdGhyZWFkLikgIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSBpcworLy8gdG8gZHVwKCkgdGhlIGRlc2NyaXB0b3IgeW91IHdhbnQgdGhlIGNoaWxkIHRvIGhhdmUuCisvLworLy8gSXQgYXBwZWFycyB0aGF0IHVubmFtZWQgcGlwZXMgY2FuJ3QgZG8gbm9uLWJsb2NraW5nICgib3ZlcmxhcHBlZCIpIEkvTy4KKy8vIFlvdSBjYW4ndCB1c2Ugc2VsZWN0KCkgZWl0aGVyLCBzaW5jZSB0aGF0IG9ubHkgd29ya3Mgb24gc29ja2V0cy4gIFRoZQorLy8gV2luZG93cyBBUEkgY2FsbHMgdGhhdCBhcmUgdXNlZnVsIGhlcmUgYWxsIG9wZXJhdGUgb24gYSBIQU5ETEUsIG5vdAorLy8gYW4gaW50ZWdlciBmaWxlIGRlc2NyaXB0b3IsIGFuZCBJIGRvbid0IHRoaW5rIHlvdSBjYW4gZ2V0IHRoZXJlIGZyb20KKy8vIGhlcmUuICBUaGUgIm5hbWVkIHBpcGUiIHN0dWZmIGlzIGluc2FuZS4KKy8vCitpbnQgcGlwZShpbnQgZmlsZWRlc1syXSkKK3sKKyAgICByZXR1cm4gX3BpcGUoZmlsZWRlcywgMCwgX09fQklOQVJZIHwgX09fTk9JTkhFUklUKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChORUVEX1NFVEVOVikKKy8qCisgKiBNaW5HVyBsYWNrcyB0aGVzZS4gIEZvciBub3csIGp1c3Qgc3R1YiB0aGVtIG91dCBzbyB0aGUgY29kZSBjb21waWxlcy4KKyAqLworaW50IHNldGVudihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSkKK3sKKyAgICByZXR1cm4gMDsKK30KK3ZvaWQgdW5zZXRlbnYoY29uc3QgY2hhciogbmFtZSkKK3sKK30KK2NoYXIqIGdldGVudihjb25zdCBjaGFyKiBuYW1lKQoreworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL3BvcnRlZC5oIGIvc2ltdWxhdG9yL2FwcC9wb3J0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjNiZTAxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL2FwcC9wb3J0ZWQuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8KKy8vIFN0YW5kYXJkIGZ1bmN0aW9ucyBwb3J0ZWQgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBOb3RlIHRoZXNlIGFyZSBOT1QKKy8vIGluIHRoZSAiYW5kcm9pZCIgbmFtZXNwYWNlLgorLy8KKyNpZm5kZWYgX0xJQlNfVVRJTFNfUE9SVEVEX0gKKyNkZWZpbmUgX0xJQlNfVVRJTFNfUE9SVEVEX0gKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+ICAgICAgIC8vIGZvciB0aW1ldmFsCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogbGlicmFyeSByZXBsYWNlbWVudCBmdW5jdGlvbnMgKi8KKyNpZiBkZWZpbmVkKE5FRURfR0VUVElNRU9GREFZKQoraW50IGdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCogdHYsIHN0cnVjdCB0aW1lem9uZSogdHopOworI2VuZGlmCisjaWYgZGVmaW5lZChORUVEX1VTTEVFUCkKK3ZvaWQgdXNsZWVwKHVuc2lnbmVkIGxvbmcgdXNlYyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE5FRURfUElQRSkKK2ludCBwaXBlKGludCBmaWxlZGVzWzJdKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoTkVFRF9TRVRFTlYpCitpbnQgc2V0ZW52KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBpbnQgb3ZlcndyaXRlKTsKK3ZvaWQgdW5zZXRlbnYoY29uc3QgY2hhciogbmFtZSk7CitjaGFyKiBnZXRlbnYoY29uc3QgY2hhciogbmFtZSk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9MSUJTX1VUSUxTX1BPUlRFRF9ICmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL3V0aWxzLmggYi9zaW11bGF0b3IvYXBwL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0ODQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci9hcHAvdXRpbHMuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8KKy8vIEhhbmR5IHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBwb3J0YWJpbGl0eSBjb2RlLiAgVGhpcyBmaWxlIGluY2x1ZGVzIGFsbAorLy8gb2YgdGhlIGdlbmVyYWxseS11c2VmdWwgaGVhZGVycyBpbiB0aGUgInV0aWxzIiBkaXJlY3RvcnkuCisvLworI2lmbmRlZiBfU0lNX1VUSUxTX0gKKyNkZWZpbmUgX1NJTV9VVElMU19ICisKKyNpbmNsdWRlICJwb3J0ZWQuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZ0FycmF5Lmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjZW5kaWYgLy8gX1NJTV9VVElMU19ICmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9BbmRyb2lkLm1rIGIvc2ltdWxhdG9yL3dyYXBzaW0vQW5kcm9pZC5tawppbmRleCAwYjc4OTBkLi5mOWEyNDE0IDEwMDY0NAotLS0gYS9zaW11bGF0b3Ivd3JhcHNpbS9BbmRyb2lkLm1rCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL0FuZHJvaWQubWsKQEAgLTMsNyArMyw2IEBACiAjCiAjIEJ1aWxkIGluc3RydWN0aW9ucyBmb3Igc2ltdWxhdG9yIExEX1BSRUxPQUQgd3JhcHBlci4KICMKLWlmbmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCiBpZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCiAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQpAQCAtMjMsNyArMjIsOCBAQAogCUludGVyY2VwdC5jIFwKIAlMb2cuYyBcCiAJU2ltTWdyLmMgXAotCVN5c1Bvd2VyLmMKKwlTeXNQb3dlci5jIFwKKwlVdGlsLmMKIAogTE9DQUxfQ19JTkNMVURFUyArPSBwcmVidWlsdC9jb21tb24vZXNkCiAKQEAgLTU1LDUgKzU1LDMgQEAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCiBlbmRpZiAjIGlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLWVuZGlmCi0jIGlmbmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9Db21tb24uaCBiL3NpbXVsYXRvci93cmFwc2ltL0NvbW1vbi5oCmluZGV4IGE5YzNiYjguLjQ2MzI2MmYgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci93cmFwc2ltL0NvbW1vbi5oCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL0NvbW1vbi5oCkBAIC0xNCw1ICsxNCw2IEBACiAjaW5jbHVkZSAiTG9nLmgiCiAjaW5jbHVkZSAiU2ltTWdyLmgiCiAjaW5jbHVkZSAiR2xvYmFscy5oIgorI2luY2x1ZGUgIlV0aWwuaCIKIAogI2VuZGlmIC8qX1dSQVBTSU1fQ09NTU9OX0gqLwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vRGV2RmIuYyBiL3NpbXVsYXRvci93cmFwc2ltL0RldkZiLmMKaW5kZXggYzU0NDAzZS4uYmZkYmIyMiAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL3dyYXBzaW0vRGV2RmIuYworKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9EZXZGYi5jCkBAIC0xNCw2ICsxNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAKIHR5cGVkZWYgc3RydWN0IEZiU3RhdGUgeworCisgICAgLyogcmVmY291bnQgZm9yIGR1cCgpICovCisgICAgaW50IHJlZkNvdW50OworCiAgICAgLyogaW5kZXggaW50byBnV3JhcFNpbS5kaXNwbGF5W10gKi8KICAgICBpbnQgICAgIGRpc3BsYXlJZHg7CiAKQEAgLTc3LDcgKzgxLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGZyZWVTdGF0ZShGYlN0YXRlKiBmYlN0YXRlKQogewotICAgIGZyZWUoZmJTdGF0ZSk7CisgICAgaW50IG9sZGNvdW50OworCisgICAgb2xkY291bnQgPSB3c0F0b21pY0FkZCgmZmJTdGF0ZS0+cmVmQ291bnQsIC0xKTsKKworICAgIGlmIChvbGRjb3VudCA9PSAwKSB7CisgICAgICAgIGZyZWUoZmJTdGF0ZSk7CisgICAgfQogfQogCiAvKgpAQCAtMjQyLDYgKzI1MiwyOCBAQAogfQogCiAvKgorICogZHVwKCkgYW4gZXhpc3RpbmcgZmFrZSBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyBGYWtlRGV2KiBkdXBGYihGYWtlRGV2KiBkZXYsIGludCBmZCkKK3sKKyAgICBGYWtlRGV2KiBuZXdEZXYgPSB3c0NyZWF0ZUZha2VEZXYoZGV2LT5kZWJ1Z05hbWUpOworICAgIGlmIChuZXdEZXYgIT0gTlVMTCkgeworICAgICAgICBuZXdEZXYtPm1tYXAgPSBtbWFwRmI7CisgICAgICAgIG5ld0Rldi0+aW9jdGwgPSBpb2N0bEZiOworICAgICAgICBuZXdEZXYtPmNsb3NlID0gY2xvc2VGYjsKKyAgICAgICAgbmV3RGV2LT5kdXAgPSBkdXBGYjsKKworICAgICAgICAvKiB1c2Ugc3RhdGUgZnJvbSBleGlzdGluZyBGYWtlRGV2ICovCisgICAgICAgIEZiU3RhdGUqIGZiU3RhdGUgPSBkZXYtPnN0YXRlOworICAgICAgICB3c0F0b21pY0FkZCgmZmJTdGF0ZS0+cmVmQ291bnQsIDEpOworCisgICAgICAgIG5ld0Rldi0+c3RhdGUgPSBmYlN0YXRlOworICAgIH0KKworICAgIHJldHVybiBuZXdEZXY7Cit9CisKKy8qCiAgKiBPcGVuIHRoZSBjb25zb2xlIFRUWSBkZXZpY2UsIHdoaWNoIHJlc3BvbmRzIHRvIGEgY29sbGVjdGlvbiBvZiBpb2N0bCgpcy4KICAqLwogRmFrZURldiogd3NPcGVuRGV2RmIoY29uc3QgY2hhciogcGF0aE5hbWUsIGludCBmbGFncykKQEAgLTI1MSw2ICsyODMsNyBAQAogICAgICAgICBuZXdEZXYtPm1tYXAgPSBtbWFwRmI7CiAgICAgICAgIG5ld0Rldi0+aW9jdGwgPSBpb2N0bEZiOwogICAgICAgICBuZXdEZXYtPmNsb3NlID0gY2xvc2VGYjsKKyAgICAgICAgbmV3RGV2LT5kdXAgPSBkdXBGYjsKIAogICAgICAgICBGYlN0YXRlKiBmYlN0YXRlID0gY2FsbG9jKDEsIHNpemVvZihGYlN0YXRlKSk7CiAKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL0Zha2VEZXYuYyBiL3NpbXVsYXRvci93cmFwc2ltL0Zha2VEZXYuYwppbmRleCA3ZDI0OTRlLi5mMDNkZDI5IDEwMDY0NAotLS0gYS9zaW11bGF0b3Ivd3JhcHNpbS9GYWtlRGV2LmMKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vRmFrZURldi5jCkBAIC05OSw2ICs5OSwxMSBAQAogewogICAgIHJldHVybiAwOwogfQorc3RhdGljIEZha2VEZXYqIG5vRHVwKEZha2VEZXYqIGRldiwgLi4uKQoreworICAgIG5vdEltcGxlbWVudGVkKGRldiwgImR1cCIpOworICAgIHJldHVybiBOVUxMOworfQogc3RhdGljIGludCBub1JlYWQoRmFrZURldiogZGV2LCAuLi4pCiB7CiAgICAgcmV0dXJuIG5vdEltcGxlbWVudGVkKGRldiwgInJlYWQiKTsKQEAgLTE0Niw2ICsxNTEsNyBAQAogICAgIG5ld0Rldi0+c3RhdGUgPSBOVUxMOwogCiAgICAgbmV3RGV2LT5jbG9zZSA9IChGYWtlX2Nsb3NlKSBub0Nsb3NlOworICAgIG5ld0Rldi0+ZHVwID0gKEZha2VfZHVwKSBub0R1cDsKICAgICBuZXdEZXYtPnJlYWQgPSAoRmFrZV9yZWFkKSBub1JlYWQ7CiAgICAgbmV3RGV2LT5yZWFkdiA9IChGYWtlX3JlYWR2KSBub1JlYWR2OwogICAgIG5ld0Rldi0+d3JpdGUgPSAoRmFrZV93cml0ZSkgbm9Xcml0ZTsKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL0Zha2VEZXYuaCBiL3NpbXVsYXRvci93cmFwc2ltL0Zha2VEZXYuaAppbmRleCA0NzgxY2ZjLi42NWY0N2FlIDEwMDY0NAotLS0gYS9zaW11bGF0b3Ivd3JhcHNpbS9GYWtlRGV2LmgKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vRmFrZURldi5oCkBAIC0xMiwxMyArMTIsMTQgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgRmFrZURldiBGYWtlRGV2OwogCi10eXBlZGVmIGludCAgICAgKCpGYWtlX2Nsb3NlKShGYWtlRGV2KiBkZXYsIGludCk7Ci10eXBlZGVmIHNzaXplX3QgKCpGYWtlX3JlYWQpKEZha2VEZXYqIGRldiwgaW50LCB2b2lkKiwgc2l6ZV90KTsKLXR5cGVkZWYgc3NpemVfdCAoKkZha2VfcmVhZHYpKEZha2VEZXYqIGRldiwgaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMqLCBpbnQpOwotdHlwZWRlZiBzc2l6ZV90ICgqRmFrZV93cml0ZSkoRmFrZURldiogZGV2LCBpbnQsIGNvbnN0IHZvaWQqLCBzaXplX3QpOwotdHlwZWRlZiBzc2l6ZV90ICgqRmFrZV93cml0ZXYpKEZha2VEZXYqIGRldiwgaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMqLCBpbnQpOwotdHlwZWRlZiB2b2lkKiAgICgqRmFrZV9tbWFwKShGYWtlRGV2KiBkZXYsIHZvaWQqLCBzaXplX3QsIGludCwgaW50LCBpbnQsIF9fb2ZmX3QpOwotdHlwZWRlZiBpbnQgICAgICgqRmFrZV9pb2N0bCkoRmFrZURldiogZGV2LCBpbnQsIGludCwgdm9pZCopOwordHlwZWRlZiBpbnQgICAgICAoKkZha2VfY2xvc2UpKEZha2VEZXYqIGRldiwgaW50KTsKK3R5cGVkZWYgRmFrZURldiogKCpGYWtlX2R1cCkoRmFrZURldiogZGV2LCBpbnQpOwordHlwZWRlZiBzc2l6ZV90ICAoKkZha2VfcmVhZCkoRmFrZURldiogZGV2LCBpbnQsIHZvaWQqLCBzaXplX3QpOwordHlwZWRlZiBzc2l6ZV90ICAoKkZha2VfcmVhZHYpKEZha2VEZXYqIGRldiwgaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMqLCBpbnQpOwordHlwZWRlZiBzc2l6ZV90ICAoKkZha2Vfd3JpdGUpKEZha2VEZXYqIGRldiwgaW50LCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKK3R5cGVkZWYgc3NpemVfdCAgKCpGYWtlX3dyaXRldikoRmFrZURldiogZGV2LCBpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyosIGludCk7Cit0eXBlZGVmIHZvaWQqICAgICgqRmFrZV9tbWFwKShGYWtlRGV2KiBkZXYsIHZvaWQqLCBzaXplX3QsIGludCwgaW50LCBpbnQsIF9fb2ZmX3QpOwordHlwZWRlZiBpbnQgICAgICAoKkZha2VfaW9jdGwpKEZha2VEZXYqIGRldiwgaW50LCBpbnQsIHZvaWQqKTsKIAogLyoKICAqIEFuIG9wZW4gZmFrZSBkZXZpY2UgZW50cnkuCkBAIC00Miw2ICs0Myw3IEBACiAgICAgICogQWxsIG90aGVyIGZpbGUgZGVzY3JpcHRvciBvcGVyYXRpb25zIHNob3VsZCBmYWlsLCB1c3VhbGx5IHdpdGggRUJBREYuCiAgICAgICovCiAgICAgRmFrZV9jbG9zZSAgY2xvc2U7CisgICAgRmFrZV9kdXAgIGR1cDsKICAgICBGYWtlX3JlYWQgICByZWFkOwogICAgIEZha2VfcmVhZHYgIHJlYWR2OwogICAgIEZha2Vfd3JpdGUgIHdyaXRlOwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vR2xvYmFscy5oIGIvc2ltdWxhdG9yL3dyYXBzaW0vR2xvYmFscy5oCmluZGV4IDc1Yzk4ZDguLmE4ZDgzNGMgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci93cmFwc2ltL0dsb2JhbHMuaAorKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9HbG9iYWxzLmgKQEAgLTI5LDYgKzI5LDcgQEAKIHR5cGVkZWYgaW50ICAgICAoKkZ1bmNfb3BlbjY0KShjb25zdCBjaGFyKiwgaW50LCBtb2RlX3QpOwogCiB0eXBlZGVmIGludCAgICAgKCpGdW5jX2Nsb3NlKShpbnQpOwordHlwZWRlZiBpbnQgICAgICgqRnVuY19kdXApKGludCk7CiB0eXBlZGVmIHNzaXplX3QgKCpGdW5jX3JlYWQpKGludCwgdm9pZCosIHNpemVfdCk7CiB0eXBlZGVmIHNzaXplX3QgKCpGdW5jX3JlYWR2KShpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyosIGludCk7CiB0eXBlZGVmIHNzaXplX3QgKCpGdW5jX3dyaXRlKShpbnQsIGNvbnN0IHZvaWQqLCBzaXplX3QpOwpAQCAtOTUsNiArOTYsNyBAQAogRVhURVJOX0ZVTkMgRnVuY19vcGVuNjQgX3dzX29wZW42NDsKIAogRVhURVJOX0ZVTkMgRnVuY19jbG9zZSBfd3NfY2xvc2U7CitFWFRFUk5fRlVOQyBGdW5jX2R1cCBfd3NfZHVwOwogRVhURVJOX0ZVTkMgRnVuY19yZWFkIF93c19yZWFkOwogRVhURVJOX0ZVTkMgRnVuY19yZWFkdiBfd3NfcmVhZHY7CiBFWFRFUk5fRlVOQyBGdW5jX3dyaXRlIF93c193cml0ZTsKQEAgLTIwMSw2ICsyMDMsOSBAQAogICAgIHB0aHJlYWRfbXV0ZXhfdCBmYWtlRmRMb2NrOwogICAgIEJpdFZlY3RvciogIGZha2VGZE1hcDsKICAgICBGYWtlRGV2KiAgICBmYWtlRmRMaXN0W2tNYXhGYWtlRmRDb3VudF07CisKKyAgICAvKiB1c2VkIGZvciB3c0F0b21pY0FkZCAqLworICAgIHB0aHJlYWRfbXV0ZXhfdCBhdG9taWNMb2NrOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBXcmFwU2ltR2xvYmFscyBnV3JhcFNpbTsKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL0luaXQuYyBiL3NpbXVsYXRvci93cmFwc2ltL0luaXQuYwppbmRleCBlZWQ2NTBiLi4zZGYwZWZlIDEwMDY0NAotLS0gYS9zaW11bGF0b3Ivd3JhcHNpbS9Jbml0LmMKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vSW5pdC5jCkBAIC00MCw2ICs0MCw3IEBACiAgICAgX3dzX29wZW42NCA9IGRsc3ltKFJUTERfTkVYVCwgIm9wZW42NCIpOwogCiAgICAgX3dzX2Nsb3NlID0gZGxzeW0oUlRMRF9ORVhULCAiY2xvc2UiKTsKKyAgICBfd3NfZHVwID0gZGxzeW0oUlRMRF9ORVhULCAiZHVwIik7CiAgICAgX3dzX3JlYWQgPSBkbHN5bShSVExEX05FWFQsICJyZWFkIik7CiAgICAgX3dzX3JlYWR2ID0gZGxzeW0oUlRMRF9ORVhULCAicmVhZHYiKTsKICAgICBfd3Nfd3JpdGUgPSBkbHN5bShSVExEX05FWFQsICJ3cml0ZSIpOwpAQCAtMTA4LDYgKzEwOSw4IEBACiAgICAgZ1dyYXBTaW0uZmFrZUZkTWFwID0gd3NBbGxvY0JpdFZlY3RvcihrTWF4RmFrZUZkQ291bnQsIDApOwogICAgIG1lbXNldChnV3JhcFNpbS5mYWtlRmRMaXN0LCAwLCBzaXplb2YoZ1dyYXBTaW0uZmFrZUZkTGlzdCkpOwogCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZnV3JhcFNpbS5hdG9taWNMb2NrLCBOVUxMKTsKKwogICAgIGdXcmFwU2ltLm51bURpc3BsYXlzID0gMDsKIAogICAgIGdXcmFwU2ltLmtleUlucHV0RGV2aWNlID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL0ludGVyY2VwdC5jIGIvc2ltdWxhdG9yL3dyYXBzaW0vSW50ZXJjZXB0LmMKaW5kZXggNDlkNzdlZS4uM2Q0ZWRiMiAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL3dyYXBzaW0vSW50ZXJjZXB0LmMKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vSW50ZXJjZXB0LmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogICAgIF9ydHlwZSBfZm5hbWUoIF9fVkFfQVJHU19fICkKICNkZWZpbmUgUEFTU19USFJPVUdIX0JPRFkoX2ZuYW1lLCBfcGF0aGFyZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDQUxMVFJBQ0VWKCIlc1xuIiwgX19GVU5DVElPTl9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0FMTFRSQUNFVigiJXMoJXMpXG4iLCBfX0ZVTkNUSU9OX18sIF9wYXRoYXJnKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNoYXIgcGF0aEJ1ZltQQVRIX01BWF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICByZXR1cm4gX3dzXyMjX2ZuYW1lKHJld3JpdGVQYXRoKCNfZm5hbWUsIHBhdGhCdWYsIF9wYXRoYXJnKSwgICAgICAgIFwKICAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02MzEsNiArNjMxLDMwIEBACiB9CiAKIAoraW50IGR1cChpbnQgZmQpCit7CisgICAgQ0FMTFRSQUNFVigiJXMoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGZkKTsKKworICAgIEZha2VEZXYqIGRldiA9IHdzRmFrZURldkZyb21GZChmZCk7CisgICAgaWYgKGRldiAhPSBOVUxMKSB7CisgICAgICAgIEZha2VEZXYqIG5ld0RldiA9IGRldi0+ZHVwKGRldiwgZmQpOworICAgICAgICBpZiAobmV3RGV2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBOb3cgdGhhdCB0aGUgZGV2aWNlIGVudHJ5IGlzIHJlYWR5LCBhZGQgaXQgdG8gdGhlIGxpc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdzTG9nKCIjIyBkdXAnZWQgZmFrZSBkZXYgJWQ6ICclcycgJXBcbiIsCisgICAgICAgICAgICAgICAgbmV3RGV2LT5mZCwgbmV3RGV2LT5kZWJ1Z05hbWUsIG5ld0Rldi0+c3RhdGUpOworICAgICAgICAgICAgZ1dyYXBTaW0uZmFrZUZkTGlzdFtuZXdEZXYtPmZkIC0ga0Zha2VGZEJhc2VdID0gbmV3RGV2OworICAgICAgICAgICAgcmV0dXJuIG5ld0Rldi0+ZmQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIENBTExUUkFDRSgiZHVwKCVkKVxuIiwgZmQpOworICAgICAgICByZXR1cm4gX3dzX2R1cChmZCk7CisgICAgfQorfQorCisKIC8qCiAgKiBDbG9zZSBhIGZpbGUgZGVzY3JpcHRvci4KICAqLwpAQCAtNzk5LDYgKzgyMywxNiBAQAogICAgIHJldHVybiAwOwogfQogCisvKgorICogUHJldGVuZCB0byBiZSBydW5uaW5nIGFzIHJvb3QsIHNvIHRoZSBBbmRyb2lkIGZyYW1ld29yaworICogZG9lc24ndCBjb21wbGFpbiBhYm91dCBwZXJtaXNzaW9uIHByb2JsZW1zIGFsbCBvdmVyIHRoZQorICogcGxhY2UuCisgKi8KK3VpZF90IGdldHVpZCh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCiAjaWYgMAogLyoKICAqIENyZWF0ZSBhIHBpcGUuICAoT25seSBuZWVkZWQgZm9yIGRlYnVnZ2luZyBhbiBmZCBsZWFrLikKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL1V0aWwuYyBiL3NpbXVsYXRvci93cmFwc2ltL1V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Q5MDNiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vVXRpbC5jCkBAIC0wLDAgKzEsMTMgQEAKKworI2luY2x1ZGUgIkNvbW1vbi5oIgorCitpbnQgd3NBdG9taWNBZGQoaW50ICp2YXIsIGludCB2YWwpCit7CisgICAgaW50IGNjOworICAgIGludCByZXQ7CisgICAgY2MgPSBwdGhyZWFkX211dGV4X2xvY2soJmdXcmFwU2ltLmF0b21pY0xvY2spOworICAgIHJldCA9ICp2YXI7CisgICAgKnZhciA9ICp2YXIgKyB2YWw7CisgICAgY2MgPSBwdGhyZWFkX211dGV4X3VubG9jaygmZ1dyYXBTaW0uYXRvbWljTG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL1V0aWwuaCBiL3NpbXVsYXRvci93cmFwc2ltL1V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDcwODAyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vVXRpbC5oCkBAIC0wLDAgKzEsNCBAQAorCisKKworaW50IHdzQXRvbWljQWRkKGludCAqdmFyLCBpbnQgdmFsKTsKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvcnVuX2NvbW1hbmQucHkgYi90ZXN0cnVubmVyL3J1bl9jb21tYW5kLnB5CmluZGV4IDdkMWY1NDcuLjc5YzdlYTUgMTAwNzU1Ci0tLSBhL3Rlc3RydW5uZXIvcnVuX2NvbW1hbmQucHkKKysrIGIvdGVzdHJ1bm5lci9ydW5fY29tbWFuZC5weQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgIGVsc2U6CiAgICAgIyBOZWVkIHRoZSBmdWxsIHBhdGggdG8gdmFsZ3JpbmQgdG8gYXZvaWQgb3RoZXIgdmVyc2lvbnMgb24gdGhlIHN5c3RlbS4KICAgICBzdWJwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihbIi91c3IvYmluL3ZhbGdyaW5kIiwgIi0tdG9vbD1tZW1jaGVjayIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWxlYWstY2hlY2s9eWVzIiwgIi1xIiwgZnVsbF9wYXRoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tbGVhay1jaGVjaz15ZXMiLCAiLXEiLCBiaW5hcnldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKICAgICAjIENhbm5vdCByZWx5IG9uIHRoZSByZXRjb2RlIG9mIHZhbGdyaW5kLiBJbnN0ZWFkIGxvb2sgZm9yIGFuIGVtcHR5IG91dHB1dC4KICAgICB2YWxncmluZF9vdXQgPSBzdWJwcm9jLmNvbW11bmljYXRlKClbMF0uc3RyaXAoKQpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sCmluZGV4IDA4YWZhNDIuLjgzY2Q2MjMgMTAwNjQ0Ci0tLSBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbAorKysgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwKQEAgLTQ0LDYgKzQ0LDEyIEBACiAgICAgY292ZXJhZ2VfdGFyZ2V0PSJmcmFtZXdvcmsiCiAgICAgY29udGludW91cz0idHJ1ZSIgLz4KIAorPHRlc3QgbmFtZT0iYWNjb3VudCIKKyAgICBidWlsZF9wYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdGVzdHMvQW5kcm9pZFRlc3RzIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnVuaXRfdGVzdHMiCisgICAgY2xhc3M9ImNvbS5hbmRyb2lkLnVuaXRfdGVzdHMuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlVGVzdCIKKyAgICBjb3ZlcmFnZV90YXJnZXQ9ImZyYW1ld29yayIgLz4KKwogPHRlc3QgbmFtZT0ic21va2UiCiAgICAgYnVpbGRfcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3Rlc3RzL1Ntb2tlVGVzdCIKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5zbW9rZXRlc3QudGVzdHMiCkBAIC05Niw2ICsxMDIsMTIgQEAKICAtLT4KIAogCis8dGVzdCBuYW1lPSJjb250ZW50cHJvdmlkZXJvcGVyYXRpb24iCisgICAgYnVpbGRfcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3Rlc3RzL0ZyYW1ld29ya1Rlc3QiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3JrdGVzdC50ZXN0cyIKKyAgICBjbGFzcz0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvblRlc3QiCisgICAgY292ZXJhZ2VfdGFyZ2V0PSJmcmFtZXdvcmsiIC8+CisKIDx0ZXN0IG5hbWU9InRhYmxlbWVyZ2VyIgogICAgIGJ1aWxkX3BhdGg9ImZyYW1ld29ya3MvYmFzZS90ZXN0cy9GcmFtZXdvcmtUZXN0IgogICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3Rlc3QudGVzdHMiCkBAIC00MjAsNyArNDMyLDYgQEAKIDx0ZXN0IG5hbWU9Im1tcyIKICAgICBidWlsZF9wYXRoPSJwYWNrYWdlcy9hcHBzL01tcyIKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tbXMudGVzdHMiCi0gICAgcnVubmVyPSJjb20uYW5kcm9pZC5tbXMudWkuTU1TSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKICAgICBjb3ZlcmFnZV90YXJnZXQ9Ik1tcyIgLz4KIAogPHRlc3QgbmFtZT0ibW1zbGF1bmNoIgpAQCAtNDQ2LDYgKzQ1NywxMCBAQAogICAgIGRlc2NyaXB0aW9uPSJCaW9uaWMgbGlic3RkYysrLiIKICAgICBleHRyYV9idWlsZF9hcmdzPSJCSU9OSUNfVEVTVFM9MSIgLz4KIAorPHRlc3QtbmF0aXZlIG5hbWU9ImxpYnNraWEiCisgICAgYnVpbGRfcGF0aD0iZXh0ZXJuYWwvc2tpYS90ZXN0cyIKKyAgICBkZXNjcmlwdGlvbj0iU2tpYSB0ZXN0cy4iIC8+CisKIDwhLS0gIEFuZHJvaWQgU1RMIHRlc3RzIC0tPgogPHRlc3QtbmF0aXZlIG5hbWU9ImFzdGwiCiAgICAgYnVpbGRfcGF0aD0iZXh0ZXJuYWwvYXN0bC90ZXN0cyIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVQcm9maWxpbmcuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVQcm9maWxpbmcuamF2YQppbmRleCBlOGU4MTAzLi4wNzg5NjU1IDEwMDY0NAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlUHJvZmlsaW5nLmphdmEKKysrIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVByb2ZpbGluZy5qYXZhCkBAIC03MywxMSArNzMsMTQgQEAKICAgICAvKioKICAgICAgKiBTZW5kIGEgTVBSUyAoTWV0aG9kIFBSb2ZpbGluZyBTdGFydCkgcmVxdWVzdCB0byB0aGUgY2xpZW50LgogICAgICAqCisgICAgICogVGhlIGFyZ3VtZW50cyB0byB0aGlzIG1ldGhvZCB3aWxsIGV2ZW50dWFsbHkgYmUgcGFzc2VkIHRvCisgICAgICogYW5kcm9pZC5vcy5EZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoKSBvbiB0aGUgZGV2aWNlLgorICAgICAqCiAgICAgICogQHBhcmFtIGZpbGVOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdoaWNoIHByb2ZpbGluZyBkYXRhCiAgICAgICogICAgICAgICAgd2lsbCBiZSB3cml0dGVuIChvbiB0aGUgZGV2aWNlKTsgaXQgd2lsbCBoYXZlICIudHJhY2UiCiAgICAgICogICAgICAgICAgYXBwZW5kZWQgaWYgbmVjZXNzYXJ5CiAgICAgICogQHBhcmFtIGJ1ZmZlclNpemUgaXMgdGhlIGRlc2lyZWQgYnVmZmVyIHNpemUgaW4gYnl0ZXMgKDhNQiBpcyBnb29kKQotICAgICAqIEBwYXJhbSBmbGFncyBzaG91bGQgYmUgemVybworICAgICAqIEBwYXJhbSBmbGFncyBzZWUgc3RhcnRNZXRob2RUcmFjaW5nKCkgZG9jczsgdXNlIDAgZm9yIGRlZmF1bHQgYmVoYXZpb3IKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZE1QUlMoQ2xpZW50IGNsaWVudCwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgYnVmZmVyU2l6ZSwKICAgICAgICAgaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC8uZ2l0aWdub3JlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5jb21tb24vLmdpdGlnbm9yZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5jb21tb24vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkyZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmNvbW1vbi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyouamFyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy8uZ2l0aWdub3JlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDMyZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMxIEBACithZGQucG5nCitiYWNrd2FyZC5wbmcKK2NsZWFyLnBuZworZC5wbmcKK2RlYnVnLWF0dGFjaC5wbmcKK2RlYnVnLWVycm9yLnBuZworZGVidWctd2FpdC5wbmcKK2RlbGV0ZS5wbmcKK2RldmljZS5wbmcKK2Rvd24ucG5nCitlLnBuZworZWRpdC5wbmcKK2VtcHR5LnBuZworZW11bGF0b3IucG5nCitmb3J3YXJkLnBuZworZ2MucG5nCitoYWx0LnBuZworaGVhcC5wbmcKK2kucG5nCitpbXBvcnRCdWcucG5nCitsb2FkLnBuZworcGF1c2UucG5nCitwbGF5LnBuZworcHVsbC5wbmcKK3B1c2gucG5nCitzYXZlLnBuZwordGhyZWFkLnBuZwordXAucG5nCit2LnBuZwordy5wbmcKK3dhcm5pbmcucG5nCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9saWJzLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9saWJzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5MmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2xpYnMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmQ5OTgxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitkZG1saWIKK2RkbXVpbGliCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy8uZ2l0aWdub3JlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkyZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkyZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmR1bnVzZWQvZmluZHVudXNlZHJlc291cmNlcyBiL3Rvb2xzL2ZpbmR1bnVzZWQvZmluZHVudXNlZHJlc291cmNlcwppbmRleCA3NDgxMzlhLi41NGIxNTk2IDEwMDc1NQotLS0gYS90b29scy9maW5kdW51c2VkL2ZpbmR1bnVzZWRyZXNvdXJjZXMKKysrIGIvdG9vbHMvZmluZHVudXNlZC9maW5kdW51c2VkcmVzb3VyY2VzCkBAIC0yNiwxMSArMjYsMTUgQEAKIGZvciBhcHAgaW4gJGFwcHMKIGRvCiAgICAgZWNobyAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgaWYgWyAiJGFwcCIgPT0gIi4iIF0KKyAgICB0aGVuCisgICAgICAgIGFwcD0kKHB3ZCkKKyAgICBmaQogICAgIGlmIFsgLWQgJGFwcC9yZXMgXQogICAgIHRoZW4KICAgICAgICAgYXBwbmFtZT0kKGJhc2VuYW1lICRhcHApCiAgICAgICAgIHJlc291cmNlcz0KLSAgICAgICAgZm9yIHJlcyBpbiAkKGVjaG8gJGFwcC9yZXMvKikKKyAgICAgICAgZm9yIHJlcyBpbiAkKGVjaG8gJGFwcC9yZXMvKiAkKGZpbmQgJEFORFJPSURfQlVJTERfVE9QL3ZlbmRvciAtdHlwZSBkIC13aG9sZW5hbWUgJEFORFJPSURfQlVJTERfVE9QL3ZlbmRvci8qLyRhcHBuYW1lL3JlcyB8IGdyZXAgb3ZlcmxheSkpCiAgICAgICAgIGRvCiAgICAgICAgICAgICByZXNvdXJjZXM9IiRyZXNvdXJjZXMgJChlY2hvICRyZXMgfCBncmVwIC12ICdcLW1jY1x8W2Etel0qLVthLXpdW2Etel0kXHxbYS16XSotW2Etel1bYS16XS0uKicpIgogICAgICAgICBkb25lCkBAIC00NSwxOSArNDksMjUgQEAKICAgICAgICAgZmkKIAogICAgICAgICAjIGZpbmQgdGhlIFIuamF2YSBmaWxlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBnZW5lcmF0ZWQgcmVzb3VyY2UgaWRlbnRpZmllcnMKLSAgICAgICAgckRvdEphdmE9JChmaW5kIG91dC90YXJnZXQvY29tbW9uL29iai9BUFBTLyR7YXBwbmFtZX1faW50ZXJtZWRpYXRlcy8gLW5hbWUgUi5qYXZhKQorICAgICAgICByRG90SmF2YT0kKGZpbmQgJEFORFJPSURfQlVJTERfVE9QL291dC90YXJnZXQvY29tbW9uL29iai9BUFBTLyR7YXBwbmFtZX1faW50ZXJtZWRpYXRlcy8gLW5hbWUgUi5qYXZhKQogCiAgICAgICAgICMgU2ltcGxpc3RpY2FsbHkgcHJvY2VzcyB0aGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBnZXQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY29uc3RhbnRzLAogICAgICAgICAjIGFuZCB0cnkgdG8gZmluZCBhIHJlZmVyZW5jZSB0byBlYWNoIGNvbnN0YW50LgorCisgICAgICAgICMgRmlyc3QgdGFrZSBhbGwgdGhlIGlucHV0IGZpbGVzIGFuZCBjb25jYXRlbmF0ZSB0aGVtLCByZW1vdmluZyBuZXdsaW5lcy4gVGhpcyBhbGxvd3MgdXMgdG8KKyAgICAgICAgIyBmaW5kIGV4cHJlc3Npb25zIHRoYXQgYXJlIGJyb2tlbiB1cCBvdmVyIG11bHRpcGxlIGxpbmVzLCBpLmUuIFIuZHJhd2FibGUuXG5zb21lY29uc3RhbnQKKyAgICAgICAgZmluZCAkcmVzb3VyY2VzICRzb3VyY2VzICRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCAtdHlwZSBmIC1wcmludCB8eGFyZ3MgY2F0IHwgdHIgLWQgJ1xuICcgPiAvdG1wL2V2ZXJ5dGhpbmckJAorCisgICAgICAgICMgTm93IGxvb2sgZm9yIGVhY2ggb2YgdGhlIGNvbnN0YW50cyBpbiB0aGUgY29udGF0ZW5hdGVkIGZpbGUuCiAgICAgICAgIGZvciBpIGluICQoY2F0ICRyRG90SmF2YSB8IGdyZXAgIlx3Kj0weFxkKiIgfCBzZWQgJ3MvICpwdWJsaWMgc3RhdGljIGZpbmFsIGludCAvLycgfCBzZWQgJ3MvPTB4LiovLycpCiAgICAgICAgIGRvCiAgICAgICAgICAgICAjIFNpbmNlIHBlcmlvZHMgaW4gdGhlIG5hbWVzIGdldCB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzIGluIFIuamF2YSwgYW5kIHlvdSBjYW4gYWN0dWFsbHkKICAgICAgICAgICAgICMgcmVmZXIgdG8gc3VjaCBjb25zdGFudHMgZnJvbSBqYXZhIGJ5IHVzaW5nIGFuIHVuZGVyc2NvcmUgaW5zdGVhZCBvZiBhIHBlcmlvZCwgd2UgYWxzbwogICAgICAgICAgICAgIyByZXBsYWNlIGFsbCB1bmRlcnNjb3JlcyB3aXRoIGEgcGF0dGVybiB0aGF0IHdpbGwgbWF0Y2ggcGVyaW9kcyBhbmQgdW5kZXJzY29yZXMuCiAgICAgICAgICAgICBwPSQoZWNobyAkaSB8IHNlZCAncy9fL1tcXC5fXS9nJykKLSAgICAgICAgICAgIGVjaG8gJGkgJChncmVwIC1SdyBSXFwuLipcXC4kaVxcXHxAc3R5bGUvJHBcXFx8QGRyYXdhYmxlLyRwXFxcfEBhbmltLyRwXFxcfEBjb2xvci8kcFxcXHxAeG1sLyRwXFxcfEBsYXlvdXQvJHBcXFx8QG1lbnUvJHBcXFx8QCtpZC8kcFxcXHxAYXJyYXkvJHBcXFx8QHN0cmluZy8kcFxcXHxAZGltZW4vJHAgJHJlc291cmNlcyAkc291cmNlcyAkYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgfCB3YyAtbCkKKyAgICAgICAgICAgIGVjaG8gJGkgJChncmVwIC1jdyBSXFwuLipcXC4kaVxcXHxAc3R5bGUvJHBcXFx8QGRyYXdhYmxlLyRwXFxcfEBhbmltLyRwXFxcfEBjb2xvci8kcFxcXHxAeG1sLyRwXFxcfEBsYXlvdXQvJHBcXFx8QG1lbnUvJHBcXFx8QCtpZC8kcFxcXHxAYXJyYXkvJHBcXFx8QHN0cmluZy8kcFxcXHxAZGltZW4vJHBcXFx8XFthLXpcXVwqOiRwXFxcfGVudW1uYW1lPVwiJHBcXFx8XDxpdGVtXD4kcFw8IDwgL3RtcC9ldmVyeXRoaW5nJCQpCiAgICAgICAgIGRvbmUgfCBncmVwICIgMCQiIHwgewotICAgICAgICAgICAgIyB0aGlzIGJsb2NrIGdldHMgYXMgaXRzIGlucHV0IGEgbGlzdCBvZiBjb25zdGFudHMgd2hpY2ggbm8gcmVmZXJlbmNlcyB3ZXJlIGZvdW5kLCBvbmUgcGVyIGxpbmUKKyAgICAgICAgICAgICMgdGhpcyBibG9jayBnZXRzIGFzIGl0cyBpbnB1dCBhIGxpc3Qgb2YgY29uc3RhbnRzIGZvciB3aGljaCBubyByZWZlcmVuY2VzIHdlcmUgZm91bmQsIG9uZSBwZXIgbGluZQogICAgICAgICAgICAgaWYgWyAiJHNob3dhbGwiID09ICJ5ZXMiIF0KICAgICAgICAgICAgIHRoZW4KICAgICAgICAgICAgICAgICBlY2hvICRhcHAKQEAgLTcwLDUgKzgwLDYgQEAKICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgZmkKICAgICAgICAgfQorICAgICAgICBybSAvdG1wL2V2ZXJ5dGhpbmckJAogICAgIGZpCiBkb25lCmRpZmYgLS1naXQgYS90b29scy9maW5kdW51c2VkL3JlbW92ZXVudXNlZHJlc291cmNlcyBiL3Rvb2xzL2ZpbmR1bnVzZWQvcmVtb3ZldW51c2VkcmVzb3VyY2VzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjMzg0OTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5kdW51c2VkL3JlbW92ZXVudXNlZHJlc291cmNlcwpAQCAtMCwwICsxLDg0IEBACisjIS9iaW4vYmFzaAorCitpZiAhIHdoaWNoIHhtbHN0YXJsZXQgPiAvZGV2L251bGwKK3RoZW4KKyAgICBlY2hvICJZb3UgbmVlZCB0byBoYXZlIHRoZSAneG1sc3RhcmxldCcgY29tbWFuZCBpbiB5b3VyIHBhdGgiCisgICAgZXhpdAorZmkKKworYXBwcz0kMQorQ1dEPSQocHdkKS8KK2lmIFsgIiRhcHBzIiA9ICIiIF0KK3RoZW4KKyAgICBlY2hvICJQbGVhc2Ugc3BlY2lmeSB0aGUgcGF0aCB0byBhbiBhcHBsaWNhdGlvbiwgb3IgJy0tYWxsJyB0byBwcm9jZXNzIGFsbCBhcHBsaWNhdGlvbnMiCisgICAgZXhpdAorZWxpZiBbICIkYXBwcyIgPSAiLS1hbGwiIF0KK3RoZW4KKyAgICBhcHBzPSRBTkRST0lEX0JVSUxEX1RPUC9wYWNrYWdlcy9hcHBzLyoKK2ZpCisKK0JBU0U9JChwd2QpLyQoZGlybmFtZSAkMCkKKworZm9yIGFwcCBpbiAkYXBwcworZG8KKyAgICBwdXNoZCAkYXBwCisgICAgJEJBU0UvZmluZHVudXNlZHJlc291cmNlcyAtcCAuIHwgeworICAgICAgICByZWFkIExJTkUgTlVNCisgICAgICAgIHdoaWxlIFsgIiRMSU5FIiAhPSAiIiBdCisgICAgICAgIGRvCisgICAgICAgICAgICBpZiBbICJaJExJTkUiID0gIlotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICMgc2tpcAorICAgICAgICAgICAgICAgIHRydWUKKyAgICAgICAgICAgIGVsaWYgWyAiJExJTkUiID0gIiRhcHAiIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAjIHNraXAKKyAgICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIyB0cnkgdG8gZmluZCB0aGUgbWlzc2luZyByZXNvdXJjZQorICAgICAgICAgICAgICAgIGZpbmQgcmVzIHwgZ3JlcCAtdyAkTElORSAgfCB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQgUkVTTElORQorICAgICAgICAgICAgICAgICAgICB3aGlsZSBbICIkUkVTTElORSIgIT0gIiIgXQorICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAkUkVTTElORSBdCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBSRU1PVklORyBGSUxFOiAkUkVTTElORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdCBybSAkUkVTTElORSA+IC9kZXYvbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gV0FSTklORyB1bmV4cGVjdGVkIHJlc3VsdCBmb3IgJExJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkIFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBncmVwIC1Sd2wgJExJTkUgcmVzIHwgeworICAgICAgICAgICAgICAgICAgICByZWFkIFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgWyAiJFJFU0xJTkUiICE9ICIiIF0KKyAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTU1RSSU5HPSQoZWNobyAiJFJFU0xJTkUiIHwgZ3JlcCAtdyAic3RyaW5nc1wueG1sIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLW4gIiRJU1NUUklORyIgXQorICAgICAgICAgICAgICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gUkVNT1ZJTkcgU1RSSU5HICRMSU5FIGZyb20gJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxzdGFybGV0IGVkIC1QIC1TIC1kICIvcmVzb3VyY2VzL3N0cmluZ1tAbmFtZT0nJExJTkUnXSIgJFJFU0xJTkUgPiB0ZiQkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYgdGYkJCAkUkVTTElORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdCBhZGQgJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIFJFTU9WSU5HICRMSU5FIGZyb20gJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxzdGFybGV0IGVkIC1QIC1TIC1kICIvcmVzb3VyY2VzLypbQG5hbWU9JyRMSU5FJ10iICRSRVNMSU5FID4gdGYkJAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12IHRmJCQgJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXQgYWRkICRSRVNMSU5FCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBSRVNMSU5FCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmaQorICAgICAgICAgICAgcmVhZCBMSU5FIE5VTQorICAgICAgICBkb25lCisgICAgfQorICAgIHBvcGQKK2RvbmUKK2VjaG8KK2VjaG8gIkRvbmUuIgorZWNobyAiUGxlYXNlIHJlYnVpbGQgdGhlIHVwZGF0ZWQgYXBwbGljYXRpb25zIHRvIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgc3RpbGwgYnVpbGRzLiIKK2VjaG8gIkFmdGVyIHJlYnVpbGRpbmcsIHJlcnVuICdmaW5kdW51c2VkcmVzb3VyY2VzJyBvciAncmVtb3ZldW51c2VkcmVzb3VyY2VzJyB0byBzZWUgaWYgYW55IG1vcmUgcmVzb3VyY2VzIGFyZSBub3cgdW51c2VkLiIKK2VjaG8gIldoZW4geW91J3JlIGRvbmUsIHlvdSBjYW4gJ2dpdCBjb21taXQnIHRoZSBjaGFuZ2UuIgorZWNobwo=