ZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YWUzNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQ0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZjAzNzViCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX29wdGltLmgKKyAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZm9yIFN5bWJpYW4KKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gcmVhZCBhIGZpbGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKworI2lmbmRlZiBNNE9TQV9GSUxFUkVBREVSX09QVElNX0gKKyNkZWZpbmUgTTRPU0FfRklMRVJFQURFUl9PUFRJTV9ICisKKyNkZWZpbmUgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisKKy8qKi8KKyNpZm5kZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIE00T1NBX1ZvaWQqICAgICAgICAoKnBGY3RQdHJfT3BlbikoIE00T1NBX1ZvaWQqIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm8gKTsKKyAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uICgqcEZjdFB0cl9SZWFkKSggTTRPU0FfVm9pZCogZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOworICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1NlZWspKCBNNE9TQV9Wb2lkKiBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm8gKTsKKyAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uICgqcEZjdFB0cl9UZWxsKSggTTRPU0FfVm9pZCogZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm8gKTsKKyAgICAgICAgTTRPU0FfSW50MzIgICAgICAgICgqcEZjdFB0cl9DbG9zZSkoIE00T1NBX1ZvaWQqIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOworICAgICAgICBNNE9TQV9Wb2lkICAgICAgICAgKCpwRmN0UHRyX0FjY2Vzc1R5cGUpKCBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3NfSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIEZpbGVNb2RlQWNjZXNzX091dCApOworCisgICAgfSBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0cjsKKyNlbmRpZgorLyoqLworCisKKy8qIFJlYWRlciBBUEkgOiBidWZmZXJpemVkIGZ1bmN0aW9ucyAqLworI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgorICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKKyNlbHNlCisgICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSggTTRPU0FfQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHIgKkZTKTsKKyNlbmRpZgorCitNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHNpemUgKTsKK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gKTsKK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQgKTsKK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSApOworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUgKTsKKworI2VuZGlmIC8qIE00T1NBX0ZJTEVSRUFERVJfT1BUSU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZfTWFjcm9zLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjMxMmNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZfTWFjcm9zLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBmaWxlICAgICAgICBMVl9NYWNyb3MuaAorKiBAcGFyICAgICAgICBOWFAgU29mdHdhcmUKKyogQGJyaWVmICAgIE1hY3JvcyBkZWZpbml0aW9uIGZvciBTbWFydHBob25lIHRlYW0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTFZfTUFDUk9TX0gKKyNkZWZpbmUgTFZfTUFDUk9TX0gKKworLyotLS0tLS0tLS0tLS0qLworLyogICAgSU5DTFVERVMgICovCisvKi0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBDSEVDS19QVFIoZmN0LCBwLCBlcnIsIGVyclZhbHVlKQorKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNoZWNrcyB0aGUgdmFsdWUgcC4gSWYgaXQgaXMgTlVMTCwgaXQgc2V0cyB0aGUgdmFyaWFibGUgZXJyCisqICAgICAgICAgICB0byBlcnJWYWx1ZSBhbmQganVtcHMgdG8gdGhlIGxhYmVsIDxmY3Q+X2NsZWFuVXAuIEEgdHJhY2UgaXMgZGlzcGxheWVkCisqICAgICAgICAgICBzaWduYWxsaW5nIHRoZSBlcnJvciwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBsaW5lIG51bWJlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ0hFQ0tfUFRSKGZjdCwgcCwgZXJyLCBlcnJWYWx1ZSkgXAoreyBcCisgICAgaWYoTTRPU0FfTlVMTCA9PSAocCkpIFwKKyAgICB7IFwKKyAgICAgICAgKGVycikgPSAoZXJyVmFsdWUpIDsgXAorICAgICAgICBNNE9TQV9UUkFDRTFfMSgoTTRPU0FfQ2hhciopIiIgI2ZjdCAiKEwlZCk6ICIgI3AgIiBpcyBOVUxMLCByZXR1cm5pbmcgIiAjZXJyVmFsdWUgIiIsX19MSU5FX18pIDsgXAorICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKKyAgICB9IFwKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBDSEVDS19FUlIoZmN0LCBlcnIpCisqIEBub3RlICAgIFRoaXMgbWFjcm8gY2hlY2tzIHRoZSB2YWx1ZSBlcnIuIElmIGl0IGlzIG5vdCBOVUxMLCBhIHRyYWNlIGlzIGRpc3BsYXllZAorKiAgICAgICAgICAgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuIFRoZSBtYWNybworKiAgICAgICAgICAganVtcHMgdG8gdGhlIGxhYmVsIDxmY3Q+X2NsZWFuVXAuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENIRUNLX0VSUihmY3QsIGVycikgXAoreyBcCisgICAgaWYoTTROT19FUlJPUiAhPSAoZXJyKSkgXAorICAgIHsgXAorICAgICAgICBNNE9TQV9UUkFDRTFfMigoTTRPU0FfQ2hhciopIiEhISAiICNmY3QgIihMJWQpOiBFUlJPUiAweCUuOHggcmV0dXJuZWQiLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLGVycikgOyBcCisgICAgICAgIGdvdG8gZmN0IyNfY2xlYW5VcDsgXAorICAgIH0gXAorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogQ0hFQ0tfRVJSKGZjdCwgZXJyKQorKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNvbXBhcmVzIGEgY3VycmVudCBzdGF0ZSB3aXRoIGEgc3RhdGUgdmFsdWUuIElmIHRoZXkgYXJlIGRpZmZlcmVudCwKKyogICAgICAgICAgIGVyciBpcyBzZXQgdG8gTTRFUlJfU1RBVEUuCisqICAgICAgICAgICBBIHRyYWNlIGlzIGRpc3BsYXllZCBzaWduYWxsaW5nIHRoZSBlcnJvciwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBsaW5lIG51bWJlci4KKyogICAgICAgICAgIFRoZSBtYWNybyBqdW1wcyB0byB0aGUgbGFiZWwgPGZjdD5fY2xlYW5VcC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgICAgQ0hFQ0tfU1RBVEUoZmN0LCBzdGF0ZVZhbHVlLCBzdGF0ZSkgXAoreyBcCisgICAgaWYoKHN0YXRlVmFsdWUpICE9IChzdGF0ZSkpIFwKKyAgICB7IFwKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIiIgI2ZjdCAiIGNhbGxlZCBpbiBiYWQgc3RhdGUgJWQiLCBzdGF0ZSkgOyBcCisgICAgICAgIChlcnIpID0gTTRFUlJfU1RBVEUgOyBcCisgICAgICAgIGdvdG8gZmN0IyNfY2xlYW5VcDsgXAorICAgIH0gXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFNBRkVfRlJFRShwKQorKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNoZWNrcyB0aGUgdmFsdWUgb2YgcCBpcyBub3QgTlVMTC4gSWYgaXQgaXMgTlVMTCwgaXQgZG9lcworKiAgICAgICAgICAgbm90aGluZy4gRWxzZSwgcCBpcyBkZSBhbGxvY2F0ZWQgYW5kIHNldCB0byBOVUxMLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTQUZFX0ZSRUUocCkgXAoreyBcCisgICAgaWYoTTRPU0FfTlVMTCAhPSAocCkpIFwKKyAgICB7IFwKKyAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKShwKSkgOyBcCisgICAgICAgIChwKSA9IE00T1NBX05VTEwgOyBcCisgICAgfSBcCit9CisKKworCisjZW5kaWYgLyotLS0gIExWX01BQ1JPU19IIC0tLSovCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzNGVhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9UeXBlcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBmaWxlICAgICAgICBMVl9UeXBlcy5oCisqIEBicmllZiAgICBUeXBlcyBkZWZpbml0aW9uIGZvciBTbWFydHBob25lIHRlYW0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTFZfVFlQRVNfSAorI2RlZmluZSBMVl9UWVBFU19ICisKKy8qLS0tLS0tLS0tLS0tKi8KKy8qICAgIElOQ0xVREVTICAqLworLyotLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgQ0hBUkFDVEVSIEVOQ09ESU5HIENPTlZFUlNJT04gRkNUUyAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE00T1NBX1VJbnQzMiAoKkxWX2Zyb21VVEY4VG9OYXRpdmVfRmN0KShjb25zdCBNNE9TQV9DaGFyKiBwU3RhcnQsCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCoqIHBPdXQpOworKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHN0cmluZyBmcm9tIFVURjggZm9ybWF0IHdoaWNoIGlzIHRoZSBkZWZhdWx0CisqICAgICAgICAgICAgZW5jb2RpbmcgaW4gdGhlIGVuZ2luZXMgYW5kIGFwcGxpY2F0aW9uIGxvZ2ljcyB0byB0aGUgY2hhcmFjdGVyIGVuY29kaW5nCisqICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBPUyBvciBwbGF0Zm9ybS4gVGhlIG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCB3aXRoaW4gdGhpcworKiAgICAgICAgICAgIGZ1bmN0aW9uIGFuZCB0aGVuLCBjYWxsZXIgd2lsbCBoYXZlIHRvIGZyZWUgKnRhcmdldFN0YXJ0IHRoYW5rcyB0byBNNE9TQV9mcmVlLgorKiAgICAgICAgICAgIEJvdGggc3RyaW5ncyBtdXN0IGJlIE5VTEwtdGVybWluYXRlZWQuCisqIEBwYXJhbSAgICBwU3RhcnQgICAgICAgIChJTik6ICAgIFN0cmluZyB0byBjb252ZXJ0LgorKiBAcGFyYW0gICAgcE91dCAgICAgICAgKE9VVCk6ICAgIFRoaXMgcG9pbnRlciB3aWxsIGJlIGZpbGxlZCBieSB0aGlzIGZ1bmN0aW9uLiBJdCBjb250YWlucyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb252ZXJ0ZWQgdG8gdGhlIG5hdGl2ZSBmb3JtYXQuCisqIEByZXR1cm4gICAgU3VjY2VzczogU2l6ZSBpbiBieXRlcyBhbGxvY2F0ZWQgaW5jbHVkaW5nIHRoZSBOVUxMIGNoYXJhY3Rlci4gRmFpbHVyZTogMAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBNNE9TQV9VSW50MzIgKCpMVl9mcm9tVVRGOFRvTmF0aXZlX0ZjdCkoY29uc3QgTTRPU0FfQ2hhciogcFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCoqIHBPdXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE00T1NBX1VJbnQzMiAoKkxWX2Zyb21OYXRpdmVUb1VURjhfRmN0KShjb25zdCBNNE9TQV9DaGFyKiBwU3RhcnQsCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCoqIHRhcmdldFN0YXJ0KTsKKyogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgaW4gdGhlIGNoYXJhY3RlciBlbmNvZGluZyBzdXBwb3J0ZWQgYnkgdGhlCisqICAgICAgICAgICAgT1Mgb3IgcGxhdGZvcm0gdG8gZnJvbSBVVEY4IGZvcm1hdCB3aGljaCBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZyBpbiB0aGUKKyogICAgICAgICAgICBlbmdpbmVzIGFuZCBhcHBsaWNhdGlvbiBsb2dpY3MuIFRoZSBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQgd2l0aGluIHRoaXMKKyogICAgICAgICAgICBmdW5jdGlvbiBhbmQgdGhlbiwgY2FsbGVyIHdpbGwgaGF2ZSB0byBmcmVlICp0YXJnZXRTdGFydCB0aGFua3MgdG8gTTRPU0FfZnJlZS4KKyogICAgICAgICAgICBCb3RoIHN0cmluZ3MgbXVzdCBiZSBOVUxMLXRlcm1pbmF0ZWVkLgorKiBAcGFyYW0gICAgcFN0YXJ0ICAgICAgICAoSU4pOiAgICBTdHJpbmcgdG8gY29udmVydC4KKyogQHBhcmFtICAgIHBPdXQgICAgICAgIChPVVQpOiAgICBUaGlzIHBvaW50ZXIgd2lsbCBiZSBmaWxsZWQgYnkgdGhpcyBmdW5jdGlvbi4gSXQgY29udGFpbnMgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udmVydGVkIHRvIFVURjggZm9ybWF0LgorKiBAcmV0dXJuICAgIFN1Y2Nlc3M6IFNpemUgaW4gYnl0ZXMgYWxsb2NhdGVkIGluY2x1ZGluZyB0aGUgTlVMTCBjaGFyYWN0ZXIuIEZhaWx1cmU6IDAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgTTRPU0FfVUludDMyICgqTFZfZnJvbU5hdGl2ZVRvVVRGOF9GY3QpKGNvbnN0IE00T1NBX1ZvaWQqKiBwU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcE91dCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyotLS0gIExWX1RZUEVTX0ggLS0tKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NoYXJTdGFyLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DaGFyU3Rhci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1MWFmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DaGFyU3Rhci5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00T1NBX0NoYXJTdGFyLmgKKyAqIEBpbmdyb3VwCisgKiBAYnJpZWYgICAgICAgIGV4dGVybmFsIEFQSSBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIE00T1NBX0NIQVJTVEFSX0gKKyNkZWZpbmUgTTRPU0FfQ0hBUlNUQVJfSAorCisvKiBnZW5lcmFsIE9TQUwgdHlwZXMgYW5kIHByb3RvdHlwZXMgaW5jbHVzaW9uICAgICAgICAgICAgICAgICAgICAgICovCisjaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKKyNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgorI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCisKKy8qIHR5cGVzIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgZW51bQoreworICAgTTRPU0Ffa2NockRlYyAgPSAweDAxLAorICAgTTRPU0Ffa2NockhleGEgPSAweDAyLAorICAgTTRPU0Ffa2Nock9jdCAgPSAweDAzCit9IE00T1NBX2Nock51bUJhc2U7CisKKy8qIGVycm9yIGFuZCB3YXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVyBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKKyNkZWZpbmUgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKKyNkZWZpbmUgTTRXQVJfQ0hSX05PVF9GT1VORCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKKyNkZWZpbmUgTTRXQVJfQ0hSX05VTV9SQU5HRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKKyNkZWZpbmUgTTRXQVJfQ0hSX05FR0FUSVZFICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMykKKworLyogcHJvdG90eXBlcyBvZiB0aGUgQ2hhciBTdGFyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJOQ29weSAgICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4yQ29weSk7CitNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2Nock5DYXQgICAgICAgICAgIChNNE9TQV9DaGFyICAgKnN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbjJBcHBlbmQpOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJDb21wYXJlICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAgKmNtcFJlc3VsdCk7CitNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2Nock5Db21wYXJlICAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4yQ29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgICpjbXBSZXN1bHQpOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJBcmVJZGVudGljYWwgICAoTTRPU0FfQ2hhciAgICpzdHJJbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sICAqcmVzdWx0KTsKK000T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyRmluZENoYXIgICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipwb2ludGVySW5TdHIpOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJSZXZlcnNlRmluZENoYXIoTTRPU0FfQ2hhciAgICpzdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnBvaW50ZXJJblN0cik7CitNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclNwYW4gICAgICAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKmRlbGltaXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcG9zSW5TdHIpOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJTcGFuQ29tcGxlbWVudCAoTTRPU0FfQ2hhciAgICpzdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpkZWxpbWl0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBvc0luU3RyKTsKK000T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyUGJyayAgICAgICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqZGVsaW1pdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqcG9pbnRlckluU3RyKTsKK000T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyRmluZFBhdHRlcm4gICAgKE00T1NBX0NoYXIgICAqc3RySW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKnN0ckluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqcG9pbnRlckluU3RyMSk7CitNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfVUludDMyIE00T1NBX2Nockxlbmd0aCAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluKTsKK000T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9DaGFyICAgTTRPU0FfY2hyVG9Mb3dlciAgICAgKE00T1NBX0NoYXIgICBjSW4pOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0NoYXIgICBNNE9TQV9jaHJUb1VwcGVyICAgICAoTTRPU0FfQ2hhciAgIGNJbik7CitNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSICAgIE00T1NBX2NockdldFdvcmQgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKmJlZ2luRGVsaW1pdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICplbmREZWxpbWl0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKnN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpzdHJPdXRNYXhMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKm91dHB1dFBvaW50ZXIpOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICp2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKK000T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDE2ICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7CitNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQ4ICAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAgKnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqc3RyT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRJbnQ2NCAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50NjQgICp2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKK000T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0SW50MzIgICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICAqdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7CitNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockdldEludDE2ICAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAgKnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqc3RyT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRJbnQ4ICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCAgICp2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKK000T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0RG91YmxlICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RvdWJsZSAqdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQpOworTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRUaW1lICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSAgICp2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKK000T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0RmlsZVBvc2l0aW9uKE00T1NBX0NoYXIgICAqc3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAqdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7CitNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYgICAgICAgICAoTTRPU0FfQ2hhciAgKnN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTNjMzllCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2xvY2suaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00T1NBX0Nsb2NrLmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBjbG9jayBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgTTRPU0FfQ0xPQ0hfSAorI2RlZmluZSBNNE9TQV9DTE9DS19ICisKKyNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgorI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCisjaW5jbHVkZSAiTTRPU0FfVGltZS5oIgorCisKKyNkZWZpbmUgTTRXQVJfVElNRVNDQUxFX1RPT19CSUcgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRPU0FfQ0xPQ0ssMHgwMDAwMDEpIC8qKjwgVGltZSBwcmVjaXNpb24gdG9vIGhpZ2ggZm9yIHRoZSBzeXN0ZW0qLworI2RlZmluZSBNNEVSUl9DTE9DS19CQURfUkVGX1lFQVIgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DTE9DSywweDAwMDAwMSkgLyoqPCBJbnB1dCB5ZWFyIG9mIHJlZmVyZW5jZSBpcyBuZWl0aGVyIDE5MDAsIG5vciAxOTcwIG5vciAyMDAwKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworTTRPU0FMX0NMT0NLX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jbG9ja0dldFRpbWUoTTRPU0FfVGltZSogcFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGltZXNjYWxlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qTTRPU0FfQ0xPQ0tfSCovCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NvcmVJRC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ29yZUlELmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZThjYTFhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NvcmVJRC5oCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgIE00T1NBX0NvcmVJRC5oCisgKiBAYnJpZWYgIGRlZmluZXMgdGhlIHVuaXF1ZXMgY29tcG9uZW50IGlkZW50aWZpZXJzIHVzZWQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50CisgKiAgICAgICAgIGFuZCBvcHRpb25JRCBtZWNoYW5pc20KKyAqIEBub3RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworI2lmbmRlZiBfX000T1NBX0NPUkVJRF9IX18KKyNkZWZpbmUgX19NNE9TQV9DT1JFSURfSF9fCisKKy8qIENvcmVJZCBhcmUgZGVmaW5lZCBvbiAxNCBiaXRzICovCisvKiB3ZSBzdGFydCBmcm9tIDB4MDEwMCwgbG93ZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Igb3NhbCBjb3JlIGNvbXBvbmVudHMgKi8KKworLyogcmVhZGVyIHNoZWxscyovCisjZGVmaW5lIE00UkVBREVSX0NPTU1PTiAgICAgMHgwMTAwCisjZGVmaW5lIE00UkVBREVSX0FWSSAgICAgICAgMHgwMTAxCisjZGVmaW5lIE00UkVBREVSX0FNUiAgICAgICAgMHgwMTAyCisjZGVmaW5lIE00UkVBREVSXzNHUCAgICAgICAgMHgwMTAzCisjZGVmaW5lIE00UkVBREVSX05FVCAgICAgICAgMHgwMTA0CisjZGVmaW5lIE00UkVBREVSXzNHUF9IVFRQICAgMHgwMTA1CisjZGVmaW5lIE00UkVBREVSX01QMyAgICAgICAgMHgwMTA2CisjZGVmaW5lIE00UkVBREVSX1dBViAgICAgICAgMHgwMTA3CisjZGVmaW5lIE00UkVBREVSX01JREkgICAgICAgMHgwMTA4CisjZGVmaW5lIE00UkVBREVSX0FTRiAgICAgICAgMHgwMTA5CisjZGVmaW5lIE00UkVBREVSX1JFQUwgICAgICAgIDB4MDEwQQorI2RlZmluZSBNNFJFQURFUl9BQUMgICAgICAgIDB4MDEwQgorI2RlZmluZSBNNFJFQURFUl9GTEVYICAgICAgICAweDAxMEMKKyNkZWZpbmUgTTRSRUFERVJfQkJBICAgICAgICAweDAxMEQKKyNkZWZpbmUgTTRSRUFERVJfU1lOVEhFU0lTX0FVRElPICAgIDB4MDEwRQorI2RlZmluZSBNNFJFQURFUl9KUEVHICAgICAgICAweDAxMEYKKworCisvKiB3cml0ZXIgc2hlbGxzKi8KKyNkZWZpbmUgTTRXUklURVJfQ09NTU9OICAgICAweDAxMTAKKyNkZWZpbmUgTTRXUklURVJfQVZJICAgICAgICAweDAxMTEKKyNkZWZpbmUgTTRXUklURVJfQU1SICAgICAgICAweDAxMTIKKyNkZWZpbmUgTTRXUklURVJfM0dQICAgICAgICAweDAxMTMKKyNkZWZpbmUgTTRXUklURVJfSlBFRyAgICAgICAgMHgwMTE2CisjZGVmaW5lIE00V1JJVEVSX01QMyAgICAgICAgMHgwMTE3CisKKy8qIGRlY29kZXIgc2hlbGxzICovCisjZGVmaW5lIE00REVDT0RFUl9DT01NT04gICAgMHgwMTIwCisjZGVmaW5lIE00REVDT0RFUl9KUEVHICAgICAgMHgwMTIxCisjZGVmaW5lIE00REVDT0RFUl9NUEVHNCAgICAgMHgwMTIyCisjZGVmaW5lIE00REVDT0RFUl9BVURJTyAgICAgMHgwMTIzCisjZGVmaW5lIE00REVDT0RFUl9BVkMgICAgICAgMHgwMTI0CisjZGVmaW5lIE00REVDT0RFUl9NSURJICAgICAgMHgwMTI1CisjZGVmaW5lIE00REVDT0RFUl9XTUEgICAgICAgIDB4MDEyNgorI2RlZmluZSBNNERFQ09ERVJfV01WICAgICAgICAweDAxMjcKKyNkZWZpbmUgTTRERUNPREVSX1JNViAgICAgICAgMHgwMTI4CisjZGVmaW5lIE00REVDT0RFUl9STUEgICAgICAgIDB4MDEyOQorI2RlZmluZSBNNERFQ09ERVJfQUFDICAgICAgIDB4MDEyQQorI2RlZmluZSBNNERFQ09ERVJfQkVBVEJSRVcgIDB4MDEyQgorI2RlZmluZSBNNERFQ09ERVJfRVhURVJOQUwgIDB4MDEyQworCisvKiBlbmNvZGVyIHNoZWxscyAqLworI2RlZmluZSBNNEVOQ09ERVJfQ09NTU9OICAgIDB4MDEzMAorI2RlZmluZSBNNEVOQ09ERVJfSlBFRyAgICAgIDB4MDEzMQorI2RlZmluZSBNNEVOQ09ERVJfTVBFRzQgICAgIDB4MDEzMgorI2RlZmluZSBNNEVOQ09ERVJfQVVESU8gICAgIDB4MDEzMworI2RlZmluZSBNNEVOQ09ERVJfVklEX05VTEwgIDB4MDEzNAorI2RlZmluZSBNNEVOQ09ERVJfTUpQRUcgICAgICAgIDB4MDEzNQorI2RlZmluZSBNNEVOQ09ERVJfTVAzICAgICAgICAweDAxMzYKKyNkZWZpbmUgTTRFTkNPREVSX0gyNjQgICAgICAgIDB4MDEzNworI2RlZmluZSBNNEVOQ09ERVJfQUFDICAgICAgICAweDAxMzgKKyNkZWZpbmUgTTRFTkNPREVSX0FNUk5CICAgICAgICAweDAxMzkKKyNkZWZpbmUgTTRFTkNPREVSX0FVRF9OVUxMICAweDAxM0EKKyNkZWZpbmUgTTRFTkNPREVSX0VYVEVSTkFMICAweDAxM0IKKworLyogY29yZXMgKi8KKyNkZWZpbmUgTTRKUEdfREVDT0RFUiAgICAgICAweDAxNDAKKyNkZWZpbmUgTTRKUEdfRU5DT0RFUiAgICAgICAweDAxNDEKKworI2RlZmluZSBNNE1QNF9ERUNPREVSICAgICAgIDB4MDE0MgorI2RlZmluZSBNNE1QNF9FTkNPREVSICAgICAgIDB4MDE0MworCisjZGVmaW5lIE00QVZJX0NPTU1PTiAgICAgICAgMHgwMTQ0CisjZGVmaW5lIE00QVZJX1JFQURFUiAgICAgICAgMHgwMTQ1CisjZGVmaW5lIE00QVZJX1dSSVRFUiAgICAgICAgMHgwMTQ2CisKKyNkZWZpbmUgTTRIVFRQX0VOR0lORSAgICAgICAweDAxNDcKKworI2RlZmluZSBNNE9TQV9UTVBGSUxFICAgICAgIDB4MDE0OAorI2RlZmluZSBNNFRPT0xfVElNRVIgICAgICAgIDB4MDE0OQorCisjZGVmaW5lIE00QU1SX1JFQURFUiAgICAgICAgMHgwMTRBCisKKyNkZWZpbmUgTTRNUDNfUkVBREVSICAgICAgICAweDAxNEIKKworI2RlZmluZSBNNFdBVl9SRUFERVIgICAgICAgIDB4MDE0QworI2RlZmluZSBNNFdBVl9XUklURVIgICAgICAgIDB4MDE0RAorI2RlZmluZSBNNFdBVl9DT01NT04gICAgICAgIDB4MDE0RQorCisjZGVmaW5lIE00QURUU19SRUFERVIgICAgICAgIDB4MDE0RgorI2RlZmluZSBNNEFESUZfUkVBREVSICAgICAgICAweDAxNkEKKworI2RlZmluZSBNNFNQUyAgICAgICAgICAgICAgIDB4MDE1MAorI2RlZmluZSBNNEVYSUZfREVDT0RFUiAgICAgIDB4MDE1MQorI2RlZmluZSBNNEVYSUZfRU5DT0RFUiAgICAgIDB4MDE1MgorI2RlZmluZSBNNEdJRl9ERUNPREVSICAgICAgIDB4MDE1MworI2RlZmluZSBNNEdJRl9FTkNPREVSICAgICAgIDB4MDE1NAorI2RlZmluZSBNNFBOR19ERUNPREVSICAgICAgIDB4MDE1NQorI2RlZmluZSBNNFBOR19FTkNPREVSICAgICAgIDB4MDE1NgorI2RlZmluZSBNNFdCTVBfREVDT0RFUiAgICAgIDB4MDE1NworI2RlZmluZSBNNFdCTVBfRU5DT0RFUiAgICAgIDB4MDE1OAorCisjZGVmaW5lIE00QU1SX1dSSVRFUiAgICAgICAgMHgwMTU5ICAgIC8qKjwgbm8gcm9vbSB0byBwdXQgaXQgYWxvbmcgTTRBTVJfUkVBREVSICovCisKKworI2RlZmluZSBNNEFWQ19ERUNPREVSICAgICAgIDB4MDE1QQorI2RlZmluZSBNNEFWQ19FTkNPREVSICAgICAgIDB4MDE1QgorCisjZGVmaW5lIE00QVNGX1JFQURFUiAgICAgICAgMHgwMTVDCisjZGVmaW5lIE00V01EUk1fQUdFTlQgICAgICAgIDB4MDE1RAorI2RlZmluZSBNNE1JRElfUkVBREVSICAgICAgICAweDAxNjIgICAgLyoqPCBubyByb29tIGJlZm9yZSB0aGUgcHJlc2VudGVycyAqLworI2RlZmluZSBNNFJNX1JFQURFUiAgICAgICAgIDB4MTYzCisjZGVmaW5lIE00Uk1WX0RFQ09ERVIgICAgICAgIDB4MTY0CisjZGVmaW5lIE00Uk1BX0RFQ09ERVIgICAgICAgIDB4MTY1CisKKyNkZWZpbmUgTTRUT09MX1hNTCAgICAgICAgICAgIDB4MDE2NgorI2RlZmluZSBNNFRPT0xfRUZSICAgICAgICAgICAgMHgwMTY3ICAgIC8qKjwgRGVjcnlwdGlvbiBtb2R1bGUgZm9yIFZpZGVvIEFydGlzdCAqLworI2RlZmluZSBNNElBTF9GVE4gICAgICAgICAgICAweDAxNjggICAgLyogRlROIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJQUwgKi8KKyNkZWZpbmUgTTRGVE4gICAgICAgICAgICAgICAgMHgwMTY5ICAgIC8qIEZUTiBsaWJyYXJ5ICovCisKKy8qIHByZXNlbnRlciAqLworI2RlZmluZSBNNFBSRVNFTlRFUl9BVURJTyAgIDB4MDE2MAorI2RlZmluZSBNNFBSRVNFTlRFUl9WSURFTyAgIDB4MDE2MQorCisvKiBoaWdoIGxldmVsIGludGVyZmFjZXMgKHZwcywgZXRjLi4pKi8KKyNkZWZpbmUgTTRWUFMgICAgICAgICAgICAgICAweDAxNzAKKyNkZWZpbmUgTTRWVFMgICAgICAgICAgICAgICAweDAxNzEKKyNkZWZpbmUgTTRWWFMgICAgICAgICAgICAgICAweDAxNzIKKyNkZWZpbmUgTTRDQUxMQkFDSyAgICAgICAgICAweDAxNzMKKyNkZWZpbmUgTTRWRVMgICAgICAgICAgICAgICAweDAxNzQKKyNkZWZpbmUgTTRQUkVQUk9DRVNTX1ZJREVPICAweDAxNzUKKyNkZWZpbmUgTTRHUkFCX0FVRElPICAgICAgICAweDAxNzYKKyNkZWZpbmUgTTRHUkFCX1ZJREVPICAgICAgICAweDAxNzcKKyNkZWZpbmUgTTRWU1NBVkkgICAgICAgICAgICAweDAxNzgKKyNkZWZpbmUgTTRWU1MzR1BQICAgICAgICAgICAweDAxNzkKKyNkZWZpbmUgTTRQVE8zR1BQICAgICAgICAgICAweDAxN0EKKyNkZWZpbmUgTTRQVlhfUEFSU0VSICAgICAgICAweDAxN0IKKyNkZWZpbmUgTTRWQ1MgICAgICAgICAgICAgICAgMHgwMTdDCisjZGVmaW5lIE00TUNTICAgICAgICAgICAgICAgIDB4MDE3RAorI2RlZmluZSBNNE1OTUMgICAgICAgICAgICAgICAgMHgwMTgwICAgIC8qKjwgbW5tIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgTTRUVEVYVF9QQVJTRVIgICAgICAweDAxODEgICAgLyoqPCB0aW1lZCB0ZXh0ICovCisjZGVmaW5lIE00TU0gICAgICAgICAgICAgICAgMHgwMTgyICAgIC8qKjwgTXVzaWMgbWFuYWdlciAqLworI2RlZmluZSBNNE1EUCAgICAgICAgICAgICAgICAweDAxODMgICAgLyoqPCBNZXRhZGF0YSBwYXJzZXIgKi8KKyNkZWZpbmUgTTRNTVNRTENPUkUgICAgICAgICAgICAweDAxODQKKyNkZWZpbmUgTTRWUFNJTCAgICAgICAgICAgICAgICAweDAxODUKKyNkZWZpbmUgTTRGSUxFSUwgICAgICAgICAgICAweDAxODYgLyogSUwgZmlsZSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgTTRNVSAgICAgICAgICAgICAgICAweDAxODcKKyNkZWZpbmUgTTRWRUUgICAgICAgICAgICAgICAgMHgwMTg4ICAvKio8IFZpZGVvIGVmZmVjdCBlbmdpbmUgKi8KKyNkZWZpbmUgTTRWQSAgICAgICAgICAgICAgICAweDAxODkgLyogVmlkZW9BcnRpc3QgKi8KKyNkZWZpbmUgTTRKVFMgICAgICAgICAgICAgICAgMHgwMThBCisjZGVmaW5lIE00SlRTSUwgICAgICAgICAgICAgICAgMHgwMThCCisjZGVmaW5lIE00QUlSICAgICAgICAgICAgICAgIDB4MDE4QyAgLyoqPCBBSVIgKi8KKyNkZWZpbmUgTTRTUEUgICAgICAgICAgICAgICAgMHgwMThEICAvKio8IFN0aWxsIHBpY3R1cmUgZWRpdG9yICovCisjZGVmaW5lIE00VlMgICAgICAgICAgICAgICAgMHgwMThFICAgIC8qKjwgVmlkZW8gU3R1ZGlvICh4VlNTKSAqLworI2RlZmluZSBNNFZFU0lMICAgICAgICAgICAgICAgIDB4MDE4RiAgICAvKio8IFZFUyBpbCAqLworI2RlZmluZSBNNElEMyAgICAgICAgICAgICAgICAweDAxOTAgICAgLyoqPCBJRDMgVGFnIE1vZHVsZSAqLworI2RlZmluZSBNNFNDICAgICAgICAgICAgICAgIDB4MDE5MSAgICAvKio8IE1lZGlhIFNjYW5uZXIgKi8KKyNkZWZpbmUgTTRURyAgICAgICAgICAgICAgICAweDAxOTIgIC8qKjwgVGh1bWJuYWlsIEdlbmVyYXRvciovCisjZGVmaW5lIE00VFMgICAgICAgICAgICAgICAgMHgwMTkzICAgIC8qKjwgVGh1bWJuYWlsIHN0b3JhZ2UgKi8KKyNkZWZpbmUgTTRNQiAgICAgICAgICAgICAgICAweDAxOTQgICAgLyoqPCBNZWRpYSBicm93c2VyICovCisKKy8qIGhpZ2ggbGV2ZWwgYXBwbGljYXRpb24gKHRlc3Qgb3IgY2xpZW50IGFwcCkgKi8KKyNkZWZpbmUgTTRBUFBMSSAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgTTRWQV9BUFBMSSAgICAgICAgICAgIDB4MDIwMSAgICAvKio8IFZpZGVvIEFydGlzdCB0ZXN0IGFwcGxpY2F0aW9uICovCisKKy8qIGV4dGVybmFsIGNvbXBvbmVudHMgKEhXIHZpZGVvIGNvZGVjcywgZXRjLikgKi8KKyNkZWZpbmUgTTRWRF9FWFRFUk5BTCAgICAgICAgMHgwMzAwCisjZGVmaW5lIE00VkVfRVhURVJOQUwgICAgICAgIDB4MDMwMQorCisKKy8qIHByaW9yaXR5IHRvIGNvbWJpbmUgd2l0aCBtb2R1bGUgaWRzICovCisjZGVmaW5lIE00SElHSF9QUklPUklUWSAgICAgMHhDMDAwCisjZGVmaW5lIE00TUVESVVNX1BSSU9SSVRZICAgMHg4MDAwCisjZGVmaW5lIE00TE9XX1BSSU9SSVRZICAgICAgMHg0MDAwCisjZGVmaW5lIE00REVGQVVMVF9QUklPUklUWSAgMHgwMDAwCisKKworI2VuZGlmIC8qX19NNE9TQV9DT1JFSURfSF9fKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRGVidWcuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmQ5M2M5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmgKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRGVidWcuaAorICogQGJyaWVmICAgICAgICBEZWJ1ZyBhbmQgVHJhY2UgTWFjcm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKworI2lmbmRlZiBfTTRPU0FfREVCVUdfSF8KKyNkZWZpbmUgX000T1NBX0RFQlVHX0hfCisKKyNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgorI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisKKworLyogZGVmYXV0IHZhbHVlLCBkZWZpbmVkIG9ubHkgaWYgbm90IGRlZmluZWQgYWxyZWFkeS4gKi8KKyNpZm5kZWYgTTRUUkFDRV9JRAorI2RlZmluZSBNNFRSQUNFX0lEIE00VU5LTk9XTl9DT1JFSUQKKyNlbmRpZiAvKiBNNFRSQUNFX0lEIHVuZGVmaW5lZCAqLworCisKKyNkZWZpbmUgTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgMAorCisjaWZuZGVmIE00T1NBX0RFQlVHX0xFVkVMCisjZGVmaW5lIE00T1NBX0RFQlVHX0xFVkVMICAgICAgIDAKKyNlbmRpZgorCisKKyNkZWZpbmUgTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgMAorCisjaWZuZGVmIE00T1NBX1RSQUNFX0xFVkVMCisjZGVmaW5lIE00T1NBX1RSQUNFX0xFVkVMICAgICAgIDAKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisKKyNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpCisKKy8qIERlYnVnIG1hY3JvcyAqLworZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgcmV0dXJuZWRFcnJvcik7CisKKworI2RlZmluZSBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIGxldmVsKVwKKyAgICAgIGlmKGNvbmQpXAorICAgICAge1wKKyAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgbGV2ZWwsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopI2NvbmQsIChNNE9TQV9DaGFyKiltc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvckNvZGUpKTtcCisgICAgICAgICByZXR1cm4oZXJyb3JDb2RlKTtcCisgICAgICB9CisKKyNkZWZpbmUgTTRPU0FfREVCVUcoZXJyb3JDb2RlLCBtc2cpXAorICAgICAgICAgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLCAxLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSNlcnJvckNvZGUsIChNNE9TQV9DaGFyKiltc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvckNvZGUpKTsKKworI2Vsc2UgLyooTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpKi8KKworCisjZGVmaW5lIE00T1NBX0RFQlVHKGVycm9yQ29kZSwgbXNnKQorCisjZW5kaWYgLyooTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpKi8KKworCisKKyNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpCisgI2RlZmluZSBNNE9TQV9ERUJVR19JRjEoY29uZCwgZXJyb3JDb2RlLCBtc2cpXAorICAgICAgICAgTTRPU0FfREVCVUdfSUZ4KGNvbmQsIGVycm9yQ29kZSwgbXNnLCAxKQorI2Vsc2UKKyAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMShjb25kLCBlcnJvckNvZGUsIG1zZykKKyNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLworCisKKyNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDIpCisgI2RlZmluZSBNNE9TQV9ERUJVR19JRjIoY29uZCwgZXJyb3JDb2RlLCBtc2cpXAorICAgICAgICAgTTRPU0FfREVCVUdfSUZ4KGNvbmQsIGVycm9yQ29kZSwgbXNnLCAyKQorI2Vsc2UKKyAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMihjb25kLCBlcnJvckNvZGUsIG1zZykKKyNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMikqLworCisKKyNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMykgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDMpCisgI2RlZmluZSBNNE9TQV9ERUJVR19JRjMoY29uZCwgZXJyb3JDb2RlLCBtc2cpXAorICAgICAgICAgTTRPU0FfREVCVUdfSUZ4KGNvbmQsIGVycm9yQ29kZSwgbXNnLCAzKQorI2Vsc2UKKyAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMyhjb25kLCBlcnJvckNvZGUsIG1zZykKKyNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMykqLworCisKKworLyogVHJhY2UgbWFjcm9zICovCisKKyNpZiAoTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpCisKK2V4dGVybiBNNE9TQV9Wb2lkIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oTTRPU0FfVUludDMyIGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db3JlSUQgY29yZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZ01zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICk7CisKKworCisjZGVmaW5lIE00T1NBX1RSQUNFeF8wKG1zZywgbGV2ZWwpXAorICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCwgKE00T1NBX0NoYXIqKW1zZyk7CisKKworI2RlZmluZSBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgbGV2ZWwpXAorICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsIChNNE9TQV9DaGFyKiltc2csIHBhcmFtMSk7CisKKworI2RlZmluZSBNNE9TQV9UUkFDRXhfMihtc2csIHBhcmFtMSwgcGFyYW0yLCBsZXZlbClcCisgICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yKTsKKworCisjZGVmaW5lIE00T1NBX1RSQUNFeF8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgbGV2ZWwpXAorICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCwgKE00T1NBX0NoYXIqKW1zZyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMSxwYXJhbTIsIHBhcmFtMyk7CisKKworI2RlZmluZSBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgbGV2ZWwpXAorICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKiltc2csIHBhcmFtMSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpOworCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgbGV2ZWwpXAorICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKiltc2csIHBhcmFtMSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSk7CisKKyNlbmRpZiAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkqLworCisKKworI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkKKyNkZWZpbmUgTTRPU0FfVFJBQ0UxXzAobXNnKVwKKyAgICAgICAgTTRPU0FfVFJBQ0V4XzAobXNnLCAxKQorCisjZGVmaW5lIE00T1NBX1RSQUNFMV8xKG1zZywgcGFyYW0xKVwKKyAgICAgICAgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIDEpCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0UxXzIobXNnLCBwYXJhbTEsIHBhcmFtMilcCisgICAgICAgIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIDEpCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0UxXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVwKKyAgICAgICAgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCAxKQorCisjZGVmaW5lIE00T1NBX1RSQUNFMV80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVwKKyAgICAgICAgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIDEpCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0UxXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcCisgICAgICAgIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIDEpCisKKyNlbHNlIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKSovCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0UxXzAobXNnKQorI2RlZmluZSBNNE9TQV9UUkFDRTFfMShtc2csIHBhcmFtMSkKKyNkZWZpbmUgTTRPU0FfVFJBQ0UxXzIobXNnLCBwYXJhbTEsIHBhcmFtMikKKyNkZWZpbmUgTTRPU0FfVFJBQ0UxXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQorI2RlZmluZSBNNE9TQV9UUkFDRTFfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkKKyNkZWZpbmUgTTRPU0FfVFJBQ0UxXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkKKworI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKSovCisKKworI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMikKKyNkZWZpbmUgTTRPU0FfVFJBQ0UyXzAobXNnKVwKKyAgICAgICAgTTRPU0FfVFJBQ0V4XzAobXNnLCAyKQorCisjZGVmaW5lIE00T1NBX1RSQUNFMl8xKG1zZywgcGFyYW0xKVwKKyAgICAgICAgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIDIpCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0UyXzIobXNnLCBwYXJhbTEsIHBhcmFtMilcCisgICAgICAgIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIDIpCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0UyXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVwKKyAgICAgICAgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCAyKQorCisjZGVmaW5lIE00T1NBX1RSQUNFMl80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVwKKyAgICAgICAgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIDIpCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0UyXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcCisgICAgICAgIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIDIpCisKKyNlbHNlIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKSovCisKKyNkZWZpbmUgTTRPU0FfVFJBQ0UyXzAobXNnKQorI2RlZmluZSBNNE9TQV9UUkFDRTJfMShtc2csIHBhcmFtMSkKKyNkZWZpbmUgTTRPU0FfVFJBQ0UyXzIobXNnLCBwYXJhbTEsIHBhcmFtMikKKyNkZWZpbmUgTTRPU0FfVFJBQ0UyXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQorI2RlZmluZSBNNE9TQV9UUkFDRTJfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkKKyNkZWZpbmUgTTRPU0FfVFJBQ0UyXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkKKyNlbmRpZiAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMikqLworCisKKyNpZiAoTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMykgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDMpCisjZGVmaW5lIE00T1NBX1RSQUNFM18wKG1zZylcCisgICAgICAgIE00T1NBX1RSQUNFeF8wKG1zZywgMykKKworI2RlZmluZSBNNE9TQV9UUkFDRTNfMShtc2csIHBhcmFtMSlcCisgICAgICAgIE00T1NBX1RSQUNFeF8xKG1zZywgcGFyYW0xLCAzKQorCisjZGVmaW5lIE00T1NBX1RSQUNFM18yKG1zZywgcGFyYW0xLCBwYXJhbTIpXAorICAgICAgICBNNE9TQV9UUkFDRXhfMihtc2csIHBhcmFtMSwgcGFyYW0yLCAzKQorCisjZGVmaW5lIE00T1NBX1RSQUNFM18zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcCisgICAgICAgIE00T1NBX1RSQUNFeF8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgMykKKworI2RlZmluZSBNNE9TQV9UUkFDRTNfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNClcCisgICAgICAgIE00T1NBX1RSQUNFeF80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCAzKQorCisjZGVmaW5lIE00T1NBX1RSQUNFM181KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpXAorICAgICAgICBNNE9TQV9UUkFDRXhfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01LCAzKQorCisjZWxzZSAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMykqLworCisjZGVmaW5lIE00T1NBX1RSQUNFM18wKG1zZykKKyNkZWZpbmUgTTRPU0FfVFJBQ0UzXzEobXNnLCBwYXJhbTEpCisjZGVmaW5lIE00T1NBX1RSQUNFM18yKG1zZywgcGFyYW0xLCBwYXJhbTIpCisjZGVmaW5lIE00T1NBX1RSQUNFM18zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykKKyNkZWZpbmUgTTRPU0FfVFJBQ0UzXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpCisjZGVmaW5lIE00T1NBX1RSQUNFM181KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpCisKKyNlbmRpZiAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMykqLworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NNE9TQV9ERUJVR19IXyAqLworCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FcnJvci5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NjNiYjYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXJyb3IuaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9FcnJvci5oCisgKiBAaW5ncm91cCAgICAgIE9TQUwKKyAqIEBicmllZiAgICAgICAgRGVmaW5pdGlvbiBvZiBjb21tb24gZXJyb3IgdHlwZXMKKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyB0byBnZW5lcmF0ZSBhbmQgYW5hbHl6ZSBlcnJvciBjb2Rlcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKworI2lmbmRlZiBNNE9TQV9FUlJPUl9ICisjZGVmaW5lIE00T1NBX0VSUk9SX0gKKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisKKy8qKiBNNE9TQV9FUlIgaXMgYSAzMiBiaXRzIHVuc2lnbmVkIGludGVnZXIuCisgKiBUbyBzb3J0IHJldHVybmVkIGNvZGUsIGEgc3BlY2lmaWMgbmFtaW5nIGNvbnZlbnRpb24gbXVzdCBiZSBmb2xsb3dlZDoKKyAqIC0gU2V2ZXJpdHkgKDIgYml0cyk6IEl0IG1heSBiciBlaXRoZXIgMGIwMCAobm8gZXJyb3IpLCAwYjAxICh3YXJuaW5nKSBvcgorICogICAgICAgICAgICAgICAgICAgICAgMGIwMSAoZmF0YWwgZXJyb3IpCisgKiAtIENvcmUgSUQgKDE0IGJpdHMpOiBJdCBpcyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBjb3JlIGNvbXBvbmVudAorICogLSBFcnJvcklEICgxNiBiaXRzKTogSXQgaXMgdGhlIHNwZWNpZmljIGVycm9yIGNvZGUKKworICogRUFDSCBDT1JFIENPTVBPTkVOVCBGVU5DVElPTiBTSE9VTEQgUkVUVVJOIEFOIE00T1NBX0VSUgorKi8KK3R5cGVkZWYgTTRPU0FfVUludDMyICAgTTRPU0FfRVJSOworCisjZGVmaW5lIE00X09LICAgICAwCisjZGVmaW5lIE00X1dBUiAgICAxCisjZGVmaW5lIE00X0VSUiAgICAyCisKKworLyogTWFjcm8gdG8gcHJvY2VzcyBNNE9TQV9FUlIgKi8KKworLyoqIFRoaXMgbWFjcm8gdGVzdHMgaWYgdGhlIHByb3ZpZGVkIE00T1NBX0VSUiBpcyBhIHdhcm5pbmcgb3Igbm90Ki8KKyNkZWZpbmUgTTRPU0FfRVJSX0lTX1dBUk5JTkcoZXJyb3IpICAgKCgoKGVycm9yKT4+MzApID09IE00X1dBUikgPyAxOjApCisKKy8qKiBUaGlzIG1hY3JvIHRlc3RzIGlmIHRoZSBwcm92aWRlZCBNNE9TQV9FUlIgaXMgYSBmYXRhbCBlcnJvciBvciBub3QqLworI2RlZmluZSBNNE9TQV9FUlJfSVNfRVJST1IoZXJyb3IpICAgKCgoKGVycm9yKT4+MzApID09IE00X0VSUikgPyAxOjApCisKKy8qKiBUaGlzIG1hY3JvIHJldHVybnMgYW4gZXJyb3IgY29kZSBhY2Nyb2RpbmcgdG8gdGhlIDMgcHJvdmlkZWQgZmllbGRzOgorICAqIEBhcmcgc2V2ZXJpdHk6IChJTikgW000T1NBX1VJbnQzMl0gU2V2ZXJpdHkgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCisgICogQGFyZyBjb3JlSUQ6IChJTikgW000T1NBX1VJbnQzMl0gQ29yZUlEIHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQorICAqIEBhcmcgZXJyb3JJRDogKElOKSBbTTRPU0FfVUludDMyXSBFcnJvcklEIHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZSovCisjZGVmaW5lIE00T1NBX0VSUl9DUkVBVEUoc2V2ZXJpdHksIGNvcmVJRCwgZXJyb3JJRClcCisgICAoTTRPU0FfSW50MzIpKCgoKE00T1NBX1VJbnQzMilzZXZlcml0eSk8PDMwKSsoKCgoTTRPU0FfVUludDMyKWNvcmVJRCkmMHgwMDNGRkYpPDwxNikrKCgoTTRPU0FfVUludDMyKWVycm9ySUQpJjB4MDBGRkZGKSkKKworLyoqIFRoaXMgbWFjcm8gZXh0cmFjdHMgdGhlIDMgZmllbGRzIGZyb20gdGhlIGVycm9yOgorICAqIEBhcmcgZXJyb3I6IChJTikgW000T1NBX0VSUl0gRXJyb3IgY29kZQorICAqIEBhcmcgc2V2ZXJpdHk6IChPVVQpIFtNNE9TQV9VSW50MzJdIFNldmVyaXR5IHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQorICAqIEBhcmcgY29yZUlEOiAoT1VUKSBbTTRPU0FfVUludDMyXSBDb3JlSUQgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCisgICogQGFyZyBlcnJvcklEOiAoT1VUKSBbTTRPU0FfVUludDMyXSBFcnJvcklEIHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZSovCisjZGVmaW5lIE00T1NBX0VSUl9TUExJVChlcnJvciwgc2V2ZXJpdHksIGNvcmVJRCwgZXJyb3JJRClcCisgICB7IHNldmVyaXR5PShNNE9TQV9VSW50MzIpKChlcnJvcik+PjMwKTtcCisgICAgIGNvcmVJRD0oTTRPU0FfVUludDMyKSgoKGVycm9yKT4+MTYpJjB4MDAzRkZGKTtcCisgICAgIChNNE9TQV9VSW50MzIpKGVycm9ySUQ9KGVycm9yKSYweDAwRkZGRik7IH0KKworCisvKiAiZmFrZSIgQ29yZUlELCBpcyB1c2VkIHRvIHJlcG9ydCBhbiB1bmtub3duIENvcmVJRC4gVXNlZCBieSB0aGUgdHJhY2Ugc3lzdGVtCit3aGVuIHRoZSBjb3JlIElEIG1hY3JvIGlzbid0IGRlZmluZWQuIERlZmluZWQgaGVyZSBpbnN0ZWFkIG9mIENvcmVJRC5oIHRvIGF2b2lkCitpbnRyb2R1Y2luZyBkZXBlbmRlbmNpZXMgdG8gY29tbW9uL2luYy4gKi8KKworI2RlZmluZSBNNFVOS05PV05fQ09SRUlEICAgIDB4M0ZGRiAvKiBtYXggcG9zc2libGUgQ29yZUlEICovCisKKyNkZWZpbmUgTTRfQ09NTU9OICAgICAgICAgICAweDAwICAvKio8Q29tbW9uKi8KKyNkZWZpbmUgTTRNUDRfQ09NTU9OICAgICAgICAweDAxICAvKio8Q29yZSBNUDQgKGNvbW1vbikqLworI2RlZmluZSBNNE1QNF9XUklURVIgICAgICAgIDB4MDIgIC8qKjxDb3JlIE1QNCB3cml0ZXIqLworI2RlZmluZSBNNE1QNF9SRUFERVIgICAgICAgIDB4MDMgIC8qKjxDb3JlIE1QNCByZWFkZXIqLworI2RlZmluZSBNNFJUU1BfQ09NTU9OICAgICAgIDB4MTEgIC8qKjxDb3JlIFJUU1AgY29tbW9uKi8KKyNkZWZpbmUgTTRSVFNQX1dSSVRFUiAgICAgICAweDEyICAvKio8Q29yZSBSVFNQIHRyYW5zbWl0dGVyKi8KKyNkZWZpbmUgTTRSVFNQX1JFQURFUiAgICAgICAweDEzICAvKio8Q29yZSBSVFNQIHJlY2VpdmVyKi8KKyNkZWZpbmUgTTRSVFBfV1JJVEVSICAgICAgICAweDE0ICAvKio8Q29yZSBSVFAvUlRDUCByZWNlaXZlciovCisjZGVmaW5lIE00UlRQX1JFQURFUiAgICAgICAgMHgxNSAgLyoqPENvcmUgUlRQL1JUQ1AgdHJhbnNtaXR0ZXIqLworI2RlZmluZSBNNFNBUF9XUklURVIgICAgICAgIDB4MTYgIC8qKjxDb3JlIFNBUCB0cmFuc21pdHRlciovCisjZGVmaW5lIE00U0FQX1JFQURFUiAgICAgICAgMHgxNyAgLyoqPENvcmUgU0FQIHJlY2VpdmVyKi8KKyNkZWZpbmUgTTREVkJIX1JFQURFUiAgICAgICAgMHgxOCAgLyoqPENvcmUgRFZCSCByZWNlaXZlciovCisjZGVmaW5lIE00U0RQX1dSSVRFUiAgICAgICAgMHgyMiAgLyoqPENvcmUgU0RQIHdyaXRlciovCisjZGVmaW5lIE00U0RQX1JFQURFUiAgICAgICAgMHgzMSAgLyoqPENvcmUgU0RQIHJlYWRlciovCisjZGVmaW5lIE00UEFLX0FNUiAgICAgICAgICAgMHgzMiAgLyoqPENvcmUgcGFja2V0aXplciBBTVIgKFJGQzMyNjcpKi8KKyNkZWZpbmUgTTRERVBBS19BTVIgICAgICAgICAweDMzICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIEFNUiAoUkZDMzI2NykqLworI2RlZmluZSBNNFBBS19IMjYzICAgICAgICAgIDB4MzQgIC8qKjxDb3JlIHBhY2tldGl6ZXIgSDI2MyAoUkZDMjQyOSkqLworI2RlZmluZSBNNERFUEFLX0gyNjMgICAgICAgIDB4MzUgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgSDI2MyhSRkMyNDI5KSovCisjZGVmaW5lIE00UEFLX1NJTVBMRSAgICAgICAgMHgzNiAgLyoqPENvcmUgcGFja2V0aXplciBTaW1wbGVEcmFmdCAoUkZDIHh4eHgpKi8KKyNkZWZpbmUgTTRERVBBS19TSU1QTEUgICAgICAweDM3ICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFNpbXBsZURyYWZ0IChSRkMgeHh4eCkqLworI2RlZmluZSBNNFBBS18zMDE2X1ZJREVPICAgIDB4MzggIC8qKjxDb3JlIHBhY2tldGl6ZXIgUkZDMzAxNiB2aWRlbyovCisjZGVmaW5lIE00REVQQUtfMzAxNl9WSURFTyAgMHgzOSAgLyoqPENvcmUgZGUtcGFja2V0aXplciBSRkMzMDE2IHZpZGVvKi8KKyNkZWZpbmUgTTRQQUtfMzAxNl9BVURJTyAgICAweDNBICAvKio8Q29yZSBwYWNrZXRpemVyIFJGQzMwMTYgYXVkaW8gKExBVE0pKi8KKyNkZWZpbmUgTTRERVBBS18zMDE2X0FVRElPICAweDNCICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJGQzMwMTYgYXVkaW8gKExBVE0pKi8KKyNkZWZpbmUgTTRERVBBS19IMjY0ICAgICAgICAweDNDICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIEgyNjQqLworI2RlZmluZSBNNERFUEFLX1JFQUxWICAgICAgICAweDNEICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJlYWwgVmlkZW8gKi8KKyNkZWZpbmUgTTRERVBBS19SRUFMQSAgICAgICAgMHgzRSAgLyoqPENvcmUgZGUtcGFja2V0aXplciBSZWFsIEF1ZGlvICovCisjZGVmaW5lIE00UkRUX1JFQURFUiAgICAgICAgMHgzRiAgLyoqPENvcmUgUkRUIHJlY2VpdmVyKi8KKyNkZWZpbmUgTTRUQ1BfRE1VWCAgICAgICAgICAweDUwICAvKio8Q29yZSBUQ1AgZGVtdXgqLworI2RlZmluZSBNNElPRF9QQVJTRVIgICAgICAgIDB4NTEgIC8qKjxDb3JlIElPRCBwYXJzZXIqLworI2RlZmluZSBNNE9TQV9GSUxFX0NPTU1PTiAgIDB4NjEgIC8qKjxPU0FMIGZpbGUgY29tbW9uKi8KKyNkZWZpbmUgTTRPU0FfRklMRV9XUklURVIgICAweDYyICAvKio8T1NBTCBmaWxlIHdyaXRlciovCisjZGVmaW5lIE00T1NBX0ZJTEVfUkVBREVSICAgMHg2MyAgLyoqPE9TQUwgZmlsZSByZWFkZXIqLworI2RlZmluZSBNNE9TQV9GSUxFX0VYVFJBICAgIDB4NjQgIC8qKjxPU0FMIGZpbGUgZXh0cmEqLworI2RlZmluZSBNNE9TQV9ESVJFQ1RPUlkgICAgIDB4NjUgIC8qKjxPU0FMIGRpcmVjdG9yeSovCisjZGVmaW5lIE00T1NBX1NPQ0tFVCAgICAgICAgMHg3MSAgLyoqPE9TQUwgc29ja2V0IChib3RoIHJlYWRlciBhbmQgd3JpdGVyKSovCisjZGVmaW5lIE00T1NBX1RIUkVBRCAgICAgICAgMHg4MSAgLyoqPE9TQUwgdGhyZWFkKi8KKyNkZWZpbmUgTTRPU0FfTVVURVggICAgICAgICAweDgyICAvKio8T1NBTCBtdXRleCovCisjZGVmaW5lIE00T1NBX1NFTUFQSE9SRSAgICAgMHg4MyAgLyoqPE9TQUwgc2VtYXBob3JlKi8KKyNkZWZpbmUgTTRPU0FfQ0xPQ0sgICAgICAgICAweDg0ICAvKio8T1NBTCBjbG9jayovCisjZGVmaW5lIE00T1NBX01FTU9SWSAgICAgICAgMHg5MSAgLyoqPE9TQUwgbWVtb3J5Ki8KKyNkZWZpbmUgTTRDQUxMX0JBQ0sgICAgICAgICAweEExICAvKio8Q2FsbCBCYWNrIGVycm9yKi8KKyNkZWZpbmUgTTRPU0FfVVJJICAgICAgICAgICAweEIxICAvKio8T1NBTCBVUkkgaGFuZGxlciovCisjZGVmaW5lIE00T1NBX1NUUklORyAgICAgICAgMHhCMiAgLyoqPE9TQUwgc3RyaW5nKi8KKyNkZWZpbmUgTTRTWVNfQ01BUEkgICAgICAgICAweEIzICAvKio8U1lTVEVNIENvbW1vbiBNZWRpIEFQSSovCisjZGVmaW5lIE00T1NBX0NIQVJTVEFSICAgICAgMHhCNCAgLyoqPE9TQUwgQ2hhclN0YXIqLworI2RlZmluZSBNNFJFQUNUT1IgICAgICAgICAgIDB4QzEgIC8qKjxDb3JlIHJlYWN0b3IqLworI2RlZmluZSBNNFRFU1QgICAgICAgICAgICAgIDB4RDEgIC8qKjxUZXN0IGNvbXBvbmVudCovCisjZGVmaW5lIE00U1RBQ0sgICAgICAgICAgICAgICAgMHhFMSAgLyoqPCBDb3JlIElEIG9mIHRoZSBpbnRlZ3JhdGVkIHN0YWNrKi8KKyNkZWZpbmUgTTRTVEFDS19SRUFMICAgICAgICAweEUyICAvKio8Q29yZSBJRCBvZiB0aGUgUmVhbCBpbnRlZ3JhdGVkIHN0YWNrICovCisjZGVmaW5lIE00VE9PTF9MQlZUX1BBUkFNICAgMHhGMSAgLyoqPExCX1ZUIGNvbmZpZyBmaWxlIG1hbmFnZXIqLworI2RlZmluZSBNNFRPT0xfTElOS19MSVNUICAgIDB4RjIgIC8qKjxUb29sIGxpbmtlZCBsaXN0Ki8KKyNkZWZpbmUgTTRUT09MX0JBU0U2NCAgICAgICAweEYzICAvKio8Q29yZSBiYXNlNjQgZW5jb2Rlci9kZWNvZGVyKi8KKworCisKKy8qIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIGNvZGVzICovCisvKiogdGhlcmUgaXMgbm8gZXJyb3IqLworI2RlZmluZSBNNE5PX0VSUk9SICAgICAgICAgICAgMHgwMDAwMDAwMAorCisvKiogQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMKi8KKyNkZWZpbmUgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDAxKQorLyoqIFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cqLworI2RlZmluZSBNNEVSUl9TVEFURSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDIpCisvKiogVGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlKi8KKyNkZWZpbmUgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDAzKQorLyoqIFByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lKi8KKyNkZWZpbmUgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA0KQorI2RlZmluZSBNNEVSUl9DT05URVhUX0ZBSUxFRCAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDUpCisjZGVmaW5lIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwNikKKy8qKiBUaGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lKi8KKyNkZWZpbmUgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA3KQorLyoqIFRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUqLworI2RlZmluZSBNNEVSUl9XUklURV9PTkxZICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDgpCisvKiogVGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lKi8KKyNkZWZpbmUgTTRFUlJfUkVBRF9PTkxZICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA5KQorLyoqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQqLworI2RlZmluZSBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMEEpCisKKyNkZWZpbmUgICAgTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00X0NPTU1PTiwgMHgwMDAwMEIpCisKKyNkZWZpbmUgTTRXQVJfTk9fREFUQV9ZRVQgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDAxKQorI2RlZmluZSBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDIpCisjZGVmaW5lIE00V0FSX0lOVkFMSURfVElNRSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwMykKKyNkZWZpbmUgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDA0KQorI2RlZmluZSBNNFdBUl9USU1FX09VVCAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDUpCisvKiogVGhlIGJ1ZmZlciBpcyBmdWxsKi8KKyNkZWZpbmUgTTRXQVJfQlVGRkVSX0ZVTEwgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDA2KQorLyogVGhlIHNlcnZlciBhc2tzIGZvciBhIHJlZGlyZWN0aW9uICovCisjZGVmaW5lIE00V0FSX1JFRElSRUNUICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDA3KQorI2RlZmluZSBNNFdBUl9UT09fTVVDSF9TVFJFQU1TICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDgpCisKKyNlbmRpZiAvKk00T1NBX0VSUk9SX0gqLworCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FeHBvcnQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0V4cG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkMzgzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FeHBvcnQuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICBNNE9TQV9FeHBvcnQuaAorICogQGJyaWVmICAgIERhdGEgYWNjZXNzIGV4cG9ydCB0eXBlcyBmb3IgQW5kcm9pZAorICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdHlwZXMgd2hpY2ggbXVzdCBiZQorICogICAgICAgICAgdXNlZCB0byBpbXBvcnQgb3IgZXhwb3J0IGFueSBmdW5jdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgTTRPU0FfRVhQT1JUX0gKKyNkZWZpbmUgTTRPU0FfRVhQT1JUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBPU0FMIEVYUE9SVFMgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBDSEFSX1NUQVIgICAgICAgICovCisjZGVmaW5lIE00T1NBTF9DTE9DS19FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBDTE9DSyAgICAgICAgICAgICovCisjZGVmaW5lIE00T1NBTF9EQVRFX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBEQVRFICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgLyoqPCBPU0FMIEZJTEUgICAgICAgICAgICAqLworI2RlZmluZSBNNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgUkVBTCBUSU1FICAgICAgICAqLworI2RlZmluZSBNNE9TQUxfU09DS0VUX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBTT0NLRVQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBTVFJJTkcgICAgICAgICovCisjZGVmaW5lIE00T1NBTF9VUklfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgLyoqPCBPU0FMIFVSSSAgICAgICAgICAgICovCisjZGVmaW5lIE00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgTUVNT1JZICAgICAgICAqLworI2RlZmluZSBNNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgVFJBQ0UgICAgICAgICAgICAqLworI2RlZmluZSBNNE9TQUxfVE9PTF9USU1FUl9FWFBPUlRfVFlQRSAgICAgICAgLyoqPCBPU0FMIFRPT0wgVElNRVIgICAgKi8KKyNkZWZpbmUgTTRPU0FMX1NZU1RFTV9DTV9FWFBPUlRfVFlQRSAgICAgICAgLyoqPCBTWVNURU0gQ09NTU9OIEFQSSAgICAqLworI2RlZmluZSBNNE9TQUxfTElOS0VEX0xJU1RfRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgVE9PTCBMSU5LRUQgTElTVCAgICAqLworI2RlZmluZSBNNE9TQUxfTUVNT1JZX01BTkFHRVJfRVhQT1JUX1RZUEUgICAgLyoqPCBNRU1PUlkgTUFOQUdFUiAgICAgICAgKi8KKyNkZWZpbmUgTTRPU0FMX1RSQUNFX01BTkFHRVJfRVhQT1JUX1RZUEUgICAgLyoqPCBUT09MIFRSQUNFIE1BTkFHRVIgKi8KKyNkZWZpbmUgTTRWUFNfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgVlBTIEFQSSAgICAgICAgICAgICovCisjZGVmaW5lIE00QVBfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgQVVESU8gUFJFU0VOVEVSUyAgICAqLworI2RlZmluZSBNNFZQX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IFZJREVPIFBSRVNFTlRFUlMgICAgKi8KKyNkZWZpbmUgTTRDQl9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgLyoqPCBDYWxsIGJhY2sgICAgICAgICAgICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KKworI2VuZGlmIC8qTTRPU0FfRVhQT1JUX0gqLworCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQWNjZXNzLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg5YTk4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVBY2Nlc3MuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTTRPU0FfRklMRUFDRVNTX0hfXworI2RlZmluZSBfX000T1NBX0ZJTEVBQ0VTU19IX18KKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisjaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCisjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN0cnVjdCAgICAgICAgTTRPU0FfRmlsZVB0ckZjdAorICogQGJyaWVmICAgICAgICBEZWZpbmVzIHRoZSBhdmFpbGFibGUgZnVuY3Rpb25zIGZvciBGaWxlIHJlYWQvd3JpdGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordHlwZWRlZiBlbnVtCit7CisgICAgTTRPU0FfRklMRUlOVEVSRkFDRV9SQU0sCisgICAgTTRPU0FfRklMRUlOVEVSRkFDRV9GRlMsCisgICAgTTRPU0FfRklMRUlOVEVSRkFDRV9PUFRJTV9GRlMKKworfSBNNE9TQV9GaWxlSW50ZXJmYWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZXI7ICAgIC8qKjwgUG9pbnRlciB0byBmaWxlIHdyaXRlciBmdW5jdGlvbnMgKi8KKyAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgICAqcEZpbGVSZWFkZXI7ICAgIC8qKjwgUG9pbnRlciB0byBmaWxlIHJlYWRlciBmdW5jdGlvbnMgKi8KK30gTTRPU0FfRmlsZVB0ckZjdDsKKworLypTZW1hcGhvcmUgZm9yIGhhbmRsaW5nIG9mIFIvVyBhY2Nlc3MqLworZXh0ZXJuIE00T1NBX0NvbnRleHQgICAgTTRPU0FfRmlsZUludGVyZmFjZV9SV3NlbWFwaG9yZTsgLypkZWZpbmVkIGluIE00T1NBX0ZpbGVJbnRlcmZhY2UuYyovCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuYyAgICAgICAgIE00X0ZpbGVJbnRlcmZhY2VfeHh4CisgKiBAYnJpZWYgICAgICAgIE1hbmFnZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXJzIGZvciBmaWxlc3lzdGVtIGFjY2VzcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0ZpbGVQdHJGY3QqIE00X0ZpbGVJbnRlcmZhY2VfSW5pdFBvaW50ZXIodm9pZCk7CitNNE9TQV9FUlIgTTRfRmlsZUludGVyZmFjZV9TZWxlY3RQb2ludGVyKE00T1NBX0ZpbGVQdHJGY3QgKnBGaWxlRmN0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlSW50ZXJmYWNlX3QgbW9kZSk7CitNNE9TQV9Wb2lkIE00X0ZpbGVJbnRlcmZhY2VfRnJlZVBvaW50ZXIoTTRPU0FfRmlsZVB0ckZjdCAqcEZpbGVGY3RQdHIpOworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbV9TZXRJbnRlcmZhY2VGRlMoTTRPU0FfQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyovCisKKyNlbmRpZiAvKiBfX000T1NBX0ZJTEVBQ0VTU19IX18qLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNhY2hlLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjRjMmJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNhY2hlLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ2FjaGUuaAorICogQGluZ3JvdXAgICAgICBPU0FMCisgKiBAYnJpZWYgICAgICAgICBPc2FsIEZpbGUgUmVhZGVyIGFuZCBXcml0ZXIgd2l0aCBjYWNoZQorICogQG5vdGUgICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUKKyAqICAgICAgICAgICAgICAgICBmaWxlc3lzdGVtIGFjY2VzcyB3aXRoIGludGVybWVkaWF0ZSBidWZmZXJzIHVzZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgcmVhZCBhbmQgdG8gd3JpdGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIE00T1NBX0ZJTEVDQUNIRV9ICisjZGVmaW5lIE00T1NBX0ZJTEVDQUNIRV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKK000T1NBX0VSUiBNNE9TQV9maWxlT3Blbl9jYWNoZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzKTsKK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGFfY2FjaGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogc2l6ZSApOworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGFfY2FjaGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUgKTsKK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWtfY2FjaGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gKTsKK000T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVTZWVrX2NhY2hlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gKTsKK000T1NBX0VSUiBNNE9TQV9maWxlR2V0T3B0aW9uX2NhY2hlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqb3B0aW9uVmFsdWUgKTsKK000T1NBX0VSUiBNNE9TQV9maWxlU2V0T3B0aW9uX2NhY2hlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSApOworTTRPU0FfRVJSIE00T1NBX2ZpbGVGbHVzaF9jYWNoZSggTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7CitNNE9TQV9FUlIgTTRPU0FfZmlsZUNsb3NlX2NhY2hlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQgKTsKKworLyogVXNlZCBpbiBWQSAqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYWZUcnVuY2F0ZV9jYWNoZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBNNE9TQV9GSUxFQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY2M2JlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uLmgKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUNvbW1vbi5oCisgKiBAaW5ncm91cCAgICAgIE9TQUwKKyAqIEBicmllZiAgICAgICAgRmlsZSBjb21tb24KKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdXNlZCBieSBib3RoIHRoZSBmaWxlCisgKiAgICAgICAgICAgICAgIHdyaXRlciBhbmQgZmlsZSByZWFkZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKyNpZm5kZWYgTTRPU0FfRklMRUNPTU1PTl9ICisjZGVmaW5lIE00T1NBX0ZJTEVDT01NT05fSAorCisjaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKKyNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCisjaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKKyNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgorCisKKworLyojZGVmaW5lIE00T1NBX0ZJTEVfUE9TXzY0X0JJVFNfU1VQUE9SVEVEKi8gLypNZWFucyBNNE9TQV9JbnQ2NCBpcyB1c2VkKi8KKworI2lmbmRlZiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRAorI2RlZmluZSBNNE9TQV9GSUxFX1BPU18zMl9CSVRTX1NVUFBPUlRFRCAgICAgLypNZWFucyBNNE9TQV9JbnQzMiBpcyB1c2VkKi8KKyNlbmRpZiAvKk00T1NBX0ZJTEVfUE9TXzY0X0JJVFNfU1VQUE9SVEVEKi8KKworCisKKyNpZmRlZiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRAordHlwZWRlZiBNNE9TQV9JbnQ2NCBNNE9TQV9GaWxlUG9zaXRpb247CisjZW5kaWYKKyNpZmRlZiBNNE9TQV9GSUxFX1BPU18zMl9CSVRTX1NVUFBPUlRFRAordHlwZWRlZiBNNE9TQV9JbnQzMiBNNE9TQV9GaWxlUG9zaXRpb247CisjZW5kaWYKKworLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBtb2RlIGFjY2Vzcy4KKyAqICBpZSwgdGhlIGFwcGxpY2F0aW9uIHVzZXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBvciB0byB3cml0ZSAgb3IKKyAqICBib3RoIHRvIHJlYWQgYW5kIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUuCisgKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgTU0gcHJvamVjdCBvbmx5LiBJdCBlbmFibGVzIHRvIHJlYWQgYW5kIHdyaXRlIHRvIGEgZmlsZQorICogIHdpdGggb25lIGRlc2NyaXB0b3IuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgTTRPU0Ffa0Rlc2NOb25lQWNjZXNzICAgID0gMHgwMCwKKyAgIE00T1NBX2tEZXNjUmVhZEFjY2VzcyAgICA9IDB4MDEsICAgIC8qKiBUaGUgRGVzY3JpcHRvciByZWFkcyBvbmx5IGZyb20gdGhlIGZpbGUgKi8KKyAgIE00T1NBX2tEZXNjV3JpdGVBY2Nlc3MgICAgPSAweDAyLCAgICAvKiogVGhlIERlc2NyaXB0b3Igd3JpdGVzIG9ubHkgZnJvbSB0aGUgZmlsZSovCisgICBNNE9TQV9rRGVzY1JXQWNjZXNzICAgICAgICA9IDB4MDMgICAgLyoqIFRoZSBEZXNjcmlwdG9yIHJlYWRzIGFuZCB3cml0ZXMgZnJvbS9pbiB0aGUgZmlsZSovCit9IE00T1NBX0Rlc2NyTW9kZUFjY2VzczsKKworCisvKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIGZpbGUgbW9kZSBhY2Nlc3MuIEJvdGggdGV4dCBtb2RlIGFzIGJpbmFyeSBtb2RlCisgICAgY2Fubm90IGJlIHNldCB0b2dldGhlci4qLwordHlwZWRlZiBlbnVtCit7CisgICAvKiogVGhlIGZpbGUgbXVzdCBiZSBhY2Nlc3NlZCBpbiByZWFkIG9ubHkgbW9kZSovCisgICBNNE9TQV9rRmlsZVJlYWQgICAgICAgICAgICAgPSAweDAxLAorICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gd3JpdGUgb25seSBtb2RlKi8KKyAgIE00T1NBX2tGaWxlV3JpdGUgICAgICAgICAgICA9IDB4MDIsCisgICAvKiogVGhlIGZpbGUgbXVzdCBiZSBhY2Nlc3NlZCBpbiBhcHBlbmQgbW9kZSAoQW4gZXhpc3RpbmcgZmlsZSBtdXN0CisgICAgICAgYmUgYXZhaWxhYmxlIHRvIGFwcGVuZCBkYXRhKSovCisgICBNNE9TQV9rRmlsZUFwcGVuZCAgICAgICAgICAgPSAweDA0LAorICAgLyoqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQqLworICAgTTRPU0Ffa0ZpbGVDcmVhdGUgICAgICAgICAgID0gMHgwOCwKKyAgIC8qKiBEYXRhIGFyZSBwcm9jZXNzZWQgYXMgYmluYXJ5IG9uZSwgdGhlcmUgaXMgbm8gZGF0YSBtYW5hZ2VtZW50Ki8KKyAgIE00T1NBX2tGaWxlSXNUZXh0TW9kZSAgICAgICA9IDB4MTAKK30gTTRPU0FfRmlsZU1vZGVBY2Nlc3M7CisKKworLyoqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHN0b3JlIGEgZGF0ZS4qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qKiBUaW1lIHNjYWxlICh0aWNrIG51bWJlciBwZXIgc2Vjb25kKSovCisgICBNNE9TQV9VSW50MzIgdGltZVNjYWxlOworICAgLyoqIERhdGUgZXhwcmVzc2VkIGluIHRoZSB0aW1lIHNjYWxlKi8KKyAgIE00T1NBX1RpbWUgICB0aW1lOworICAgLyoqIFllYXIgb2YgdGhlIGFic29sdXRlIHRpbWUgKDE5MDAsIDE5NzAgb3IgMjAwMCkqLworICAgTTRPU0FfVUludDMyIHJlZmVyZW5jZVllYXI7Cit9IE00T1NBX0RhdGU7CisKKworLyoqIFRoaXMgc3RydWN1cmUgZGVmaW5lcyB0aGUgZmlsZSBhdHRyaWJ1dGVzKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKiogVGhlIGZpbGUgbW9kZSBhY2Nlc3MqLworICAgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgICAgbW9kZUFjY2VzczsKKyAgIC8qKiBUaGUgY3JlYXRpb24gZGF0ZSovCisgICBNNE9TQV9EYXRlICAgICAgICAgICAgICBjcmVhdGlvbkRhdGU7CisgICAvKiogVGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUqLworICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgbW9kaWZpZWREYXRlOworICAgLyoqIFRoZSBsYXN0IGFjY2VzcyBkYXRlIChyZWFkKSovCisgICBNNE9TQV9EYXRlICAgICAgICAgICAgICBsYXN0QWNjZXNzRGF0ZTsKK30gTTRPU0FfRmlsZUF0dHJpYnV0ZTsKKworCisKKy8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgc2VlayBiZWhhdmlvciovCit0eXBlZGVmIGVudW0gTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlCit7CisgICAvKiogUmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSovCisgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgICAgICAgICAgICA9IDB4MDEsCisgICAvKiogUmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSovCisgICBNNE9TQV9rRmlsZVNlZWtFbmQgICAgICAgICAgICAgICAgICA9IDB4MDIsCisgICAvKiogUmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiovCisgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50ICAgICAgICAgICAgICA9IDB4MDMKK30gTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlOworCisKKy8qIEVycm9yIGNvZGVzICovCisjZGVmaW5lIE00RVJSX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwMSkKKyNkZWZpbmUgTTRFUlJfRklMRV9MT0NLRUQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9DT01NT04sIDB4MDAwMDAyKQorI2RlZmluZSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUyAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDMpCisjZGVmaW5lIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwNCkKKworCisjaWZkZWYgTTRPU0FfRklMRV9QT1NfNjRfQklUU19TVVBQT1JURUQKKworI2RlZmluZSBNNE9TQV9GUE9TX1NFVChmcG9zX2EsIGZwb3NfYilcCisgICAgICAgIE00T1NBX0lOVDY0X1NFVChmcG9zX2EsIGZwb3NfYikKKworI2RlZmluZSBNNE9TQV9GUE9TX0FERChmcG9zX3Jlc3VsdCwgZnBvc19hLCBmcG9zX2IpXAorICAgICAgICBNNE9TQV9JTlQ2NF9BREQoZnBvc19yZXN1bHQsIGZwb3NfYSwgZnBvc19iKQorCisjZGVmaW5lIE00T1NBX0ZQT1NfU1VCKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGZwb3NfYilcCisgICAgICAgIE00T1NBX0lOVDY0X1NVQihmcG9zX3Jlc3VsdCwgZnBvc19hLCBmcG9zX2IpCisKKyNkZWZpbmUgTTRPU0FfRlBPU19BRERfQ09OU1RfVUlOVDMyKGZwb3Nfb3V0LCBmcG9zX2luLCBpMzJfaW4pXAorICAgICAgeyBNNE9TQV9JbnQ2NCBpNjRfaW47XAorICAgICAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKGk2NF9pbiwgaTMyX2luKTtcCisgICAgICAgIE00T1NBX0lOVDY0X0FERChmcG9zX291dCwgZnBvc19pbiwgaTY0X2luKTsgfQorCisjZGVmaW5lIE00T1NBX0ZQT1NfU1VCX0NPTlNUX1VJTlQzMihmcG9zX291dCwgZnBvc19pbiwgaTMyX2luKVwKKyAgICAgIHsgTTRPU0FfSW50NjQgaTY0X2luO1wKKyAgICAgICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMihpNjRfaW4sIGkzMl9pbik7XAorICAgICAgICBNNE9TQV9JTlQ2NF9TVUIoZnBvc19vdXQsIGZwb3NfaW4sIGk2NF9pbik7IH0KKworI2RlZmluZSBNNE9TQV9GUE9TX1NDQUxBUl9QUk9EVUNUKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGkzMl92YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDY0X1NDQUxBUl9QUk9EVUNUKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGkzMl92YWx1ZSkKKworI2RlZmluZSBNNE9TQV9GUE9TX1NDQUxBUl9ESVZJU0lPTihmcG9zX3Jlc3VsdCwgZnBvc19hLCBpMzJfdmFsdWUpXAorICAgICAgICBNNE9TQV9JTlQ2NF9TQ0FMQVJfRElWSVNJT04oZnBvc19yZXN1bHQsIGZwb3NfYSwgaTMyX3ZhbHVlKQorCisjZGVmaW5lIE00T1NBX0ZQT1NfQ09NUEFSRShmcG9zX2EsIGZwb3NfYilcCisgICAgICAgIE00T1NBX0lOVDY0X0NPTVBBUkUoZnBvc19hLCBmcG9zX2IpCisKKyNkZWZpbmUgTTRPU0FfRklMRV9QT1NJVElPTl9UT19JTlQoZnBvcywgaXBvcylcCisgICAgICAgIE00T1NBX0lOVDY0X1NFVChpcG9zLCBmcG9zKQorCisjZGVmaW5lIE00T1NBX0lOVF9UT19GSUxFX1BPU0lUSU9OKGlwb3MsIGZwb3MpXAorICAgICAgICBNNE9TQV9GUE9TX1NFVChmcG9zLCBpcG9zKQorCisjZGVmaW5lIE00T1NBX0ZQT1NfSVNfUE9TSVRJVkUoZnBvc192YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDY0X0lTX1BPU0lUSVZFKGZwb3NfdmFsdWUpCisKKyNkZWZpbmUgTTRPU0FfRlBPU19ORUcoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpXAorICAgICAgICBNNE9TQV9JTlQ2NF9ORUcoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpCisKKyNkZWZpbmUgTTRPU0FfRlBPU19BQlMoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpXAorICAgICAgICBNNE9TQV9JTlQ2NF9BQlMoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpCisKKyNkZWZpbmUgTTRPU0FfRlBPU19MRUZUX1NISUZUKGZwb3NfcmVzdWx0LCBmcG9zX3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKVwKKyAgICAgICAgTTRPU0FfSU5UNjRfTEVGVF9TSElGVChmcG9zX3Jlc3VsdCwgZnBvc192YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucykKKworI2RlZmluZSBNNE9TQV9GUE9TX1JJR0hUX1NISUZUKGZwb3NfcmVzdWx0LCBmcG9zX3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKVwKKyAgICAgICAgTTRPU0FfSU5UNjRfUklHSFRfU0hJRlQoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUsIHVpMzJfbmJQb3NpdGlvbnMpCisKKyNlbmRpZgorCisjaWZkZWYgTTRPU0FfRklMRV9QT1NfMzJfQklUU19TVVBQT1JURUQKKworI2RlZmluZSBNNE9TQV9GUE9TX1NFVChmcG9zX2EsIGZwb3NfYilcCisgICAgICAgIE00T1NBX0lOVDMyX1NFVChmcG9zX2EsIGZwb3NfYikKKworI2RlZmluZSBNNE9TQV9GUE9TX0FERChmcG9zX3Jlc3VsdCwgZnBvc19hLCBmcG9zX2IpXAorICAgICAgICBNNE9TQV9JTlQzMl9BREQoZnBvc19yZXN1bHQsIGZwb3NfYSwgZnBvc19iKQorCisjZGVmaW5lIE00T1NBX0ZQT1NfU1VCKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGZwb3NfYilcCisgICAgICAgIE00T1NBX0lOVDMyX1NVQihmcG9zX3Jlc3VsdCwgZnBvc19hLCBmcG9zX2IpCisKKyNkZWZpbmUgTTRPU0FfRlBPU19BRERfQ09OU1RfVUlOVDMyKGZwb3Nfb3V0LCBmcG9zX2luLCBpMzJfaW4pXAorICAgICAgICBNNE9TQV9GUE9TX0FERChmcG9zX291dCwgZnBvc19pbiwgaTMyX2luKQorCisjZGVmaW5lIE00T1NBX0ZQT1NfU1VCX0NPTlNUX1VJTlQzMihmcG9zX291dCwgZnBvc19pbiwgaTMyX2luKVwKKyAgICAgICAgTTRPU0FfRlBPU19TVUIoZnBvc19vdXQsIGZwb3NfaW4sIGkzMl9pbikKKworI2RlZmluZSBNNE9TQV9GUE9TX1NDQUxBUl9QUk9EVUNUKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGkzMl92YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDMyX1NDQUxBUl9QUk9EVUNUKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGkzMl92YWx1ZSkKKworI2RlZmluZSBNNE9TQV9GUE9TX1NDQUxBUl9ESVZJU0lPTihmcG9zX3Jlc3VsdCwgZnBvc19hLCBpMzJfdmFsdWUpXAorICAgICAgICBNNE9TQV9JTlQzMl9TQ0FMQVJfRElWSVNJT04oZnBvc19yZXN1bHQsIGZwb3NfYSwgaTMyX3ZhbHVlKQorCisjZGVmaW5lIE00T1NBX0ZQT1NfQ09NUEFSRShmcG9zX2EsIGZwb3NfYilcCisgICAgICAgIE00T1NBX0lOVDMyX0NPTVBBUkUoZnBvc19hLCBmcG9zX2IpCisKKyNkZWZpbmUgTTRPU0FfRklMRV9QT1NJVElPTl9UT19JTlQoZnBvcywgaXBvcylcCisgICAgICAgIE00T1NBX0lOVDMyX1NFVChpcG9zLCBmcG9zKQorCisjZGVmaW5lIE00T1NBX0lOVF9UT19GSUxFX1BPU0lUSU9OKGlwb3MsIGZwb3MpXAorICAgICAgICBNNE9TQV9GUE9TX1NFVChmcG9zLCBpcG9zKQorCisjZGVmaW5lIE00T1NBX0ZQT1NfSVNfUE9TSVRJVkUoZnBvc192YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDMyX0lTX1BPU0lUSVZFKGZwb3NfdmFsdWUpCisKKyNkZWZpbmUgTTRPU0FfRlBPU19ORUcoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpXAorICAgICAgICBNNE9TQV9JTlQzMl9ORUcoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpCisKKyNkZWZpbmUgTTRPU0FfRlBPU19BQlMoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpXAorICAgICAgICBNNE9TQV9JTlQzMl9BQlMoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpCisKKyNkZWZpbmUgTTRPU0FfRlBPU19MRUZUX1NISUZUKGZwb3NfcmVzdWx0LCBmcG9zX3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKVwKKyAgICAgICAgTTRPU0FfSU5UMzJfTEVGVF9TSElGVChmcG9zX3Jlc3VsdCwgZnBvc192YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucykKKworI2RlZmluZSBNNE9TQV9GUE9TX1JJR0hUX1NISUZUKGZwb3NfcmVzdWx0LCBmcG9zX3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKVwKKyAgICAgICAgTTRPU0FfSU5UMzJfUklHSFRfU0hJRlQoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUsIHVpMzJfbmJQb3NpdGlvbnMpCisKKyNlbmRpZgorCisKKworI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9IKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMzA2NGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBGaWxlIGNvbW1vbiBwcml2YXRlIGZvciBBbmRyb2lkCisgKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHVzZWQgYnkgYm90aCB0aGUgZmlsZQorICogICAgICAgICAgICAgICB3cml0ZXIgYW5kIGZpbGUgcmVhZGVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBNNE9TQV9GSUxFQ09NTU9OX1BSSVZfSAorI2RlZmluZSBNNE9TQV9GSUxFQ09NTU9OX1BSSVZfSAorCisKKyNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBNNE9TQV9pc0FjY2Vzc01vZGVBY3RpdmVkKGNvbXBvdW5kX21vZGVfYWNjZXNzLGVsZW1lbnRhcnlfbW9kZV9hY2Nlc3MpXAorICAgICAgICAoKChjb21wb3VuZF9tb2RlX2FjY2VzcykmKGVsZW1lbnRhcnlfbW9kZV9hY2Nlc3MpKT8gMTowKQorCisKK3R5cGVkZWYgZW51bSBNNE9TQV9MYXN0U2VlaworeworICAgU2Vla05vbmUsCisgICBTZWVrUmVhZCwKKyAgIFNlZWtXcml0ZQorfSBNNE9TQV9MYXN0U2VlazsKKworLyoqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZpbGUgY29udGV4dCovCit0eXBlZGVmIHN0cnVjdCB7CisgICBNNE9TQV9VSW50MzIgICAgICAgICBjb3JlSURfcmVhZDsKKyAgIE00T1NBX1VJbnQzMiAgICAgICAgIGNvcmVJRF93cml0ZTsKKyNpZmRlZiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRAorICAgLyoqIFRoZSBmaWxlIGhhbmRsZXIgKi8KKyAgIE00T1NBX0ludDMyICAgICAgICAgIGZpbGVfZGVzYzsKKyNlbHNlCisgICBGSUxFKiAgICAgICAgICAgICAgICBmaWxlX2Rlc2M7CisjZW5kaWYgLyogTTRPU0FfRklMRV9QT1NfNjRfQklUU19TVVBQT1JURUQgKi8KKyAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgVVJMICovCisgICBNNE9TQV9DaGFyKiAgICAgICAgICB1cmxfbmFtZTsKKyAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSAqLworICAgTTRPU0FfQ2hhciogICAgICAgICAgZmlsZV9uYW1lOworICAgLyoqIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlICovCisgICBNNE9TQV9GaWxlUG9zaXRpb24gICBmaWxlX3NpemU7CisgICAvKiogVGhlIGZpbGUgbW9kZSBhY2Nlc3MgdXNlZCB0byBvcGVuIHRoZSBmaWxlICovCisgICBNNE9TQV9GaWxlTW9kZUFjY2VzcyBhY2Nlc3NfbW9kZTsKKyAgIE00T1NBX0xhc3RTZWVrICAgICAgIGN1cnJlbnRfc2VlazsKKyAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIHJlYWRfcG9zaXRpb247CisgICBNNE9TQV9GaWxlUG9zaXRpb24gICB3cml0ZV9wb3NpdGlvbjsKKyAgIE00T1NBX0Jvb2wgICAgICAgICAgIGJfaXNfZW5kX29mX2ZpbGU7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICBNNE9TQV9Db250ZXh0ICAgICAgICBzZW1hcGhvcmVfY29udGV4dDsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKworICAgLyogVGhlc2UgdHdvIHZhcmlhYmxlcyB3ZXJlIGFkZGVkIHRvIG1hbmFnZSBjYXNlIHdoZXJlIGEgZmlsZQorICAgICogaXMgb3BlbmVkIGluIHJlYWQgYW5kIHdyaXRlIG1vZGUgd2l0aCBvbmUgZGVzY3JpcHRvciAqLworICAgIE00T1NBX0Rlc2NyTW9kZUFjY2VzcyAgICBtX0Rlc2NyTW9kZUFjY2VzczsKKyAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpTG9ja01vZGU7CisKKworfSBNNE9TQV9GaWxlQ29udGV4dDsKKworCisKK000T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uT3BlbihNNE9TQV9VSW50MTYgY29yZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIFVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlTW9kZUFjY2VzcyBmaWxlTW9kZUFjY2Vzcyk7CisKK000T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfVUludDE2IGNvcmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7CisKK000T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVBdHRyaWJ1dGUqIGF0dHJpYnV0ZSk7CisKK000T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiB1cmwpOworCitNNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKE00T1NBX0NoYXIqIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIGZpbGVuYW1lKTsKKworTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25TZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7CisKKyNpZmRlZiBVVEZfQ09OVkVSU0lPTgorTTRPU0FfRVJSIE00T1NBX1RvVVRGOF9PU0FMIChNNE9TQV9Wb2lkICAgKnBCdWZmZXJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggICpwQnVmZmVyT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKmJ1ZmZlck91dFNpemUpOworI2VuZGlmIC8qVVRGX0NPTlZFUlNJT04qLworCisKKyNlbmRpZiAvKk00T1NBX0ZJTEVDT01NT05fUFJJVl9IKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUV4dHJhLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlRXh0cmEuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYzliYWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUV4dHJhLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQGZpbGUgICAgICAgIE00T1NBX0ZpbGVFeHRyYS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBAaW5ncm91cCAgICAgT1NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIE00T1NBX0ZJTEVfRVhUUkFfSAorI2RlZmluZSBNNE9TQV9GSUxFX0VYVFJBX0gKKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisjaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCisvKiBzaXplIG9mIHRoZSBjb3B5IGJ1ZmZlciAoaW4gYnl0ZXMpIGZvciBNNE9TQV9maWxlRXh0cmFDb3B5ICovCisjZGVmaW5lIEJVRkZFUl9DT1BZX1NJWkUgMTAyNAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBNNE9TQV9UeXBlSW52YWxpZCA9IDAsCisgICAgTTRPU0FfVHlwZUZpbGUsCisgICAgTTRPU0FfVHlwZURpcgorfSBNNE9TQV9FbnRyeVR5cGU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKK000T1NBX0VSUiBNNE9TQV9maWxlRXh0cmFEZWxldGUoY29uc3QgTTRPU0FfQ2hhciogdXJsKTsKKworTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYUNvcHkoTTRPU0FfQ2hhciogc3JjVXJsLCBNNE9TQV9DaGFyKiBkc3RVcmwpOworCitNNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhUmVuYW1lKE00T1NBX0NoYXIqIHNyY1VybCwgTTRPU0FfQ2hhciogZHN0VXJsKTsKKworTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYUNoYW5nZUN1cnJlbnREaXIoY29uc3QgTTRPU0FfQ2hhciogdXJsKTsKKworTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYUNyZWF0ZURpcihjb25zdCBNNE9TQV9DaGFyKiBwVXJsKTsKKworTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYVJlbW92ZURpcihjb25zdCBNNE9TQV9DaGFyKiBwVXJsKTsKKworTTRPU0FfVUludDMyIE00T1NBX2ZpbGVFeHRyYUdldEZyZWVTcGFjZShjb25zdCBNNE9TQV9DaGFyKiBwVXJsKTsKKworTTRPU0FfVUludDMyIE00T1NBX2ZpbGVFeHRyYUdldFRvdGFsU3BhY2UoY29uc3QgTTRPU0FfQ2hhciogcFVybCk7CisKK000T1NBX0VudHJ5VHlwZSBNNE9TQV9maWxlRXh0cmFHZXRUeXBlKGNvbnN0IE00T1NBX0NoYXIqIHBVcmwpOworCitNNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhZlRydW5jYXRlKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfRmlsZVBvc2l0aW9uIGxlbmd0aCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgIC8qTTRPU0FfRklMRV9FWFRSQV9IKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlci5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwYzc1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlci5oCisgKiBAaW5ncm91cCAgICAgIE9TQUwKKyAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIKKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gcmVhZCBhIGZpbGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKyNpZm5kZWYgTTRPU0FfRklMRVJFQURFUl9ICisjZGVmaW5lIE00T1NBX0ZJTEVSRUFERVJfSAorCisKKyNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgorI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgorI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgorCisKKworLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBvcHRpb24gSUQgdG8gYmUgdXNlZCBpbiBNNE9TQV9GaWxlUmVhZEdldE9wdGlvbigpCisgICAgYW5kIE00T1NBX0ZpbGVSZWFkU2V0T3B0aW9uKCkqLwordHlwZWRlZiBlbnVtIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQKK3sKKyAgIC8qKiBHZXQgdGhlIGZpbGUgc2l6ZSAoTTRPU0FfZnBvcyopKi8KKyAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplCisgICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDEpLAorCisgICAgICAvKiogR2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKSovCisgICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDIpLAorCisgICAvKiogR2V0IHRoZSBmaWxlIFVSTCwgcHJvdmlkZWQgYnkgdGhlIE00T1NBX0ZpbGVSZWFkT3BlbiAoTTRPU0FfQ2hhciopKi8KKyAgIE00T1NBX2tGaWxlUmVhZEdldFVSTAorICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAzKSwKKworICAgLyoqIEdldCB0aGUgZmlsZSBwb3NpdGlvbiAoTTRPU0FfZnBvcyopKi8KKyAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDA0KSwKKworICAgLyoqIENoZWNrIGVuZCBvZiBmaWxlOiBUUlVFIGlmIHRoZSBFT0YgaGFzIGJlZW4gcmVhY2hlZCwgRkFMU0UgZWxzZQorICAgICAgIChNNE9TQV9Cb29sKikqLworICAgTTRPU0Ffa0ZpbGVSZWFkSXNFT0YKKyAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwNSksCisKKyAgIC8qKiBDaGVjayBsb2NrIG9mIGZpbGUgKi8KKyAgIE00T1NBX2tGaWxlUmVhZExvY2tNb2RlCisgICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRFdSSVRFLCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwNikKKworfSBNNE9TQV9GaWxlUmVhZE9wdGlvbklEOworCisKKworCisKKy8qKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHNldCBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBhY2Nlc3MgdG8gYQorICAgIGZpbGUgaW4gcmVhZCBtb2RlKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICBNNE9TQV9FUlIgKCpvcGVuUmVhZCkgICAoTTRPU0FfQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOworCisgICBNNE9TQV9FUlIgKCpyZWFkRGF0YSkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHNpemUpOworCisgICBNNE9TQV9FUlIgKCpzZWVrKSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKKworICAgTTRPU0FfRVJSICgqY2xvc2VSZWFkKSAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7CisKKyAgIE00T1NBX0VSUiAoKnNldE9wdGlvbikgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKKworICAgTTRPU0FfRVJSICgqZ2V0T3B0aW9uKSAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKm9wdGlvblZhbHVlKTsKK30gTTRPU0FfRmlsZVJlYWRQb2ludGVyOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCitNNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuICAgICAgICAoTTRPU0FfQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOworCitNNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhICAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHNpemUpOworCitNNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrICAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKKworTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2UgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7CisKK000T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbiAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSk7CisKK000T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbiAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAgLypNNE9TQV9GSUxFUkVBREVSX0gqLworCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyUmFtLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyUmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ4MDE5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXJSYW0uaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJSYW0uaAorICogQGluZ3JvdXAgICAgICBPU0FMCisgKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byByZWFkIGEgImZpbGUiIHN0b3JlZCBpbiBSQU0uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKworI2lmbmRlZiBNNE9TQV9GSUxFUkVBREVSUkFNX0gKKyNkZWZpbmUgTTRPU0FfRklMRVJFQURFUlJBTV9ICisKKyNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RydWN0dXJlICAgIE00RklfRmlsZVJlYWRlclJhbV9EZXNjcmlwdG9yCisgKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgZGVzY3JpcHRvciAocHVibGljKQorICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGRhdGEgaW4gbWVtb3J5CisgKiBAbm90ZSAgICAgICAgYW5kIGl0cyBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBNNE9TQV9NZW1BZGRyOCAgICBwRmlsZURlc2M7ICAgIC8qIFBvaW50ZXIgb24gZmlsZSBkYXRhICovCisgICAgTTRPU0FfSW50MzIgICAgICAgIGRhdGFTaXplOyAgICAvKiBTaXplIG9mIGRhdGEgKi8KK30gTTRPU0FfRmlsZVJlYWRlclJhbV9EZXNjcmlwdG9yOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisvKiByZWFkZXIgQVBJIDogUkFNIGZ1bmN0aW9ucyAqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkUmFtT3BlbiggTTRPU0FfQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzICk7CitNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRSYW1EYXRhKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHNpemUgKTsKK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbVNlZWsoIE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gKTsKK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbUNsb3NlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQgKTsKK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbUdldE9wdGlvbiggTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSApOworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkUmFtU2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUgKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgICAvKk00T1NBX0ZJTEVSRUFERVJSQU1fSCovCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXJfcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmUyYWY5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXJfcHJpdi5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBwcml2YXRlIGZvciBBbmRyb2lkCisgKiBAbm90ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBNNE9TQV9GSUxFUkVBREVSX1BSSVZfSAorI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX1BSSVZfSAorCisKKy8qKiBUaG9zZSBkZWZpbmUgZW5hYmxlL2Rpc2FibGUgb3B0aW9uIElEKi8KKworI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfU0laRSAgICAgICAgICAgICAgIE00T1NBX1RSVUUKKyNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX0FUVFJJQlVURSAgICAgICAgICBNNE9TQV9UUlVFCisjZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfVVJMICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQorI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfUE9TSVRJT04gICAgICAgICAgIE00T1NBX1RSVUUKKyNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0lTX0VPRiAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFCisKKyNlbmRpZiAvKk00T1NBX0ZJTEVSRUFERVJfUFJJVl9IKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlci5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4YmE1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5oCisgKiBAaW5ncm91cCAgICAgIE9TQUwKKyAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIKKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gd3JpdGUgaW4gYSBmaWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworCisjaWZuZGVmIE00T1NBX0ZJTEVXUklURVJfSAorI2RlZmluZSBNNE9TQV9GSUxFV1JJVEVSX0gKKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisjaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisKKworLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBvcHRpb24gSUQgdG8gYmUgdXNlZCBpbiBNNE9TQV9GaWxlV3JpdGVHZXRPcHRpb24oKQorYW5kIE00T1NBX0ZpbGVXcml0ZVNldE9wdGlvbigpKi8KK3R5cGVkZWYgZW51bQoreworICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlV3JpdGVPcGVuIChNNE9TQV9DaGFyKikqLworICAgTTRPU0Ffa0ZpbGVXcml0ZUdldFVSTAorICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAxKSwKKworICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLworICAgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAyKSwKKworICAgLyoqIEdldCB0aGUgcmVhZGVyIGNvbnRleHQgZm9yIHJlYWQgJiB3cml0ZSBmaWxlLiAoTTRPU0FfQ29udGV4dCopKi8KKyAgIE00T1NBX2tGaWxlV3JpdGVHZXRSZWFkZXJDb250ZXh0CisgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDMpLAorCisgICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uCisgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDQpLAorCisgICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemUKKyAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwNSksCisKKworICAgIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZQorICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9XUklURVIsIDB4MDYpLAorCisKKyAgIC8qKiBDaGVjayBsb2NrIG9mIGZpbGUgKi8KKyAgIE00T1NBX2tGaWxlV3JpdGVEZXNjTW9kZQorICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEV1JJVEUsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDA3KQorfSBNNE9TQV9GaWxlV3JpdGVPcHRpb25JRDsKKworCisvKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEgZmlsZQorICAgIGluIHJlYWQgbW9kZSovCit0eXBlZGVmIHN0cnVjdAoreworICAgTTRPU0FfRVJSICgqb3BlbldyaXRlKSAgIChNNE9TQV9Db250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKKworICAgTTRPU0FfRVJSICgqd3JpdGVEYXRhKSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKKworICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7CisKKyAgIE00T1NBX0VSUiAoKkZsdXNoKSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKKyAgIE00T1NBX0VSUiAoKmNsb3NlV3JpdGUpICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKKyAgIE00T1NBX0VSUiAoKnNldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7CisKKyAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpOworfSBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlcjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZU9wZW4gICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKKworTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKKworLyogUGllcnJlIExlYmVhdXBpbiAyMDA4LzA0LzI5OiBXQVJOSU5HISB0aGUgZmVhdHVyZSBvZiBmaWxlKlNlZWsgd2hpY2ggcmV0dXJucwordGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIChmcm9tIHRoZSBiZWdpbm5pbmcpIGFmdGVyIHRoZSBzZWVrIGluIHRoZSAicG9zaXRpb24iCitwb2ludGVyIGhhcyBiZWVuIGZvdW5kIHRvIGJlIHVucmVsaWFibHkgKG9yIHNvbWV0aW1lcyBub3QgYXQgYWxsKSBpbXBsZW1lbnRlZAoraW4gc29tZSBPU0FMcywgc28gcmVseWluZyBvbiBpdCBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCwgdW5sZXNzIHlvdSByZWFsbHkgd2FudAordG8gaGF2ZSBhIHBpenphIGV2ZW5pbmcuICovCitNNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2VlayAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKKworTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUNsb3NlICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7CisKK000T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVGbHVzaCAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOworCitNNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKTsKKworTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX0gqLworCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyUmFtLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyUmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmMxOWEwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJSYW0uaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJSYW0uaAorICogQGluZ3JvdXAgICAgICBPU0FMCisgKiBAYnJpZWYgICAgICAgIEZpbGUgd3JpdGVyIHRvIFJBTQorICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gd3JpdGUgYSAiZmlsZSIgaW4gUkFNLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworCisjaWZuZGVmIE00T1NBX0ZJTEVXUklURVJSQU1fSAorI2RlZmluZSBNNE9TQV9GSUxFV1JJVEVSUkFNX0gKKworI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN0cnVjdHVyZSAgICBNNE9TQV9GaWxlV3JpdGVyUmFtX0Rlc2NyaXB0b3IKKyAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSBkZXNjcmlwdG9yIChwdWJsaWMpCisgKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSB0aGUgcG9pbnRlciB0byB0aGUgZGF0YSBpbiBtZW1vcnkKKyAqIEBub3RlICAgICAgICBhbmQgaXRzIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit0eXBlZGVmIHN0cnVjdAoreworICAgIE00T1NBX01lbUFkZHI4ICAgIHBGaWxlRGVzYzsgICAgLyogUG9pbnRlciBvbiBmaWxlIGRhdGEgKi8KKyAgICBNNE9TQV9JbnQzMiAgICAgICAgZGF0YVNpemU7ICAgIC8qIFNpemUgb2YgZGF0YSAqLworfSBNNE9TQV9GaWxlV3JpdGVyUmFtX0Rlc2NyaXB0b3I7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKy8qIFdyaXRlciBBUEkgOiBSQU0gZnVuY3Rpb25zICovCitNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtT3BlbihNNE9TQV9Db250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbURhdGEoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBTaXplKTsKK000T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1TZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBTZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24pOworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbUNsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCk7CitNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtRmx1c2goTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKK000T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1TZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBPcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBPcHRpb25WYWx1ZSk7CitNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgT3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgICAvKk00T1NBX0ZJTEVXUklURVJSQU1fSCovCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTU3ZDE3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBGaWxlIHdyaXRlciBwcml2YXRlIGZvciBBbmRyb2lkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKKyNkZWZpbmUgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKKworCisvKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCisKKyNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFICAgICAgICAgICAgICBNNE9TQV9UUlVFCisjZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFICAgICAgICAgTTRPU0FfVFJVRQorI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCAgICAgICAgIE00T1NBX1RSVUUKKyNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiAgICAgICAgICBNNE9TQV9UUlVFCisjZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQorCisjZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX1BSSVZfSCovCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX01lbW9yeS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDBiYjQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX01lbW9yeS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfTWVtb3J5LmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbgorICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBmdW5jdGlvbiBwcm90b3R5cGVzIHRvIGFsbG9jYXRlCisgKiAgICAgICAgICAgICAgIGFuZCBmcmVlIG1lbW9yeS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgTTRPU0FfTUVNT1JZX0gKKyNkZWZpbmUgTTRPU0FfTUVNT1JZX0gKKworCisjaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKKyNpbmNsdWRlICJNNE9TQV9FcnJvci5oIiAvKmZvciBNNE9TQV9Db3JlSUQgZGVmaW5pdGlvbiovCisKK3R5cGVkZWYgTTRPU0FfSW50MzIqIE00T1NBX01lbUFkZHIzMjsKK3R5cGVkZWYgTTRPU0FfSW50OCogIE00T1NBX01lbUFkZHI4OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCitNNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9NZW1BZGRyMzIgTTRPU0FfbWFsbG9jIChNNE9TQV9VSW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmcpOworCitNNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9Wb2lkICBNNE9TQV9mcmVlICAgKE00T1NBX01lbUFkZHIzMiBhZGRyZXNzKTsKKworTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfVm9pZCBNNE9TQV9tZW1zZXQgKE00T1NBX01lbUFkZHI4IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdmFsdWUpOworCitNNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9Wb2lkIE00T1NBX21lbWNweSAoTTRPU0FfTWVtQWRkcjggb3V0cHV0QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGlucHV0QmxvY2ssIE00T1NBX1VJbnQzMiBzaXplKTsKKworTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfTWVtQWRkcjggTTRPU0FfbWVtbW92ZShNNE9TQV9NZW1BZGRyOCBvdXRwdXRCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBpbnB1dEJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKKworTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfSW50MzIgTTRPU0FfbWVtY21wIChNNE9TQV9NZW1BZGRyOCBhZGRyZXNzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggYWRkcmVzczIsIE00T1NBX1VJbnQzMiBzaXplKTsKKworTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfRVJSIE00T1NBX3JhbmRJbml0KHZvaWQpOworCisKK000T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX0VSUiBNNE9TQV9yYW5kKE00T1NBX0ludDMyKiBvdXRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4X3ZhbHVlKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTXV0ZXguaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTJhNDE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9NdXRleC5oCisgKiBAaW5ncm91cCAgICAgIE9TQUwKKyAqIEBicmllZiAgICAgICAgbXV0ZXggQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKyNpZm5kZWYgTTRPU0FfTVVURVhfSAorI2RlZmluZSBNNE9TQV9NVVRFWF9ICisKKyNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgorI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisKKyNlbmRpZgorCitNNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbiggICAgTTRPU0FfQ29udGV4dCogY29udGV4dCApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhMb2NrKCAgICBNNE9TQV9Db250ZXh0ICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgdGltZW91dCApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhVbmxvY2soICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7CisKKworTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9tdXRleENsb3NlKCAgIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLypNNE9TQV9NVVRFWF9IKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX09wdGlvbklELmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjkzNzY0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX09wdGlvbklELmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9PcHRpb25JRC5oCisgKiBAaW5ncm91cCAgICAgIE9TQUwKKyAqIEBicmllZiAgICAgICAgT3B0aW9uIElEIG1hY3JvcworICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBtYWNyb3MgdG8gZ2VuZXJhdGUgYW5kIGFuYWx5emUgb3B0aW9uIElELgorICogICAgICAgICAgICAgICBPcHRpb24gSUQgaXMgdXNlZCBieSBNNFlZWV9aWnNldE9wdGlvbigpIGFuZAorICogICAgICAgICAgICAgICBNNFlZWV9aWmdldE9wdGlvbigpIGZ1bmN0aW9ucy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgTTRPU0FfT1BUSU9OSURfSAorI2RlZmluZSBNNE9TQV9PUFRJT05JRF9ICisKKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisKKy8qKiBNNE9TQV9PcHRpb25JRCBpcyBhIDMyIGJpdHMgdW5zaWduZWQgaW50ZWdlci4KKy0gUmlnaHQgYWNjZXNzICgyIGJpdHMpOiBTb21lIG9wdGlvbnMgbWF5IGhhdmUgcmVhZCBvbmx5LCB3cml0ZSBvbmx5IG9yIHJlYWQKKyAgYW5kIHdyaXRlIGFjY2VzcworLSBDb3JlIElEICgxNCBiaXRzKTogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQKKy0gU3ViT3B0aW9uIElEICgxNiBiaXRzKTogVG8gc2VsZWN0IHdoaWNoIG9wdGlvbiBpbiBhIHNwZWNpZmljIGNvcmUgY29tcG9uZW50CisqLwordHlwZWRlZiBNNE9TQV9VSW50MzIgTTRPU0FfT3B0aW9uSUQ7Cit0eXBlZGVmIHZvaWQqICAgICAgICBNNE9TQV9EYXRhT3B0aW9uOworCisjZGVmaW5lIE00X1JFQUQgICAgICAweDAxCisjZGVmaW5lIE00X1dSSVRFICAgICAweDAyCisjZGVmaW5lIE00X1JFQURXUklURSAweDAzCisKKy8qIE1hY3JvIHRvIHByb2Nlc3MgTTRPU0FfT3B0aW9uSUQgKi8KKworLyoqIFRoaXMgbWFjcm8gY3JlYXRlcyBhbiBvcHRpb25JRCBnaXZlbiByZWFkL3dyaXRlIGFjY2VzcywKKyAgICBjb3JlSUQgYW5kIFN1Yk9wdGlvbklEKi8KKyNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShyaWdodCwgY29yZUlELCBlcnJvcklEKVwKKyAgIChNNE9TQV9JbnQzMikoKCgoKChNNE9TQV9VSW50MzIpcmlnaHQpJjB4MDMpPDwzMCkpKygoKChNNE9TQV9VSW50MzIpY29yZUlEKSYweDAwM0ZGRik8PDE2KSsoKChNNE9TQV9VSW50MzIpZXJyb3JJRCkmMHgwMEZGRkYpKQorCisvKiogVGhpcyBtYWNybyBzcGxpdHMgYW4gb3B0aW9uSUQgaW50byByZWFkL3dyaXRlIGFjY2VzcywKKyAgICBjb3JlSUQgYW5kIFN1Yk9wdGlvbklEKi8KKyNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX1NQTElUKG9wdGlvbklELCByaWdodCwgY29yZUlELCBlcnJvcklEKVwKKyAgIHsgcmlnaHQ9KE00T1NBX1VJbnQ4KSgob3B0aW9uSUQpPj4zMCk7XAorICAgICBjb3JlSUQ9KE00T1NBX1VJbnQxNikoKChvcHRpb25JRCk+PjE2KSYweDAwMDAzRkZGKTtcCisgICAgIGVycm9ySUQ9KE00T1NBX1VJbnQzMikoKG9wdGlvbklEKSYweDAwMDBGRkZGKTsgfQorCisvKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGlzIHdyaXRhYmxlLCAwIG90aGVyd2lzZSovCisjZGVmaW5lIE00T1NBX09QVElPTl9JRF9JU19XUklUQUJMRShvcHRpb25JRCkgKCgoKG9wdGlvbklEKT4+MzApJk00X1dSSVRFKSE9MCkKKworLyoqIFRoaXMgbWFjcm8gcmV0dXJucyAxIGlmIHRoZSBvcHRpb25JRCBpcyByZWFkYWJsZSwgMCBvdGhlcndpc2UqLworI2RlZmluZSBNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpICgoKChvcHRpb25JRCk+PjMwKSZNNF9SRUFEKSE9MCkKKworLyoqIFRoaXMgbWFjcm8gcmV0dXJucyAxIGlmIHRoZSBvcHRpb25JRCBoYXMgaXRzIGNvcmUgSUQgZXF1YWwgdG8gJ2NvcmVJRCcsIDAgb3RoZXJ3aXNlKi8KKyNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgY29yZUlEKVwKKyAgICgoKCgob3B0aW9uSUQpPj4xNikmMHgwMDNGRkYpID09IChjb3JlSUQpKSA/IE00T1NBX1RSVUU6TTRPU0FfRkFMU0UpCisKKworI2VuZGlmICAgLypNNE9TQV9PUFRJT05JRF9IKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU2VtYXBob3JlLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTczNjczCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU2VtYXBob3JlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9TZW1hcGhvcmUuaAorICogQGluZ3JvdXAgICAgICBPU0FMCisgKiBAYnJpZWYgICAgICAgIHNlbWFwaG9yZSBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgTTRPU0FfU0VNQVBIT1JFX0gKKyNkZWZpbmUgTTRPU0FfU0VNQVBIT1JFX0gKKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisjaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVPcGVuKCAgTTRPU0FfQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgaW5pdGlhbE51bWJlciApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlUG9zdCggIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKKworCitNNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVdhaXQoICBNNE9TQV9Db250ZXh0ICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAgICB0aW1lb3V0ICk7CisKKworTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVDbG9zZSggTTRPU0FfQ29udGV4dCAgY29udGV4dCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKk00T1NBX1NFTUFQSE9SRV9IKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU3RyaW5nLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmNmNGVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU3RyaW5nLmgKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfU3RyaW5nLmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBwdWJsaWMgZGVmaW5pdGlvbiBmb3Igc3RyaW5nIGxpYnJhcnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgX000T1NBX1NUUklOR19IXworI2RlZmluZSBfTTRPU0FfU1RSSU5HX0hfCisKKyNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgorI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKKyNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCisjaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKKworCisKK3R5cGVkZWYgdm9pZCogTTRPU0FfU3RyaW5nOworCit0eXBlZGVmIGVudW0KK3sKKyAgIE00T1NBX2tzdHJBbGwgPSAwLAorICAgTTRPU0Ffa3N0ckJlZ2luLAorICAgTTRPU0Ffa3N0ckVuZAorfSBNNE9TQV9zdHJNb2RlOworCisvKiB0eXBlcyBkZWZpbml0aW9uICovCit0eXBlZGVmIGVudW0KK3sKKyAgIE00T1NBX2tzdHJEZWMgICA9IE00T1NBX2tjaHJEZWMsCisgICBNNE9TQV9rc3RySGV4YSAgPSBNNE9TQV9rY2hySGV4YSwKKyAgIE00T1NBX2tzdHJPY3QgICA9IE00T1NBX2tjaHJPY3QKK30gTTRPU0Ffc3RyTnVtQmFzZTsKKworLyogRXJyb3IgYW5kIFdhcm5pbmdzIGNvZGVzICovCisjZGVmaW5lIE00RVJSX1NUUl9CQURfU1RSSU5HICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9TVFJJTkcsMHgwMDAwMDEpCisjZGVmaW5lIE00RVJSX1NUUl9DT05WX0ZBSUxFRCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9TVFJJTkcsMHgwMDAwMDIpCisjZGVmaW5lIE00RVJSX1NUUl9PVkVSRkxPVyAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9TVFJJTkcsMHgwMDAwMDMpCisjZGVmaW5lIE00RVJSX1NUUl9CQURfQVJHUyAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9TVFJJTkcsMHgwMDAwMDQpCisKKyNkZWZpbmUgTTRXQVJfU1RSX09WRVJGTE9XICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00T1NBX1NUUklORywweDAwMDAwMSkKKyNkZWZpbmUgTTRXQVJfU1RSX05PVF9GT1VORCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00T1NBX1NUUklORywweDAwMDAwMikKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckNyZWF0ZSggICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nKiBwc3RyKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyUmVzZXQoICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyRGVzdHJveSggICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0Q2hhckNvbnRlbnQoICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcGNoYXIpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRDaGFyQ29udGVudCggICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcHBjaGFyKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0Q2hhciggICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBjKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0Q2hhciggICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcGMpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRJbnQ4KCAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0SW50OCggICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCogcGk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0VUludDgoICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0VUludDgoICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHB1aTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRJbnQxNiggICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBpMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRJbnQxNiggICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiogcGkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldFVJbnQxNiggICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiB1aTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0VUludDE2KCAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBwdWkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldEludDMyKCAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldEludDMyKCAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0VUludDMyKCAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRVSW50MzIoICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0RG91YmxlKCAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlIGQpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXREb3VibGUoICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Eb3VibGUqIHBkKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0SW50NjQoICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50NjQgaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0SW50NjQoICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50NjQqIHBpNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRGaWxlUG9zaXRpb24oICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldEZpbGVQb3NpdGlvbiggICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcGZwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRUaW1lKCAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRUaW1lKCAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lKiBwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldExlbmd0aCggICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcHVpMzIpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJUcnVuY2F0ZSggICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJDb3B5KCAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX291dCk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckNvcHlTdWJTdHIoICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiB1aTMyX251bSk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckNvbmNhdCggICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfc2Vjb25kKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RySW5zZXJ0U3ViU3RyKCAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX251bSk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckNvbXBhcmUoICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckNvbXBhcmVTdWJTdHIoICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9vZmZzZXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9vZmZzZXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcGkzMl9yZXN1bHQpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJDYXNlQ29tcGFyZSggICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcGkzMl9yZXN1bHQpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJDYXNlQ29tcGFyZVN1YlN0ciggICAgIE00T1NBX1N0cmluZyBzdHJfaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBpMzJfcmVzdWx0KTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU3BhbiggICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfcmVzdWx0KTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU3BhbkNvbXBsZW1lbnQoICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfcG9zKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyRmluZEZpcnN0Q2hhciggICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9wb3MpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJGaW5kTGFzdENoYXIoICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX3Bvcyk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckZpbmRGaXJzdFN1YlN0ciggICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfcG9zKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyRmluZExhc3RTdWJTdHIoICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9wb3MpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRGaXJzdFRva2VuKCAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHBzdHJfdG9rZW4pOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRMYXN0VG9rZW4oICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2RlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHBzdHJfdG9rZW4pOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRVcHBlckNhc2UoICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRMb3dlckNhc2UoICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIpOworCitNNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJEZWxTdWJTdHIoICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHVpMzJfbnVtKTsKKworTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyUmVwbGFjZVN1YlN0ciggICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9vbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX25ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck1vZGUgbW9kZSk7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNwcmludGYoICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CisKK000T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldE1pbkFsbG9jYXRpb25TaXplKCAgTTRPU0FfU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX3NpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU3RyaW5nX3ByaXYuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1N0cmluZ19wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzMwM2MxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1N0cmluZ19wcml2LmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfU3RyaW5nLmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBwdWJsaWMgZGVmaW5pdGlvbiBmb3Igc3RyaW5nIGxpYnJhcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworCisjaWZuZGVmIF9NNE9TQV9TVFJJTkdfUFJJVl9ICisjZGVmaW5lIF9NNE9TQV9TVFJJTkdfUFJJVl9ICisKKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisjaW5jbHVkZSAiTTRPU0FfU3RyaW5nLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qIHN0cmluZyBpZGVudGlmaWFudCAqLworICAgTTRPU0FfVUludDMyICAgY29yZUlEOworICAgLyoqIGRhdGEgYnVmZmVyICovCisgICBNNE9TQV9DaGFyKiBwdWk4X2J1ZmZlcjsKKyAgIC8qKiBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKyAgIE00T1NBX1VJbnQzMiB1aTMyX3NpemU7CisgICAvKiogc2l6ZSBvZiB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIgKi8KKyAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aDsKK30gTTRPU0Ffc3RyU3RydWN0OworCisKKworTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZWFsbG9jKCAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgpOworCitNNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KCAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aCk7CisKK000T1NBX0VSUiBNNE9TQV9zdHJQcml2U2V0KCAgICAgICAgICAgICAgICAgIE00T1NBX3N0clN0cnVjdCogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgpOworCitNNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZSggICAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqKiBvc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyKTsKKworTTRPU0FfSW50MzIgTTRPU0Ffc3RyUHJpdkZpbmRMYXN0U3ViU3RyKCAgICAgTTRPU0Ffc3RyU3RydWN0KiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBzdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfcG9zKTsKKworTTRPU0FfRVJSIE00T1NBX3N0clByaXZTZXRBbmRSZXBsZWNlU3RyKCAgICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBuYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBubGVuZ3RoKTsKKworTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZXBsYWNlU2FtZVNpemVTdHIoICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBuc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKTsKKworTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZXBsYWNlU21hbGxlclN0ciggICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBuc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKTsKKworTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyKCAgICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBuc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKTsKKworTTRPU0FfRVJSIE00T1NBX3N0clByaXZTUHJpbnRmKCAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IG1hcmtlcik7CisKKworI2RlZmluZSBNNE9TQV9DSEVDS19NQUxMT0MoYnVmZiwgc3RyaW5nKVwKKyAgIGlmKGJ1ZmYgPT0gTTRPU0FfTlVMTClcCisgICB7XAorICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsIHN0cmluZyk7XAorICAgICAgcmV0dXJuIE00RVJSX0FMTE9DO1wKKyAgIH1cCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTgzYTlmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00T1NBX1RocmVhZC5oCisgKiBAaW5ncm91cCAgICAgIE9TQUwKKyAqIEBicmllZiAgICAgICAgdGhyZWFkIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworCisjaWZuZGVmIE00T1NBX1RIUkVBRF9ICisjZGVmaW5lIE00T1NBX1RIUkVBRF9ICisKKyNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgorI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCisjaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKKworCisvKiBEZWZpbml0aW9uIG9mIGNvbW1vbiBlcnJvciBjb2RlcyAqLworI2RlZmluZSBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRPU0FfVEhSRUFELDB4MDAwMDAxKQorCisKK3R5cGVkZWYgZW51bQoreworICAgTTRPU0Ffa1RocmVhZE9wZW5lZCAgID0gMHgxMDAsCisgICBNNE9TQV9rVGhyZWFkU3RhcnRpbmcgPSAweDIwMCwKKyAgIE00T1NBX2tUaHJlYWRSdW5uaW5nICA9IDB4MzAwLAorICAgTTRPU0Ffa1RocmVhZFN0b3BwaW5nID0gMHg0MDAsCisgICBNNE9TQV9rVGhyZWFkQ2xvc2VkICA9IDB4NTAwCit9IE00T1NBX1RocmVhZFN0YXRlOworCisKKwordHlwZWRlZiBlbnVtCit7CisgICBNNE9TQV9rVGhyZWFkSGlnaGVzdFByaW9yaXR5ICA9ICAweDAwMCwKKyAgIE00T1NBX2tUaHJlYWRIaWdoUHJpb3JpdHkgICAgID0gIDB4MTAwLAorICAgTTRPU0Ffa1RocmVhZE5vcm1hbFByaW9yaXR5ICAgPSAgMHgyMDAsCisgICBNNE9TQV9rVGhyZWFkTG93UHJpb3JpdHkgICAgICA9ICAweDMwMCwKKyAgIE00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSAgID0gIDB4NDAwCit9IE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWw7CisKKworCit0eXBlZGVmIGVudW0KK3sKKyAgIE00T1NBX1RocmVhZFN0YXJ0ZWQKKyAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDEpLAorCisgICBNNE9TQV9UaHJlYWRTdG9wcGVkCisgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDAyKSwKKworICAgTTRPU0FfVGhyZWFkUHJpb3JpdHkKKyAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDMpLAorCisgICBNNE9TQV9UaHJlYWROYW1lCisgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDA0KSwKKworICAgTTRPU0FfVGhyZWFkU3RhY2tTaXplCisgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDA1KSwKKworICAgTTRPU0FfVGhyZWFkVXNlckRhdGEKKyAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDYpCisKK30gTTRPU0FfVGhyZWFkT3B0aW9uSUQ7CisKKworCit0eXBlZGVmIE00T1NBX0VSUiAgKCpNNE9TQV9UaHJlYWREb0l0KShNNE9TQV9Wb2lkKik7Cit0eXBlZGVmIE00T1NBX1ZvaWQgKCpNNE9TQV9UaHJlYWRDYWxsQmFjaykoTTRPU0FfQ29udGV4dCwgTTRPU0FfVm9pZCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCitNNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNPcGVuKCAgICAgTTRPU0FfQ29udGV4dCogICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWREb0l0ICAgICAgZnVuYyApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0YXJ0KCAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqICAgICAgICAgICBwYXJhbSApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0b3AoICAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0Nsb3NlKCAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlKCBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZFN0YXRlKiAgICBzdGF0ZSApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU2xlZXAoICAgICAgICBNNE9TQV9VSW50MzIgICAgICAgICAgdGltZSApOworCisKK000T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbihNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEICBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICAgICAgdmFsdWUgKTsKKworCitNNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24oTTRPU0FfQ29udGV4dCAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCAgb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogICAgIHZhbHVlICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qTTRPU0FfVEhSRUFEX0gqLworCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYjlhNTFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkX3ByaXYuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00T1NBX1RocmVhZF9wcml2LmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBUaHJlYWQgcHJpdmF0ZSBmb3IgQW5kcm9pZAorICogQG5vdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgTTRPU0FfVEhSRUFEX1BSSVZfSAorI2RlZmluZSBNNE9TQV9USFJFQURfUFJJVl9ICisKKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisKKworLyogQ29udGV4dCBmb3IgdGhlIHRocmVhZCAqLwordHlwZWRlZiBzdHJ1Y3QgTTRPU0FfVGhyZWFkQ29udGV4dCB7CisgICBNNE9TQV9VSW50MzIgY29yZUlEOyAgICAgICAgICAgICAgICAvKiB0aHJlYWQgY29udGV4dCBpZGVudGlmaWFudCAqLworICAgcHRocmVhZF90IHRocmVhZElEOyAgICAgICAgICAgICAgICAgLyogdGhyZWFkIGlkZW50aWZpZXIuICovCisgICBNNE9TQV9DaGFyKiBuYW1lOyAgICAgICAgICAgICAgICAgICAvKiB0aHJlYWQgbmFtZSAqLworICAgTTRPU0FfVUludDMyIHN0YWNrU2l6ZTsgICAgICAgICAgICAgLyogdGhyZWFkIHN0YWNrU2l6ZSBpbiBieXRlcyAqLworICAgTTRPU0FfVGhyZWFkRG9JdCBmdW5jOyAgICAgICAgICAgICAgLyogdGhyZWFkIGZ1bmN0aW9uICovCisgICBNNE9TQV9Wb2lkKiBwYXJhbTsgICAgICAgICAgICAgICAgICAvKiB0aHJlYWQgcGFyYW1ldGVyICovCisvKgorICAgTTRPU0FfVm9pZCogdXNlckRhdGE7ICAgICAgICAgICAgICAgLyAqIHRocmVhZCB1c2VyIGRhdGEgKiAvCisqLworICAgTTRPU0FfVGhyZWFkU3RhdGUgc3RhdGU7ICAgICAgICAgICAgLyogdGhyZWFkIGF1dG9tYXRvbiBzdGF0ZSAqLworICAgTTRPU0FfQ29udGV4dCBzdGF0ZU11dGV4OyAgICAgICAgICAgLyogbXV0ZXggZm9yIHRocmVhZCBzdGF0ZSBtYW5hZ2VtZW50ICovCisvKgorICAgTTRPU0FfVGhyZWFkQ2FsbEJhY2sgc3RhcnRDYWxsQmFjazsgLyAqIHN0YXJ0aW5nIHRocmVhZCBjYWxsIGJhY2sgKiAvCisgICBNNE9TQV9UaHJlYWRDYWxsQmFjayBzdG9wQ2FsbEJhY2s7ICAvICogc3RvcHBpbmcgdGhyZWFkIGNhbGwgYmFjayAqIC8KKyovCisgICBNNE9TQV9Db250ZXh0IHNlbVN0YXJ0U3RvcDsgICAgICAgICAvKiBzZW1hcGhvcmUgZm9yIHN0YXJ0IGFuZCBzdG9wIGRvX2l0ICovCisgICBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsIHByaW9yaXR5OyAvKiB0aHJlYWQgcHJpb3JpdHkgbGV2ZWwgKi8KK30gTTRPU0FfVGhyZWFkQ29udGV4dCA7CisKKworLyoqIFRob3NlIGRlZmluZSBlbmFibGUvZGlzYWJsZSBvcHRpb24gSUQqLworI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBUlRFRCAgICAgICAgICAgTTRPU0FfVFJVRQorI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfU1RPUFBFRCAgICAgICAgICAgTTRPU0FfVFJVRQorI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkgICAgICAgICAgTTRPU0FfVFJVRQorI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSAgICAgICAgTTRPU0FfVFJVRQorI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSAgICAgICAgICAgICAgTTRPU0FfVFJVRQorI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfVVNFUl9EQVRBICAgICAgICAgTTRPU0FfVFJVRQorCisjZW5kaWYgLypNNE9TQV9USFJFQURfUFJJVl9IKi8KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGltZS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4NGMyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfVGltZS5oCisgKiBAaW5ncm91cCAgICAgIE9TQUwKKyAqIEBicmllZiAgICAgICAgVGltZSBtYWNyb3MKKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGltZSB0eXBlIGFuZCBhc3NvY2lhdGVkIG1hY3JvcyB3aGljaCBtdXN0CisgKiAgICAgICAgICAgICAgIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aW1lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyogJElkOiBNNE9TQV9UaW1lLmgsdiAxLjIgMjAwNy8wMS8wNSAxMzoxMjoyMiB0aGVuYXVsdCBFeHAgJCAqLworCisjaWZuZGVmIE00T1NBX1RJTUVfSAorI2RlZmluZSBNNE9TQV9USU1FX0gKKworCisjaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKKworCit0eXBlZGVmIE00T1NBX0ludDY0ICAgTTRPU0FfVGltZTsKKworCisvKiogVGhpcyBtYWNybyBzZXRzIHRoZSB1bmtub3duIHRpbWUgdmFsdWUgKi8KKyNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECisgICAjZGVmaW5lIE00T1NBX1RJTUVfU0VUX1VOS05PV04odGltZSkge3RpbWUgPSAweDgwMDAwMDAwMDAwMDAwMDBMTCA7fQorI2VuZGlmIC8qIE00T1NBXzY0QklUU19TVVBQT1JURUQgKi8KKworI2lmZGVmIE00T1NBXzY0QklUU19DT1VQTEVfSU5UCisgICAjZGVmaW5lIE00T1NBX1RJTUVfU0VUX1VOS05PV04odGltZSkge1wKKyAgICAgIHRpbWUubWFqb3IgPSAweDgwMDAwMDAwIDtcCisgICAgICB0aW1lLm1pbm9yID0gMHgwMDAwMDAwMCA7fQorI2VuZGlmIC8qIE00T1NBXzY0QklUU19DT1VQTEVfSU5UICovCisKKyNpZmRlZiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAorICAgI2RlZmluZSBNNE9TQV9USU1FX1NFVF9VTktOT1dOKHRpbWUpIHt0aW1lID0gMHg4MDAwMDAwMDt9CisjZW5kaWYgICAvKiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRCAqLworCisKKy8qKiBUaGlzIG1hY3JvIHJldHVybnMgMSBpZiB0aGUgcHJvdmlkZWQgdGltZSBpcyBzZXQgdG8gdW5rbm93biB0aW1lLAorICAgIGFuZCAwIGVsc2UuKi8KKyNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECisKKyNkZWZpbmUgTTRPU0FfVElNRV9JU19VTktOT1dOKHRpbWUpICgoKE00T1NBX1VJbnQ2NCkodGltZSkgPT0gMHg4MDAwMDAwMDAwMDAwMDAwTEwpID8gMSA6IDApCisKKyNlbGlmIGRlZmluZWQgTTRPU0FfNjRCSVRTX0NPVVBMRV9JTlQKKworI2RlZmluZSBNNE9TQV9USU1FX0lTX1VOS05PV04odGltZSlcCisgICAoKCAoTTRPU0FfSU5UNjRfR0VUX0hJR0gzMih0aW1lKSA9PSBNNE9TQV91bmtub3duVGltZU1ham9yKVwKKyAgICAgICYmKE00T1NBX0lOVDY0X0dFVF9MT1czMih0aW1lKSA9PSBNNE9TQV91bmtub3duVGltZU1pbm9yKSApID8gMTowKQorCisjZWxzZSAvKiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRCAqLworCisjZGVmaW5lIE00T1NBX1RJTUVfSVNfVU5LTk9XTih0aW1lKSAoKChNNE9TQV9VSW50MzIpKHRpbWUpID09IDB4ODAwMDAwMDApID8gMSA6IDApCisKKyNlbmRpZgorCisKKy8qKiBUaGlzIG1hY3JvIGFmZmVjdHMgdGltZTIgdG8gdGltZTEuKi8KKyNkZWZpbmUgTTRPU0FfVElNRV9TRVQodGltZTEsIHRpbWUyKVwKKyAgICAgICAgTTRPU0FfSU5UNjRfU0VUKHRpbWUxLCB0aW1lMikKKworCisvKiogVGhpcyBtYWNybyBzZXRzIHRpbWUgZnJvbSBpMzIuKi8KKyNkZWZpbmUgTTRPU0FfVElNRV9GUk9NX0lOVDMyKHRpbWUsIGkzMilcCisgICAgICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIodGltZSwgaTMyKQorCisKKy8qKiBUaGlzIG1hY3JvIHNldHMgdGltZSBmcm9tIGkzMiB1aTMyLiovCisjZGVmaW5lIE00T1NBX1RJTUVfRlJPTV9JTlQzMl9VSU5UMzIodGltZSwgaTMyLCB1aTMyKVwKKyAgICAgICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMl9VSU5UMzIodGltZSwgaTMyLCB1aTMyKQorCisKKy8qKiBUaGlzIG1hY3JvIHRlc3RzIGlmIHRpbWUgaXMgcG9zaXRpdmUqLworI2RlZmluZSBNNE9TQV9USU1FX0lTX1BPU0lUSVZFKHRpbWUpXAorICAgICAgICBNNE9TQV9JTlQ2NF9JU19QT1NJVElWRSh0aW1lKQorCisKKy8qKiBUaGlzIG1hY3JvIHNldHMgdGltZV9vdXQgPSAtdGltZV9pbiovCisjZGVmaW5lIE00T1NBX1RJTUVfTkVHKHRpbWVfb3V0LCB0aW1lX2luKVwKKyAgICAgICAgTTRPU0FfSU5UNjRfTkVHKHRpbWVfb3V0LCB0aW1lX2luKQorCisKKy8qKiBUaGlzIG1hY3JvIHNldHMgdGltZV9vdXQgPSB8dGltZV9pbnwqLworI2RlZmluZSBNNE9TQV9USU1FX0FCUyh0aW1lX291dCwgdGltZV9pbilcCisgICAgICAgIE00T1NBX0lOVDY0X0FCUyh0aW1lX291dCwgdGltZV9pbikKKworCisvKiogVGhpcyBtYWNybyBhZGRzIHRoZSAyIHByb3ZpZGVkIHRpbWVzICh0aW1lMSBhbmQgdGltZTIpLAorICAgIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiByZXN1bHQuIEJvdGggdGltZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHRpbWVzY2FsZS4qLworI2RlZmluZSBNNE9TQV9USU1FX0FERChyZXN1bHQsIHRpbWUxLCB0aW1lMilcCisgICAgICAgIE00T1NBX0lOVDY0X0FERChyZXN1bHQsIHRpbWUxLCB0aW1lMikKKworCisvKiogVGhpcyBtYWNybyBzdWJzIHRoZSAyIHByb3ZpZGVkIHRpbWVzICh0aW1lMSBhbmQgdGltZTIpLAorICAgIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiByZXN1bHQuKi8KKyNkZWZpbmUgTTRPU0FfVElNRV9TVUIocmVzdWx0LCB0aW1lMSwgdGltZTIpXAorICAgICAgICBNNE9TQV9JTlQ2NF9TVUIocmVzdWx0LCB0aW1lMSwgdGltZTIpCisKKworLyoqIFRoaXMgbWFjcm8gZG9lcyBhIHNjYWxhciBwcm9kdWN0IChyZXN1bHQgPSB0aW1lKnZhbHVlKSwKKyAgICBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW4gcmVzdWx0LiovCisjZGVmaW5lIE00T1NBX1RJTUVfU0NBTEFSX1BST0RVQ1QocmVzdWx0LCB0aW1lLCB2YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDY0X1NDQUxBUl9QUk9EVUNUKHJlc3VsdCwgdGltZSwgdmFsdWUpCisKKworLyoqIFRoaXMgbWFjcm8gZG9lcyBhIHNjYWxhciBkaXZpc2lvbiAocmVzdWx0PSB0aW1lIC8gdmFsdWUpLAorICAgIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiByZXN1bHQuKi8KKyNkZWZpbmUgTTRPU0FfVElNRV9TQ0FMQVJfRElWSVNJT04ocmVzdWx0LCB0aW1lLCB2YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDY0X1NDQUxBUl9ESVZJU0lPTihyZXN1bHQsIHRpbWUsIHZhbHVlKQorCisKKy8qKiBUaGlzIG1hY3JvIHVwZGF0ZXMgdGhlIHRpbWUgdG8gdGhlIG9sZFRpbWVTY2FsZSB0byB0aGUgbmV3VGltZVNjYWxlLiBUaGUKKyAgICByZXN1bHQgKHRoZSBuZWFyZXN0IHJvdW5kZWQgdG8gdGhlIG1pbiB2YWx1ZSkgaXMgc3RvcmVkIGluIHJlc3VsdCB2YWx1ZS4gKi8KKyNkZWZpbmUgTTRPU0FfVElNRV9DSEFOR0VfVElNRVNDQUxFKHJlc3VsdCwgdGltZSwgb2xkVGltZVNjYWxlLCBuZXdUaW1lU2NhbGUpXAorICAgICAgeyBNNE9TQV9UaW1lIHRfdGVtcFRpbWUxLCB0X3RlbXBUaW1lMiwgdF90ZW1wVGltZTM7XAorICAgICAgICBNNE9TQV9JbnQzMiBpMzJfcXVvdGllbnQgPSBuZXdUaW1lU2NhbGUvb2xkVGltZVNjYWxlO1wKKyAgICAgICAgTTRPU0FfSW50MzIgaTMyX3Jlc3QgPSBuZXdUaW1lU2NhbGUlb2xkVGltZVNjYWxlO1wKKyAgICAgICAgTTRPU0FfSU5UNjRfU0NBTEFSX1BST0RVQ1QodF90ZW1wVGltZTEsIHRpbWUsIGkzMl9xdW90aWVudCk7XAorICAgICAgICBNNE9TQV9JTlQ2NF9TQ0FMQVJfUFJPRFVDVCh0X3RlbXBUaW1lMiwgdGltZSwgaTMyX3Jlc3QpO1wKKyAgICAgICAgTTRPU0FfSU5UNjRfU0NBTEFSX0RJVklTSU9OKHRfdGVtcFRpbWUzLCB0X3RlbXBUaW1lMiwgb2xkVGltZVNjYWxlKTtcCisgICAgICAgIE00T1NBX0lOVDY0X0FERChyZXN1bHQsIHRfdGVtcFRpbWUxLCB0X3RlbXBUaW1lMyk7IH0KKworCisvKiogVGhpcyBtYWNybyB0ZXN0cyB0aGUgMiBwcm92aWRlZCB0aW1lcyAodGltZTEgJiB0aW1lMikuCisgICAgVGhlIHJlc3VsdCBpcyBlaXRoZXI6CisgICogQGFyZyAgMTogaWYgdGltZTEgaXMgYmlnZ2VyIHRoYW4gdGltZTIKKyAgKiBAYXJnICAwOiBpZiB0aW1lMiBpcyBlcXVhbCB0byB0aW1lMgorICAqIEBhcmcgLTE6IGlmIHRpbWUxIGlzIHNtYWxsZXIgdGhhbiB0aW1lMiAgKi8KKyNkZWZpbmUgTTRPU0FfVElNRV9DT01QQVJFKHRpbWUxLCB0aW1lMilcCisgICAgICAgIE00T1NBX0lOVDY0X0NPTVBBUkUodGltZTEsIHRpbWUyKQorCisKKy8qKiBUaGlzIG1hY3JvIGNvbnZlcnRzIGEgdGltZSB3aXRoIGEgdGltZSBzY2FsZSB0byBtaWxsaXNlY29uZC4KKyAgICBUaGUgcmVzdWx0IGlzIGEgTTRPU0FfRG91YmxlKi8KKyNkZWZpbmUgTTRPU0FfVElNRV9UT19NUyhyZXN1bHQsIHRpbWUsIHRpbWVzY2FsZSlcCisgICAgICB7IE00T1NBX0lOVDY0X1RPX0RPVUJMRShyZXN1bHQsIHRpbWUpO1wKKyAgICAgICAgcmVzdWx0ID0gKDEwMDAqcmVzdWx0KS8oKE00T1NBX0RvdWJsZSl0aW1lc2NhbGUpOyB9CisKKworLyoqIFRoaXMgbWFjcm8gY29udmVydHMgYSBtaWxsaXNlY29uZCB0aW1lIHRvIE00T1NBX1RpbWUgd2l0aCB0aGUgcHJvdmlkZWQKKyAgICB0aW1lc2NhbGUuIFRoZSByZXN1bHQgKHRoZSBuZWFyZXN0IHJvdW5kZWQgdG8gdGhlIG1pbiB2YWx1ZSkgaXMgc3RvcmVkCisgICAgaW4gdGltZSB2YWx1ZS4qLworI2RlZmluZSBNNE9TQV9NU19UT19USU1FKHRpbWUsIHRpbWVzY2FsZSwgbXMpXAorICAgICAge000T1NBX0lOVDY0X0ZST01fRE9VQkxFKHRpbWUsIChtcyooKE00T1NBX0RvdWJsZSkodGltZXNjYWxlKSkvMTAwMC4wKSk7fQorCisKKyNlbmRpZiAvKk00T1NBX1RJTUVfSCovCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1MGYxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UeXBlcy5oCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00T1NBX1R5cGVzLmgKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBBYnN0cmFjdGlvbiB0eXBlcyBmb3IgQW5kcm9pZAorICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgcmVkZWZpbmVzIGJhc2ljIHR5cGVzIHdoaWNoIG11c3QgYmUKKyAqICAgICAgICAgICAgICAgdXNlZCB0byBkZWNsYXJlIGFueSB2YXJpYWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworCisjaWZuZGVmIE00T1NBX1RZUEVTX0gKKyNkZWZpbmUgTTRPU0FfVFlQRVNfSAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJNNE9TQV9FeHBvcnQuaCIKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyojZGVmaW5lIE00T1NBXzY0QklUU19TVVBQT1JURUQgICAgICovICAvKiBtZWFucyBsb25nIGxvbmcgaXMgdXNlZCAgICAgICAgKi8KKy8qI2RlZmluZSBNNE9TQV82NEJJVFNfQ09VUExFX0lOVCAgICAqLyAgICAvKiBtZWFucyBjb3VwbGUgaW50MzIgaXMgdXNlZCAgICAqLworI2RlZmluZSBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRCAgICAgIC8qIG1lYW5zIEludDMyIGlzIHVzZWQgICAgICAgICAgICAqLworCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgICAgIE00T1NBX0Jvb2w7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBNNE9TQV9VSW50ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgICAgIE00T1NBX0ludDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBNNE9TQV9VSW50MTY7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBNNE9TQV9JbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIE00T1NBX1VJbnQzMjsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgICAgIE00T1NBX0ludDMyOworCit0eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9DaGFyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfVUNoYXI7CisKK3R5cGVkZWYgZG91YmxlICAgICAgICAgIE00T1NBX0RvdWJsZTsKK3R5cGVkZWYgZmxvYXQgICAgICAgICAgIE00T1NBX0Zsb2F0OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBNNE9TQV9XQ2hhcjsKKwordHlwZWRlZiB2b2lkICAgICAgICAgICAgTTRPU0FfVm9pZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIE00T1NBX0ludDMyICAgaGlnaDsKKyAgIE00T1NBX0ludDMyICAgbG93OworfSBNNE9TQV9Db3VwbGVJbnQzMjsKKworI2lmZGVmIE00T1NBXzY0QklUU19TVVBQT1JURUQKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBNNE9TQV9JbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE00T1NBX1VJbnQ2NDsKKyNlbmRpZgorCisjaWZkZWYgTTRPU0FfNjRCSVRTX0NPVVBMRV9JTlQKK3R5cGVkZWYgc3RydWN0Cit7CisgICBNNE9TQV9JbnQzMiBtYWpvcjsKKyAgIE00T1NBX1VJbnQzMiBtaW5vcjsKK30gTTRPU0FfSW50NjQ7Cit0eXBlZGVmIHN0cnVjdAoreworICAgTTRPU0FfVUludDMyIG1ham9yOworICAgTTRPU0FfVUludDMyIG1pbm9yOworfSBNNE9TQV9VSW50NjQ7CisjZW5kaWYKKworI2lmZGVmIE00T1NBXzY0QklUU19OT1RfU1VQUE9SVEVECit0eXBlZGVmIE00T1NBX0ludDMyIE00T1NBX0ludDY0OwordHlwZWRlZiBNNE9TQV9VSW50MzIgTTRPU0FfVUludDY0OworI2VuZGlmCisKKy8qIE1pbiAmIG1heCBkZWZpbml0aW9ucyovCisjZGVmaW5lIE00T1NBX1VJTlQ4X01JTiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTTRPU0FfVUlOVDhfTUFYICAgICAgICAgICAgICAgIDI1NQorCisjZGVmaW5lIE00T1NBX1VJTlQxNl9NSU4gICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTTRPU0FfVUlOVDE2X01BWCAgICAgICAgICAgICA2NTUzNQorCisjZGVmaW5lIE00T1NBX1VJTlQzMl9NSU4gICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTTRPU0FfVUlOVDMyX01BWCAgICAgICAgMHhGRkZGRkZGRgorCisjZGVmaW5lIE00T1NBX0lOVDhfTUlOICAgICAgICAgICAgICAgIC0xMjgKKyNkZWZpbmUgTTRPU0FfSU5UOF9NQVggICAgICAgICAgICAgICAgIDEyNworCisjZGVmaW5lIE00T1NBX0lOVDE2X01JTiAgICAgICAgICAgICAtMzI3NjgKKyNkZWZpbmUgTTRPU0FfSU5UMTZfTUFYICAgICAgICAgICAgICAzMjc2NworCisjZGVmaW5lIE00T1NBX0lOVDMyX01JTiAgICAgICAoLTB4N0ZGRkZGRkYtMSkKKyNkZWZpbmUgTTRPU0FfSU5UMzJfTUFYICAgICAgICAgMHg3RkZGRkZGRgorCisjZGVmaW5lIE00T1NBX0NIQVJfTUlOICAgICAgICAgICAgICAgIC0xMjgKKyNkZWZpbmUgTTRPU0FfQ0hBUl9NQVggICAgICAgICAgICAgICAgIDEyNworCisjZGVmaW5lIE00T1NBX1VDSEFSX01JTiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTTRPU0FfVUNIQVJfTUFYICAgICAgICAgICAgICAgIDI1NQorCisjaWZkZWYgTTRPU0FfNjRCSVRTX05PVF9TVVBQT1JURUQKKworI2RlZmluZSBNNE9TQV9VSU5UNjRfTUlOICAgICAgICBNNE9TQV9VSU5UMzJfTUlOCisjZGVmaW5lIE00T1NBX1VJTlQ2NF9NQVggICAgICAgIE00T1NBX1VJTlQzMl9NQVgKKyNkZWZpbmUgTTRPU0FfSU5UNjRfTUlOICAgICAgICAgIE00T1NBX0lOVDMyX01JTgorI2RlZmluZSBNNE9TQV9JTlQ2NF9NQVggICAgICAgICAgTTRPU0FfSU5UMzJfTUFYCisKKyNlbHNlIC8qIE00T1NBXzY0QklUU19OT1RfU1VQUE9SVEVEKi8KKworI2RlZmluZSBNNE9TQV9VSU5UNjRfTUlOICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE00T1NBX1VJTlQ2NF9NQVggICAgICAweEZGRkZGRkZGRkZGRkZGRkZMTAorI2RlZmluZSBNNE9TQV9JTlQ2NF9NSU4gICAgICAgMHg4MDAwMDAwMDAwMDAwMDAwTEwKKyNkZWZpbmUgTTRPU0FfSU5UNjRfTUFYICAgICAgIDB4N0ZGRkZGRkZGRkZGRkZGRkxMCisKKyNlbmRpZiAvKiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRCovCisKKyNkZWZpbmUgTTRPU0FfTlVMTCAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTTRPU0FfVFJVRSAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTTRPU0FfRkFMU0UgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTTRPU0FfV0FJVF9GT1JFVkVSICAgICAgIDB4ZmZmZmZmZmYKKworI2RlZmluZSBNNE9TQV9DT05TVCAgICAgICAgICAgICAgICAgICBjb25zdAorI2RlZmluZSBNNE9TQV9JTkxJTkUgICAgICAgICAgICAgICAgIGlubGluZQorCisvKiBSb2xsb3ZlciBvZmZzZXQgb2YgdGhlIGNsb2NrICovCisvKiBUaGlzIHZhbHVlIG11c3QgYmUgdGhlIG9uZSBvZiBNNE9TQV9jbG9ja0dldFRpbWUgKi8KKyNkZWZpbmUgTTRPU0FfQ0xPQ0tfUk9MTE9WRVIgICAgICAgICAgIE00T1NBX0lOVDMyX01BWAorCit0eXBlZGVmIHZvaWQqICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQ7CisKKworLyoqIEl0IGlzIGEgdW5pcXVlIElEIGZvciBlYWNoIGNvcmUgY29tcG9uZW50Ki8KK3R5cGVkZWYgIE00T1NBX1VJbnQxNiBNNE9TQV9Db3JlSUQ7CisKKworLyogTWFjcm8gdG8gc3VwcG9ydCBiaWcgZW5kaWFuIGFuZCBsaXR0bGUgZW5kaWFuIHBsYXRmb3JtICovCisKKy8qIHRvIHRyYW5zbGF0ZSBhIDE2IGJpdHMgdG8gaXRzIEJpZyBFbmRpYW4gdmFsdWUqLworI2RlZmluZSBNNE9TQV9JTlQxNl9UT19CRSh1aTE2X2hvc3QpICgoKCh1aTE2X2hvc3QpICYgKE00T1NBX1VJbnQxNikgMHgwMGZmKSA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWkxNl9ob3N0KSAmIChNNE9TQV9VSW50MTYpIDB4ZmYwMCkgPj4gOCkgKQorCisvKiB0byB0cmFuc2xhdGUgYSAzMiBiaXRzIHRvIGl0cyBCaWcgRW5kaWFuIHZhbHVlICovCisjZGVmaW5lIE00T1NBX0lOVDMyX1RPX0JFKHVpMzJfaG9zdCkgKCgoKHVpMzJfaG9zdCkgJiAoTTRPU0FfVUludDMyKSAweDAwMDAwMGZmKSA8PCAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMzJfaG9zdCkgJiAoTTRPU0FfVUludDMyKSAweDAwMDBmZjAwKSA8PCAgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMzJfaG9zdCkgJiAoTTRPU0FfVUludDMyKSAweDAwZmYwMDAwKSA+PiAgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMzJfaG9zdCkgJiAoTTRPU0FfVUludDMyKSAweGZmMDAwMDAwKSA+PiAgMjQpKQorCisvKiB0byB0cmFuc2xhdGUgYSA2NCBiaXRzIHRvIGl0cyBCaWcgRW5kaWFuIHZhbHVlICovCisjZGVmaW5lIE00T1NBX0lOVDY0X1RPX0JFKHVpNjRfaG9zdCkgKCgoKHVpNjRfaG9zdCkgJiAoTTRPU0FfVUludDY0KSAweDAwMDAwMDAwMDAwMDAwZmYpIDw8IDU2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWk2NF9ob3N0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDAwMDAwZmYwMCkgPDwgNDApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aTY0X2hvc3QpICYgKE00T1NBX1VJbnQ2NCkgMHgwMDAwMDAwMDAwZmYwMDAwKSA8PCAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfaG9zdCkgJiAoTTRPU0FfVUludDY0KSAweDAwMDAwMDAwZmYwMDAwMDApIDw8ICA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWk2NF9ob3N0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwZmYwMDAwMDAwMCkgPj4gIDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aTY0X2hvc3QpICYgKE00T1NBX1VJbnQ2NCkgMHgwMDAwZmYwMDAwMDAwMDAwKSA+PiAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfaG9zdCkgJiAoTTRPU0FfVUludDY0KSAweDAwZmYwMDAwMDAwMDAwMDApID4+IDQwKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWk2NF9ob3N0KSAmIChNNE9TQV9VSW50NjQpIDB4ZmYwMDAwMDAwMDAwMDAwMCkgPj4gNTYpKQorCisvKiB0byB0cmFuc2xhdGUgYSBCaWcgRW5kaWFuIDE2IGJpdHMgdG8gaXRzIGhvc3QgcmVwcmVzZW50YXRpb24gKi8KKyNkZWZpbmUgTTRPU0FfQkVfVE9fSU5UMTYodWkxNl9uZXQpICgoKCh1aTE2X25ldCkgJiAoTTRPU0FfVUludDE2KSAweDAwZmYpIDw8IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMTZfbmV0KSAmIChNNE9TQV9VSW50MTYpIDB4ZmYwMCkgPj4gOCkgKQorCisvKiB0byB0cmFuc2xhdGUgYSBCaWcgRW5kaWFuIDMyIGJpdHMgdG8gaXRzIGhvc3QgcmVwcmVzZW50YXRpb24qLworI2RlZmluZSBNNE9TQV9CRV9UT19JTlQzMih1aTMyX25ldCkgKCgoKHVpMzJfbmV0KSAmIChNNE9TQV9VSW50MzIpIDB4MDAwMDAwZmYpIDw8IDI0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aTMyX25ldCkgJiAoTTRPU0FfVUludDMyKSAweDAwMDBmZjAwKSA8PCAgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWkzMl9uZXQpICYgKE00T1NBX1VJbnQzMikgMHgwMGZmMDAwMCkgPj4gIDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMzJfbmV0KSAmIChNNE9TQV9VSW50MzIpIDB4ZmYwMDAwMDApID4+ICAyNCkpCisKKy8qIHRvIHRyYW5zbGF0ZSBhIEJpZyBFbmRpYW4gNjQgYml0cyB0byBpdHMgaG9zdCByZXByZXNlbnRhdGlvbiAqLworI2RlZmluZSBNNE9TQV9CRV9UT19JTlQ2NCh1aTY0X25ldCkgKCgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDAwMDAwMDBmZikgPDwgNTYpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDAwMDAwZmYwMCkgPDwgNDApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDAwMGZmMDAwMCkgPDwgMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDBmZjAwMDAwMCkgPDwgIDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwZmYwMDAwMDAwMCkgPj4gIDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMGZmMDAwMDAwMDAwMCkgPj4gMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDBmZjAwMDAwMDAwMDAwMCkgPj4gNDApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4ZmYwMDAwMDAwMDAwMDAwMCkgPj4gNTYpKQorCisvKiB0byB0cmFuc2xhdGUgYSAxNiBiaXRzIHRvIGl0cyBMaXR0bGUgRW5kaWFuIHZhbHVlKi8KKyNkZWZpbmUgTTRPU0FfSU5UMTZfVE9fTEUodWkxNl9ob3N0KSAodWkxNl9ob3N0KQorCisvKiB0byB0cmFuc2xhdGUgYSAzMiBiaXRzIHRvIGl0cyBMaXR0bGUgRW5kaWFuIHZhbHVlICovCisjZGVmaW5lIE00T1NBX0lOVDMyX1RPX0xFKHVpMzJfaG9zdCkgKHVpMzJfaG9zdCkKKworLyogdG8gdHJhbnNsYXRlIGEgNjQgYml0cyB0byBpdHMgTGl0dGxlIEVuZGlhbiB2YWx1ZSAqLworI2RlZmluZSBNNE9TQV9JTlQ2NF9UT19MRSh1aTY0X2hvc3QpICh1aTY0X2hvc3QpCisKKy8qIHRvIHRyYW5zbGF0ZSBhIExpdHRsZSBFbmRpYW4gMTYgYml0cyB0byBpdHMgaG9zdCByZXByZXNlbnRhdGlvbiAqLworI2RlZmluZSBNNE9TQV9MRV9UT19JTlQxNih1aTE2X25ldCkgKHVpMTZfbmV0KQorCisvKiB0byB0cmFuc2xhdGUgYSBMaXR0bGUgRW5kaWFuIDMyIGJpdHMgdG8gaXRzIGhvc3QgcmVwcmVzZW50YXRpb24qLworI2RlZmluZSBNNE9TQV9MRV9UT19JTlQzMih1aTMyX25ldCkgKHVpMzJfbmV0KQorCisvKiB0byB0cmFuc2xhdGUgYSBMaXR0bGUgRW5kaWFuIDY0IGJpdHMgdG8gaXRzIGhvc3QgcmVwcmVzZW50YXRpb24gKi8KKyNkZWZpbmUgTTRPU0FfTEVfVE9fSU5UNjQodWk2NF9uZXQpICh1aTY0X25ldCkKKworCisvKiBNYWNybyB0byBtYW5pcHVsYXRlIE00T1NBX0ludDMyKi8KKyNkZWZpbmUgTTRPU0FfSU5UMzJfU0VUKGkzMl9vdXQsIGkzMl9pbilcCisgICB7IGkzMl9vdXQgPSBpMzJfaW47IH0KKworI2RlZmluZSBNNE9TQV9JTlQzMl9BREQoaTMyX3Jlc3VsdCwgaTMyX2EsIGkzMl9iKVwKKyAgIHsgaTMyX3Jlc3VsdCA9IChpMzJfYSkgKyAoaTMyX2IpOyB9CisKKyNkZWZpbmUgTTRPU0FfSU5UMzJfU1VCKGkzMl9yZXN1bHQsIGkzMl9hLCBpMzJfYilcCisgICB7IGkzMl9yZXN1bHQgPSAoaTMyX2EpIC0gKGkzMl9iKTsgfQorCisjZGVmaW5lIE00T1NBX0lOVDMyX1NDQUxBUl9QUk9EVUNUKGkzMl9yZXN1bHQsIGkzMl9hLCBpMzJfdmFsdWUpXAorICAgeyBpMzJfcmVzdWx0ID0gKGkzMl9hKSAqIChpMzJfdmFsdWUpOyB9CisKKyNkZWZpbmUgTTRPU0FfSU5UMzJfU0NBTEFSX0RJVklTSU9OKGkzMl9yZXN1bHQsIGkzMl9hLCBpMzJfdmFsdWUpXAorICAgeyBpMzJfcmVzdWx0ID0gKGkzMl9hKSAvIChpMzJfdmFsdWUpOyB9CisKKyNkZWZpbmUgTTRPU0FfSU5UMzJfQ09NUEFSRShpMzJfYSwgaTMyX2IpXAorICAgKCAoKGkzMl9hKSA9PSAoaTMyX2IpKSA/IDAgOiAoICgoaTMyX2EpID4gKGkzMl9iKSkgPyAxIDogLTEpICkKKworI2RlZmluZSBNNE9TQV9JTlQzMl9GUk9NX0lOVDMyKGkzMl9yZXN1bHQsIGkzMl92YWx1ZSlcCisgICB7IGkzMl9yZXN1bHQgPSAoTTRPU0FfSW50MzIpKGkzMl92YWx1ZSk7IH0KKworI2RlZmluZSBNNE9TQV9JTlQzMl9GUk9NX0lOVDMyX1VJTlQzMihpMzJfcmVzdWx0LCBpMzJfaGlnaCwgdWkzMl9sb3cpXAorICAgeyBpMzJfcmVzdWx0ID0gKE00T1NBX0ludDMyKSh1aTMyX2xvdyk7IH0KKworI2RlZmluZSBNNE9TQV9JTlQzMl9HRVRfTE9XMzIoaTMyX3ZhbHVlKSAoKE00T1NBX0ludDMyKShpMzJfdmFsdWUpKQorCisjZGVmaW5lIE00T1NBX0lOVDMyX0dFVF9ISUdIMzIoaTMyX3ZhbHVlKSAoMCkKKworI2RlZmluZSBNNE9TQV9JTlQzMl9JU19QT1NJVElWRShpMzJfdmFsdWUpICgoaTMyX3ZhbHVlKSA+PSAwKQorCisjZGVmaW5lIE00T1NBX0lOVDMyX05FRyhpMzJfcmVzdWx0LCBpMzJfdmFsdWUpXAorICAgeyBpMzJfcmVzdWx0ID0gLShpMzJfdmFsdWUpOyB9CisKKyNkZWZpbmUgTTRPU0FfSU5UMzJfQUJTKGkzMl9yZXN1bHQsIGkzMl92YWx1ZSlcCisgICB7IGlmICgoaTMyX3ZhbHVlKSA+IDApIHsgaTMyX3Jlc3VsdCA9IGkzMl92YWx1ZTsgfVwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgeyBpMzJfcmVzdWx0ID0gLShpMzJfdmFsdWUpOyB9IH0KKworI2RlZmluZSBNNE9TQV9JTlQzMl9MRUZUX1NISUZUKGkzMl9yZXN1bHQsIGkzMl92YWx1ZSwgdWkzMl9uYlBvcylcCisgICB7IGk2NF9yZXN1bHQgPSAoKCh1aTMyX25iUG9zKT4weDFGKT8wOigoaTY0X3ZhbHVlKTw8KHVpMzJfbmJQb3MpKSk7IH0KKworI2RlZmluZSBNNE9TQV9JTlQzMl9SSUdIVF9TSElGVChpMzJfcmVzdWx0LCBpMzJfdmFsdWUsIHVpMzJfbmJQb3MpXAorICAgeyBpNjRfcmVzdWx0ID0gKCgodWkzMl9uYlBvcyk+MHgxRik/MDooKGk2NF92YWx1ZSk+Pih1aTMyX25iUG9zKSkpOyB9CisKKyNkZWZpbmUgTTRPU0FfSU5UMzJfVE9fRE9VQkxFKGZfcmVzdWx0LCBpMzJfdmFsdWUpXAorICAgeyBmX3Jlc3VsdCA9IChNNE9TQV9Eb3VibGUpKGkzMl92YWx1ZSk7IH0KKworI2RlZmluZSBNNE9TQV9JTlQzMl9GUk9NX0RPVUJMRShpMzJfcmVzdWx0LCBmX3ZhbHVlKVwKKyAgIHsgaTMyX3Jlc3VsdCA9IChNNE9TQV9JbnQzMikoZl92YWx1ZSk7IH0KKworCisjaWZkZWYgTTRPU0FfNjRCSVRTX1NVUFBPUlRFRAorCisvKiBNYWNybyB0byBtYW5pcHVsYXRlIE00T1NBX0ludDY0Ki8KKyNkZWZpbmUgTTRPU0FfSU5UNjRfU0VUKGk2NF9vdXQsIGk2NF9pbikgeyBpNjRfb3V0ID0gaTY0X2luOyB9CisKKyNkZWZpbmUgTTRPU0FfSU5UNjRfQUREKGk2NF9yZXN1bHQsIGk2NF9hLCBpNjRfYilcCisgICB7IGk2NF9yZXN1bHQgPSAoaTY0X2EpICsgKGk2NF9iKTsgfQorCisjZGVmaW5lIE00T1NBX0lOVDY0X1NVQihpNjRfcmVzdWx0LCBpNjRfYSwgaTY0X2IpXAorICAgeyBpNjRfcmVzdWx0ID0gKGk2NF9hKSAtIChpNjRfYik7IH0KKworI2RlZmluZSBNNE9TQV9JTlQ2NF9TQ0FMQVJfUFJPRFVDVChpNjRfcmVzdWx0LCBpNjRfYSwgaTMyX3ZhbHVlKVwKKyAgIHsgaTY0X3Jlc3VsdCA9IChpNjRfYSkgKiAoaTMyX3ZhbHVlKTsgfQorCisjZGVmaW5lIE00T1NBX0lOVDY0X1NDQUxBUl9ESVZJU0lPTihpNjRfcmVzdWx0LCBpNjRfYSwgaTMyX3ZhbHVlKVwKKyAgIHsgaTY0X3Jlc3VsdCA9IChpNjRfYSkgLyAoaTMyX3ZhbHVlKTsgfQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0NPTVBBUkUoaTY0X2EsIGk2NF9iKVwKKyAgICggKChpNjRfYSkgPT0gKGk2NF9iKSkgPyAwIDogKCAoKGk2NF9hKSA+IChpNjRfYikpID8gMSA6IC0xKSApXAorCisjZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fSU5UMzIoaTY0X3Jlc3VsdCwgaTMyX3ZhbHVlKVwKKyAgIHsgaTY0X3Jlc3VsdCA9IChNNE9TQV9JbnQ2NCkoaTMyX3ZhbHVlKTsgfQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fSU5UMzJfVUlOVDMyKGk2NF9yZXN1bHQsIGkzMl9oaWdoLCB1aTMyX2xvdylcCisgICB7IGk2NF9yZXN1bHQgPSAoaTMyX2hpZ2gpOyBpNjRfcmVzdWx0ID0gKGk2NF9yZXN1bHQ8PDMyKSsodWkzMl9sb3cpOyB9CisKKyNkZWZpbmUgTTRPU0FfSU5UNjRfR0VUX0xPVzMyKGk2NF92YWx1ZSlcCisgICAoKE00T1NBX0ludDMyKSgoaTY0X3ZhbHVlKSAmIDB4RkZGRkZGRkYpKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0dFVF9ISUdIMzIoaTY0X3ZhbHVlKVwKKyAgICgoTTRPU0FfSW50MzIpKCgoaTY0X3ZhbHVlKSA+PiAzMikgJiAweEZGRkZGRkZGKSkKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9JU19QT1NJVElWRShpNjRfdmFsdWUpICgoKGk2NF92YWx1ZSk+PTApPzE6MCkKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9ORUcoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlKVwKKyAgIHsgaTY0X3Jlc3VsdCA9IC0oaTY0X3ZhbHVlKTsgfQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0FCUyhpNjRfcmVzdWx0LCBpNjRfdmFsdWUpXAorICAgeyBpZiAoTTRPU0FfSU5UNjRfSVNfUE9TSVRJVkUoaTY0X3ZhbHVlKSkgeyBpNjRfcmVzdWx0ID0gaTY0X3ZhbHVlOyB9XAorICAgICBlbHNlIHsgTTRPU0FfSU5UNjRfTkVHKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSk7IH0gfQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0xFRlRfU0hJRlQoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlLCB1aTMyX25iUG9zKVwKKyAgIHsgaTY0X3Jlc3VsdCA9ICgoKHVpMzJfbmJQb3MpPjB4M0YpPzA6KChpNjRfdmFsdWUpPDwodWkzMl9uYlBvcykpKTsgfQorCisjZGVmaW5lIE00T1NBX0lOVDY0X1JJR0hUX1NISUZUKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSwgdWkzMl9uYlBvcylcCisgICB7IGk2NF9yZXN1bHQgPSAoKCh1aTMyX25iUG9zKT4weDNGKT8wOigoaTY0X3ZhbHVlKT4+KHVpMzJfbmJQb3MpKSk7IH0KKworI2RlZmluZSBNNE9TQV9JTlQ2NF9UT19ET1VCTEUoZl9yZXN1bHQsIGk2NF92YWx1ZSlcCisgICB7IGZfcmVzdWx0ID0gKE00T1NBX0RvdWJsZSkoaTY0X3ZhbHVlKTsgfQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fRE9VQkxFKGk2NF9yZXN1bHQsIGZfdmFsdWUpXAorICAgeyBpNjRfcmVzdWx0ID0gKE00T1NBX0ludDY0KShmX3ZhbHVlKTsgfQorCisjZW5kaWYgICAvKk00T1NBXzY0QklUU19TVVBQT1JURUQqLworCisKKyNpZmRlZiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAorCisjZGVmaW5lIE00T1NBX0lOVDY0X1NFVChpNjRfb3V0LCBpNjRfaW4pXAorICAgICAgICBNNE9TQV9JTlQzMl9TRVQoaTY0X291dCwgaTY0X2luKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0FERChpNjRfcmVzdWx0LCBpNjRfYSwgaTY0X2IpXAorICAgICAgICBNNE9TQV9JTlQzMl9BREQoaTY0X3Jlc3VsdCwgaTY0X2EsIGk2NF9iKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X1NVQihpNjRfcmVzdWx0LCBpNjRfYSwgaTY0X2IpXAorICAgICAgICBNNE9TQV9JTlQzMl9TVUIoaTY0X3Jlc3VsdCwgaTY0X2EsIGk2NF9iKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X1NDQUxBUl9QUk9EVUNUKGk2NF9yZXN1bHQsIGk2NF9hLCBpMzJfdmFsdWUpXAorICAgICAgICBNNE9TQV9JTlQzMl9TQ0FMQVJfUFJPRFVDVChpNjRfcmVzdWx0LCBpNjRfYSwgaTMyX3ZhbHVlKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X1NDQUxBUl9ESVZJU0lPTihpNjRfcmVzdWx0LCBpNjRfYSwgaTMyX3ZhbHVlKVwKKyAgICAgICAgTTRPU0FfSU5UMzJfU0NBTEFSX0RJVklTSU9OKGk2NF9yZXN1bHQsIGk2NF9hLCBpMzJfdmFsdWUpCisKKyNkZWZpbmUgTTRPU0FfSU5UNjRfQ09NUEFSRShpNjRfYSwgaTY0X2IpXAorICAgICAgICBNNE9TQV9JTlQzMl9DT01QQVJFKGk2NF9hLCBpNjRfYikKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKGk2NF9yZXN1bHQsIGkzMl92YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDMyX0ZST01fSU5UMzIoaTY0X3Jlc3VsdCwgaTMyX3ZhbHVlKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fSU5UMzJfVUlOVDMyKGk2NF9yZXN1bHQsIGkzMl9oaWdoLCB1aTMyX2xvdylcCisgICAgICAgIE00T1NBX0lOVDMyX0ZST01fSU5UMzJfVUlOVDMyKGk2NF9yZXN1bHQsIGkzMl9oaWdoLCB1aTMyX2xvdykKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9HRVRfTE9XMzIoaTY0X3ZhbHVlKVwKKyAgICAgICAgTTRPU0FfSU5UMzJfR0VUX0xPVzMyKGk2NF92YWx1ZSkKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9HRVRfSElHSDMyKGk2NF92YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDMyX0dFVF9ISUdIMzIoaTY0X3ZhbHVlKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0lTX1BPU0lUSVZFKGk2NF92YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDMyX0lTX1BPU0lUSVZFKGk2NF92YWx1ZSkKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9ORUcoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlKVwKKyAgICAgICAgTTRPU0FfSU5UMzJfTkVHKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSkKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9BQlMoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlKVwKKyAgICAgICAgTTRPU0FfSU5UMzJfQUJTKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSkKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9MRUZUX1NISUZUKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucylcCisgICAgICAgIE00T1NBX0lOVDMyX0xFRlRfU0hJRlQoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X1JJR0hUX1NISUZUKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucylcCisgICAgICAgIE00T1NBX0lOVDMyX1JJR0hUX1NISUZUKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucykKKworI2RlZmluZSBNNE9TQV9JTlQ2NF9UT19ET1VCTEUoZl9yZXN1bHQsIGk2NF92YWx1ZSlcCisgICAgICAgIE00T1NBX0lOVDMyX1RPX0RPVUJMRShmX3Jlc3VsdCwgaTY0X3ZhbHVlKQorCisjZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fRE9VQkxFKGk2NF9yZXN1bHQsIGZfdmFsdWUpXAorICAgICAgICBNNE9TQV9JTlQzMl9GUk9NX0RPVUJMRShpNjRfcmVzdWx0LCBmX3ZhbHVlKQorCisjZW5kaWYgLypNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRCovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qTTRPU0FfVFlQRVNfSCovCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmYjQ0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsODEgQEAKKyMNCisjIENvcHlyaWdodCAoQykgMjAxMSBOWFAgU29mdHdhcmUNCisjIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorIw0KKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjDQorIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMNCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyMNCisNCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikNCisNCisjDQorIyBsaWJ2aWRlb2VkaXRvcl9vc2FsDQorIw0KKw0KK2luY2x1ZGUgJChDTEVBUl9WQVJTKQ0KKw0KK0xPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX29zYWwNCisNCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcDQorICAgIE00T1NBX0NoYXJTdGFyLmMgXA0KKyAgICBNNE9TQV9DbG9jay5jIFwNCisgICAgTTRPU0FfRmlsZUNhY2hlLmMgXA0KKyAgICBNNE9TQV9GaWxlQ29tbW9uLmMgXA0KKyAgICBNNE9TQV9GaWxlRXh0cmEuYyBcDQorICAgIE00T1NBX0ZpbGVSZWFkZXIuYyBcDQorICAgIE00T1NBX0ZpbGVSZWFkZXJfUkFNLmMgXA0KKyAgICBNNE9TQV9GaWxlV3JpdGVyLmMgXA0KKyAgICBNNE9TQV9GaWxlV3JpdGVyX1JBTS5jIFwNCisgICAgTTRPU0FfTXV0ZXguYyBcDQorICAgIE00T1NBX1JhbmRvbS5jIFwNCisgICAgTTRPU0FfU2VtYXBob3JlLmMgXA0KKyAgICBNNE9TQV9TdHJpbmcuYyBcDQorICAgIE00T1NBX1N0cmluZ19wcml2LmMgXA0KKyAgICBNNE9TQV9UaHJlYWQuYyBcDQorICAgIE00UFNXX0RlYnVnVHJhY2UuYyBcDQorICAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jIFwNCisgICAgTTRQU1dfVHJhY2UuYyBcDQorICAgIExWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYw0KKw0KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRldmVsb3BtZW50DQorDQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMNCisNCitMT0NBTF9DX0lOQ0xVREVTICs9IFwNCisgICAgJChUT1ApL2ZyYW1ld29ya3MvbWVkaWEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXA0KKw0KK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkNCitlbHNlDQorICAgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwNCitlbmRpZg0KKw0KKyMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4NCitMT0NBTF9MRExJQlMgOj0gXA0KKyAgICAtbHB0aHJlYWQgLWxkbA0KKw0KK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcDQorICAgIC1EX19BTkRST0lEX18gXA0KKyAgICAtRE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgXA0KKyAgICAtRFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgXA0KKyAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0RFQyBcDQorICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPREVDIFwNCisgICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9FTkMgXA0KKyAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0VOQyBcDQorICAgIC1EVVNFX1NUQUdFRlJJR0hUX1JFQURFUlMgXA0KKyAgICAtRFVTRV9TVEFHRUZSSUdIVF8zR1BQX1JFQURFUg0KKw0KKyMgRG9uJ3QgcHJlbGluayB0aGlzIGxpYnJhcnkuICBGb3IgbW9yZSBlZmZpY2llbnQgY29kZSwgeW91IG1heSB3YW50DQorIyB0byBhZGQgdGhpcyBsaWJyYXJ5IHRvIHRoZSBwcmVsaW5rIG1hcCBhbmQgc2V0IHRoaXMgdG8gdHJ1ZS4NCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQ0KKw0KK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkNCisNCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzY1NDFmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYwpAQCAtMCwwICsxLDEwNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX29wdGltLmMKKyAqIEBicmllZgorICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBmaWxlc3lzdGVtIGFjY2VzcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyoqIEFkZGl0aW9uIG9mIFRyYWNlIElEICoqLworI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgorI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCisKKyNpZmRlZiBNNFRSQUNFX0lECisjdW5kZWYgTTRUUkFDRV9JRAorI2VuZGlmCisjZGVmaW5lIE00VFJBQ0VfSUQgICAgTTRPU0FfRklMRV9SRUFERVIKKworCisjaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgorI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKKworI2luY2x1ZGUgIkxWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCIKKworI2RlZmluZSBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKKyNpZm5kZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisgICAgI2luY2x1ZGUgIk00T1NBX0ZpbGVBY2Nlc3MuaCIKKyNlbmRpZgorCisjZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKHJldHZhbCk7CisKKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmlsZSByZWFkZXIgY2FjaGUgYnVmZmVycyBwYXJhbWV0ZXJzIChzaXplLCBudW1iZXIgb2YgYnVmZmVycywgZXRjKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKyNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9TSVpFICAgIDEwMjQqMTYKKyNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9OQiAgICAgICAgMgorI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX05PTkUgICAgLTEKKyNkZWZpbmUgTTRPU0FfRU9GICAgICAgICAgICAgICAgLTEKKworI2RlZmluZSBNQVhfRklMTFNfU0lOQ0VfTEFTVF9BQ0NFU1MgICAgTTRPU0FfUkVBREJVRkZFUl9OQioyCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyCisgKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSByZWFkZXIgQnVmZmVycyBjb250ZXh0IChwcml2YXRlKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTTRPU0FfTWVtQWRkcjggICAgICBkYXRhOyAgICAgICAgLyoqPCBidWZmZXIgZGF0YSAqLworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgc2l6ZTsgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyICovCisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlcG9zOyAgICAvKio8IHBvc2l0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBidWZmZXIgc3RhcnRzICovCisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICByZW1haW47ICAgICAgICAvKio8IGRhdGEgYW1vdW50IG5vdCBhbHJlYWR5IGNvcGllZCBmcm9tIGJ1ZmZlciAqLworICAgIE00T1NBX1VJbnQzMiAgICAgICAgbmJGaWxsU2luY2VMYXN0QWNlc3M7ICAgIC8qKjwgVG8ga25vdyBzaW5jZSBob3cgbWFueSB0aW1lIHdlIGRpZG4ndCB1c2UgdGhpcyBidWZmZXIgKi8KK30gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJfb3B0aW07CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dAorICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQgKHByaXZhdGUpCisgKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIEZpbGUgUmVhZGVyIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBJc09wZW5lZDsgICAgICAgLyoqPCBNaWNybyBzdGF0ZSBtYWNoaW5lICovCisgICAgTTRPU0FfRmlsZUF0dHJpYnV0ZSAgICAgRmlsZUF0dHJpYnV0ZTsgIC8qKjwgT3BlbmluZyBtb2RlICovCisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgcmVhZEZpbGVQb3M7ICAgIC8qKjwgRWZmZWN0aXZlIHBvc2l0aW9uIG9mIHRoZSBHRkwgcmVhZCBwb2ludGVyICovCisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgYWJzb2x1dGVQb3M7ICAgIC8qKjwgVmlydHVhbCBwb3NpdGlvbiBmb3IgbmV4dCByZWFkaW5nICovCisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgZmlsZVNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGZpbGUgKi8KKworICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyX29wdGltIGJ1ZmZlcltNNE9TQV9SRUFEQlVGRkVSX05CXTsgIC8qKjwgUmVhZCBidWZmZXJzICovCisKKyAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBhRmlsZURlc2M7ICAvKio8IEZpbGUgZGVzY3JpcHRvciAqLworCisjaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgRlM7ICAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGludGVyZmFjZSAqLworI2Vsc2UKKyAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlM7ICAgICAgICAvKio8IEZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCisjZW5kaWYKKworfSBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW07CisKKy8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KKy8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KKy8qfCAgICBHbG9iYWwgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGxvdyBsZXZlbCByZWFkIGFjY2VzcyAgICB8Ki8KKy8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KKworc3RhdGljIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogZ3ZfTlhQU1dfUkVBRE9QVF9sb3dMZXZlbEZ1bmN0aW9uczsKKworTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9pbml0KE00T1NBX1ZvaWQgKmxvd0xldmVsX2Z1bmN0aW9uUG9pbnRlcnMsIE00T1NBX1ZvaWQgKm9wdGltaXplZF9mdW5jdGlvblBvaW50ZXJzKQoreworICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogbG93TGV2ZWxfZnAgID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIGxvd0xldmVsX2Z1bmN0aW9uUG9pbnRlcnM7CisgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBvcHRpbWl6ZWRfZnAgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKikgb3B0aW1pemVkX2Z1bmN0aW9uUG9pbnRlcnM7CisKKyAgICAvL1NldCB0aGUgb3B0aW1pemVkIGZ1bmN0aW9ucywgdG8gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyCisgICAgb3B0aW1pemVkX2ZwLT5vcGVuUmVhZCAgPSBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW07CisgICAgb3B0aW1pemVkX2ZwLT5yZWFkRGF0YSAgPSBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW07CisgICAgb3B0aW1pemVkX2ZwLT5zZWVrICAgICAgPSBNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW07CisgICAgb3B0aW1pemVkX2ZwLT5jbG9zZVJlYWQgPSBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltOworICAgIG9wdGltaXplZF9mcC0+c2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW07CisgICAgb3B0aW1pemVkX2ZwLT5nZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbTsKKworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKK000T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1fY2xlYW5VcCgpCit7CisKKyAgICBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zID0gTTRPU0FfTlVMTDsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKK000T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1fZ2V0TG93TGV2ZWxGdW5jdGlvbnMoTTRPU0FfVm9pZCAqKkZTKQoreworICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlcioqIHBGdW5jdGlvbnNQb2ludGVyID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlcioqKSBGUzsKKyAgICAqcEZ1bmN0aW9uc1BvaW50ZXIgPSBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zOworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKKy8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KKy8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KKy8qfCAgICAgICAgQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgUmVhZCBhY2Nlc3MgICAgICAgICB8Ki8KKy8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVySW5pdChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9VSW50OCBpOworCisgICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gTTRPU0FfTlVMTDsKKyAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IDA7CisgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSAwOworICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOworICAgIH0KKworICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQorICAgIHsKKyAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IChNNE9TQV9NZW1BZGRyOCkgTTRPU0FfbWFsbG9jKE00T1NBX1JFQURCVUZGRVJfU0laRSwgTTRPU0FfRklMRV9SRUFERVIsICJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQiKTsKKyAgICAgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEpOworICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9Wb2lkIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9JbnQ4IGk7CisKKyAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKKyAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSAhPSBNNE9TQV9OVUxMKQorICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9GaWxlUG9zaXRpb24gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGksIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLCBNNE9TQV9NZW1BZGRyOCBwRGF0YSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gY29weXNpemU7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIG9mZnNldDsKKworICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPT0gTTRPU0FfRU9GKSByZXR1cm4gTTRPU0FfRU9GOworCisgICAgaWYoICAgKHBvcyA8IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpCisgICAgICAgfHwgKHBvcyA+IChhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zICsgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSAtIDEpKSApCisgICAgeworICAgICAgICByZXR1cm4gMDsgLyogbm90aGluZyBjb3BpZWQgKi8KKyAgICB9CisKKyAgICBvZmZzZXQgPSBwb3MgLSBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zOworCisgICAgY29weXNpemUgPSBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIC0gb2Zmc2V0OworICAgIGNvcHlzaXplID0gKHNpemUgPCBjb3B5c2l6ZSkgPyBzaXplIDogY29weXNpemU7CisKKyAgICBNNE9TQV9tZW1jcHkocERhdGEsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgKyBvZmZzZXQsIGNvcHlzaXplKTsKKworICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiAtPSBjb3B5c2l6ZTsKKyAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA9IDA7CisKKyAgICByZXR1cm4gY29weXNpemU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK000T1NBX0VSUiBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGksIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBncmlkUG9zOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICB0ZW1wUG9zOworICAgIE00T1NBX1VJbnQzMiAgICAgICAgYnVmZmVyU2l6ZTsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGRpZmY7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBzaXplOworICAgIE00T1NBX0VSUiAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgorICAgIE00T1NBX0VSUiAgICAgICAgICAgICBlcnJubyA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfVUludDMyICAgICAgICAgZmlsZVJlYWRTaXplID0gMDsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGZpbGVTZWVrUG9zaXRpb24gPSAwOworI2Vsc2UKKyAgICBNNE9TQV9JbnQzMiAgICAgICAgIHJldF92YWw7CisgICAgTTRPU0FfVUludDE2ICAgICAgICAgZXJybm87CisjZW5kaWYKKworICAgIE00T1NBX1RSQUNFM180KCJCdWZmZXJGaWxsICBpID0gJWQgIHBvcyA9ICVsZCAgcmVhZCA9ICVsZCAgb2xkID0gJWxkIiwgaSwgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcywgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyk7CisKKyAgICAvKiBBdm9pZCBjeWNsaW5nIHN0YXRlbWVudCBiZWNhdXNlIG9mIEVPRiAqLworICAgIGlmKHBvcyA+PSBhcENvbnRleHQtPmZpbGVTaXplKQorICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKKworICAgIC8qIFJlbG9jYXRlIHRvIGFic29sdXRlIHBvc3Rpb24gaWYgbmVjZXNzYXJ5ICovCisgICAgYnVmZmVyU2l6ZSA9IE00T1NBX1JFQURCVUZGRVJfU0laRTsKKyAgICB0ZW1wUG9zID0gKE00T1NBX0ZpbGVQb3NpdGlvbikgKHBvcyAvIGJ1ZmZlclNpemUpOworICAgIGdyaWRQb3MgPSB0ZW1wUG9zICogTTRPU0FfUkVBREJVRkZFUl9TSVpFOworICAgIGRpZmYgPSBncmlkUG9zIC0gYXBDb250ZXh0LT5yZWFkRmlsZVBvczsKKworICAgIGlmKGRpZmYgIT0gMCkKKyAgICB7CisjaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisgICAgICAgIGZpbGVTZWVrUG9zaXRpb24gPSBkaWZmOworICAgICAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPnNlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNlZWtQb3NpdGlvbik7CisgICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBncmlkUG9zOworCisgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJybm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGVycm5vOworICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIxID0gMHgleCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyNlbHNlCisgICAgICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIGRpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZlcnJubyk7CisgICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBncmlkUG9zOworCisgICAgICAgIGlmKHJldF92YWwgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7CisgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjEgPSAweCV4IiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCisgICAgfQorCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IGFwQ29udGV4dC0+cmVhZEZpbGVQb3M7CisKKyAgICAvKiBSZWFkIERhdGEgKi8KKyNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKKyAgICBmaWxlUmVhZFNpemUgPSBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7CisgICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5yZWFkRGF0YShhcENvbnRleHQtPmFGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSwgJmZpbGVSZWFkU2l6ZSk7CisKKyAgICBzaXplID0gKE00T1NBX0ZpbGVQb3NpdGlvbilmaWxlUmVhZFNpemU7CisgICAgaWYgKChNNE5PX0VSUk9SICE9IGVycm5vKSYmKE00V0FSX05PX0RBVEFfWUVUICE9IGVycm5vKSkKKyAgICB7CisgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBNNE9TQV9FT0Y7CisgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7CisKKyAgICAgICAgZXJyID0gZXJybm87CisgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMiA9IDB4JXgiLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyNlbHNlCisgICAgc2l6ZSA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfUmVhZChhcENvbnRleHQtPmFGaWxlRGVzYywKKyAgICAgICAgKE00T1NBX1VJbnQ4ICopYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSwgTTRPU0FfUkVBREJVRkZFUl9TSVpFLCAmZXJybm8pOworICAgIGlmKHNpemUgPT0gLTEpCisgICAgeworICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gTTRPU0FfRU9GOworICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOworCisgICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOworICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjIgPSAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisjZW5kaWYKKworICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBzaXplOworICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IHNpemU7CisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOworCisgICAgLyogUmV0cmlldmUgY3VycmVudCBwb3NpdGlvbiAqLworI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgorICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+Z2V0T3B0aW9uKGFwQ29udGV4dC0+YUZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopICZhcENvbnRleHQtPnJlYWRGaWxlUG9zKTsKKworICAgIGlmIChNNE5PX0VSUk9SICE9IGVycm5vKQorICAgIHsKKyAgICAgICAgZXJyID0gZXJybm87CisgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMyA9IDB4JXgiLCBlcnIpOworICAgIH0KKyAgICBlbHNlIGlmKCAgIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID49IDApCisgICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPCBNNE9TQV9SRUFEQlVGRkVSX1NJWkUpICkKKyAgICB7CisgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOworICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIHJldHVybnMgTk8gREFUQSBZRVQiKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisjZWxzZQorICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1RlbGwoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7CisKKyAgICBpZiggICAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA+PSAwKQorICAgICAgICYmIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIDwgTTRPU0FfUkVBREJVRkZFUl9TSVpFKSApCisgICAgeworICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIzID0gMHgleCIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KKworICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK000T1NBX0ludDggTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJNYXRjaChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIE00T1NBX0ludDggaTsKKworCisgICAgLyogU2VsZWN0IHRoZSBidWZmZXIgd2hpY2ggbWF0Y2hlcyB3aXRoIGdpdmVuIHBvcyAqLworICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoICAgKHBvcyA+PSBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKQorICAgICAgICAgICAmJiAocG9zIDwgKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgKyBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplKSkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTTRPU0FfUkVBREJVRkZFUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9JbnQ4IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyU2VsZWN0KE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGN1cnJlbnRfaSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9JbnQ4IGksajsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gbWluX2Ftb3VudCxtYXhfYW1vdW50OworICAgIE00T1NBX0ludDggbWluX2ksbWF4X2NvdW50OworCisgICAgLyogdXBkYXRlIG5iRmlsbFNpbmNlTGFzdEFjZXNzIGZpZWxkICovCisgICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyArKzsKKyAgICB9CisKKyAgICAvKiBQbGFuIEEgOiBTY2FuIGZvciBlbXB0eSBidWZmZXIgKi8KKyAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKKyAgICB7CisgICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1heF9jb3VudCA9IE00T1NBX1JFQURCVUZGRVJfTkI7CisgICAgbWF4X2Ftb3VudCA9IE1BWF9GSUxMU19TSU5DRV9MQVNUX0FDQ0VTUzsKKworICAgIC8qIFBsYW4gQiA6IFNjYW4gZm9yIGRlYWQgYnVmZmVyICovCisgICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA+PSAoTTRPU0FfVUludDMyKSBtYXhfYW1vdW50KQorICAgICAgICB7CisgICAgICAgICAgICBtYXhfYW1vdW50ID0gYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3M7CisgICAgICAgICAgICBtYXhfY291bnQgPSBpOworICAgICAgICB9CisgICAgfQorICAgIGlmKG1heF9jb3VudDxNNE9TQV9SRUFEQlVGRkVSX05CKQorICAgIHsKKyAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkRFQUQgQlVGRkVSOiAlZCwgJWQiLG1heF9jb3VudCxhcENvbnRleHQtPmJ1ZmZlclttYXhfY291bnRdLm5iRmlsbFNpbmNlTGFzdEFjZXNzKTsKKyAgICAgICAgcmV0dXJuIG1heF9jb3VudDsKKyAgICB9CisKKyAgICBtaW5faSA9IGN1cnJlbnRfaTsKKyAgICBtaW5fYW1vdW50ID0gTTRPU0FfUkVBREJVRkZFUl9TSVpFOworCisgICAgLyogU2VsZWN0IHRoZSBidWZmZXIgd2hpY2ggaXMgdGhlIG1vc3QgImVtcHR5IiAqLworICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChpK2N1cnJlbnRfaSklTTRPU0FfUkVBREJVRkZFUl9OQjsKKworICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltqXS5yZW1haW4gPCBtaW5fYW1vdW50KQorICAgICAgICB7CisgICAgICAgICAgICBtaW5fYW1vdW50ID0gYXBDb250ZXh0LT5idWZmZXJbal0ucmVtYWluOworICAgICAgICAgICAgbWluX2kgPSBqOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1pbl9pOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK000T1NBX0VSUiBNNE9TQV9GaWxlUmVhZGVyX0NhbGN1bGF0ZVNpemUoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfRVJSICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKKyNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKKyAgICBNNE9TQV9FUlIgICAgICAgICAgICBlcnJubyA9IE00Tk9fRVJST1I7CisjZWxzZQorICAgIE00T1NBX0ludDMyICAgICAgICAgIHJldF92YWw7CisgICAgTTRPU0FfVUludDE2ICAgICAgICAgZXJybm87CisjZW5kaWYKKworICAgIC8qIGdvIHRvIHRoZSBlbmQgb2YgZmlsZSovCisjaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisgICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5nZXRPcHRpb24oYXBDb250ZXh0LT5hRmlsZURlc2MsIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikgJmFwQ29udGV4dC0+ZmlsZVNpemUpOworICAgIGlmIChNNE5PX0VSUk9SICE9IGVycm5vKQorICAgIHsKKyAgICAgICAgZXJyID0gZXJybm87CisgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0NhbGN1bGF0ZVNpemUgRVJSID0gMHgleCIsIGVycik7CisgICAgfQorI2lmIDAKKyAgICBmaWxlU2Vla1Bvc2l0aW9uID0gMDsKKyAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPnNlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIE00T1NBX2tGaWxlU2Vla0VuZCwgJmZpbGVTZWVrUG9zaXRpb24pOworCisgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCisgICAgeworICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gTTRPU0FfRU9GOworICAgICAgICBlcnIgPSBlcnJubzsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIxID0gMHgleCIsIGVycik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJldHJpZXZlIHNpemUgb2YgdGhlIGZpbGUgKi8KKyAgICAgICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5nZXRPcHRpb24oYXBDb250ZXh0LT5hRmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSAmYXBDb250ZXh0LT5maWxlU2l6ZSk7CisgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycm5vKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBlcnJubzsKKyAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0NhbGN1bGF0ZVNpemUgRVJSMiA9IDB4JXgiLCBlcnIpOworICAgICAgICB9CisgICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPmZpbGVTaXplOworICAgIH0KKyNlbmRpZgorI2Vsc2UKKyAgICByZXRfdmFsID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9TZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAwLCBNNE9TQV9rRmlsZVNlZWtFbmQsICZlcnJubyk7CisKKyAgICBpZiAocmV0X3ZhbCAhPSAwKQorICAgIHsKKyAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IE00T1NBX0VPRjsKKyAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7CisgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0NhbGN1bGF0ZVNpemUgRVJSID0gMHgleCIsIGVycik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJldHJpZXZlIHNpemUgb2YgdGhlIGZpbGUgKi8KKyAgICAgICAgYXBDb250ZXh0LT5maWxlU2l6ZSA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfVGVsbChhcENvbnRleHQtPmFGaWxlRGVzYywgJmVycm5vKTsKKyAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+ZmlsZVNpemU7CisgICAgfQorI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KKworICAgIHJldHVybiBlcnI7Cit9CisKKworLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLworLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLworLyp8ICAgICAgICAgICAgICAgICAgIE9TQUwgZmlsZXN5c3RlbSBBUEkgICAgICAgICAgICAgICAgICAgIHwqLworLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLworCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIHByb3ZpZGVkIGZpbGVEZXNjcmlwdG9yIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgorKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChPVVQpIEZpbGUgcmVhZGVyIGNvbnRleHQuCisqIEBwYXJhbSAgICAgICBwRmlsZURlc2NyaXB0b3IgOiAgICAgICAoSU4pIEZpbGUgRGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgZmlsZS4KKyogQHBhcmFtICAgICAgIEZpbGVNb2RlQWNjZXNzIDogICAgICAgIChJTikgRmlsZSBtb2RlIGFjY2Vzcy4KKyogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisqIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgcENvbnRleHQgb3IgZmlsZURlc2NyaXB0b3IgaXMgTlVMTAorKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQorKiBAcmV0dXJuICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MgICAgICB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdCAoaXQgbXVzdCBiZSBlaXRoZXIgaXNUZXh0TW9kZSBvciByZWFkKQorKiBAcmV0dXJuICAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQgVGhlIGZpbGUgY2FuIG5vdCBiZSBvcGVuZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisjaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisgICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcykKKyNlbHNlCisgICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyICpGUykKKyNlbmRpZgoreworICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gTTRPU0FfTlVMTDsKKworICAgIE00T1NBX0VSUiAgIGVyciAgICAgICA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfVm9pZCogYUZpbGVEZXNjID0gTTRPU0FfTlVMTDsKKyAgICBNNE9TQV9Cb29sICBidWZmZXJzX2FsbG9jYXRlZCA9IE00T1NBX0ZBTFNFOworI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgorICAgIE00T1NBX0VSUiBlcnJubyA9IE00Tk9fRVJST1I7CisjZWxzZQorICAgIE00T1NBX1VJbnQxNiBlcnJubzsKKyNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCisKKyAgICBNNE9TQV9UUkFDRTJfMygiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIHAgPSAweCVwIGZkID0gJXMgbW9kZSA9ICVsdSIsIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2Vzcyk7CisKKyAgICAvKiAgICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KTsKKyAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBGaWxlRGVzY3JpcHRvcik7CisKKyAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOworCisgICAgLyogICAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBGaWxlIHJlYWRlciBjb250ZXh0LiAqLworICAgIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0gKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAiTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltIik7CisKKyAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgYXBDb250ZXh0KTsKKworICAgIC8qIFNldCBmaWxlc3lzdGVtIGludGVyZmFjZSAqLworI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgorCisgICAgLypTZXQgdGhlIG9wdGltaXplZCBmdW5jdGlvbnMsIHRvIGJlIGNhbGxlZCBieSB0aGUgdXNlciovCisKKyAgICBhcENvbnRleHQtPkZTID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIE00T1NBX21hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRQb2ludGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAiTlhQU1dfRmlsZVJlYWRlck9wdGltX2luaXQiKTsKKyAgICBpZiAoTTRPU0FfTlVMTD09YXBDb250ZXh0LT5GUykKKyAgICB7CisgICAgICAgIE00T1NBX1RSQUNFMV8wKCJOWFBTV19GaWxlUmVhZGVyT3B0aW1faW5pdCAtIEVSUk9SIDogYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIH0KKyAgICBhcENvbnRleHQtPkZTLT5vcGVuUmVhZCAgPSBNNE9TQV9maWxlUmVhZE9wZW47CisgICAgYXBDb250ZXh0LT5GUy0+cmVhZERhdGEgID0gTTRPU0FfZmlsZVJlYWREYXRhOworICAgIGFwQ29udGV4dC0+RlMtPnNlZWsgICAgICA9IE00T1NBX2ZpbGVSZWFkU2VlazsKKyAgICBhcENvbnRleHQtPkZTLT5jbG9zZVJlYWQgPSBNNE9TQV9maWxlUmVhZENsb3NlOworICAgIGFwQ29udGV4dC0+RlMtPnNldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOworICAgIGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOworICAgI2Vsc2UKKyAgICBhcENvbnRleHQtPkZTID0gRlM7CisjZW5kaWYKKworICAgIC8qIFZlcmlmeSBhY2Nlc3MgbW9kZSAqLworICAgIGlmICggICAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpICE9IDApCisgICAgICAgIHx8ICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpID09IDApKQorICAgIHsKKyAgICAgICAgZXJyID0gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBPcGVuIGZpbGUgaW4gcmVhZCBtb2RlICovCisgICAgaWYoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpICE9IDApCisgICAgeworICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGluIHJlYWQgb25seSovCisjaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisgICAgICAgICAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPm9wZW5SZWFkKCZhRmlsZURlc2MsIHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MpOworCisgICAgICAgICAgICBpZiAoKGFGaWxlRGVzYyA9PSBNNE9TQV9OVUxMKXx8KE00Tk9fRVJST1IgIT0gZXJybm8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KKyAgICAgICAgICAgICAgICBlcnIgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKKyAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgYUZpbGVEZXNjID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9PcGVuKHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MsICZlcnJubyk7CisKKyAgICAgICAgICAgIGlmIChhRmlsZURlc2MgPT0gTTRPU0FfTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCisgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7CisgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7CisgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7CisKKyAgICAvKiBBbGxvY2F0ZSBidWZmZXJzICovCisgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0KGFwQ29udGV4dCk7CisgICAgYnVmZmVyc19hbGxvY2F0ZWQgPSBNNE9TQV9UUlVFOworCisgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7CisKKyAgICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgKi8KKyAgICBhcENvbnRleHQtPmZpbGVTaXplID0gMDsKKyAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gMDsKKyAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gMDsKKworICAgIC8qIFJldHJpZXZlIHRoZSBGaWxlIERlc2NyaXB0b3IqLworICAgIGFwQ29udGV4dC0+YUZpbGVEZXNjID0gYUZpbGVEZXNjOworCisgICAgLyogUmV0cmlldmUgdGhlIEZpbGUgbW9kZSBBY2Nlc3MgKi8KKyAgICBhcENvbnRleHQtPkZpbGVBdHRyaWJ1dGUubW9kZUFjY2VzcyA9IChNNE9TQV9GaWxlTW9kZUFjY2VzcykgRmlsZU1vZGVBY2Nlc3M7CisKKyAgICAvKlJldHJpZXZlIHRoZSBGaWxlIHJlYWRlciBjb250ZXh0ICovCisgICAgKnBDb250ZXh0PSAoTTRPU0FfQ29udGV4dClhcENvbnRleHQ7CisKKyAgICAvKiBDb21wdXRlIGZpbGUgc2l6ZSAqLworICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZShhcENvbnRleHQpOworCisgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKKworY2xlYW51cDoKKworICAgIC8qIGZyZWUgY29udGV4dCAqLworICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmKGJ1ZmZlcnNfYWxsb2NhdGVkID09IE00T1NBX1RSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShhcENvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSBhcENvbnRleHQpOworICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOworICAgIH0KKworICAgIE00T1NBX1RSQUNFMl8xICgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltOiByZXR1cm5zIGVycm9yIDB4JTB4IiwgZXJyKQorICAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKQorKiAgICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScgcG9pbnRlci4gSWYgJ3NpemUnIGJ5dGUgY2FuIG5vdCBiZSByZWFkIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyLAorKiAgICAgICAgICAgICAgICAgICAgICAnc2l6ZScgcGFyYW1ldGVyIGlzIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHJlYWQgYnl0ZXMuCisqIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgorKiBAcGFyYW0gICAgICAgcERhdGEgOiAoT1VUKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHJlYWQgZGF0YS4KKyogQHBhcmFtICAgICAgIHBTaXplIDogKElOT1VUKSBTaXplIG9mIHRoZSBkYXRhIHRvIHJlYWQgKGluIGJ5dGUpLgorKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBwU2l6ZSwgZmlsZURlc2NyaXB0b3Igb3IgcERhdGEgaXMgTlVMTAorKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQorKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQsTTRPU0FfTWVtQWRkcjggcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBTaXplKQoreworICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7CisKKyAgICBNNE9TQV9FUlIgZXJyOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBhU2l6ZTsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gY29waWVkU2l6ZTsKKyAgICBNNE9TQV9JbnQ4IHNlbGVjdGVkX2J1ZmZlciwgY3VycmVudF9idWZmZXI7CisKKyAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVJlYWREYXRhX29wdGltIHAgPSAweCVwICBkID0gMHglcCAgcyA9ICVsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHBEYXRhLCAqcFNpemUpOworCisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcERhdGEpOworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFNpemUpOworCisgICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKKyAgICB9CisKKyAgICAvKiBQcmV2ZW50IHJlYWRpbmcgYmV5b25kIEVPRiAqLworICAgIGlmKCgqcFNpemUgPiAwKSAmJiAoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA+PSBhcENvbnRleHQtPmZpbGVTaXplKSkKKyAgICB7CisgICAgICAgIGNvcGllZFNpemUgPSAwOworICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIGEgYnVmZmVyICovCisgICAgLyogSWYgbm90LCBmaWxsIG9uZSBhY2NvcmRpbmcgdG8gcXVhbnRpemVkIHBvc2l0aW9ucyAqLworICAgIGNvcGllZFNpemUgPSAwOworICAgIGVyciA9IE00Tk9fRVJST1I7CisKKyAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKGFwQ29udGV4dCwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7CisKKyAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfUkVBREJVRkZFUl9OT05FKQorICAgIHsKKyAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoYXBDb250ZXh0LCAwKTsKKyAgICAgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKKyAgICB9CisKKyAgICBpZihlcnIgIT0gTTROT19FUlJPUikKKyAgICB7CisgICAgICAgIGlmKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpwU2l6ZSA8PSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvcGllZFNpemUgPSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZTsKKyAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGNvbnRlbnQgaW50byBwRGF0YSovCisgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MsIGNvcGllZFNpemUsIHBEYXRhKTsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNNE9TQV9UUkFDRTNfMygicmVhZCAgc2l6ZSA9ICVsdSAgYnVmZmVyID0gJWQgIHBvcyA9ICVsZCIsICpwU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7CisKKyAgICAvKiBDb3B5IGJ1ZmZlciBpbnRvIHBEYXRhICovCisgICAgd2hpbGUoKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkgJiYgKGVyciA9PSBNNE5PX0VSUk9SKSkKKyAgICB7CisgICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZS1jb3BpZWRTaXplLCBwRGF0YStjb3BpZWRTaXplKTsKKyAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKKworICAgICAgICBpZihhU2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlciA9IHNlbGVjdGVkX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKGFwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfUkVBREJVRkZFUl9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoYXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyID09IE00V0FSX05PX0RBVEFfWUVUKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSWYgd2UgZ290IGFsbCB0aGUgZGF0YSB0aGF0IHdlIHdhbnRlZCwgd2Ugc2hvdWxkIHJldHVybiBubyBlcnJvciovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFNpemUtY29waWVkU2l6ZSkgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklmIHdlIGRpZCBub3QgZ2V0IGVub3VnaCBkYXRhLCB3ZSB3aWxsIHJldHVybiBOT19EQVRBX1lFVCovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGRhdGEgcmVhZCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVNpemUgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2UgcmVhY2hlZCBlbmQgb2YgZmlsZSwgc28gc3RvcCB0cnlpbmcgdG8gcmVhZCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb3B5IHRoZSBkYXRhIHJlYWQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2UgcmVhY2hlZCBlbmQgb2YgZmlsZSwgc28gc3RvcCB0cnlpbmcgdG8gcmVhZCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitjbGVhbnVwIDoKKworICAgIC8qIFVwZGF0ZSB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyICovCisgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyBjb3BpZWRTaXplOworCisgICAgaWYoKGVyciAhPSBNNE5PX0VSUk9SKSYmKGVyciE9TTRXQVJfTk9fREFUQV9ZRVQpKQorICAgIHsKKyAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbSBzaXplID0gJWxkICBjb3BpZWQgPSAlbGQgIGVyciA9IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUsIGNvcGllZFNpemUsIGVycik7CisgICAgfQorCisgICAgLyogRWZmZWN0aXZlIGNvcGllZCBzaXplIG11c3QgYmUgcmV0dXJuZWQgKi8KKyAgICAqcFNpemUgPSBjb3BpZWRTaXplOworCisKKyAgICAvKiBSZWFkIGlzIGRvbmUgKi8KKyAgICByZXR1cm4gZXJyOworfQorCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4KKyogICAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciA6CisqICAgICAgICAgICAgICBGcm9tIHRoZSBiZWdpbm5pbmcgKHBvc2l0aW9uIE1VU1QgYmUgcG9zaXRpdmUpIDogZW5kIHBvc2l0aW9uID0gcG9zaXRpb24KKyogICAgICAgICAgICAgIEZyb20gdGhlIGVuZCAocG9zaXRpb24gTVVTVCBiZSBuZWdhdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBmaWxlIHNpemUgKyBwb3NpdGlvbgorKiAgICAgICAgICAgICAgRnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAoc2lnbmVkIG9mZnNldCkgOiBlbmQgcG9zaXRpb24gPSBjdXJyZW50IHBvc2l0aW9uICsgcG9zaXRpb24uCisqIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgorKiBAcGFyYW0gICAgICAgU2Vla01vZGUgOiAgICAgIChJTikgU2VlayBhY2Nlc3MgbW9kZS4KKyogQHBhcmFtICAgICAgIHBQb3NpdGlvbiA6ICAgICAoSU4pIFBvc2l0aW9uIGluIHRoZSBmaWxlLgorKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBTZWVrbW9kZSBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCisqIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisqIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KKyogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgU2Vla01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQoreworICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OworICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOworICAgIE00T1NBX1RSQUNFM18zKCJNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW0gcCA9IDB4JXAgbW9kZSA9ICVkIHBvcyA9ICVkIiwgcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vla01vZGUsICpwUG9zaXRpb24pOworCisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFBvc2l0aW9uKTsKKyAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIFNlZWtNb2RlKTsKKworICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KKyAgICB9CisKKyAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLworICAgIHN3aXRjaChTZWVrTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nIDoKKyAgICAgICAgICAgIGlmKCpwUG9zaXRpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSAqcFBvc2l0aW9uOworICAgICAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0VuZCA6CisgICAgICAgICAgICBpZigqcFBvc2l0aW9uID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5maWxlU2l6ZSArICpwUG9zaXRpb247CisgICAgICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA6CisgICAgICAgICAgICBpZigoKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyAqcFBvc2l0aW9uKSA+IGFwQ29udGV4dC0+ZmlsZVNpemUpIHx8CisgICAgICAgICAgICAgICAgKChhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbikgPCAwKSl7CisgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbjsKKyAgICAgICAgICAgICpwUG9zaXRpb24gPSBhcENvbnRleHQtPmFic29sdXRlUG9zOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlCisqICAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkgYW5kIGFsc28gZnJlZXMgdGhlIGNvbnRleHQuCisqIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgorKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKK3sKKyAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKKworICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOworI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgorICAgIE00T1NBX0VSUiBlcnJubyA9IE00Tk9fRVJST1I7CisjZWxzZQorICAgIE00T1NBX1VJbnQxNiBlcnJubzsKKyNlbmRpZgorCisgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0gcCA9IDB4JXAiLCBwQ29udGV4dCApOworCisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOworCisgICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyoqPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KKyAgICB9CisKKyAgICAvKiBidWZmZXIgKi8KKyAgICBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZyZWUoYXBDb250ZXh0KTsKKworICAgIC8qIENsb3NlIHRoZSBmaWxlICovCisjaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCisgICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5jbG9zZVJlYWQoYXBDb250ZXh0LT5hRmlsZURlc2MpOworCisgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCisgICAgeworICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCisgICAgICAgIGVyciA9IGVycm5vOworICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7CisgICAgfQorI2Vsc2UKKyAgICBhUmV0X1ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfQ2xvc2UoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7CisKKyAgICBpZiAoYVJldF9WYWwgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KKyAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7CisgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZENsb3NlX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKKyAgICB9CisjZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLworCisgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOworCisgICAgLy8+Pj4+IEdMTTIwMDkwMjEyIDogc2V0IHRoZSBsb3cgbGV2ZWwgZnVuY3Rpb24gc3RhdGljYWxseQorICAgIGlmIChhcENvbnRleHQtPkZTICE9IE00T1NBX05VTEwpCisgICAgeworICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpIGFwQ29udGV4dC0+RlMpOworICAgIH0KKyAgICAvLzw8PDwgR0xNMjAwOTAyMTIgOiBzZXQgdGhlIGxvdyBsZXZlbCBmdW5jdGlvbiBzdGF0aWNhbGx5CisKKyAgICAvKiBGcmVlIHRoZSBjb250ZXh0ICovCisgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWFwQ29udGV4dCk7CisKKyAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgICBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gcmVxdWlyZWQgdG8gbWFpbnRhaW4gZnVuY3Rpb24gcG9pbnRlcgorKiAgICAgICAgICAgICAgc3RydWN0dXJlLgorKiBAbm90ZSAgICAgICAgVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHJlcXVpcmVkIHRvIG1haW50YWluIGZ1bmN0aW9uIHBvaW50ZXIKKyogICAgICAgICAgICAgIHN0cnVjdHVyZS4KKyogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgorKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCisqIEBwYXJhbSAgICAgICBPcHRpb25WYWx1ZSA6ICAgKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uLgorKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbl9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgT3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBPcHRpb25WYWx1ZSkKK3sKKyAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQKKyogICAgICAgICAgICAgIHdpdGggdGhlIG9wdGlvbklELlRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZworKiAgICAgICAgICAgICAgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCisqIEBub3RlICAgICAgICBUaGUgb3B0aW9ucyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnQuCisqIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KKyogQHBhcmFtICAgICAgIE9wdGlvbklkIDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gc2V0LgorKiBAcGFyYW0gICAgICAgcE9wdGlvblZhbHVlIDogIChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24uCisqIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcENvbnRleHQgaXMgTlVMTAorKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCB0aGUgb3B0aW9uIGlkIGlzIG5vdCB2YWxpZC4KKyogQHJldHVybiAgICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRCBUaGUgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb25fb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIE9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKK3sKKyAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKKyAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKKworICAgIC8qICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7CisKKyAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLworICAgIH0KKworICAgIC8qIEdldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCisgICAgc3dpdGNoKE9wdGlvbklEKQorICAgIHsKKyAgICAgICAgLyogR2V0IEZpbGUgU2l6ZSAqLworICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplOi8qKjwgR2V0IHNpemUgb2YgdGhlIGZpbGUsIGxpbWl0ZWQgdG8gMzIgYml0IHNpemUgKi8KKworICAgICAgICAgICAgKCooTTRPU0FfVUludDMyICopcE9wdGlvblZhbHVlKSA9IGFwQ29udGV4dC0+ZmlsZVNpemU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBDaGVjayBFbmQgb2YgZmlsZSBPY2N1cnMgKi8KKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRiA6ICAgICAvKio8IFNlZSBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLworCisgICAgICAgICAgICAoKihNNE9TQV9Cb29sICopcE9wdGlvblZhbHVlKSA9IChhcENvbnRleHQtPmFic29sdXRlUG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogR2V0IEZpbGUgUG9zaXRpb24gKi8KKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24gOiAgIC8qKjwgR2V0IGZpbGUgcG9zaXRpb24gKi8KKworICAgICAgICAgICAgKihNNE9TQV9GaWxlUG9zaXRpb24gKilwT3B0aW9uVmFsdWUgPSBhcENvbnRleHQtPmFic29sdXRlUG9zOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogR2V0IEF0dHJpYnV0ZSAqLworICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGUgOiAgLyoqPCBHZXQgdGhlIGZpbGUgYXR0cmlidXRlID0gYWNjZXNzIG1vZGUgKi8KKworICAgICAgICAgICAgKCooTTRPU0FfRmlsZUF0dHJpYnV0ZSAqKXBPcHRpb25WYWx1ZSkubW9kZUFjY2VzcyA9IGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qKjwgQmFkIG9wdGlvbiBJRCAqLworICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0NoYXJTdGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGE4NjVjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0NoYXJTdGFyLmMKQEAgLTAsMCArMSwxNjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00RFBBS19DaGFyU3Rhci5jCisgKiBAaW5ncm91cAorICAqIEBicmllZiAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCisgKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDaGFyIFN0YXIgc2V0IG9mIGZ1bmN0aW9ucy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKyNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgorI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgorI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCisKKy8qIFdBUk5JTkc6IFNwZWNpZmljIEFuZHJvaWQgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cm5jcHkoKS4KKyAqIEBub3RlICAgICAgIEl0IGNvcGllcyBleGFjdGx5IGxlbjJDb3B5IGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gcFN0ck91dCwKKyAqICAgICAgICAgICAgIHRydW5jYXRpbmcgIHBTdHJJbiBvciBhZGRpbmcgbnVsbCBjaGFyYWN0ZXJzIHRvIHBTdHJPdXQgaWYKKyAqICAgICAgICAgICAgIG5lY2Vzc2FyeS4KKyAqICAgICAgICAgICAgIC0gSWYgbGVuMkNvcHkgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgcFN0ckluLAorICogICAgICAgICAgICAgICBhIG51bGwgY2hhcmFjdGVyIGlzIGFwcGVuZGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGNvcGllZAorICogICAgICAgICAgICAgICBzdHJpbmcuCisgKiAgICAgICAgICAgICAtIElmIGxlbjJDb3B5IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwgcFN0ck91dCBpcworICogICAgICAgICAgICAgICBwYWRkZWQgd2l0aCBudWxsIGNoYXJhY3RlcnMgdXAgdG8gbGVuZ3RoIGxlbjJDb3B5LgorICogICAgICAgICAgICAgLSBwU3RyT3V0IGFuZCBwU3RySW4gTVVTVCBOT1QgT1ZFUkxBUCAodGhpcyBpcyBOT1QgQ0hFQ0tFRCkuCisgKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBEZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc3RyaW5nLgorICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIFNvdXJjZSBjaGFyYWN0ZXIgc3RyaW5nLgorICogQHBhcmFtICAgICAgbGVuMkNvcHk6IChJTikgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHBTdHJJbiB0byBjb3B5LgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwU3RyT3V0IGlzIE00T1NBX05VTEwuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9jaHJOQ29weShNNE9TQV9DaGFyKiBwU3RyT3V0LCBNNE9TQV9DaGFyICAgKnBTdHJJbiwgTTRPU0FfVUludDMyIGxlbjJDb3B5KQoreworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJOQ29weVx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4LE00T1NBX1VJbnQzMiAlbGQpIiwKKyAgICAgICAgcFN0ck91dCxwU3RySW4sbGVuMkNvcHkpOworICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RyT3V0KSxNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nock5Db3B5Olx0cFN0ck91dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJJbiksTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29weTpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBzdHJuY3B5KChjaGFyICopcFN0ck91dCwgKGNvbnN0IGNoYXIgKilwU3RySW4sIChzaXplX3QpbGVuMkNvcHkpOworICAgIGlmKGxlbjJDb3B5IDw9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluKSkKKyAgICB7CisgICAgICAgIHBTdHJPdXRbbGVuMkNvcHldID0gJ1wwJzsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cm5jYXQoKS4KKyAqIEBub3RlICAgICAgIEl0IGFwcGVuZHMgYXQgbW9zdCBsZW4yQXBwZW5kIGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gdGhlIGVuZAorICogICAgICAgICAgICAgb2YgcFN0ck91dC4gVGhlIGluaXRpYWwgY2hhcmFjdGVyIG9mIHBTdHJJbiBvdmVycmlkZXMgdGhlIG51bGwKKyAqICAgICAgICAgICAgIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHBTdHJPdXQuIFRISVMgTEFTVCBOVUxMIENIQVJBQ1RFUiBJTgorICogICAgICAgICAgICAgcFN0ck91dCBNVVNUIEJFIFBSRVNFTlQuCisgKiAgICAgICAgICAgICAtIElmIGEgbnVsbCBjaGFyYWN0ZXIgYXBwZWFycyBpbiBwU3RySW4gYmVmb3JlIGxlbjJBcHBlbmQKKyAqICAgICAgICAgICAgICAgY2hhcmFjdGVycyBhcmUgYXBwZW5kZWQsIHRoZSBmdW5jdGlvbiBhcHBlbmRzIGFsbCBjaGFyYWN0ZXJzCisgKiAgICAgICAgICAgICAgIGZyb20gcFN0ckluLCB1cCB0byB0aGlzIE00T1NBX05VTEwgY2hhcmFjdGVyLgorICogICAgICAgICAgICAgLSBJZiBsZW4yQXBwZW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwgdGhlIGxlbmd0aAorICogICAgICAgICAgICAgICBvZiBwU3RySW4gaXMgdXNlZCBpbiBwbGFjZSBvZiBsZW4yQXBwZW5kLiBUaGUgcmVzdWx0aW5nIHN0cmluZworICogICAgICAgICAgICAgICBpcyB0ZXJtaW5hdGVkIHdpdGggYSBudWxsIGNoYXJhY3Rlci4KKyAqICAgICAgICAgICAgIC0gcFN0ck91dCBhbmQgcFN0ckluIE1VU1QgTk9UIE9WRVJMQVAgKHRoaXMgaXMgTk9UIENIRUNLRUQpLgorICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgRGVzdGluYXRpb24gY2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBjaGFyYWN0ZXIgc3RyaW5nIHRvIGFwcGVuZC4KKyAqIEBwYXJhbSAgICAgIGxlbjJBcHBlbmQ6IChJTikgTWF4IG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcFN0ckluIHRvIGFwcGVuZC4KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFN0ck91dCBpcyBNNE9TQV9OVUxMLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfY2hyTkNhdChNNE9TQV9DaGFyKiBwU3RyT3V0LCBNNE9TQV9DaGFyKiBwU3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4yQXBwZW5kKQoreworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJOQ2F0XHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgsTTRPU0FfVUludDMyICVsZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJPdXQscFN0ckluLGxlbjJBcHBlbmQpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJPdXQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ2F0Olx0cFN0ck91dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyTkNhdDpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBzdHJuY2F0KChjaGFyICopcFN0ck91dCwgKGNvbnN0IGNoYXIqKXBTdHJJbiwgKHNpemVfdClsZW4yQXBwZW5kKTsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3Mgc3RyY21wKCkuCisgKiBAbm90ZSAgICAgICBJdCBjb21wYXJlcyBwU3RySW4xIGFuZCBwU3RySW4yIGxleGljb2dyYXBoaWNhbGx5LgorICogICAgICAgICAgICAgVGhlIHZhbHVlIHJldHVybmVkIGluIGNtcFJlc3VsdCBpcyBncmVhdGVyIHRoYW4sIGVxdWFsIHRvLCBvcgorICogICAgICAgICAgICAgbGVzcyB0aGFuIDAsIGlmIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIGdyZWF0ZXIgdGhhbiwKKyAqICAgICAgICAgICAgIGVxdWFsIHRvLCBvciBsZXNzIHRoYW4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHBTdHJJbjIKKyAqICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4gVGhlIHNpZ24gb2YgYSBub24temVybyByZXR1cm4gdmFsdWUgaXMgZGV0ZXJtaW5lZAorICogICAgICAgICAgICAgYnkgdGhlIHNpZ24gb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWVzIG9mIHRoZSBmaXJzdAorICogICAgICAgICAgICAgcGFpciBvZiBieXRlcyB0aGF0IGRpZmZlciBpbiB0aGUgc3RyaW5ncyBiZWluZyBjb21wYXJlZC4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjE6IChJTikgRmlyc3QgY2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgU2Vjb25kIGNoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBjbXBSZXN1bHQ6IChPVVQpIENvbXBhcmlzb24gcmVzdWx0LgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbjEgcFN0ckluMiBvciBjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTC4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2NockNvbXBhcmUoTTRPU0FfQ2hhciogcFN0ckluMSwgTTRPU0FfQ2hhciogcFN0ckluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBDbXBSZXN1bHQpCit7CisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2NockNvbXBhcmVcdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCxNNE9TQV9JbnQzMiogJXgpIiwKKyAgICAgICAgICAgICAgICAgICAgcFN0ckluMSxwU3RySW4yLHBDbXBSZXN1bHQpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjEsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQ29tcGFyZTpcdHN0ckluMSBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJDb21wYXJlOlx0c3RySW4yIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ21wUmVzdWx0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockNvbXBhcmU6XHRjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTCIpOworCisgICAgKnBDbXBSZXN1bHQgPSAoTTRPU0FfSW50MzIpc3RyY21wKChjb25zdCBjaGFyICopcFN0ckluMSwgKGNvbnN0IGNoYXIgKilwU3RySW4yKTsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cm5jbXAoKS4KKyAqIEBub3RlICAgICAgIEl0IGxleGljb2dyYXBoaWNhbGx5IGNvbXBhcmVzIGF0IG1vc3QgdGhlIGZpcnN0IGxlbjJDb21wCisgKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIGluIHBTdHJJbjEgYW5kIHBTdHJJbjIuCisgKiAgICAgICAgICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgaW4gY21wUmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiwgZXF1YWwgdG8sIG9yCisgKiAgICAgICAgICAgICBsZXNzIHRoYW4gMCwgaWYgdGhlIGZpcnN0IGxlbjJDb21wIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZworICogICAgICAgICAgICAgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIGdyZWF0ZXIgdGhhbiwgZXF1YWwgdG8sIG9yIGxlc3MgdGhhbiB0aGUKKyAqICAgICAgICAgICAgIGZpcnN0IGxlbjJDb21wIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHBTdHJJbjIKKyAqICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4gVGhlIHNpZ24gb2YgYSBub24temVybyByZXR1cm4gdmFsdWUgaXMgZGV0ZXJtaW5lZAorICogICAgICAgICAgICAgYnkgdGhlIHNpZ24gb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWVzIG9mIHRoZSBmaXJzdAorICogICAgICAgICAgICAgcGFpciBvZiBieXRlcyB0aGF0IGRpZmZlciBpbiB0aGUgc3RyaW5ncyBiZWluZyBjb21wYXJlZC4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjE6IChJTikgRmlyc3QgY2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgU2Vjb25kIGNoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBsZW4yQ29tcDogKElOKSBMZW5ndGggdXNlZCBmb3IgdGhlIGNvbXBhcmlzb24uCisgKiBAcGFyYW0gICAgICBjbXBSZXN1bHQ6IChPVVQpIENvbXBhcmlzb24gcmVzdWx0LgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbjEgcFN0ckluMiBvciBjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTC4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2Nock5Db21wYXJlKE00T1NBX0NoYXIqIHBTdHJJbjEsTTRPU0FfQ2hhciogcFN0ckluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGVuMkNvbXAsIE00T1NBX0ludDMyKiBwQ21wUmVzdWx0KQoreworICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJOQ29tcGFyZVx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4LCIKKyAgICAgICAgIk00T1NBX0ludDMyICVsZCwgTTRPU0FfSW50MzIqICV4KSIscFN0ckluMSxwU3RySW4yLGxlbjJDb21wLHBDbXBSZXN1bHQpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjEsTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyTkNvbXBhcmU6XHRwU3RySW4xIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4yLE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nock5Db21wYXJlOlx0cFN0ckluMiBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENtcFJlc3VsdCxNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29tcGFyZTpcdHBDbXBSZXN1bHQgaXMgTTRPU0FfTlVMTCIpOworCisgICAgKnBDbXBSZXN1bHQgPSAoTTRPU0FfSW50MzIpc3RybmNtcCgoY29uc3QgY2hhciopcFN0ckluMSwgKGNvbnN0IGNoYXIqKXBTdHJJbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpbGVuMkNvbXApOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBjb21wYXJpc29uIG9mIHBTdHJJbjEgYW5kIHBTdHJJbjIuCisgKiBAbm90ZSAgICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgaW4gcmVzdWx0IGlzIE00T1NBX1RSVUUgaWYgdGhlIHN0cmluZworICogICAgICAgICAgICAgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIHN0cmljdGx5IGlkZW50aWNhbCB0byB0aGUgc3RyaW5nIHBvaW50ZWQKKyAqICAgICAgICAgICAgIHRvIGJ5IHBTdHJJbjIsIGFuZCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCisgKiBAcGFyYW0gICAgICBwU3RySW4xOiAoSU4pIEZpcnN0IGNoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBwU3RySW4yOiAoSU4pIFNlY29uZCBjaGFyYWN0ZXIgc3RyaW5nLgorICogQHBhcmFtICAgICAgY21wUmVzdWx0OiAoT1VUKSBDb21wYXJpc29uIHJlc3VsdC4KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4xIHBTdHJJbjIgb3IgY21wUmVzdWx0IGlzIE00T1NBX05VTEwuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9jaHJBcmVJZGVudGljYWwoTTRPU0FfQ2hhciogcFN0ckluMSwgTTRPU0FfQ2hhciogcFN0ckluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wqIHBSZXN1bHQpCit7CisgICAgTTRPU0FfVUludDMyIGkzMixsZW4zMjsKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyQXJlSWRlbnRpY2FsXHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgsIgorICAgICAgICAiTTRPU0FfSW50MzIqICV4KSIscFN0ckluMSxwU3RySW4yLHBSZXN1bHQpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjEsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQXJlSWRlbnRpY2FsOlx0cFN0ckluMSBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJBcmVJZGVudGljYWw6XHRwU3RySW4yIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUmVzdWx0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockFyZUlkZW50aWNhbDpcdHBSZXN1bHQgaXMgTTRPU0FfTlVMTCIpOworCisgICAgbGVuMzIgPSAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbjEpOworICAgIGlmKGxlbjMyICE9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluMikpCisgICAgeworICAgICAgICAqcFJlc3VsdCA9IE00T1NBX0ZBTFNFOworICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgICB9CisKKyAgICBmb3IoaTMyPTA7aTMyPGxlbjMyO2kzMisrKQorICAgIHsKKyAgICAgICAgaWYocFN0ckluMVtpMzJdICE9IHBTdHJJbjJbaTMyXSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBSZXN1bHQgPSBNNE9TQV9GQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgKnBSZXN1bHQgPSBNNE9TQV9UUlVFOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYmMncyBzdHJjaHIoKS4KKyAqIEBub3RlICAgICAgIEl0IGZpbmRzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIChpLmUuIHN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubmluZworICogICAgICAgICAgICAgb2YgdGhlIHN0cmluZykgb2YgYyBpbiBwU3RySW4gYW5kIHNldCAqcFBvaW50ZXJJblN0ciB0byB0aGlzCisgKiAgICAgICAgICAgICBwb3NpdGlvbi4KKyAqICAgICAgICAgICAgIElmIG5vIG9jY3VycmVuY2UgaXMgZm91bmQsICpwUG9pbnRlckluU3RyIGlzIHNldCB0byBNNE9TQV9OVUxMLgorICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcgd2hlcmUgdG8gc2VhcmNoLgorICogQHBhcmFtICAgICAgYzogKElOKSBDaGFyYWN0ZXIgdG8gc2VhcmNoLgorICogQHBhcmFtICAgICAgcFBvaW50ZXJJblN0cjogKE9VVCkgcG9pbnRlciBvbiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBjLgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwUG9pbnRlckluU3RyIGlzIE00T1NBX05VTEwuCisgKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTk9UX0ZPVU5EOiBubyBvY2N1cnJlbmNlIG9mIGMgZm91bmQuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9jaHJGaW5kQ2hhciAoTTRPU0FfQ2hhciogcFN0ckluLCBNNE9TQV9DaGFyIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcEluU3RyKQoreworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJGaW5kQ2hhclx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9DaGFyICVjIgorICAgICAgICAiTTRPU0FfQ2hhcioqICV4KSIscFN0ckluLGMscEluU3RyKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockZpbmRDaGFyOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSW5TdHIsTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockZpbmRDaGFyOlx0cEluU3RyIGlzIE00T1NBX05VTEwiKTsKKworICAgICpwSW5TdHIgPSAoTTRPU0FfQ2hhciopc3RyY2hyKChjb25zdCBjaGFyICopcFN0ckluLChpbnQpYyk7CisgICAgaWYoTTRPU0FfTlVMTCA9PSAqcEluU3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OT1RfRk9VTkQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgIH0KK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cnJjaHIoKS4KKyAqIEBub3RlICAgICAgIEl0IGZpbmRzIHRoZSBsYXN0IG9jY3VycmVuY2UgKGkuZS4gc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZQorICogICAgICAgICAgICAgc3RyaW5nLCBiYWNrd2FyZCkgb2YgYyBpbiBwU3RySW4gYW5kIHNldCAqcFBvaW50ZXJJblN0ciB0byB0aGlzCisgKiAgICAgICAgICAgICBwb3NpdGlvbi4KKyAqICAgICAgICAgICAgIElmIG5vIG9jY3VycmVuY2UgaXMgZm91bmQsICpwUG9pbnRlckluU3RyIGlzIHNldCB0byBNNE9TQV9OVUxMLgorICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcgd2hlcmUgdG8gc2VhcmNoLgorICogQHBhcmFtICAgICAgYzogKElOKSBDaGFyYWN0ZXIgdG8gc2VhcmNoLgorICogQHBhcmFtICAgICAgcFBvaW50ZXJJblN0cjogKE9VVCkgcG9pbnRlciBvbiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBjLgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwUG9pbnRlckluU3RyIGlzIE00T1NBX05VTEwuCisgKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTk9UX0ZPVU5EOiBubyBvY2N1cnJlbmNlIG9mIGMgZm91bmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2NoclJldmVyc2VGaW5kQ2hhcihNNE9TQV9DaGFyKiBwU3RySW4sIE00T1NBX0NoYXIgYyxNNE9TQV9DaGFyKiogcEluU3RyKQoreworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJSZXZlcnNlRmluZENoYXJcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfQ2hhciAlYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9DaGFyKiogJXgpIixwU3RySW4sYyxwSW5TdHIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyUmV2ZXJzZUZpbmRDaGFyOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSW5TdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclJldmVyc2VGaW5kQ2hhcjpcdHBJblN0ciBpcyBNNE9TQV9OVUxMIik7CisKKyAgICAqcEluU3RyID0gKE00T1NBX0NoYXIqKXN0cnJjaHIoKGNvbnN0IGNoYXIgKilwU3RySW4sKGludCljKTsKKyAgICBpZihNNE9TQV9OVUxMID09ICpwSW5TdHIpCisgICAgeworICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05PVF9GT1VORDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgfQorfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3Mgc3Ryc3BuKCkuCisgKiBAbm90ZSAgICAgICBJdCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBzdHJpbmcgcFN0ckluCisgKiAgICAgICAgICAgICB0aGF0IGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgZnJvbSBzdHJpbmcgcERlbGltaXRlcnMKKyAqICAgICAgICAgICAgIChpdCAic3BhbnMiIHRoaXMgc2V0IG9mIGNoYXJhY3RlcnMpLgorICogICAgICAgICAgICAgSWYgbm8gb2NjdXJyZW5jZSBvZiBhbnkgY2hhcmFjdGVyIHByZXNlbnQgaW4gcERlbGltaXRlcnMgaXMgZm91bmQKKyAqICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgcFN0ckluLCAqcFBvc0luU3RyIGlzIE00T1NBX05VTEwuCisgKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZyB3aGVyZSB0byBzZWFyY2guCisgKiBAcGFyYW0gICAgICBwRGVsaW1pdGVyczogKElOKSBDaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNldCBvZgorICogICAgICAgICAgICAgY2hhcmFjdGVycyB0byBzZWFyY2guCisgKiBAcGFyYW0gICAgICBwUG9zSW5TdHI6IChPVVQpIExlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50LgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiwgcERlbGltaXRlcnMgb3IgcFBvc0luU3RyIGlzIE00T1NBX05VTEwuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2NoclNwYW4oTTRPU0FfQ2hhciogcFN0ckluLE00T1NBX0NoYXIqIHBEZWxpbWl0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBQb3NJblN0cikKK3sKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyU3Bhblx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4IgorICAgICAgICAiTTRPU0FfVUludDMyKiAleCkiLHBTdHJJbixwRGVsaW1pdGVycyxwUG9zSW5TdHIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRGVsaW1pdGVycywgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU3BhbjpcdHBEZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zSW5TdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU3BhbjpcdHBQb3NJblN0ciBpcyBNNE9TQV9OVUxMIik7CisKKyAgICAqcFBvc0luU3RyID0gKE00T1NBX1VJbnQzMilzdHJzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlbGltaXRlcnMpOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYmMncyBzdHJjc3BuKCkuCisgKiBAbm90ZSAgICAgICBJdCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBzdHJpbmcgcFN0ckluCisgKiAgICAgICAgICAgICB0aGF0IGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgTk9UIGZyb20gc3RyaW5nIGRlbGltaXRlcnMKKyAqICAgICAgICAgICAgIChpdCBzcGFucyB0aGUgY29tcGxlbWVudCBvZiB0aGlzIHNldCBvZiBjaGFyYWN0ZXJzKS4KKyAqICAgICAgICAgICAgIElmIG5vIG9jY3VycmVuY2Ugb2YgYW55IGNoYXJhY3RlciBwcmVzZW50IGluIGRlbGltaXRlcnMgaXMgZm91bmQKKyAqICAgICAgICAgICAgIGluIHBTdHJJbiwgKnBQb3NJblN0ciBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiBwU3RySW4uCisgKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZyB3aGVyZSB0byBzZWFyY2guCisgKiBAcGFyYW0gICAgICBkZWxpbWl0ZXJzOiAoSU4pIENoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0aGUgc2V0IG9mCisgKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIHRvIHNlYXJjaC4KKyAqIEBwYXJhbSAgICAgIHBQb3NJblN0cjogKE9VVCkgTGVuZ3RoIG9mIHRoZSBpbml0aWFsIHNlZ21lbnQuCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluLCBkZWxpbWl0ZXJzIG9yIHBQb3NJblN0ciBpcyBNNE9TQV9OVUxMLgorICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05PVF9GT1VORDogbm8gb2NjdXJyZW5jZSBvZiBhbnkgY2hhcmFjdGVyIHByZXNlbnQgaW4KKyAqICAgICAgICAgICAgIGRlbGltaXRlcnMgaGFzIGJlZW4gZm91bmQgaW4gcFN0ckluLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9jaHJTcGFuQ29tcGxlbWVudCAoTTRPU0FfQ2hhciogcFN0ckluLCBNNE9TQV9DaGFyKiBwRGVsaW1pdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwUG9zSW5TdHIpCit7CisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2NoclNwYW5Db21wbGVtZW50XHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgiCisgICAgICAgICJNNE9TQV9VSW50MzIqICV4KSIscFN0ckluLHBEZWxpbWl0ZXJzLHBQb3NJblN0cik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuQ29tcGxlbWVudDpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcERlbGltaXRlcnMsTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuQ29tcGxlbWVudDpcdHBEZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zSW5TdHIsTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNwYW5Db21wbGVtZW50Olx0cFBvc0luU3RyIGlzIE00T1NBX05VTEwiKTsKKworICAgICpwUG9zSW5TdHIgPSAoTTRPU0FfVUludDMyKXN0cmNzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlbGltaXRlcnMpOworICAgIGlmKCpwUG9zSW5TdHIgPCAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbikpCisgICAgeworICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OT1RfRk9VTkQ7CisgICAgfQorfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3Mgc3RycGJyaygpLgorICogQG5vdGUgICAgICAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gc3RyaW5nIHBTdHJJbgorICogICAgICAgICAgICAgb2YgYW55IGNoYXJhY3RlciBmcm9tIHN0cmluZyBwRGVsaW1pdGVycywgb3IgYSBudWxsIHBvaW50ZXIgaWYKKyAqICAgICAgICAgICAgIG5vIGNoYXJhY3RlciBmcm9tIHBEZWxpbWl0ZXJzIGV4aXN0cyBpbiBwU3RySW4uIEluIHRoZSBsYXR0ZXIKKyAqICAgICAgICAgICAgIGNhc2UsIFdBUl9OT19GT1VORCBpcyByZXR1cm5lZC4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nIHdoZXJlIHRvIHNlYXJjaC4KKyAqIEBwYXJhbSAgICAgIHBEZWxpbWl0ZXJzOiAoSU4pIENoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0aGUgc2V0IG9mCisgKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIHRvIHNlYXJjaC4KKyAqIEBwYXJhbSAgICAgIHBQb2ludGVySW5TdHI6IChPVVQpIFBvaW50ZXIgb24gdGhlIGZpcnN0IGNoYXJhY3RlciBiZWxvbmdpbmcgdG8KKyAqICAgICAgICAgICAgIHBEZWxpbWl0ZXJzLgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiwgcERlbGltaXRlcnMgb3IgcFBvc0luU3RyIGlzIE00T1NBX05VTEwuCisgKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTk9UX0ZPVU5EOiBubyBvY2N1cnJlbmNlIG9mIGFueSBjaGFyYWN0ZXIgcHJlc2VudCBpbgorICogICAgICAgICAgICAgcERlbGltaXRlcnMgaGFzIGJlZW4gZm91bmQgaW4gcFN0ckluLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9jaHJQYnJrKE00T1NBX0NoYXIqIHBTdHJJbiwgTTRPU0FfQ2hhciogcERlbGltaXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgKipwUG9pbnRlckluU3RyKQoreworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJQYnJrXHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgiCisgICAgICAgICJNNE9TQV9DaGFyKiogJXgpIixwU3RySW4scERlbGltaXRlcnMscFBvaW50ZXJJblN0cik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuQ29tcGxlbWVudDpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcERlbGltaXRlcnMsTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuQ29tcGxlbWVudDpcdHBEZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9pbnRlckluU3RyLE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNwYW5Db21wbGVtZW50Olx0cFBvaW50ZXJJblN0ciBpcyBNNE9TQV9OVUxMIik7CisKKyAgICAqcFBvaW50ZXJJblN0ciA9IChNNE9TQV9DaGFyKilzdHJwYnJrKChjb25zdCBjaGFyICopcFN0ckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXBEZWxpbWl0ZXJzKTsKKyAgICBpZihNNE9TQV9OVUxMID09ICpwUG9pbnRlckluU3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OT1RfRk9VTkQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgIH0KK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cnN0cigpLgorICogQG5vdGUgICAgICAgSXQgbG9jYXRlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3RyaW5nIHBTdHJJbjIgKGV4Y2x1ZGluZworICogICAgICAgICAgICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyKSBpbiBzdHJpbmcgcFN0ckluMSBhbmQgc2V0CisgKiAgICAgICAgICAgICBwUG9pbnRlckluU3RyMSB0byB0aGUgbG9jYXRlZCBzdHJpbmcsIG9yIHRvIGEgbnVsbCBwb2ludGVyIGlmIHRoZQorICogICAgICAgICAgICAgc3RyaW5nIGlzIG5vdCBmb3VuZCwgaW4gd2hpY2ggY2FzZSBNNFdBUl9DSFJfTk9UX0ZPVU5EIGlzCisgKiAgICAgICAgICAgICByZXR1cm5lZC4gSWYgcFN0ckluMiBwb2ludHMgdG8gYSBzdHJpbmcgd2l0aCB6ZXJvIGxlbmd0aCAodGhhdAorICogICAgICAgICAgICAgaXMsIHRoZSBzdHJpbmcgIiIpLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBwU3RySW4xLgorICogQHBhcmFtICAgICAgcFN0ckluMTogKElOKSBDaGFyYWN0ZXIgc3RyaW5nIHdoZXJlIHRvIHNlYXJjaC4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgQ2hhcmFjdGVyIHN0cmluZyB0byBzZWFyY2guCisgKiBAcGFyYW0gICAgICBwUG9pbnRlckluU3RyMTogKE9VVCkgUG9pbnRlciBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHBTdHJJbjIKKyAqICAgICAgICAgICAgIGluIHBTdHJJbjEuCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluMSwgcFN0ckluMiBvciBwUG9pbnRlckluU3RyMSBpcyBNNE9TQV9OVUxMLgorICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05PVF9GT1VORDogbm8gb2NjdXJyZW5jZSBvZiBwU3RySW4yIGhhcyBiZWVuIGZvdW5kIGluCisgKiAgICAgICAgICAgICBwU3RySW4xLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9jaHJGaW5kUGF0dGVybihNNE9TQV9DaGFyKiBwU3RySW4xLCBNNE9TQV9DaGFyKiBwU3RySW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiBwUG9pbnRlckluU3RyMSkKK3sKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyRmluZFBhdHRlcm5cdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCIKKyAgICAgICAgIk00T1NBX0NoYXIqKiAleCkiLHBTdHJJbjEscFN0ckluMixwUG9pbnRlckluU3RyMSk7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMSxNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJGaW5kUGF0dGVybjpcdHBTdHJJbjEgaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjIsTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyRmluZFBhdHRlcm46XHRwU3RySW4yIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9pbnRlckluU3RyMSxNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockZpbmRQYXR0ZXJuOlx0cFBvaW50ZXJJblN0cjEgaXMgTTRPU0FfTlVMTCIpOworCisgICAgKnBQb2ludGVySW5TdHIxID0gKE00T1NBX0NoYXIqKXN0cnN0cigoY29uc3QgY2hhciAqKXBTdHJJbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXBTdHJJbjIpOworICAgIGlmKE00T1NBX05VTEwgPT0gKnBQb2ludGVySW5TdHIxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OT1RfRk9VTkQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgIH0KK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cmxlbigpLgorICogQG5vdGUgICAgICAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gcFN0ckluLCBub3QgaW5jbHVkaW5nCisgKiAgICAgICAgICAgICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCisgKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGhhdmUgbm8gcmV0dXJuIGNvZGUuIEl0IGRvZXMgbm90IGNoZWNrIHRoYXQgcFN0ckluCisgKiAgICAgICAgICAgICBkb2VzIG5vdCBwb2ludCB0byBudWxsLCBub3IgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgc3RyaW5nIChpLmUuCisgKiAgICAgICAgICAgICBudWxsLXRlcm1pbmF0ZWQpLgorICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCisgKiBAcmV0dXJuICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBwU3RySW4uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfVUludDMyIE00T1NBX2Nockxlbmd0aChNNE9TQV9DaGFyKiBwU3RySW4pCit7CisgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2Nockxlbmd0aFx0KE00T1NBX0NoYXIqICV4KSIscFN0ckluKTsKKyAgICByZXR1cm4gKE00T1NBX1VJbnQzMilzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RySW4pOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3MgdG9sb3dlcigpLgorICogQG5vdGUgICAgICAgSXQgY29udmVydHMgdGhlIGNoYXJhY3RlciB0byBsb3dlciBjYXNlLCBpZiBwb3NzaWJsZSBhbmQKKyAqICAgICAgICAgICAgIGFwcHJvcHJpYXRlLCBhbmQgcmV0dXJucyBpdC4KKyAqIEBwYXJhbSAgICAgIGNJbjogKElOKSBJbnB1dCBjaGFyYWN0ZXIgdG8gY29udmVydC4KKyAqIEByZXR1cm4gICAgIGNvbnZlcnRlZCBjaGFyYWN0ZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfQ2hhciBNNE9TQV9jaHJUb0xvd2VyIChNNE9TQV9DaGFyIGNJbikKK3sKKyAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfY2hyVG9Mb3dlclx0KE00T1NBX0NoYXIgJWMpIixjSW4pOworICAgIHJldHVybiAoTTRPU0FfQ2hhcil0b2xvd2VyKChpbnQpY0luKTsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHRvdXBwZXIoKS4KKyAqIEBub3RlICAgICAgIEl0IGNvbnZlcnRzIHRoZSBjaGFyYWN0ZXIgdG8gdXBwZXIgY2FzZSwgaWYgcG9zc2libGUgYW5kCisgKiAgICAgICAgICAgICBhcHByb3ByaWF0ZSwgYW5kIHJldHVybnMgaXQuCisgKiBAcGFyYW0gICAgICBjSW46IChJTikgSW5wdXQgY2hhcmFjdGVyIHRvIGNvbnZlcnQuCisgKiBAcmV0dXJuICAgICBjb252ZXJ0ZWQgY2hhcmFjdGVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0NoYXIgTTRPU0FfY2hyVG9VcHBlcihNNE9TQV9DaGFyIGNJbikKK3sKKyAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfY2hyVG9VcHBlclx0KE00T1NBX0NoYXIgJWMpIixjSW4pOworICAgIHJldHVybiAoTTRPU0FfQ2hhcil0b3VwcGVyKChpbnQpY0luKTsKK30KKworCitNNE9TQV9FUlIgTTRPU0FfY2hyR2V0V29yZChNNE9TQV9DaGFyKiAgICBwU3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiAgICBwQmVnaW5EZWxpbWl0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogICAgcEVuZERlbGltaXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiAgICBwU3RyT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKnBTdHJPdXRNYXhMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcE91dHB1dFBvaW50ZXIpCit7CisgICAgTTRPU0FfQ2hhciAgICpwVGVtcDsKKyAgICBNNE9TQV9VSW50MzIgIHBvczsKKyAgICBNNE9TQV9FUlIgICAgIGVycm9yQ29kZTsKKworICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRXb3JkXHQoTTRPU0FfQ2hhciogJXgsLi4uLC4uLixNNE9TQV9DaGFyKiAleCwiCisgICAgICAgICJNNE9TQV9VSW50MzIqICV4LE00T1NBX0NoYXIqKiAleCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RySW4scFN0ck91dCxwU3RyT3V0TWF4TGVuLHBPdXRwdXRQb2ludGVyKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0V29yZDpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEJlZ2luRGVsaW1pdGVycywgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRXb3JkOlx0YmVnaW5EZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRW5kRGVsaW1pdGVycywgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFdvcmQ6XHRlbmREZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyT3V0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0V29yZDpcdHBTdHJPdXQgaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJPdXRNYXhMZW4sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0V29yZDpcdHN0ck91dE1heExlbiBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBlcnJvckNvZGUgPSBNNE9TQV9jaHJTcGFuKHBTdHJJbiwgcEJlZ2luRGVsaW1pdGVycywgJnBvcyk7CisgICAgcFRlbXAgICAgID0gcFN0ckluICsgcG9zOworICAgIGVycm9yQ29kZSA9IE00T1NBX2NoclNwYW5Db21wbGVtZW50KHBUZW1wLCBwRW5kRGVsaW1pdGVycywgJnBvcyk7CisgICAgaWYocG9zID4gKnBTdHJPdXRNYXhMZW4pCisgICAgeworICAgICAgICAqcFN0ck91dE1heExlbiA9IHBvczsKKyAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1c7CisgICAgfQorICAgIGlmKHBvcykKKyAgICB7CisgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcFN0ck91dCwoTTRPU0FfTWVtQWRkcjgpcFRlbXAsIHBvcyk7CisgICAgfQorICAgIHBTdHJPdXRbcG9zXSAgID0gJ1wwJzsKKyAgICBpZihNNE9TQV9OVUxMICE9IHBPdXRwdXRQb2ludGVyKQorICAgIHsKKyAgICAgICAgKnBPdXRwdXRQb2ludGVyID0gcFRlbXAgKyBwb3M7CisgICAgfQorICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX1VJbnQzMiBmcm9tIHN0cmluZy4KKyAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQorICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9VSW50MzIgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQorICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKKyAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0CisgKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAorICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCisgKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgorICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDMyX01BWC4KKyAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgorICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgorICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KKyAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgorICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgorICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX1VJTlQzMl9NQVguCisgKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTkVHQVRJVkU6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBuZWdhdGl2ZQorICogICAgICAgICAgICAgbnVtYmVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIoTTRPU0FfQ2hhciogICAgcFN0ckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqICAgIHBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiAgICBwU3RyT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0FfVUludDMyIHVsOworICAgIGNoYXIqICAgICAgICBwVGVtcDsKKworICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRVSW50MzJcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfVUludDMyKiAleCIKKyAgICAgICAgIk00T1NBX0NoYXIqKiAleCxNNE9TQV9jaHJOdW1CYXNlICVkKSIscFN0ckluLHBWYWwscFN0ck91dCxiYXNlKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQzMjpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MzI6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKKworICAgIGVycm5vID0gMDsKKyAgICBzd2l0Y2goYmFzZSkKKyAgICB7CisgICAgY2FzZSBNNE9TQV9rY2hyRGVjOgorICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwgMTApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE00T1NBX2tjaHJIZXhhOgorICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKKyAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsOCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KKyAgICBpZigoTTRPU0FfQ2hhciopcFRlbXAgPT0gcFN0ckluKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSAwOworICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOworICAgIH0KKworICAgIC8qIHdhcyB0aGUgbnVtYmVyIG5lZ2F0aXZlID8gKi8KKyAgICBpZigqKHBTdHJJbitzdHJzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sIiBcdCIpKSA9PSAnLScpCisgICAgeworICAgICAgICAqcFZhbCA9IDA7CisgICAgICAgIHJldHVybiBNNFdBUl9DSFJfTkVHQVRJVkU7CisgICAgfQorCisgICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLworICAgIGlmKGVycm5vID09IEVSQU5HRSkKKyAgICB7CisgICAgICAgICpwVmFsID0gTTRPU0FfVUlOVDMyX01BWDsKKyAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQorICAgICAgICB7CisgICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBub21pbmFsIGNhc2UgKi8KKyAgICAqcFZhbCA9IChNNE9TQV9VSW50MzIpdWw7CisgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQorICAgIHsKKyAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7CisgICAgfQorCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfVUludDE2IGZyb20gc3RyaW5nLgorICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgZmlyc3Qgc2V0IG9mIG5vbi13aGl0ZXNwYWNlCisgKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIHBTdHJJbiB0byBhIE00T1NBX1VJbnQxNiB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCisgKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcworICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKKyAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgorICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90CisgKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgorICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG5lZ2F0aXZlIG51bWJlciwgcFN0ck91dCBpcyBub3QgdXBkYXRlZCwgYW5kIHBWYWwgaXMKKyAqICAgICAgICAgICAgICAgc2V0IHRvIG51bGwuCisgKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbnVtZXJpY2FsIG92ZXJmbG93LCBwVmFsIGlzIHNldCB0byBNNE9TQV9VSU5UMTZfTUFYLgorICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCisgKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCisgKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgorICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCisgKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCisgKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfVUlOVDE2X01BWC4KKyAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9ORUdBVElWRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG5lZ2F0aXZlCisgKiAgICAgICAgICAgICBudW1iZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQxNiAoTTRPU0FfQ2hhciogcFN0ckluLCBNNE9TQV9VSW50MTYgKnBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcFN0ck91dCwgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX1VJbnQzMiB1bDsKKyAgICBjaGFyKiAgICAgICAgcFRlbXA7CisKKyAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0VUludDE2XHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQxNiogJXgiCisgICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQxNjpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MTY6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKKworICAgIHN3aXRjaChiYXNlKQorICAgIHsKKyAgICBjYXNlIE00T1NBX2tjaHJEZWM6CisgICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDEwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNNE9TQV9rY2hySGV4YToKKyAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsMTYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE00T1NBX2tjaHJPY3Q6CisgICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgIH0KKworICAgIC8qIGhhcyBjb252ZXJzaW9uIGZhaWxlZCA/ICovCisgICAgaWYoKE00T1NBX0NoYXIqKXBUZW1wID09IHBTdHJJbikKKyAgICB7CisgICAgICAgICpwVmFsID0gMDsKKyAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9DT05WX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvKiB3YXMgdGhlIG51bWJlciBuZWdhdGl2ZSA/ICovCisgICAgaWYoKihwU3RySW4rc3Ryc3BuKChjb25zdCBjaGFyICopcFN0ckluLCIgXHQiKSkgPT0gJy0nKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSAwOworICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05FR0FUSVZFOworICAgIH0KKworICAgIC8qIGhhcyBhbiBvdmVyZmxvdyBvY2N1cmVkID8gKi8KKyAgICBpZih1bD5NNE9TQV9VSU5UMTZfTUFYKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSBNNE9TQV9VSU5UMTZfTUFYOworICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOworICAgIH0KKworICAgIC8qIG5vbWluYWwgY2FzZSAqLworICAgICpwVmFsID0gKE00T1NBX1VJbnQxNil1bDsKKyAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCisgICAgeworICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKKyAgICB9CisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfVUludDggZnJvbSBzdHJpbmcuCisgKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKKyAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfVUludDggdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQorICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKKyAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0CisgKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAorICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCisgKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgorICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDhfTUFYLgorICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCisgKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCisgKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgorICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCisgKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCisgKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfVUlOVDhfTUFYLgorICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05FR0FUSVZFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbmVnYXRpdmUKKyAqICAgICAgICAgICAgIG51bWJlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDgoTTRPU0FfQ2hhciogICAgICAgIHBTdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogICAgcFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0FfVUludDMyIHVsOworICAgIGNoYXIqICAgICAgICBwVGVtcDsKKworICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRVSW50OFx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9VSW50OCogJXgiCisgICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDg6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQ4Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBzd2l0Y2goYmFzZSkKKyAgICB7CisgICAgY2FzZSBNNE9TQV9rY2hyRGVjOgorICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwgMTApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE00T1NBX2tjaHJIZXhhOgorICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwgMTYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE00T1NBX2tjaHJPY3Q6CisgICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLworICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCisgICAgeworICAgICAgICAqcFZhbCA9IDA7CisgICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisgICAgLyogd2FzIHRoZSBudW1iZXIgbmVnYXRpdmUgPyAqLworICAgIGlmKCoocFN0ckluK3N0cnNwbigoY29uc3QgY2hhciAqKXBTdHJJbiwiIFx0IikpID09ICctJykKKyAgICB7CisgICAgICAgICpwVmFsID0gMDsKKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9ORUdBVElWRTsKKyAgICB9CisKKyAgICAvKiBoYXMgYW4gb3ZlcmZsb3cgb2NjdXJlZCA/ICovCisgICAgaWYodWw+TTRPU0FfVUlOVDhfTUFYKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSBNNE9TQV9VSU5UOF9NQVg7CisgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7CisgICAgfQorCisgICAgLyogbm9taW5hbCBjYXNlICovCisgICAgKnBWYWwgPSAoTTRPU0FfVUludDgpdWw7CisgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQorICAgIHsKKyAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7CisgICAgfQorICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX0ludDY0IGZyb20gc3RyaW5nLgorICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgZmlyc3Qgc2V0IG9mIG5vbi13aGl0ZXNwYWNlCisgKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIHBTdHJJbiB0byBhIE00T1NBX0ludDY0IHZhbHVlIHBWYWwsIGFzc3VtaW5nIGEKKyAqICAgICAgICAgICAgIGRlY2ltYWwgcmVwcmVzZW50YXRpb24uIHBTdHJPdXQgaXMgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKyAqICAgICAgICAgICAgIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzCisgKiAgICAgICAgICAgICBiZWVuIGNvbnZlcnRlZC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAorICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBwVmFsIGlzIHNldCB0bworICogICAgICAgICAgICAgICBNNE9TQV9JTlQ2NF9NQVggb3IgTTRPU0FfSU5UNjRfTUlOIHJlc3BlY3RpdmVseS4KKyAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgorICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgorICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgKiAgICAgICAgICAgICBGT1IgVEhFIE1PTUVOVCwgT05MWSBERUNJTUFMIFJFUFJFU0VOVEFUSU9OIElTIEhBTkRMRUQuCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KKyAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgorICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgorICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX0lOVDY0X01BWCBvciBsZXNzIHRoYW4gTTRPU0FfSU5UNjRfTUlOCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2NockdldEludDY0KE00T1NBX0NoYXIqIHBTdHJJbiwgTTRPU0FfSW50NjQqIHBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHBTdHJPdXQsIE00T1NBX2Nock51bUJhc2UgYmFzZSkKK3sKKyNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECisgICAgTTRPU0FfSW50NjQgICAgIG1heFZhbCAgID0gIE00T1NBX0lOVDY0X01BWDsgLyogdGhpcyBpcyAyXjYzLTEgKi8KKyAgICBNNE9TQV9JbnQ2NCAgICAgbWluVmFsICAgPSAgTTRPU0FfSU5UNjRfTUlOOyAvKiB0aGlzIGlzIC0yXjYzKzEgKi8KKyAgICBNNE9TQV9DaGFyICAgbWF4U3RyW10gPSAgIjkyMjMzNzIwMzY4NTQ3NzU4MDciOworICAgIE00T1NBX0NoYXIqICBiZWdpbk51bTsKKyAgICBNNE9TQV9VSW50MzIgbWF4TGVuICAgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKiltYXhTdHIpOworICAgIE00T1NBX1VJbnQzMiBjaHJDb3VudCA9IDA7CisgICAgTTRPU0FfVUludDggIG5lZ2F0aXZlID0gMDsKKworICAgIE00T1NBX1RSQUNFMV80KChNNE9TQV9DaGFyICopIk00T1NBX2NockdldEludDY0XHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQ2NCogJXgiCisgICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0SW50NjQ6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldEludDY0Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBzd2l0Y2goYmFzZSkKKyAgICB7CisgICAgY2FzZSBNNE9TQV9rY2hyRGVjOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIE00T1NBX2tjaHJPY3Q6CisgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7CisgICAgY2FzZSBNNE9TQV9rY2hySGV4YToKKyAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgIH0KKworICAgIC8qIHRyaW0gYmxhbmsgY2hhcmFjdGVycyAqLworICAgIHdoaWxlICgqcFN0ckluID09ICcgJyB8fCAqcFN0ckluID09ICdcdCcpIHBTdHJJbisrOworCisgICAgLyogZ2V0IHRoZSBzaWduICovCisgICAgaWYgKCpwU3RySW4gPT0gJysnKSBwU3RySW4rKzsKKyAgICBlbHNlIGlmICgqcFN0ckluID09ICctJykKKyAgICB7CisgICAgICAgIG5lZ2F0aXZlID0gMTsKKyAgICAgICAgcFN0ckluKys7CisgICAgfQorICAgIGJlZ2luTnVtID0gcFN0ckluOworCisgICAgLyogZ2V0IHRoZSBsZW5ndGggb2YgdGhlIG51bWVyaWNhbCBwYXJ0ICovCisgICAgd2hpbGUoKCpwU3RySW4gPj0gJzAnKSAmJiAoKnBTdHJJbiA8PSAnOScpKQorICAgIHsKKyAgICAgICAgcFN0ckluKys7CisgICAgICAgIGNockNvdW50Kys7CisgICAgfQorCisgICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KKyAgICBpZighY2hyQ291bnQpCisgICAgeworICAgICAgICAqcFZhbCA9IDA7CisgICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisgICAgLyogaGFzIG92ZXJmbG93IChvciB1bmRlcmZsb3cpIG9jY3VyZWQgPyAqLworICAgIGlmKChjaHJDb3VudCA+IG1heExlbikgLyogb2J2aW91cyBvdmVyZmxvdyAob3IgdW5kZXJmbG93KSAqLworICAgICAgICB8fAorICAgICAgICAoKGNockNvdW50ID09IG1heExlbikgJiYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKiliZWdpbk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW1heFN0ciwgbWF4TGVuKSA+IDApKSkKKyAgICAgICAgLyogbGVzcyBvYnZpb3VzIG92ZXJmbG93IChvciB1bmRlcmZsb3cpICovCisgICAgeworICAgICAgICBpZihuZWdhdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBWYWwgPSBtaW5WYWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcFZhbCA9IG1heFZhbDsKKyAgICAgICAgfQorICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU3RyT3V0ID0gYmVnaW5OdW0rY2hyQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7CisgICAgfQorCisgICAgLyogbm9taW5hbCBjYXNlICovCisgICAgcFN0ckluID0gYmVnaW5OdW07CisgICAgKnBWYWwgID0gMDsKKyAgICB3aGlsZSgoKnBTdHJJbiA+PSAnMCcpICYmICgqcFN0ckluIDw9ICc5JykpCisgICAgeworICAgICAgICAqcFZhbCA9ICgqcFZhbCkqMTAgKyAoKnBTdHJJbisrIC0gJzAnKTsKKyAgICB9CisgICAgaWYobmVnYXRpdmUpCisgICAgeworICAgICAgICAqcFZhbCA9IC0qcFZhbDsKKyAgICB9CisgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQorICAgIHsKKyAgICAgICAgKnBTdHJPdXQgPSBwU3RySW47CisgICAgfQorICAgIHJldHVybiBNNE5PX0VSUk9SOworI2VsaWYgZGVmaW5lZCBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAorICAgIHJldHVybihNNE9TQV9jaHJHZXRJbnQzMihwU3RySW4sIChNNE9TQV9JbnQzMiopIHBWYWwsIHBTdHJPdXQsIE00T1NBX2tjaHJEZWMpKTsKKyNlbHNlCisgICAgcmV0dXJuKE00RVJSX05PVF9JTVBMRU1FTlRFRCk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfSW50MzIgZnJvbSBzdHJpbmcuCisgKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKKyAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfSW50MzIgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQorICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKKyAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0CisgKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAorICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBwVmFsIGlzIHNldCB0bworICogICAgICAgICAgICAgICBNNE9TQV9JTlQzMl9NQVggb3IgTTRPU0FfSU5UMzJfTUlOIHJlc3BlY3RpdmVseS4KKyAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgorICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgorICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KKyAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgorICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgorICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX0lOVDMyX01BWCBvciBsZXNzIHRoYW4gTTRPU0FfSU5UMzJfTUlOCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2NockdldEludDMyKE00T1NBX0NoYXIqICAgICAgICBwU3RySW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqICAgIHBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqICAgIHBTdHJPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX0ludDMyIGw7CisgICAgY2hhciogICAgICAgcFRlbXA7CisKKyAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0SW50MzJcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfSW50MzIqICV4IgorICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbixNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0SW50MzI6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0SW50MzI6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKKworICAgIGVycm5vID0gMDsKKyAgICBzd2l0Y2goYmFzZSkKKyAgICB7CisgICAgY2FzZSBNNE9TQV9rY2hyRGVjOgorICAgICAgICBsID0gc3RydG9sKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNNE9TQV9rY2hySGV4YToKKyAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKKyAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLworICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCisgICAgeworICAgICAgICAqcFZhbCA9IDA7CisgICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisgICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLworICAgIGlmKChlcnJubyA9PSBFUkFOR0UpICYmIChsID09IE00T1NBX0lOVDMyX01BWCkpCisgICAgeworICAgICAgICAqcFZhbCA9IE00T1NBX0lOVDMyX01BWDsKKyAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQorICAgICAgICB7CisgICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBoYXMgYW4gdW5kZXJmbG93IG9jY3VyZWQgPyAqLworICAgIGlmKChlcnJubyA9PSBFUkFOR0UpICYmIChsID09ICBNNE9TQV9JTlQzMl9NSU4pKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSBNNE9TQV9JTlQzMl9NSU47CisgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7CisgICAgfQorCisgICAgLyogbm9taW5hbCBjYXNlICovCisgICAgKnBWYWwgPSAoTTRPU0FfSW50MzIpbDsKKyAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCisgICAgeworICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9JbnQxNiBmcm9tIHN0cmluZy4KKyAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQorICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9JbnQxNiB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCisgKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcworICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKKyAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgorICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90CisgKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgorICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHBWYWwgaXMgc2V0IHRvCisgKiAgICAgICAgICAgICAgIE00T1NBX0lOVDE2X01BWCBvciBNNE9TQV9JTlQxNl9NSU4gcmVzcGVjdGl2ZWx5LgorICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCisgKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCisgKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgorICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCisgKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCisgKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfSU5UMTZfTUFYIG9yIGxlc3MgdGhhbiBNNE9TQV9JTlQxNl9NSU4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfY2hyR2V0SW50MTYoTTRPU0FfQ2hhciogICAgICAgIHBTdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiogICAgcFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0FfSW50MzIgbDsKKyAgICBjaGFyKiAgICAgICBwVGVtcDsKKworICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRJbnQxNlx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9JbnQxNiogJXgiCisgICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0SW50MTY6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldEludDE2Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBzd2l0Y2goYmFzZSkKKyAgICB7CisgICAgY2FzZSBNNE9TQV9rY2hyRGVjOgorICAgICAgICBsID0gc3RydG9sKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNNE9TQV9rY2hySGV4YToKKyAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKKyAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLworICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCisgICAgeworICAgICAgICAqcFZhbCA9IDA7CisgICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisgICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLworICAgIGlmKGw+TTRPU0FfSU5UMTZfTUFYKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSBNNE9TQV9JTlQxNl9NQVg7CisgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7CisgICAgfQorCisgICAgLyogaGFzIGFuIHVuZGVyZmxvdyBvY2N1cmVkID8gKi8KKyAgICBpZihsPE00T1NBX0lOVDE2X01JTikKKyAgICB7CisgICAgICAgICpwVmFsID0gTTRPU0FfSU5UMTZfTUlOOworICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOworICAgIH0KKworICAgIC8qIG5vbWluYWwgY2FzZSAqLworICAgICpwVmFsID0gKE00T1NBX1VJbnQxNilsOworICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKKyAgICB7CisgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOworICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX0ludDggZnJvbSBzdHJpbmcuCisgKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKKyAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfSW50OCB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCisgKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcworICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKKyAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgorICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90CisgKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgorICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHBWYWwgaXMgc2V0IHRvCisgKiAgICAgICAgICAgICAgIE00T1NBX0lOVDhfTUFYIG9yIE00T1NBX0lOVDhfTUlOIHJlc3BlY3RpdmVseS4KKyAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgorICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgorICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCisgKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KKyAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgorICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgorICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX0lOVDhfTUFYIG9yIGxlc3MgdGhhbiBNNE9TQV9JTlQ4X01JTgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9jaHJHZXRJbnQ4KE00T1NBX0NoYXIqICAgIHBTdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDgqICAgIHBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSkKK3sKKyAgICBNNE9TQV9JbnQzMiBsOworICAgIGNoYXIqICAgICAgIHBUZW1wOworCisgICAgTTRPU0FfVFJBQ0UxXzQoIk00T1NBX2NockdldEludDhcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfSW50OCogJXgiCisgICAgICAgICAgICAgICAgICAgIk00T1NBX0NoYXIqKiAleCxNNE9TQV9jaHJOdW1CYXNlICVkKSIscFN0ckluLHBWYWwscFN0ck91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldEludDg6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRJbnQ4Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBzd2l0Y2goYmFzZSkKKyAgICB7CisgICAgY2FzZSBNNE9TQV9rY2hyRGVjOgorICAgICAgICBsID0gc3RydG9sKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNNE9TQV9rY2hySGV4YToKKyAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCAxNik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKKyAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLworICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCisgICAgeworICAgICAgICAqcFZhbCA9IDA7CisgICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisgICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLworICAgIGlmKGw+TTRPU0FfSU5UOF9NQVgpCisgICAgeworICAgICAgICAqcFZhbCA9IE00T1NBX0lOVDhfTUFYOworICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOworICAgIH0KKworICAgIC8qIGhhcyBhbiB1bmRlcmZsb3cgb2NjdXJlZCA/ICovCisgICAgaWYobDxNNE9TQV9JTlQ4X01JTikKKyAgICB7CisgICAgICAgICpwVmFsID0gTTRPU0FfSU5UOF9NSU47CisgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7CisgICAgfQorCisgICAgLyogbm9taW5hbCBjYXNlICovCisgICAgKnBWYWwgPSAoTTRPU0FfVUludDgpbDsKKyAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCisgICAgeworICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9Eb3VibGUgZnJvbSBzdHJpbmcuCisgKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKKyAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfRG91YmxlIHZhbHVlIHBWYWwuIHBTdHJPdXQgaXMgc2V0CisgKiAgICAgICAgICAgICB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0CisgKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAorICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KKyAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBwVmFsIGlzIHNldCB0byBudWxsCisgKiAgICAgICAgICAgICAtIGlmIHBTdHJPdXQgaXMgbm90IHRvIGJlIHVzZWQsIGl0IGNhbiBiZSBzZXQgdG8gTTRPU0FfTlVMTC4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nLgorICogQHBhcmFtICAgICAgcFZhbDogKE9VVCkgcmVhZCB2YWx1ZS4KKyAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIE91dHB1dCBjaGFyYWN0ZXIgc3RyaW5nLgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwVmFsIGlzIE00T1NBX05VTEwuCisgKiBAcmV0dXJuICAgICBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ6IGNvbnZlcnNpb24gZmFpbHVyZS4KKyAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9OVU1fUkFOR0U6IGFuIHVuZGVyZmxvdyBvciBvdmVyZmxvdyBvY2N1cnMgZHVyaW5nIHRoZQorICogICAgICAgICAgICAgY29udmVyc2lvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfY2hyR2V0RG91YmxlKE00T1NBX0NoYXIqICAgIHBTdHJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiAgICBwVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCkKK3sKKyAgICBNNE9TQV9Eb3VibGUgZDsKKyAgICBjaGFyKiAgICAgICAgcFRlbXA7CisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyR2V0RG91YmxlXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX0RvdWJsZSogJXgiCisgICAgICAgICJNNE9TQV9DaGFyKiogJXgpIixwU3RySW4scFZhbCxwU3RyT3V0KTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldERvdWJsZTpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXREb3VibGU6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKKworICAgIGVycm5vID0gMDsKKyAgICBkID0gc3RydG9kKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXApOworCisgICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KKyAgICBpZigoTTRPU0FfQ2hhciopcFRlbXAgPT0gcFN0ckluKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSAwLjA7CisgICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisgICAgLyogaGFzIGFuIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBvY2N1cmVkID8gKi8KKyAgICBpZihlcnJubyA9PSBFUkFOR0UpCisgICAgeworICAgICAgICAqcFZhbCA9IDAuMDsKKyAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQorICAgICAgICB7CisgICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBub21pbmFsIGNhc2UgKi8KKyAgICAqcFZhbCA9IChNNE9TQV9Eb3VibGUpZDsKKyAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCisgICAgeworICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9UaW1lIGZyb20gc3RyaW5nLgorICogQG5vdGUgICAgICAgU2luY2UsIE00T1NBX1RpbWUgaXMgZGVmaW5lZCBhcyBNNE9TQV9JbnQ2NCwgaXQgY2FsbHMKKyAqICAgICAgICAgICAgIE00T1NBX2NockdldEludDY0KCkuCisgKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCisgKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KKyAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgorICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCisgKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCisgKiAgICAgICAgICAgICBvdXQgb2YgcmFuZ2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2NockdldFRpbWUoTTRPU0FfQ2hhciogICAgcFN0ckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSogICAgcFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiAgICBwU3RyT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRUaW1lXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1RpbWUqICV4IgorICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRUaW1lOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVmFsLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VGltZTpcdHBWYWwgaXMgTTRPU0FfTlVMTCIpOworCisgICAgcmV0dXJuIE00T1NBX2NockdldEludDY0KHBTdHJJbiwoTTRPU0FfSW50NjQqKXBWYWwscFN0ck91dCxiYXNlKTsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9GaWxlUG9zaXRpb24gZnJvbSBzdHJpbmcuCisgKiBAbm90ZSAgICAgICBEZXBlbmRpbmcgb24gdGhlIE00T1NBX0ZpbGVQb3NpdGlvbiBkZWZpbml0aW9uLCB0aGlzIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICBjYWxscyB0aGUgY29ycmVzcG9kaW5nIHVuZGVybHlpbmcgdHlwZS4KKyAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nLgorICogQHBhcmFtICAgICAgcFZhbDogKE9VVCkgcmVhZCB2YWx1ZS4KKyAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIE91dHB1dCBjaGFyYWN0ZXIgc3RyaW5nLgorICogQHBhcmFtICAgICAgYmFzZTogKElOKSBCYXNlIG9mIHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwVmFsIGlzIE00T1NBX05VTEwuCisgKiBAcmV0dXJuICAgICBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ6IGNvbnZlcnNpb24gZmFpbHVyZS4KKyAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9OVU1fUkFOR0U6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBudW1iZXIKKyAqICAgICAgICAgICAgIG91dCBvZiByYW5nZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfY2hyR2V0RmlsZVBvc2l0aW9uKE00T1NBX0NoYXIqICAgICAgICAgICAgcFN0ckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qICAgIHBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiAgICAgICAgICAgIHBTdHJPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgICAgICAgIGJhc2UpCit7CisgICAgTTRPU0FfVFJBQ0UxXzQoIk00T1NBX2NockdldEZpbGVQb3NpdGlvblx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9GaWxlUG9zaXRpb24qICV4IgorICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0RmlsZVBvc2l0aW9uOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVmFsLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldEZpbGVQb3NpdGlvbjpcdHBWYWwgaXMgTTRPU0FfTlVMTCIpOworCisjaWZkZWYgTTRPU0FfRklMRV9QT1NfNjRfQklUU19TVVBQT1JURUQKKyAgICByZXR1cm4gTTRPU0FfY2hyR2V0SW50NjQocFN0ckluLChNNE9TQV9JbnQ2NCopcFZhbCxwU3RyT3V0LGJhc2UpOworI2Vsc2UKKyAgICByZXR1cm4gTTRPU0FfY2hyR2V0SW50MzIocFN0ckluLChNNE9TQV9JbnQzMiopcFZhbCxwU3RyT3V0LGJhc2UpOworI2VuZGlmCisKK30KKworTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYoTTRPU0FfQ2hhciAgKnBTdHJPdXQsIE00T1NBX1VJbnQzMiBzdHJPdXRNYXhMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgICAgICAgbWFya2VyOworICAgIE00T1NBX0NoYXIgICAqcFRlbXA7CisgICAgTTRPU0FfQ2hhciAgICpwZXJjZW50UG9pbnRlcjsKKyAgICBNNE9TQV9DaGFyICAgKm5ld0Zvcm1hdDsKKyAgICBNNE9TQV9JbnQzMiAgbmV3Rm9ybWF0TGVuZ3RoPTA7CisgICAgTTRPU0FfVUludDMyICBjb3VudF9sbCA9IDA7CisgICAgTTRPU0FfVUludDMyICBjb3VudF90bSA9IDA7CisgICAgTTRPU0FfVUludDMyICBjb3VudF9hYSA9IDA7CisgICAgTTRPU0FfVUludDMyICBjb3VudDsKKyAgICBNNE9TQV9VSW50MzIgIG5iQ2hhcjsKKyAgICBNNE9TQV9JbnQzMiAgICAgZXJyOworICAgIE00T1NBX0NoYXIgZmxhZ0NoYXJbXSAgICAgICAgICAgICA9ICInLSsgIzAiOworICAgIE00T1NBX0NoYXIgd2lkdGhPclByZWNpc2lvbkNoYXJbXSA9ICIqMDEyMzQ1Njc4OSI7CisgICAgTTRPU0FfQ2hhciBvdGhlclByZWZpeENoYXJbXSAgICAgID0gImhsTCI7CisgICAgTTRPU0FfQ2hhciBjb252ZXJzaW9uQ2hhcltdICAgICAgID0gImRpb3V4WG5mZUVnR2NDc1NwJSI7CisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyU1ByaW50Zlx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9VSW50MzIgJWxkIgorICAgICAgICAiTTRPU0FfQ2hhciogJXgpIixwU3RyT3V0LHN0ck91dE1heExlbixmb3JtYXQpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJPdXQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTUHJpbnRmOlx0cFN0ck91dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZm9ybWF0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNQcmludGY6XHRmb3JtYXQgaXMgTTRPU0FfTlVMTCIpOworCisgICAgdmFfc3RhcnQobWFya2VyLGZvcm1hdCk7CisKKyAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXWxsW2NvbnZlcnNpb25dICovCisgICAgcFRlbXAgPSBmb3JtYXQ7CisgICAgd2hpbGUoKnBUZW1wKQorICAgIHsKKyAgICAgICAgcGVyY2VudFBvaW50ZXIgPSAoTTRPU0FfQ2hhciAqKXN0cmNocigoY29uc3QgY2hhciAqKXBUZW1wLCclJyk7IC8qIGdldCB0aGUgbmV4dCBwZXJjZW50IGNoYXJhY3RlciAqLworICAgICAgICBpZighcGVyY2VudFBvaW50ZXIpCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KKyAgICAgICAgcFRlbXAgPSBwZXJjZW50UG9pbnRlcisxOyAgICAgICAgICAgLyogc3BhbiBpdCAqLworICAgICAgICBpZighKnBUZW1wKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCisgICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLChjb25zdCBjaGFyICopZmxhZ0NoYXIpOyAgICAvKiBzcGFuIHRoZSBvcHRpb25hbCBmbGFncyAqLworICAgICAgICBpZighKnBUZW1wKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCisgICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLChjb25zdCBjaGFyICopd2lkdGhPclByZWNpc2lvbkNoYXIpOyAvKiBzcGFuIHRoZSBvcHRpb25hbCB3aWR0aCAqLworICAgICAgICBpZighKnBUZW1wKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCisgICAgICAgIGlmKCpwVGVtcD09Jy4nKQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcCsrOworICAgICAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopd2lkdGhPclByZWNpc2lvbkNoYXIpOyAvKiBzcGFuIHRoZSBvcHRpb25hbCBwcmVjaXNpb24gKi8KKyAgICAgICAgfQorICAgICAgICBpZighKnBUZW1wKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCisgICAgICAgIGlmKHN0cmxlbigoY29uc3QgY2hhciAqKXBUZW1wKT49MikKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilwVGVtcCwibGwiLDIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50X2xsKys7ICAgICAgICAgICAgICAgICAvKiBJIGdvdCBPTkUgKi8KKyAgICAgICAgICAgICAgICBwVGVtcCArPTI7ICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImxsIiBwcmVmaXggKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilwVGVtcCwidG0iLDIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50X3RtKys7CisgICAgICAgICAgICAgICAgcFRlbXAgKz0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKXBUZW1wLCJhYSIsMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnRfYWErKzsKKyAgICAgICAgICAgICAgICBwVGVtcCArPTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopb3RoZXJQcmVmaXhDaGFyKTsgLyogc3BhbiB0aGUgb3RoZXIgb3B0aW9uYWwgcHJlZml4ICovCisgICAgICAgIGlmKCEqcFRlbXApCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLworICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKiljb252ZXJzaW9uQ2hhcik7CisgICAgICAgIGlmKCEqcFRlbXApCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLworICAgIH0KKworICAgIGNvdW50ID0gY291bnRfbGwgKyBjb3VudF90bSArIGNvdW50X2FhOworCisgICAgaWYoIWNvdW50KQorICAgIHsKKyAgICAgICAgZXJyPSB2c25wcmludGYoKGNoYXIgKilwU3RyT3V0LCAoc2l6ZV90KXN0ck91dE1heExlbiArIDEsIChjb25zdCBjaGFyICopZm9ybWF0LCBtYXJrZXIpOworICAgICAgICB2YV9lbmQobWFya2VyKTsKKyAgICAgICAgaWYgKChlcnI8MCkgfHwgKChNNE9TQV9VSW50MzIpZXJyPnN0ck91dE1heExlbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdHJPdXRbc3RyT3V0TWF4TGVuXSA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisKKyAgICBuZXdGb3JtYXRMZW5ndGggPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilmb3JtYXQpICsgMTsKKworI2lmZGVmIE00T1NBXzY0QklUU19TVVBQT1JURUQKKyNpZmRlZiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRAorICAgIG5ld0Zvcm1hdExlbmd0aCArPSAoY291bnRfbGwrY291bnRfdG0rY291bnRfYWEpOworI2Vsc2UKKyAgICBuZXdGb3JtYXRMZW5ndGggKz0gKGNvdW50X2xsK2NvdW50X3RtLWNvdW50X2FhKTsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZCBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAorICAgIG5ld0Zvcm1hdExlbmd0aCAtPSAoY291bnRfbGwrY291bnRfdG0rY291bnRfYWEpOworI2Vsc2UKKyAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOworI2VuZGlmCisKKyAgICBuZXdGb3JtYXQgPShNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2MobmV3Rm9ybWF0TGVuZ3RoLAorICAgICAgICBNNE9TQV9DSEFSU1RBUiwoTTRPU0FfQ2hhciopIk00T1NBX2NoclByaW50ZjogbmV3Rm9ybWF0Iik7CisgICAgaWYoTTRPU0FfTlVMTCA9PSBuZXdGb3JtYXQpCisgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKKyAgICBuZXdGb3JtYXRbbmV3Rm9ybWF0TGVuZ3RoLTFdID0gJ1wwJzsKKyAgICBwVGVtcCA9IG5ld0Zvcm1hdDsKKworICAgIC8qIGNvcHkgZm9ybWF0IHRvIG5ld0Zvcm1hdCwgcmVwbGFjaW5nICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXWxsW2NvbnZlcnNpb25dCisgICAgICogYnkgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dSTY0W2NvbnZlcnNpb25dICovCisgICAgd2hpbGUoKmZvcm1hdCkKKyAgICB7CisgICAgICAgIG5iQ2hhciA9IHN0cmNzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsICIlIik7CisgICAgICAgIGlmKG5iQ2hhcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IGNoYXJhY3RlcnMgYmVmb3JlIHRoZSAlIGNoYXJhY3RlciAqLworICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOworICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKKyAgICAgICAgfQorICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7CisgICAgICAgICpwVGVtcCsrID0gKmZvcm1hdCsrOyAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgJSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKWZsYWdDaGFyKTsKKyAgICAgICAgaWYobmJDaGFyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIGZsYWcgY2hhcmFjdGVycyAqLworICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOworICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKKyAgICAgICAgfQorICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7CisgICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7CisgICAgICAgIGlmKG5iQ2hhcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSB3aWR0aCBjaGFyYWN0ZXJzICovCisgICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7CisgICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOworICAgICAgICB9CisgICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKKyAgICAgICAgaWYoKmZvcm1hdD09Jy4nKQorICAgICAgICB7CisgICAgICAgICAgICAqcFRlbXArKyA9ICpmb3JtYXQrKzsgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIGRvdCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIGlmKCFmb3JtYXQpIGJyZWFrOworICAgICAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsKKyAgICAgICAgICAgIGlmKG5iQ2hhcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIHdpZHRoIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7CisgICAgICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFmb3JtYXQpIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKHN0cmxlbigoY29uc3QgY2hhciAqKWZvcm1hdCk+PTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAibGwiLCAyKSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7IC8qICVsbCAqLworICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOworI2Vsc2UKKyAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWwgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJsbCIgcHJlZml4ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAidG0iLCAyKSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7IC8qICVsbCAqLworICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOworI2Vsc2UKKyAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWwgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJ0bSIgcHJlZml4ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAiYWEiLCAyKSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECisjaWZkZWYgTTRPU0FfRklMRV9QT1NfNjRfQklUU19TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWxsICovCisgICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7CisjZWxzZQorICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOworI2VuZGlmCisjZWxzZQorICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOworI2VuZGlmCisgICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImFhIiBwcmVmaXggKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopb3RoZXJQcmVmaXhDaGFyKTsKKyAgICAgICAgaWYobmJDaGFyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIG90aGVyIFByZWZpeCAqLworICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOworICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKKyAgICAgICAgfQorICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7CisgICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKiljb252ZXJzaW9uQ2hhcik7CisgICAgICAgIGlmKG5iQ2hhcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsKKyAgICAgICAgICAgIGZvcm1hdCArPSBuYkNoYXI7CisgICAgICAgICAgICBwVGVtcCAgICs9IG5iQ2hhcjsKKyAgICAgICAgfQorICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7CisgICAgfQorCisgICAgLyogWmVybyB0ZXJtaW5hdGUgdGhlIGZvcm1hdCBzdHJpbmcuICovCisgICAgKCpwVGVtcCkgPSAnXDAnOworCisgICAgZXJyID0gdnNucHJpbnRmKChjaGFyICopcFN0ck91dCwgKHNpemVfdClzdHJPdXRNYXhMZW4gKyAxLCAoY29uc3QgY2hhciAqKW5ld0Zvcm1hdCwgbWFya2VyKTsKKyAgICB2YV9lbmQobWFya2VyKTsKKyAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbmV3Rm9ybWF0KTsKKyAgICBpZiAoKGVycjwwKSB8fCAoKE00T1NBX1VJbnQzMillcnI+c3RyT3V0TWF4TGVuKSkKKyAgICB7CisgICAgICAgIHBTdHJPdXRbc3RyT3V0TWF4TGVuXSA9ICdcMCc7CisgICAgICAgIHJldHVybiBNNEVSUl9DSFJfU1RSX09WRVJGTE9XOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0Nsb2NrLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxNDhmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9DbG9jay5jCisgKiBAYnJpZWYgICAgICAgIENsb2NrIHJlbGF0ZWQgZnVuY3Rpb25zCisgKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGNsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgorI2luY2x1ZGUgIk00T1NBX0Nsb2NrLmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisjaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYW4gYWJzb2x1dGUgdGltZSB0byBhbiB1bmtub3duIHJlZmVyZW5jZSB3aXRoCisgKiAgICAgICAgICAgICBhIGhpZ2ggcHJlY2lzaW9uLgorICogQG5vdGUgICAgICAgSXQgbWVhbnMgaXQgY2FuIG9ubHkgYmUgdXNlZCB0byBnZXQgYSByZWxhdGl2ZSB0aW1lIGJ5IGNvbXB1dGluZworICogICAgICAgICAgICAgZGlmZmVyZW5jZXMgYmV0d2VlbiB0byB0aW1lcy4KKyAqICAgICAgICAgICAgIEl0IGlzIHRvIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgdGltZS4gVGltZSBpcyBleHByZXNzZWQgaW4KKyAqICAgICAgICAgICAgIHRpbWVzY2FsZSB1bml0LgorICogICAgICAgICAgICAgTTRPU0FfUk9MTE9WRVJfQ0xPQ0sgaW4gTTRPU0FfVHlwZXMuaCBtdXN0IGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgcm9sbG92ZXIKKyAqICAgICAgICAgICAgIG9mZnNldCBvZiB0aGlzIGZ1bmN0aW9uLgorICogQHBhcmFtICAgICAgdGltZTogKElOL09VVCkgdGltZQorICogQHBhcmFtICAgICAgdGltZXNjYWxlOiAoSU4pIFRoZSB0aW1lc2NhbGUgKHRpbWUgdW5pdCBwZXIgc2Vjb25kKQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRzogdGhlIHByZWNpc2lvbiBvZiB0aGUgc3lzdGVtIGNsb2NrIGlzCisgKiAgICAgICAgICAgICBub3QKKyAqICAgICAgICAgICAgIGNvbXBsaWFudCB3aXRoIHRoZSBpbnB1dCB0aW1lc2NhbGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfY2xvY2tHZXRUaW1lKE00T1NBX1RpbWUqIHBUaW1lLCBNNE9TQV9VSW50MzIgdGltZXNjYWxlKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKKyNpZmRlZiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAorICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZSA9IDA7CisgICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2hpOworICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9sbzsKKyAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfbGg7CisjZWxzZSAvKiBNNE9TQV82NEJJVFNfU1VQUE9SVEVEICovCisgICAgTTRPU0FfSW50NjQgaTY0X3RpbWUgPSAwOworICAgIE00T1NBX0ludDY0IGk2NF90aW1lX2hpOworICAgIE00T1NBX0ludDY0IGk2NF90aW1lX2xvOworICAgIE00T1NBX0ludDY0IGk2NF90ZW1wOworI2VuZGlmIC8qIE00T1NBXzY0QklUU19TVVBQT1JURUQgKi8KKyAgICBNNE9TQV9VSW50MzIgZmFjdG9yOworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX2Nsb2NrR2V0VGltZVx0XHRNNE9TQV9UaW1lKiAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZSwgdGltZXNjYWxlKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBUaW1lLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nsb2NrR2V0VGltZTogcFRpbWUgaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMigwID09IHRpbWVzY2FsZSwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nsb2NrR2V0VGltZTogdGltZXNjYWxlIGlzIDAiKTsKKworICAgIGZhY3RvciA9IDEwMDAwMDAgLyB0aW1lc2NhbGU7CisKKyAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCAmdHopID09IDApCisgICAgeworI2lmZGVmIE00T1NBXzY0QklUU19OT1RfU1VQUE9SVEVECisgICAgICAgIHUzMl90aW1lX2xvID0gKHR2LnR2X3NlYyAmIDB4RkZGRikgKiB0aW1lc2NhbGU7CisgICAgICAgIHUzMl90aW1lX2hpID0gKCgodHYudHZfc2VjID4+IDE2KSAmIDB4RkZGRikgKiB0aW1lc2NhbGUpICsgKCh1MzJfdGltZV9sbyA+PiAxNikgJiAweEZGRkYpOworICAgICAgICB1MzJfdGltZV9sbyAmPSAweEZGRkY7CisgICAgICAgIHUzMl90aW1lX2xvICs9IHR2LnR2X3VzZWMgLyBmYWN0b3I7CisgICAgICAgIHUzMl90aW1lX2hpICs9ICgodTMyX3RpbWVfbG8gPj4gMTYpICYgMHhGRkZGKTsKKyAgICAgICAgdTMyX3RpbWVfbG8gJj0gMHhGRkZGOworICAgICAgICB1MzJfdGltZSA9ICgodTMyX3RpbWVfaGkgJiAweDdGRkYpIDw8IDE2KSB8IHUzMl90aW1lX2xvOworI2Vsc2UgLyogTTRPU0FfNjRCSVRTX1NVUFBPUlRFRCAqLworICAgICAgICB0di50dl91c2VjIC89IGZhY3RvcjsKKyAgICAgICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMl9VSU5UMzIoaTY0X3RpbWVfaGksIDAsIHR2LnR2X3NlYyk7CisgICAgICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzJfVUlOVDMyKGk2NF90aW1lX2xvLCAwLCB0di50dl91c2VjKTsKKyAgICAgICAgTTRPU0FfSU5UNjRfU0NBTEFSX1BST0RVQ1QoaTY0X3RlbXAsIGk2NF90aW1lX2hpLCB0aW1lc2NhbGUpOworICAgICAgICBNNE9TQV9JTlQ2NF9BREQoaTY0X3RpbWUsIGk2NF90ZW1wLCBpNjRfdGltZV9sbyk7CisjZW5kaWYgLyogTTRPU0FfNjRCSVRTX1NVUFBPUlRFRCAqLworICAgIH0KKworI2lmZGVmIE00T1NBXzY0QklUU19OT1RfU1VQUE9SVEVECisgICAgLyogTTRPU0FfVGltZSBpcyBzaWduZWQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG1heCB2YWx1ZSovCisgICAgaWYgKHUzMl90aW1lID4gTTRPU0FfSU5UMzJfTUFYKQorICAgIHsKKyAgICAgICAgdTMyX3RpbWUgPSB1MzJfdGltZSAtIE00T1NBX0lOVDMyX01BWDsKKyAgICB9CisKKyAgICAqcFRpbWUgPSAoTTRPU0FfVGltZSl1MzJfdGltZTsKKworICAgIGlmKCB0aW1lc2NhbGUgPiAxMDAwMCApCisgICAgeworICAgICAgICByZXR1cm4gTTRXQVJfVElNRVNDQUxFX1RPT19CSUc7CisgICAgfQorI2Vsc2UgLyogTTRPU0FfNjRCSVRTX1NVUFBPUlRFRCAqLworICAgICpwVGltZSA9IChNNE9TQV9UaW1lKWk2NF90aW1lOworCisgICAgaWYoIHRpbWVzY2FsZSA+IDEwMDAwMDAgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVTQ0FMRV9UT09fQklHOworICAgIH0KKyNlbmRpZiAvKiBNNE9TQV82NEJJVFNfU1VQUE9SVEVEICovCisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDYWNoZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTgwNDEyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDYWNoZS5jCkBAIC0wLDAgKzEsMjk3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUNhY2hlLmMKKyAqCisgKiBAYnJpZWYgICAgICAgIE9zYWwgRmlsZSBSZWFkZXIgYW5kIFdyaXRlciB3aXRoIGNhY2hlCisgKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlCisgKiAgICAgICAgICAgICAgIGZpbGVzeXN0ZW0gYWNjZXNzIHdpdGggaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgdXNlZCB0bworICogICAgICAgICAgICAgICByZWFkIGFuZCB0byB3cml0ZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaWxlIGNhY2hlIGJ1ZmZlcnMgcGFyYW1ldGVycyAoc2l6ZSwgbnVtYmVyIG9mIGJ1ZmZlcnMsIGV0YykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworI2RlZmluZSBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFICAgICg4KjEwMjQpCisjZGVmaW5lIE00T1NBX0NBQ0hFQlVGRkVSX05CICAgIDYKKyNkZWZpbmUgTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORSAgICAtMQorI2RlZmluZSBNNE9TQV9DQUNIRUJVRkZFUl9BTEwgICAgLTIKKyNkZWZpbmUgTTRPU0FfRU9GICAgICAgICAgICAgICAgLTEKKworLyoqIFN0cmF0ZWd5IHVzZWQgYnkgT3NhbCBGaWxlIENhY2hlIHRvIGZsdXNoIHRoZSBidWZmZXJzIHRvIGRpc2suCitEZXBlbmRpbmcgb24gdGhlIHNlcnZpY2UsIHRoZSBzdHJhdGVneSB3aWxsIGhhdmUgbW9yZSBvciBsZXNzIHN1Y2Nlc3MgKi8KKy8vI2RlZmluZSBCVUZGRVJfU0VMRUNUX0lOSVRJQUwgICAgICAgIC8qKiBJbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIE9zYWwgRmlsZSBSZWFkZXIgb3B0aW0gKi8KKy8vI2RlZmluZSBCVUZGRVJfU0VMRUNUX1dJVEhfVElNRSAgICAvKiogVG8gZmx1c2ggaW4gcHJpb3JpdHkgdGhlIGJ1ZmZlcnMgd2hpY2ggaGF2ZSBub3QgYmVlbiB1c2VkIGZvciBhIGNlcnRhaW4gdGltZSAqLworLy8jZGVmaW5lIEJVRkZFUl9TRUxFQ1RfV0lUSF9TUEFDRSAgICAvKiogVG8gZmx1c2ggaW4gcHJpb3JpdHkgdGhlIGJ1ZmZlcnMgd2hpY2ggaGF2ZSBub3QgYmVlbiB1c2VkIGEgbG90IG9mIHRpbWVzICovCisjZGVmaW5lIEJVRkZFUl9TRUxFQ1RfV0lUSF9QT1MgICAgLyoqIFRvIGZsdXNoIGluIHByaW9yaXR5IHRoZSBidWZmZXJzIHdoaWNoIGhhdmUgdGhlIHNtYWxsZXN0IHBvc2l0aW9uIG9uIHRoZSBmaWxlICovCisKKy8qIHRvIG1lYXN1cmUgc3VjY2VzcyBvZiBjYWNoZSBvcGVyYXRpb25zICovCisvLyNkZWZpbmUgRklMRUNBQ0hFX1NUQVRTCisKKy8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlICovCisvLyNkZWZpbmUgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKKworLyoqKiAgVG8gZGVidWcgKi8KKy8vI2RlZmluZSBOT19TVFJBVEVHWQorLy8jZGVmaW5lIEJVRkZFUl9ESVNQTEFZCisKKyNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUworI2luY2x1ZGUgIk00T1NBX2Nsb2NrLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIGZpbGVPcGVudGltZSwKKyAgICBmaWxlQ2xvc2V0aW1lLAorICAgIGZpbGVSZWFkRGF0YXRpbWUsCisgICAgZmlsZVdyaXRlRGF0YXRpbWUsCisgICAgZmlsZVNlZWt0aW1lLAorICAgIGZpbGVHZXRPcHRpb250aW1lLAorICAgIGZpbGVTZXRPcHRpb250aW1lLAorICAgIGZpbGVFeHRlcm5hbEZsdXNodGltZSwKKyAgICBlbnVtX3NpemUgICAgLyogZm9yIGVudW0gc2l6ZSAqLworfSBNNE9TQV9maWxldGltZVR5cGU7CisKK3R5cGVkZWYgICAgTTRPU0FfVGltZSBUYWJGaWxldGltZVtlbnVtX3NpemUrMV07CisKK3ZvaWQgTTRPU0FfRmlsZUNhY2hlX2luaXRUaW1lTWVhcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKK3ZvaWQgTTRPU0FfRmlsZUNhY2hlX2Rpc3BsYXlUaW1lTWVhcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKKworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCisKKy8qIEFOU0kgQyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisvKiBFbmQ6IEFOU0kgQyBpbmNsdWRlcyAqLworCisjaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgorI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCisKKyNpbmNsdWRlICJNNE9TQV9GaWxlQ2FjaGUuaCIKKworI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgorI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCisjaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKKyNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgorCisKKyNkZWZpbmUgTE9DSyBcCisgICAgTTRPU0FfbXV0ZXhMb2NrKGFwQ29udGV4dC0+bV9tdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKKworI2RlZmluZSBVTkxPQ0sgXAorICAgIE00T1NBX211dGV4VW5sb2NrKGFwQ29udGV4dC0+bV9tdXRleCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgRmlsZURlc2M7Cit9IE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTTRPU0FfVm9pZCogICAgICAgICgqcEZjdFB0cl9PcGVuKSggTTRPU0FfVm9pZCogZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfUmVhZCkoIE00T1NBX1ZvaWQqIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICk7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICgqcEZjdFB0cl9Xcml0ZSkoIE00T1NBX1ZvaWQqIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICk7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICgqcEZjdFB0cl9TZWVrKSggTTRPU0FfVm9pZCogZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfVGVsbCkoIE00T1NBX1ZvaWQqIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICk7CisgICAgTTRPU0FfSW50MzIgICAgICAgICgqcEZjdFB0cl9DbG9zZSkoIE00T1NBX1ZvaWQqIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOworICAgIE00T1NBX1ZvaWQgICAgICAgICAoKnBGY3RQdHJfQWNjZXNzVHlwZSkoIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2Vzc19JbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIEZpbGVNb2RlQWNjZXNzX091dCApOworCit9IE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyX2NhY2hlOworCitNNE9TQV9Wb2lkKiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19PcGVuX2NhY2hlKCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOworTTRPU0FfSW50MzIgTTRPU0FfRmlsZVN5c3RlbV9GRlNfQ2xvc2VfY2FjaGUoIE00T1NBX1ZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICk7CitNNE9TQV9GaWxlUG9zaXRpb24gTTRPU0FfRmlsZVN5c3RlbV9GRlNfUmVhZF9jYWNoZSggTTRPU0FfVm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKTsKK000T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19Xcml0ZV9jYWNoZSggTTRPU0FfVm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub18gKTsKK000T1NBX0ludDMyIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX1NlZWtfY2FjaGUoIE00T1NBX1ZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKTsKK000T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19UZWxsX2NhY2hlKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOworCitNNE9TQV9FUlIgTTRPU0FfZmlsZU9wZW5fY2FjaGVfaW50ZXJuYWwoTTRPU0FfQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0cl9jYWNoZSAqRlMpOworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tVXNlci0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0KK3xGaWxsZWR8ICAgIHxDb3BpZWR8ICAgIHxNb2RpZmllZHwKKy0tLS0tLS0tICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0KKyAgXgorICB8CistLS0tLS0tLS0tLS0tLS0tLS1EaXNrLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXRvbWljIHN0YXRlcyBmb3IgYSBidWZmZXI6CisKKzB4MDAgICAgaW5pdGlhbGl6ZWQgb3IgZmx1c2hlZCAoV2hlbiBpdCBpcyBpbml0aWFsaXplZCBhZ2FpbiwgaXQgaXMgZmx1c2hlZCBpZiBuZWNlc3NhcnkpCisweDAxICAgIEZpbGxlZCBmcm9tIGRpc2sKKzB4MDMgICAgRmlsbGVkIGFuZCBDb3BpZWQgdG8gdXNlcgorCisweDgwICAgIE1vZGlmaWVkIGFuZCBuZXdseSBjcmVhdGVkIChkb2VzIG5vdCBleGlzdCBvbiBkaXNrKSA9PiBtdXN0IGJlIGZsdXNoZWQKKzB4ODMgICAgTW9kaWZpZWQgYWZ0ZXIgaGF2aW5nIGJlZW4gcmVhZCBmcm9tIGRpc2sgPT4gbXVzdCBiZSBmbHVzaGVkCisKKyovCisKK3R5cGVkZWYgZW51bQoreworICAgIE00T1NBX2tJbml0aWFsaXplZCA9IDAsCisgICAgTTRPU0Ffa0ZpbGxlZCA9IDB4MSwKKyAgICBNNE9TQV9rQ29waWVkID0gMHgyLAorICAgIE00T1NBX2tNb2RpZmllZCA9IDB4ODAKK30gTTRPU0FfRmlsZUNhY2hlU3RhdGVBdG9taWM7CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzdHJ1Y3R1cmUgICAgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcgorICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgQnVmZmVycyBjb250ZXh0IChwcml2YXRlKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTTRPU0FfTWVtQWRkcjggICAgICBkYXRhOyAgICAgICAgLyoqPCBidWZmZXIgZGF0YSAqLworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgc2l6ZTsgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyICovCisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlcG9zOyAgICAvKio8IHBvc2l0aW9uIGluIHRoZSBmaWxlIG9mIHRoZSBidWZmZXIncyBmaXJzdCBvY3RldCAqLworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgcmVtYWluOyAgICAgICAgLyoqPCBkYXRhIGFtb3VudCBub3QgYWxyZWFkeSBjb3BpZWQgZnJvbSBidWZmZXIgKi8KKworICAgIE00T1NBX1VJbnQzMiAgICAgICAgbmJGaWxsU2luY2VMYXN0QWNlc3M7ICAgIC8qKjwgVG8ga25vdyBzaW5jZSBob3cgbWFueSB0aW1lIHdlIGRpZG4ndCB1c2UgdGhpcyBidWZmZXIuIHRvIGRldGVjdCAgZGVhZCBidWZmZXJzICovCisKKyAgICBNNE9TQV9VSW50MzIgICAgICAgIG5iQWNjZXNzZWQ7ICAgICAgICAgICAgLyoqPCBuYiBvZiB0aW1lcyB0aGUgYnVmZmVyIGhhcyBiZWVuIGFjY2Vzc2VkIHdpdGhvdXQgYmVpbmcgcmVpbml0aWFsaXplZCAqLworICAgIE00T1NBX1RpbWUgICAgICAgICAgICB0aW1lQWNjZXNzZWQ7ICAgICAgICAgLyoqPCBsYXN0IHRpbWUgYXQgd2hpY2ggdGhlIGJ1ZmZlciBoYXMgYmVlbiBhY2Nlc3NlZCB3aXRob3V0IGJlaW5nIHJlaW5pdGlhbGl6ZWQgKi8KKworICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgc3RhdGU7Cit9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXI7CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0CisgKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSBjb250ZXh0IChwcml2YXRlKQorICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBGaWxlIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBNNE9TQV9Cb29sICAgICAgICAgIElzT3BlbmVkOyAgICAgICAgICAgICAgIC8qKjwgTWljcm8gc3RhdGUgbWFjaGluZSAqLworICAgIE00T1NBX0ZpbGVBdHRyaWJ1dGUgRmlsZUF0dHJpYnV0ZTsgICAgICAgICAgLyoqPCBPcGVuaW5nIG1vZGUgKi8KKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIHJlYWRGaWxlUG9zOyAgICAgICAgICAgIC8qKjwgRWZmZWN0aXZlIHBvc2l0aW9uIG9mIHRoZSBmaWxlIHBvaW50ZXIgKi8KKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGFic29sdXRlUG9zOyAgICAgICAgICAgIC8qKjwgVmlydHVhbCBwb3NpdGlvbiBmb3IgbmV4dCByZWFkaW5nICovCisgICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBhYnNvbHV0ZVdyaXRlUG9zOyAgICAgICAgLyoqPCBWaXJ0dWFsIHBvc2l0aW9uIGZvciBuZXh0IHdyaXRpbmcgKi8KKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGZpbGVTaXplOyAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIGZpbGUgKi8KKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIHZpcnR1YWxGaWxlU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZmlsZSAqLworCisgICAgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlciBidWZmZXJbTTRPU0FfQ0FDSEVCVUZGRVJfTkJdOyAgLyoqPCBidWZmZXJzICovCisKKyAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBhRmlsZURlc2M7ICAgICAgICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yICovCisgICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHJfY2FjaGUgKkZTOyAgICAgICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCisKKyNpZmRlZiBGSUxFQ0FDSEVfU1RBVFMKKyAgICBNNE9TQV9VSW50MzIgICAgICAgIGNhY2hlU3VjY2Vzc1JlYWQ7CisgICAgTTRPU0FfVUludDMyICAgICAgICBjYWNoZVN1Y2Nlc3NXcml0ZTsKKyAgICBNNE9TQV9VSW50MzIgICAgICAgIG5iUmVhZENhY2hlOworICAgIE00T1NBX1VJbnQzMiAgICAgICAgbmJXcml0ZUNhY2hlOworCisgICAgTTRPU0FfVUludDMyICAgICAgICBuYlJlYWRGRlM7CisgICAgTTRPU0FfVUludDMyICAgICAgICBuYldyaXRlRkZTOworI2VuZGlmIC8qIEZJTEVDQUNIRV9TVEFUUyAqLworICAgIE00T1NBX0NvbnRleHQgICAgICAgIG1fbXV0ZXg7CisKKyAgICBNNE9TQV9UaW1lICAgICAgICAgICAgY2hyb25vOworICAgIE00T1NBX0NoYXIgICAgICAgICAgICBtX2ZpbGVuYW1lWzI1Nl07CisKKyNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUworICAgIFRhYkZpbGV0aW1lICAgICAgICAgICAgZ015UGVyZkZpbGVUYWI7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworfSBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dDsKKworCisjZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKHJldHZhbCk7CisKKy8qIHVzZWQgdG8gZGV0ZWN0IGRlYWQgYnVmZmVycyAqLworI2RlZmluZSBNQVhfRklMTFNfU0lOQ0VfTEFTVF9BQ0NFU1MgICAgTTRPU0FfQ0FDSEVCVUZGRVJfTkIqMgorCisKKy8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KKy8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KKy8qfCAgICAgICAgUXVpY2sgU29ydCBmdW5jdGlvbiAgICAocHJpdmF0ZSkgICAgICAgICAgICAgICAgICAgICB8Ki8KKy8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KKworTTRPU0FfVm9pZCBNNE9TQV9GaWxlQ2FjaGVfaW50ZXJuYWxRdWlja3NvcnQoTTRPU0FfSW50MzIqIGNvbnN0IHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE00T1NBX0ludDMyIGZpcnN0ICwgY29uc3QgTTRPU0FfSW50MzIgbGFzdCkKKyB7CisgICAgTTRPU0FfSW50MzIgc3RhcnRJbmRleDsKKyAgICBNNE9TQV9JbnQzMiBlbmRJbmRleDsKKyAgICBNNE9TQV9JbnQzMiBiZWdpbjsKKyAgICBNNE9TQV9JbnQzMiBlbmQ7CisgICAgTTRPU0FfSW50MzIgcGl2b3Q7CisgICAgTTRPU0FfSW50MzIgdGVtcDsKKyAgICBNNE9TQV9JbnQzMiBpbmRleD0wOworICAgIE00T1NBX0ludDMyIHNpemU9MDsKKyAgICBNNE9TQV9JbnQzMiBjYXBhY2l0eSA9IE00T1NBX0NBQ0hFQlVGRkVSX05CICogNTsKKyAgICAvL2FsbG9jYXRpb24gb2YgdGhlIGZpZm8KKyAgICBNNE9TQV9JbnQzMiogcXVldWUgPSBNNE9TQV9OVUxMOworICAgIE00T1NBX0ludDMyKiBjdXJzb3I7CisgICAgTTRPU0FfSW50MzIqIGluZGV4YzsKKworICAgIHF1ZXVlID0gKE00T1NBX0ludDMyKilNNE9TQV9tYWxsb2MoY2FwYWNpdHkqc2l6ZW9mKE00T1NBX0ludDMyKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSAicXVpY2tzb3J0IEZJRk8gb2YgRmlsZUNhY2hlIik7CisKKyAgICBpZihxdWV1ZSA9PSBNNE9TQV9OVUxMKQorICAgICAgICByZXR1cm47CisgICAgY3Vyc29yID0gcXVldWU7CisgICAgaW5kZXhjID0gcXVldWU7CisgICAgKihjdXJzb3IrKykgPSBmaXJzdDsgLy9yZW1lbWJlciB0aGUgYXJyYXkgZmlyc3QgZWxlbWVudAorICAgICooY3Vyc29yKyspID0gbGFzdDsgICAgLy9yZW1lbWJlciB0aGUgYXJyYXkgZW5kCisgICAgaW5kZXggPSAwOworICAgIHNpemUgPSAyOworICAgIGRvCisgICAgeworICAgICAgICBzdGFydEluZGV4ICAgPSAqKGluZGV4YysrKTsKKyAgICAgICAgZW5kSW5kZXggICAgPSAqKGluZGV4YysrKTsKKyAgICAgICAgaW5kZXgrPTI7CisgICAgICAgIGlmKHN0YXJ0SW5kZXggPCBlbmRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgYmVnaW4gICAgPSBzdGFydEluZGV4OworICAgICAgICAgICAgZW5kICAgICAgICA9IGVuZEluZGV4OworICAgICAgICAgICAgcGl2b3QgICAgPSB0YWJsZVtlbmRJbmRleF07CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICggKGJlZ2luIDwgZW5kSW5kZXgpICYmICh0YWJsZVtiZWdpbl08PXBpdm90KSApCisgICAgICAgICAgICAgICAgICAgIGJlZ2luKys7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAoZW5kID4gYmVnaW4pICYmICh0YWJsZVtlbmRdPj1waXZvdCkgKQorICAgICAgICAgICAgICAgICAgICBlbmQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYmVnaW4gPCBlbmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wICAgICAgICAgICAgPSB0YWJsZVtlbmRdOworICAgICAgICAgICAgICAgICAgICB0YWJsZVtlbmRdICAgICAgICA9IHRhYmxlW2JlZ2luXTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVbYmVnaW5dICAgID0gdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9d2hpbGUoYmVnaW4gPCBlbmQpOworCisgICAgICAgICAgICB0ZW1wICAgICAgICAgICAgPSB0YWJsZVtlbmRJbmRleF07CisgICAgICAgICAgICB0YWJsZVtlbmRJbmRleF0gICAgICAgID0gdGFibGVbYmVnaW5dOworICAgICAgICAgICAgdGFibGVbYmVnaW5dICAgID0gdGVtcDsKKyAgICAgICAgICAgICooY3Vyc29yKyspID0gc3RhcnRJbmRleDsKKyAgICAgICAgICAgICooY3Vyc29yKyspID0gYmVnaW4tMTsKKyAgICAgICAgICAgICooY3Vyc29yKyspID0gYmVnaW4rMTsKKyAgICAgICAgICAgICooY3Vyc29yKyspID0gIGVuZEluZGV4OworICAgICAgICAgICAgc2l6ZSs9NDsKKyAgICAgICAgICAgIGlmKHNpemU9PWNhcGFjaXR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJPdmVyZmxvdyBpbiBxdWlja1NvcnQuIGluY3JlYXNlIGNhcGFjaXR5IHNpemUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoaW5kZXg8c2l6ZSk7CisgICAgY3Vyc29yID0gTlVMTDsKKyAgICBpbmRleGMgPSBOVUxMOworICAgIE00T1NBX2ZyZWUocXVldWUpOworfQorCitNNE9TQV9Wb2lkIE00T1NBX0ZpbGVDYWNoZV9pbnRlcm5hbFF1aWNrc29ydDY0KE00T1NBX0ludDY0KiBjb25zdCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNNE9TQV9JbnQzMiBmaXJzdCAsIGNvbnN0IE00T1NBX0ludDMyIGxhc3QpCisgeworICAgIE00T1NBX0ludDMyIHN0YXJ0SW5kZXg7CisgICAgTTRPU0FfSW50MzIgZW5kSW5kZXg7CisgICAgTTRPU0FfSW50MzIgYmVnaW47CisgICAgTTRPU0FfSW50MzIgZW5kOworICAgIE00T1NBX0ludDY0IHBpdm90OworICAgIE00T1NBX0ludDY0IHRlbXA7CisgICAgTTRPU0FfSW50MzIgaW5kZXg9MDsKKyAgICBNNE9TQV9JbnQzMiBzaXplPTA7CisgICAgTTRPU0FfSW50MzIgY2FwYWNpdHkgPSBNNE9TQV9DQUNIRUJVRkZFUl9OQiAqIDU7CisgICAgLy9hbGxvY2F0aW9uIG9mIHRoZSBmaWZvCisgICAgTTRPU0FfSW50MzIqIHF1ZXVlID0gTTRPU0FfTlVMTDsKKyAgICBNNE9TQV9JbnQzMiogY3Vyc29yOworICAgIE00T1NBX0ludDMyKiBpbmRleGM7CisKKyAgICBxdWV1ZSA9IChNNE9TQV9JbnQzMiopTTRPU0FfbWFsbG9jKGNhcGFjaXR5KnNpemVvZihNNE9TQV9JbnQzMiksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikgInF1aWNrc29ydCBGSUZPIG9mIEZpbGVDYWNoZSIpOworCisgICAgaWYocXVldWUgPT0gTTRPU0FfTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGN1cnNvciA9IHF1ZXVlOworICAgIGluZGV4YyA9IHF1ZXVlOworICAgICooY3Vyc29yKyspID0gZmlyc3Q7IC8vcmVtZW1iZXIgdGhlIGFycmF5IGZpcnN0IGVsZW1lbnQKKyAgICAqKGN1cnNvcisrKSA9IGxhc3Q7ICAgIC8vcmVtZW1iZXIgdGhlIGFycmF5IGVuZAorICAgIGluZGV4ID0gMDsKKyAgICBzaXplID0gMjsKKyAgICBkbworICAgIHsKKyAgICAgICAgc3RhcnRJbmRleCAgID0gKihpbmRleGMrKyk7CisgICAgICAgIGVuZEluZGV4ICAgID0gKihpbmRleGMrKyk7CisgICAgICAgIGluZGV4Kz0yOworICAgICAgICBpZihzdGFydEluZGV4IDwgZW5kSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJlZ2luICAgID0gc3RhcnRJbmRleDsKKyAgICAgICAgICAgIGVuZCAgICAgICAgPSBlbmRJbmRleDsKKyAgICAgICAgICAgIHBpdm90ICAgID0gdGFibGVbZW5kSW5kZXhdOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIChiZWdpbiA8IGVuZEluZGV4KSAmJiAodGFibGVbYmVnaW5dPD1waXZvdCkgKQorICAgICAgICAgICAgICAgICAgICBiZWdpbisrOworICAgICAgICAgICAgICAgIHdoaWxlICggKGVuZCA+IGJlZ2luKSAmJiAodGFibGVbZW5kXT49cGl2b3QpICkKKyAgICAgICAgICAgICAgICAgICAgZW5kLS07CisgICAgICAgICAgICAgICAgaWYgKGJlZ2luIDwgZW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCAgICAgICAgICAgID0gdGFibGVbZW5kXTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVbZW5kXSAgICAgICAgPSB0YWJsZVtiZWdpbl07CisgICAgICAgICAgICAgICAgICAgIHRhYmxlW2JlZ2luXSAgICA9IHRlbXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfXdoaWxlKGJlZ2luIDwgZW5kKTsKKworICAgICAgICAgICAgdGVtcCAgICAgICAgICAgID0gdGFibGVbZW5kSW5kZXhdOworICAgICAgICAgICAgdGFibGVbZW5kSW5kZXhdICAgICAgICA9IHRhYmxlW2JlZ2luXTsKKyAgICAgICAgICAgIHRhYmxlW2JlZ2luXSAgICA9IHRlbXA7CisgICAgICAgICAgICAqKGN1cnNvcisrKSA9IHN0YXJ0SW5kZXg7CisgICAgICAgICAgICAqKGN1cnNvcisrKSA9IGJlZ2luLTE7CisgICAgICAgICAgICAqKGN1cnNvcisrKSA9IGJlZ2luKzE7CisgICAgICAgICAgICAqKGN1cnNvcisrKSA9ICBlbmRJbmRleDsKKyAgICAgICAgICAgIHNpemUrPTQ7CisgICAgICAgICAgICBpZihzaXplPT1jYXBhY2l0eSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiT3ZlcmZsb3cgaW4gcXVpY2tTb3J0LiBpbmNyZWFzZSBjYXBhY2l0eSBzaXplIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHdoaWxlKGluZGV4PHNpemUpOworICAgIGN1cnNvciA9IE5VTEw7CisgICAgaW5kZXhjID0gTlVMTDsKKyAgICBNNE9TQV9mcmVlKHF1ZXVlKTsKK30KKworLyogU29ydHMgYW4gYXJyYXkgb2Ygc2l6ZSBzaXplICovCitNNE9TQV9Wb2lkIE00T1NBX0ZpbGVDYWNoZV9RU19xdWlja1NvcnQgKE00T1NBX0ZpbGVQb3NpdGlvbiBhcnJheVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZT09MSB8fCBzaXplPT0wKQorICAgIHsKKyAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIlNvcnQgbm90IG5lY2Vzc2FyeSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTTRPU0FfRmlsZUNhY2hlX2ludGVybmFsUXVpY2tzb3J0KGFycmF5LDAsc2l6ZS0xKTsKK30KKworTTRPU0FfVm9pZCBNNE9TQV9GaWxlQ2FjaGVfUVNfcXVpY2tTb3J0NjQgKE00T1NBX1RpbWUgYXJyYXlbXSwgTTRPU0FfVUludDMyIHNpemUpCit7CisgICAgaWYgKHNpemU9PTEgfHwgc2l6ZT09MCkKKyAgICB7CisgICAgICAgIE00T1NBX1RSQUNFM18wKCJTb3J0IG5vdCBuZWNlc3NhcnkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE00T1NBX0ZpbGVDYWNoZV9pbnRlcm5hbFF1aWNrc29ydDY0KGFycmF5LDAsc2l6ZS0xKTsKK30KKworLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLworLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLworLyp8ICAgQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgUlcgYWNjZXNzICAocHJpdmF0ZSkgICAgIHwqLworLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9FUlIgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcnNJbml0KE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfVUludDggaTsKKworICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKKyAgICB7CisgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlID0gTTRPU0Ffa0luaXRpYWxpemVkOworICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KSYoYXBDb250ZXh0LT5idWZmZXJbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcikgLCAwKTsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gKE00T1NBX01lbUFkZHI4KSBNNE9TQV9tYWxsb2MoTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciopIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJJbml0Iik7CisgICAgICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKKyAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IE00T1NBX0VPRjsKKworICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9Wb2lkIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRnJlZShNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIE00T1NBX1VJbnQ4IGk7CisKKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhICE9IE00T1NBX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKKyAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgPSBNNE9TQV9OVUxMOworICAgICAgICB9CisgICAgfQorfQorCisjaWZkZWYgQlVGRkVSX0RJU1BMQVkKK000T1NBX1ZvaWQgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckRpc3BsYXkoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCkKK3sKKyAgICBNNE9TQV9VSW50MzIgaTsKKworICAgIE00T1NBX1RSQUNFMV8wKCItLS0tLS0gQnVmZmVycyBkaXNwbGF5ICIpOworICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKKyAgICB7CisgICAgICAgIE00T1NBX1RSQUNFMV81KCItLS0tLS0gQnVmJWQgOiBGaWxlUG9zPSVkIHN0YXRlPTB4JXggbmJBY2Nlc3NlZD0lZCAtLSB0aW1lQWNjZXNzZWQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJBY2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnRpbWVBY2Nlc3NlZCk7CisgICAgfQorICAgIE00T1NBX1RSQUNFMV8wKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworfQorI2VuZGlmCisKKworLyogcmVhZHMgZnJvbSBhbiBleGlzdGluZyBidWZmZXIgKG51bWJlciBpKSBhdCBhYnNvbHV0ZSBwb3NpdGlvbiBwb3MgYW5kIGZpbGxzIHBEYXRhLiBpdCByZWFkcyBtYXhpbXVtIG9uZSBibG9jICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9GaWxlUG9zaXRpb24gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckNvcHkoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGksIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcERhdGEpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGNvcHlzaXplOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBvZmZzZXQ7CisKKyAgICBNNE9TQV9UUkFDRTNfMigiQnVmZmVyQ29weSBvZiAlZCwgcG9zPSVkIiwgaSwgcG9zKTsKKworICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPT0gTTRPU0FfRU9GKSByZXR1cm4gTTRPU0FfRU9GOworCisgICAgLyogdmVyaWZpY2F0aW9uIHBvcyBpcyBpbnNpZGUgYnVmZmVyIGkqLworICAgIGlmKCAgIChwb3MgPCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKQorICAgICAgIHx8IChwb3MgPiAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgLSAxKSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7IC8qIG5vdGhpbmcgY29waWVkICovCisgICAgfQorCisgICAgb2Zmc2V0ID0gcG9zIC0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvczsgICAgLyogb2Zmc2V0IHRvIHJlYWQgZnJvbSBpbiB0aGUgYnVmZmVyICovCisKKyAgICBjb3B5c2l6ZSA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgLSBvZmZzZXQ7ICAgIC8qIGJ1ZmZlciBzaXplIC0gb2Zmc2V0LCBpdCBpcyB0aGUgbWF4aW11bSB3ZSBjYW4gcmVhZCBmcm9tIGEgYnVmZmVyICovCisgICAgY29weXNpemUgPSAoc2l6ZSA8IGNvcHlzaXplKSA/IHNpemUgOiBjb3B5c2l6ZTsgLyogYWRqdXN0IGluIGNhc2UgdXNlciB3YW50cyB0byByZWFkIGxlc3MgdGhhbiB0aGUgZGF0YSBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciAoY29weXNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoYXQgY2FzZSwgdGFrZSB0aGUgbWluKGNvcHlzaXplLCBzaXplKSovCisKKyAgICBNNE9TQV9tZW1jcHkocERhdGEsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgKyBvZmZzZXQsIGNvcHlzaXplKTsKKworICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiAtPSBjb3B5c2l6ZTsKKyAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA9IDA7CisKKworICAgIC8qIGl0IGlzIGEgcmVhZCBhY2Nlc3MgKi8KKyAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkFjY2Vzc2VkKys7CisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0udGltZUFjY2Vzc2VkID0gYXBDb250ZXh0LT5jaHJvbm87CisgICAgYXBDb250ZXh0LT5jaHJvbm8rKzsKKworCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgfD0gTTRPU0Ffa0NvcGllZDsKKworICAgIHJldHVybiBjb3B5c2l6ZTsKK30KKworLyogd3JpdGVzIG9uIGNhY2hlLiBhdCBhYnNvbHV0ZSBwb3NpdGlvbiBwb3MgYW5kIHdyaXRlcyBwRGF0YSB0byB0aGUgYnVmZmVyLiBpdCB3cml0ZXMgbWF4aW11bSBvbmUgYmxvYyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTTRPU0FfRmlsZVBvc2l0aW9uIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJNb2RpZnlDb250ZW50KE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBEYXRhKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBjb3B5c2l6ZTsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gb2Zmc2V0LCBncmlkUG9zOworCisgICAgTTRPU0FfVFJBQ0UzXzIoIkJ1ZmZlck1vZGlmeSBvZiAlZCwgcG9zPSVkIiwgaSwgcG9zKTsKKworICAgIC8qIFJlbG9jYXRlIHRvIGFic29sdXRlIHBvc3Rpb24gaWYgbmVjZXNzYXJ5ICovCisgICAgZ3JpZFBvcyA9IChwb3MgLyBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFKSAqIE00T1NBX0NBQ0hFQlVGRkVSX1NJWkU7CisKKyAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zID0gZ3JpZFBvczsKKworICAgIC8qIGluIGNhc2Ugb2YgYW4gZXhpc3RpbmcgYmxvY2sgKG5vdCBhdCBlb2YpICovCisgICAgaWYgICAgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIHRlc3QgaWYgd2UgYXJlIGFscmVhZHkgaW5zaWRlIHRoaXMgYnVmZmVyICovCisgICAgICAgIGlmICggICAocG9zIDwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKKyAgICAgICAgICAgfHwgKHBvcyA+IChhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zICsgTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSkpICkKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJ1ZmZlck1vZGlmeSBFUlIgbm90aGluZyBjb3BpZWQsIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBub3RoaW5nIGNvcGllZCAqLworICAgICAgICB9CisgICAgfQorCisgICAgb2Zmc2V0ID0gcG9zIC0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvczsgICAgLyogb2Zmc2V0IHRvIHdyaXRlIHRvLCBpbiB0aGUgYnVmZmVyICovCisKKyAgICAvKiBidWZmZXIgc2l6ZSAtIG9mZnNldCwgaXQgaXMgdGhlIG1heGltdW0gd2UgY2FuIHdyaXRlIGludG8gYSBidWZmZXIgKi8KKyAgICBjb3B5c2l6ZSA9IE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUgLSBvZmZzZXQ7CisgICAgLyogYWRqdXN0IGluIGNhc2UgdXNlciB3YW50cyB0byB3cml0ZSBsZXNzIHRoYW4gdGhlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIgKGNvcHlzaXplKSBpbiB0aGF0IGNhc2UsIHRha2UgdGhlIG1pbihjb3B5c2l6ZSwgc2l6ZSkqLworICAgIGNvcHlzaXplID0gKGNvcHlzaXplIDwgc2l6ZSkgPyBjb3B5c2l6ZSA6IHNpemU7CisKKyAgICBNNE9TQV9tZW1jcHkoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSArIG9mZnNldCwgcERhdGEsIGNvcHlzaXplKTsKKworICAgIC8qIHVwZGF0ZSBidWZmZXIgc2l6ZSBpZiBpdCBpcyBhIG5ldyBidWZmZXIgb3IgZXhwYW5kZWQgb25lKi8KKyAgICBpZiAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA8IGNvcHlzaXplK29mZnNldCkKKyAgICB7CisgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBjb3B5c2l6ZStvZmZzZXQ7CisgICAgfQorCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSAtIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemU7IC8qIG5vdCB0ZW1wb3JhcnkgKi8KKworICAgIC8qIG1hcmsgdGhpcyBidWZmZXIgYXMgbW9kaWZpZWQgKi8KKyAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZSB8PSBNNE9TQV9rTW9kaWZpZWQ7CisKKyAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA9IDA7CisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJBY2Nlc3NlZCsrOworICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnRpbWVBY2Nlc3NlZCA9IGFwQ29udGV4dC0+Y2hyb25vOworICAgIGFwQ29udGV4dC0+Y2hyb25vKys7CisKKyAgICByZXR1cm4gY29weXNpemU7Cit9CisKKworLyogd3JpdGVzIGluIGEgYnVmZmVyIChudW1iZXIgaSkgd2l0aCB0aGUgZGF0YSByZWFkIGZyb20gZGlzayovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9FUlIgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckZpbGwoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGksIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGdyaWRQb3M7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGRpZmY7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemU7CisgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfSW50MzIgcmV0X3ZhbDsKKyAgICBNNE9TQV9VSW50MTYgZXJyUmV0dXJuZWQ7CisKKyAgICBNNE9TQV9UUkFDRTNfMigiQnVmZmVyRmlsbCAgaSA9ICVkICBwb3MgPSAlZCIsIGksIHBvcyk7CisKKyAgICAvKiBBdm9pZCBjeWNsaW5nIHN0YXRlbWVudCBiZWNhdXNlIG9mIEVPRiAqLworICAgIGlmKHBvcyA+IGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKQorICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7CisKKyAgICAvKiBSZWxvY2F0ZSB0byBhYnNvbHV0ZSBwb3N0aW9uIGlmIG5lY2Vzc2FyeSAqLworICAgIGdyaWRQb3MgPSAocG9zIC8gTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSkgKiBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFOworCisgICAgLyogZGlmZiBpcyBob3cgbXVjaCBzaGFsbCB3ZSBmc19zZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbiB0byByZWFjaCBncmlkUG9zKi8KKyAgICBkaWZmID0gZ3JpZFBvcyAtIGFwQ29udGV4dC0+cmVhZEZpbGVQb3M7CisKKyAgICAvKiBvbiBzb21lIGZpbGVzeXN0ZW1zIGl0IGlzIG5lY2Vzc2FyeSB0byBkbyBhIHNlZWsgYmV0d2VlbiBhbiBmZnMgcmVhZCBhbmQgZmZzIHdyaXRlIGV2ZW4gaWYgaXQgaXMgc2FtZSBwb3MgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfU2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYsIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZlcnJSZXR1cm5lZCk7CisgICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBncmlkUG9zOworCisgICAgICAgIGlmKHJldF92YWwgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJSZXR1cm5lZCk7CisgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckZpbGwgRVJSMSA9IDB4JXgiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIC8qIGVuZC4gb24gc29tZSAqLworCisvKiB0aGUgYnVmZmVyIHdpbGwgYmUgcmV1c2VkIHRvIGJlIGZpbGxlZCB3aXRoIGFub3RoZXIgZmlsZXBvcyBzbyByZWluaXQgY291bnRlcnMgb2YgYWNjZXNzICovCisgICAgaWYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgICE9IGdyaWRQb3MpCisgICAgeworICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkFjY2Vzc2VkID0gMDsKKyAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0udGltZUFjY2Vzc2VkID0gMDsKKyAgICB9CisKKyAgICAvKiBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoaXMgYnVmZmVyICovCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IGdyaWRQb3M7CisKKyAgICAvKiBSZWFkIERhdGEgKi8KKyAgICBzaXplID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9SZWFkKGFwQ29udGV4dC0+YUZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUsICZlcnJSZXR1cm5lZCk7CisKKyNpZmRlZiBGSUxFQ0FDSEVfU1RBVFMKKyAgICBhcENvbnRleHQtPm5iUmVhZEZGUysrOworI2VuZGlmIC8qIEZJTEVDQUNIRV9TVEFUUyAqLworCisgICAgaWYoc2l6ZSA9PSAtMSkKKyAgICB7CisgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBNNE9TQV9FT0Y7CisgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7CisKKyAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJSZXR1cm5lZCk7CisgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmlsbCBFUlIyID0gMHgleCIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IHNpemU7CisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gc2l6ZTsKKyAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA9IDA7CisKKworICAgIC8qIFJldHJpZXZlIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyclJldHVybmVkKTsKKworICAgIGlmKCAgIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID49IDApCisgICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPCBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFKSApCisgICAgeworICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKKyAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGaWxsIEVSUjMgPSAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBtYXJrIHRoaXMgYnVmZmVyIGFzIG1vZGlmaWVkICovCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgfD0gTTRPU0Ffa0ZpbGxlZDsKKworICAgIC8qIGl0IGlzIGEgd3JpdGUgYWNjZXNzICovCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJBY2Nlc3NlZCsrOworICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnRpbWVBY2Nlc3NlZCA9IGFwQ29udGV4dC0+Y2hyb25vOworICAgIGFwQ29udGV4dC0+Y2hyb25vKys7CisKKyAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKiAgUmVpbml0aWFsaXplcyBhIGJ1ZmZlciBmb3IgZmlsbGluZyBpdCBmb3IgZGF0YSBhdCBlbmQgb2YgZmlsZS4gZmlsZXBvc2l0aW9uIGlzIGdpdmVuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9FUlIgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclJlaW5pdGlhbGl6ZShNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaSwgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gZ3JpZFBvczsKKyAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKKworICAgIE00T1NBX01lbUFkZHI4IHNhdmVEYXRhQWRkcmVzczsKKworICAgIE00T1NBX1RSQUNFM18yKCJCdWZmZXJSZWluaXRpYWxpemUgaSA9ICVkICBwb3MgPSAlZCIsIGksIHBvcyk7CisKKyAgICAvKiBSZWxvY2F0ZSB0byBhYnNvbHV0ZSBwb3N0aW9uIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChwb3MgIT0gLTEpCisgICAgICAgIGdyaWRQb3MgPSAocG9zIC8gTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSkgKiBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFOworICAgIGVsc2UKKyAgICAgICAgZ3JpZFBvcyA9IC0xOworCisgICAgLyogUkFaIHRoZSBidWZmZXIsIG9ubHkgImRhdGEgYWRkcmVzcyIgc3RheXMqLworICAgIHNhdmVEYXRhQWRkcmVzcyA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGE7CisKKyAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KSYoYXBDb250ZXh0LT5idWZmZXJbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcikgLCAwKTsKKworICAgIC8qIHB1dCBhZ2FpbiB0aGUgcHJlY2lvdXMgImRhdGEgYWRkcmVzcyIgcHJldmlvdXNseSBhbGxvY2F0ZWQgKi8KKyAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gc2F2ZURhdGFBZGRyZXNzOworCisgICAgLyogaW5pdGlhbGl6YXRpb25zIGFscmVhZHkgZG9uZSBpbiB0aGUgbWVtc2V0OiAqLworICAgIC8qIG1hcmsgdGhpcyBidWZmZXIgYXMgaW5pdGlhbGl6ZWQqLworICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlPSBNNE9TQV9rSW5pdGlhbGl6ZWQ7CisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJBY2Nlc3NlZCA9IDA7CisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0udGltZUFjY2Vzc2VkID0gMDsKKworICAgIC8qIFJlbG9jYXRlIHRvIGFic29sdXRlIHBvc3Rpb24gaWYgbmVjZXNzYXJ5ICovCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IGdyaWRQb3M7CisKKyAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKKy8qIGZsdXNoZXMgYSBidWZmZXIgKG51bWJlciBpKSB0byB0aGUgZGlzayovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9FUlIgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckZsdXNoKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBpKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBncmlkUG9zLCBwb3M7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGRpZmY7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemU7CisgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfSW50MzIgcmV0X3ZhbDsKKyAgICBNNE9TQV9VSW50MTYgZXJyUmV0dXJuZWQ7CisKKyAgICBNNE9TQV9UUkFDRTNfMigiQnVmZmVyRmx1c2ggb2YgYnVmZmVyIGk9JWQgaXRzIHBvcz0lZCIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpOworCisgICAgcG9zID0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvczsKKworICAgIC8qIFJlbG9jYXRlIHRvIGFic29sdXRlIHBvc3Rpb24gaWYgbmVjZXNzYXJ5ICovCisgICAgZ3JpZFBvcyA9IChwb3MgLyBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFKSAqIE00T1NBX0NBQ0hFQlVGRkVSX1NJWkU7CisKKyAgICAvKiBkaWZmIGlzIGhvdyBtdWNoIHNoYWxsIHdlIGZzX3NlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uIHRvIHJlYWNoIGdyaWRQb3MqLworICAgIGRpZmYgPSBncmlkUG9zIC0gYXBDb250ZXh0LT5yZWFkRmlsZVBvczsKKworICAgIGlmIChwb3MgPiBhcENvbnRleHQtPmZpbGVTaXplKQorICAgIHsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaDogRXJyb3IhIEF0dGVtcHQgdG8gc2VlayBhdCBwb3M9JWQsIHdoaWxzdCBmaWxlU2l6ZT0lZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBhcENvbnRleHQtPmZpbGVTaXplKTsKKyAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7CisgICAgfQorCisgICAgLyogb24gc29tZSBmaWxlc3lzdGVtcyBpdCBpcyBuZWNlc3NhcnkgdG8gZG8gYSBzZWVrIGJldHdlZW4gYW4gZmZzIHJlYWQgYW5kIGZmcyB3cml0ZSBldmVuIGlmIGl0IGlzIHNhbWUgcG9zICovCisgICAgICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIGRpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZXJyUmV0dXJuZWQpOworICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gZ3JpZFBvczsKKworICAgICAgICBpZihyZXRfdmFsICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJyUmV0dXJuZWQpOworICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGaWxsIEVSUjEgPSAweCV4IiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAvKiBlbmQ6IG9uIHNvbWUgZmlsZXN5c3RlbXMqLworCisgICAgLyogdXBkYXRlIHRoZSByZWFkIGZpbGUgcG9zIGFmdGVyIHRoZSBzZWVrICovCisgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3M7CisKKyAgICAvKiBXcml0ZSBEYXRhICovCisgICAgc2l6ZSA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfV3JpdGUoYXBDb250ZXh0LT5hRmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUsICZlcnJSZXR1cm5lZCk7CisjaWZkZWYgRklMRUNBQ0hFX1NUQVRTCisgICAgYXBDb250ZXh0LT5uYldyaXRlRkZTKys7CisjZW5kaWYgLyogRklMRUNBQ0hFX1NUQVRTICovCisgICAgIC8qIHZlcmlmeSBpZiBhbGwgZGF0YSByZXF1ZXN0ZWQgdG8gYmUgd3JpdHRlbiwgaGFzIGJlZW4gd3JpdHRlbiAqLworICAgIGlmKHNpemUgPCBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplKQorICAgIHsKKyAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IE00T1NBX0VPRjsKKyAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gMDsKKworICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVyclJldHVybmVkKTsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaCBFUlIyID0gMHgleCIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogUmV0cmlldmUgY3VycmVudCBwb3NpdGlvbiAqLworICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1RlbGwoYXBDb250ZXh0LT5hRmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyUmV0dXJuZWQpOworCisgICAgYXBDb250ZXh0LT5maWxlU2l6ZSA9IChhcENvbnRleHQtPnJlYWRGaWxlUG9zID4gYXBDb250ZXh0LT5maWxlU2l6ZSkgPyBhcENvbnRleHQtPnJlYWRGaWxlUG9zIDogYXBDb250ZXh0LT5maWxlU2l6ZTsKKworICAgIC8qIG1hcmsgdGhpcyBidWZmZXIgYXMgbm90IG1vZGlmaWVkICovCisgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgJj0gfihNNE9TQV9rTW9kaWZpZWQpOworCisgICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyogZmx1c2hlcyBhbGwgbW9kaWZpZWQgYnVmZmVycyB1bnRpbCB0aGUgcG9zaXRpb24gb2YgYnVmZmVyIGkKK2lmIGluZGV4IGlzIE00T1NBX0NBQ0hFQlVGRkVSX0FMTCB0aGVuIGZsdXNoIGFsbCovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9FUlIgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcnNGbHVzaFVudGlsKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGluZGV4KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIE00T1NBX1VJbnQ4IGksIGosIGhvd01hbnlUb0ZsdXNoOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBidWZQb3NbTTRPU0FfQ0FDSEVCVUZGRVJfTkJdOworICAgIE00T1NBX0Jvb2wgZmx1c2hlZCA9IE00T1NBX0ZBTFNFOworICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOworCisKKyAgICBpPTA7CisgICAgZm9yKGo9MDsgajxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaisrKQorICAgIHsKKyAgICAgICAgaWYgKCAoKGFwQ29udGV4dC0+YnVmZmVyW2pdLnN0YXRlICYgTTRPU0Ffa01vZGlmaWVkKSA9PSBNNE9TQV9rTW9kaWZpZWQpICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZlBvc1tpXSA9IGFwQ29udGV4dC0+YnVmZmVyW2pdLmZpbGVwb3M7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaG93TWFueVRvRmx1c2ggPSBpOworCisgICAgaWYgKGhvd01hbnlUb0ZsdXNoID09IDApCisgICAgeworICAgICAgICBNNE9TQV9UUkFDRTJfMCgiQnVmZmVyc0ZsdXNoIDogbm8gZmx1c2ggbmVlZGVkIik7CisgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgIH0KKyAgICBlbHNlIGlmIChob3dNYW55VG9GbHVzaCA9PSAxKQorICAgIHsKKyAgICAgICAgZ290byBmbHVzaGluZzsKKyAgICB9CisKKyAgICBNNE9TQV9GaWxlQ2FjaGVfUVNfcXVpY2tTb3J0KGJ1ZlBvcywgaG93TWFueVRvRmx1c2gpOworCitmbHVzaGluZzoKKyAgICBpZiAoaW5kZXggPT0gTTRPU0FfQ0FDSEVCVUZGRVJfQUxMKQorICAgIHsvKiBzaW1wbHkgZmx1c2ggYWxsIGJ1ZmZlcnMgaW4gb3JkZXIgb2YgcG9zaXRpb25zICovCisgICAgICAgIGZvcihqPTA7IGo8aG93TWFueVRvRmx1c2g7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQorICAgICAgICAgICAgaWYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPT0gYnVmUG9zW2pdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcnNGbHVzaFVudGlsKDEpIDogV2UgTmVlZCB0byBGbHVzaCBidWZmZXIgJWQgaXRzIHBvcz0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpOworICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaChhcENvbnRleHQsIGkpOworICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SIT0gZXJyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogdGhlcmUgaXMgYSBnaXZlbiBpbmRleCB0byBmbHVzaCB1bnRpbCBpdCovCisgICAgICAgIGZvcihqPTA7IGo8aG93TWFueVRvRmx1c2g7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPT0gYnVmUG9zW2pdCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zIDw9IGFwQ29udGV4dC0+YnVmZmVyW2luZGV4XS5maWxlcG9zCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUgLSBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbCgyKSA6IFdlIE5lZWQgdG8gRmx1c2ggYnVmZmVyICVkIGl0cyBwb3M9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaChhcENvbnRleHQsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IhPSBlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPT1pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgLyogdGhlIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiBpbmRleCBoYXMgYmVlbiBmbHVzaGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hlZCA9IE00T1NBX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBpZiAoTTRPU0FfVFJVRSA9PSBmbHVzaGVkKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbCBlcnI9MHgleCIsIGVycik7CisgICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIGVycjsKKworfQorCisjaWZkZWYgQlVGRkVSX0RJU1BMQVkKK000T1NBX1ZvaWQgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckRpc3BsYXkoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCkKK3sKKyAgICBNNE9TQV9VSW50MzIgaTsKKworICAgIE00T1NBX1RSQUNFMV8wKCItLS0tLS0gQnVmZmVycyBkaXNwbGF5ICIpOworICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKKyAgICB7CisgICAgICAgIE00T1NBX1RSQUNFMV8zKCItLS0tLS0gQnVmJWQgOiBGaWxlUG9zPSVkIHN0YXRlPTB4JXggIiwKKyAgICAgICAgICAgICAgICAgICBpLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZSk7CisjaWZkZWYgQlVGRkVSX0RBVEUKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIm5iQWNjZXNzZWQ9JWQgLSBuYk1vZGlmaWVkID0lZCIsCisgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iQWNjZXNzZWQsIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iTW9kaWZpZWQpOworICAgICAgICBNNE9TQV9UUkFDRTFfMigidGltZUFjY2Vzc2VkPSVkIC0gdGltZU1vZGlmaWVkID0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0udGltZUFjY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS50aW1lTW9kaWZpZWQpOworI2VuZGlmIC8qIEJVRkZFUl9EQVRFICovCisgICAgfQorICAgIE00T1NBX1RSQUNFMV8wKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworfQorI2VuZGlmCisKKworLyogcHJvdmlkZXMgdGhlIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIGEgcG9zaXRpb24gcG9zCithbmQgd2l0aCBwb3MgaW5zaWRlIHRoZSByZWFkIGRhdGEgaW50byB0aGlzIGJ1ZmZlcgorZWxzZSByZXR1cm5zIENBQ0hFX0JVRkZFUl9OT05FKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK000T1NBX0ludDggTTRPU0FfRmlsZUNhY2hlX0J1ZmZlck1hdGNoVG9SZWFkKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIE00T1NBX0ludDggaTsKKworICAgIC8qIFNlbGVjdCB0aGUgYnVmZmVyIHdoaWNoIG1hdGNoZXMgd2l0aCBnaXZlbiBwb3MgKi8KKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBpZiggICAocG9zID49IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpCisgICAgICAgICAgICAmJiAocG9zIDwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUpCisgICAgICAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyAhPSBNNE9TQV9FT0YpICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiQnVmZmVyTWF0Y2ggcmV0dXJucyAgaSA9ICVkIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE00T1NBX1RSQUNFM18xKCJCdWZmZXJNYXRjaCByZXR1cm5zICBOIE8gTiBFICEhISIsIGkpOworICAgIHJldHVybiBNNE9TQV9DQUNIRUJVRkZFUl9OT05FOworfQorCisKKy8qIHByb3ZpZGVzIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB0byBhIHBvc2l0aW9uIHBvcworYW5kIHdpdGggcG9zIGluc2lkZSBpdHMgbWF4aW11bSBjYXBhY2l0eQorZWxzZSByZXR1cm5zIENBQ0hFX0JVRkZFUl9OT05FKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK000T1NBX0ludDggTTRPU0FfRmlsZUNhY2hlX0J1ZmZlck1hdGNoVG9Xcml0ZShNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9JbnQ4IGk7CisKKyAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBtYXRjaGVzIHdpdGggZ2l2ZW4gcG9zICovCisgICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoICAgKHBvcyA+PSBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKQorICAgICAgICAgICAmJiAocG9zIDwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyAhPSBNNE9TQV9FT0YpICAgICAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIkJ1ZmZlck1hdGNoIHJldHVybnMgIGkgPSAlZCIsIGkpOworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNNE9TQV9UUkFDRTNfMSgiQnVmZmVyTWF0Y2ggcmV0dXJucyAgTiBPIE4gRSAhISEiLCBpKTsKKyAgICByZXR1cm4gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORTsKK30KKworLyogY2hvb3NlcyBhIGJ1ZmZlciBieSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUgYW5kIHJldHVybnMgaSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTTRPU0FfSW50OCBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0Rm9yV3JpdGUoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9JbnQ4IGk7CisgICAgTTRPU0FfVUludDggc2VsZWN0ZWQgPSAwOworICAgIE00T1NBX1VJbnQzMiBqLCB0b1NvcnQ7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGJ1ZlBvc1tNNE9TQV9DQUNIRUJVRkZFUl9OQl07CisgICAgTTRPU0FfRVJSIGVycjsKKworICAgIC8vIHVwZGF0ZSBuYkZpbGxTaW5jZUxhc3RBY2VzcyBmaWVsZAorICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKKyAgICB7CisgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzICsrOworICAgIH0KKyNpZmRlZiBOT19TVFJBVEVHWQorICAgIGdvdG8gZW5kX3NlbGVjdGlvbjsKKyNlbmRpZgorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAxLyBpZiB0aGVyZSBpcyBzdGlsbCBhIG5ldyBidWZmZXIsIHVzZSBpdCAqLworCisgICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgPT0gTTRPU0Ffa0luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxlY3RlZCA9IGk7CisgICAgICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIDIvIENob29zZSBhIGZpbGxlZCBhbmQgY29waWVkIGJ1ZmZlciAgICAgICovCisKKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBpZiggKChhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZSAmIE00T1NBX2tGaWxsZWQpID09IE00T1NBX2tGaWxsZWQpCisgICAgICAgICAgICAmJiAoKGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlICYgTTRPU0Ffa0NvcGllZCkgPT0gTTRPU0Ffa0NvcGllZCkKKyAgICAgICAgICAgICYmICgoYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgJiBNNE9TQV9rTW9kaWZpZWQpICE9IE00T1NBX2tNb2RpZmllZCkgICAvKiBidWcgZml4IG1vZGlmaWVkICovCisgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOworICAgICAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogMy8gQ2hvb3NlIGEgbW9kaWZpZWQgYnVmZmVyIHdpdGggZmlsZXBvcz50aHJlc2hvbGQgYW5kIG1pbiAgICovCisgICAgaT0wOworCisgICAgLyogc29ydCB0aGUgYnVmZmVycyBieSBmaWxlcG9zIGFuZCBjaG9vc2UgdGhlIG1pbiBhbmQgbm90IDwgdGhyZXNob2xkKi8KKyAgICBmb3Ioaj0wOyBqPE00T1NBX0NBQ0hFQlVGRkVSX05COyBqKyspCisgICAgeworICAgICAgICBpZiAgKAorICAgICAgICAgICAgICgoYXBDb250ZXh0LT5idWZmZXJbal0uc3RhdGUgJiBNNE9TQV9rTW9kaWZpZWQpID09IE00T1NBX2tNb2RpZmllZCkKKyAgICAgICAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbal0uZmlsZXBvcyA+IC0xKSAvKiBub3QgRU9GICovCisgICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBidWZQb3NbaV0gPSBhcENvbnRleHQtPmJ1ZmZlcltqXS5maWxlcG9zOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgdG9Tb3J0ID0gaTsKKyAgICBpZiAodG9Tb3J0ID09IDAgKQorICAgIHsKKyAgICAgICAgc2VsZWN0ZWQgPSAwOworICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247CisgICAgfQorICAgIGVsc2UgaWYgKHRvU29ydCA9PTEgKQorICAgIHsKKyAgICAgICAgZ290byBza2lwX3NvcnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE00T1NBX0ZpbGVDYWNoZV9RU19xdWlja1NvcnQoYnVmUG9zLCB0b1NvcnQpOworICAgIH0KKworc2tpcF9zb3J0OgorICAgIC8qIHRha2UgdGhlIHNtYWxsZXN0IGZpbGVwb3MgKi8KKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBpZiAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9PSBidWZQb3NbMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGVjdGVkID0gaTsKKyAgICAgICAgICAgIGdvdG8gZW5kX3NlbGVjdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworZW5kX3NlbGVjdGlvbjoKKyAgICBpZiAoYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRdLmZpbGVwb3MgPiBhcENvbnRleHQtPmZpbGVTaXplICkKKyAgICB7CisgICAgICAgIC8qIGluIGNhc2UgaXQgc2VsZWN0cyBhIG1vZGlmaWVkIGJ1ZmZlciBvdXRzaWRlIHJlYWwgZmlsZSBzaXplLAorICAgICAgICBpbiB0aGF0IGNhc2UsIGZsdXNoIGFsbCBidWZmZXJzIGJlZm9yZSB0aGlzIG9uZQorICAgICAgICB1bmxlc3MgdGhlcmUgd2lsbCBiZSBhIHNlZWsgb3V0c2lkZSBmaWxlc2l6ZSovCisgICAgICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbChhcENvbnRleHQsIHNlbGVjdGVkKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkXS5zdGF0ZSAmIE00T1NBX2tNb2RpZmllZCkgPT0gTTRPU0Ffa01vZGlmaWVkICkKKyAgICB7CisgICAgICAgIC8qIGluIGNhc2UgaXQgc2VsZWN0cyBhIG1vZGlmaWVkIGJ1ZmZlciBpbnNpZGUgZmlsZXNpemUsIHNpbXBseSBmbHVzaCBpdCovCisgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaChhcENvbnRleHQsIHNlbGVjdGVkKTsKKyAgICAgICAgaWYgKE00Tk9fRVJST1IhPSBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE9TQV9DQUNIRUJVRkZFUl9OT05FOworICAgICAgICB9CisgICAgfQorCisjaWZkZWYgTk9fU1RSQVRFR1kKKyAgICAvKiBzZWxlY3RlZCBzdGF5cyAwICovCisgICAgZXJyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcnNGbHVzaFVudGlsKGFwQ29udGV4dCwgTTRPU0FfQ0FDSEVCVUZGRVJfQUxMKTsKKyAgICBpZiAoTTROT19FUlJPUiE9IGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBNNE9TQV9GSUxFX0NBQ0hFX0JVRkZFUl9OT05FOworICAgIH0KKyNlbmRpZgorCisgICAgTTRPU0FfVFJBQ0UzXzEoIi0tLS0tLS0tLS0gQnVmZmVyU2VsZWN0IHJldHVybnMgIGkgPSAlZCIsIHNlbGVjdGVkKTsKKyAgICAgcmV0dXJuIHNlbGVjdGVkOworfQorCisKKy8qIGNob29zZXMgYSBidWZmZXIgYnkgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lIGFuZCByZXR1cm5zIGkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK000T1NBX0ludDggTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhUaW1lKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfSW50OCBpOworICAgIE00T1NBX1VJbnQ4IHNlbGVjdGVkID0gMDsKKyAgICBNNE9TQV9VSW50MzIgaiwgdG9Tb3J0OworICAgIE00T1NBX1RpbWUgYnVmVGltZVtNNE9TQV9DQUNIRUJVRkZFUl9OQl07CisgICAgTTRPU0FfRVJSIGVycjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogMS8gaWYgdGhlcmUgaXMgc3RpbGwgYSBuZXcgYnVmZmVyLCB1c2UgaXQgKi8KKworICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKKyAgICB7CisgICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlID09IE00T1NBX2tJbml0aWFsaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOworICAgICAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgaT0wOworICAgIC8qIHNvcnQgYWxsIGJ1ZmZlcnMgd2l0aCBvcmRlciBvZiB0aW1lQWNjZXNzZWQgKi8KKyAgICBmb3Ioaj0wOyBqPE00T1NBX0NBQ0hFQlVGRkVSX05COyBqKyspCisgICAgeworICAgICAgICBidWZUaW1lW2ldID0gYXBDb250ZXh0LT5idWZmZXJbal0udGltZUFjY2Vzc2VkOworICAgICAgICBpKys7CisgICAgfQorCisgICAgdG9Tb3J0ID0gaTsKKyAgICBpZiAodG9Tb3J0ID09IDAgKQorICAgIHsKKyAgICAgICAgc2VsZWN0ZWQgPSAwOworICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247CisgICAgfQorICAgIGVsc2UgaWYgKHRvU29ydCA9PTEgKQorICAgIHsKKyAgICAgICAgZ290byBza2lwX3NvcnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE00T1NBX0ZpbGVDYWNoZV9RU19xdWlja1NvcnQ2NChidWZUaW1lLCB0b1NvcnQpOworICAgIH0KKworc2tpcF9zb3J0OgorICAgIC8qIHRha2UgdGhlIHNtYWxsZXN0IHRpbWVBY2Nlc3NlZCAqLworICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChhcENvbnRleHQtPmJ1ZmZlcltpXS50aW1lQWNjZXNzZWQgPT0gYnVmVGltZVswXSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOworICAgICAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOworICAgICAgICB9CisgICAgfQorCitlbmRfc2VsZWN0aW9uOgorICAgIGlmIChhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF0uZmlsZXBvcyA+IGFwQ29udGV4dC0+ZmlsZVNpemUgKQorICAgIHsKKyAgICAgICAgLyogaW4gY2FzZSBpdCBzZWxlY3RzIGEgbW9kaWZpZWQgYnVmZmVyIG91dHNpZGUgcmVhbCBmaWxlIHNpemUsCisgICAgICAgIGluIHRoYXQgY2FzZSwgZmx1c2ggYWxsIGJ1ZmZlcnMgYmVmb3JlIHRoaXMgb25lCisgICAgICAgIHVubGVzcyB0aGVyZSB3aWxsIGJlIGEgc2VlayBvdXRzaWRlIGZpbGVzaXplKi8KKyAgICAgICAgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcnNGbHVzaFVudGlsKGFwQ29udGV4dCwgc2VsZWN0ZWQpOworICAgIH0KKyAgICBlbHNlIGlmICgoYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRdLnN0YXRlICYgTTRPU0Ffa01vZGlmaWVkKSA9PSBNNE9TQV9rTW9kaWZpZWQgKQorICAgIHsKKyAgICAgICAgLyogaW4gY2FzZSBpdCBzZWxlY3RzIGEgbW9kaWZpZWQgYnVmZmVyIGluc2lkZSBmaWxlc2l6ZSwgc2ltcGx5IGZsdXNoIGl0Ki8KKyAgICAgICAgZXJyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckZsdXNoKGFwQ29udGV4dCwgc2VsZWN0ZWQpOworICAgICAgICBpZiAoTTROT19FUlJPUiE9IGVycikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE00T1NBX0NBQ0hFQlVGRkVSX05PTkU7CisgICAgICAgIH0KKyAgICB9CisgICAgTTRPU0FfVFJBQ0UzXzEoIi0tLS0tLS0tLS0gQnVmZmVyU2VsZWN0IHJldHVybnMgIGkgPSAlZCIsIHNlbGVjdGVkKTsKKyAgICAgcmV0dXJuIHNlbGVjdGVkOworfQorCisvKiBjaG9vc2VzIGEgYnVmZmVyIGJ5IG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZSBhbmQgcmV0dXJucyBpICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9JbnQ4IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoUG9zKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfSW50OCBpOworICAgIE00T1NBX1VJbnQ4IHNlbGVjdGVkID0gMCwgajsKKyAgICBNNE9TQV9FUlIgZXJyOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBtaW5Qb3M7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIDEvIGlmIHRoZXJlIGlzIHN0aWxsIGEgbmV3IGJ1ZmZlciwgdXNlIGl0ICovCisKKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZSA9PSBNNE9TQV9rSW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGVjdGVkID0gaTsKKyAgICAgICAgICAgIGdvdG8gZW5kX3NlbGVjdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1pblBvcyA9IGFwQ29udGV4dC0+YnVmZmVyWzBdLmZpbGVwb3M7CisgICAgc2VsZWN0ZWQgPSAwOworICAgIGZvcihqPTE7IGo8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGorKykKKyAgICB7CisgICAgICAgIGlmIChhcENvbnRleHQtPmJ1ZmZlcltqXS5maWxlcG9zIDwgbWluUG9zKQorICAgICAgICB7CisgICAgICAgICAgICBtaW5Qb3MgPSBhcENvbnRleHQtPmJ1ZmZlcltqXS5maWxlcG9zOworICAgICAgICAgICAgc2VsZWN0ZWQgPSBqOworICAgICAgICB9CisgICAgfQorCitlbmRfc2VsZWN0aW9uOgorICAgIGlmIChhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF0uZmlsZXBvcyA+IGFwQ29udGV4dC0+ZmlsZVNpemUgKQorICAgIHsKKyAgICAgICAgLyogaW4gY2FzZSBpdCBzZWxlY3RzIGEgbW9kaWZpZWQgYnVmZmVyIG91dHNpZGUgcmVhbCBmaWxlIHNpemUsCisgICAgICAgIGluIHRoYXQgY2FzZSwgZmx1c2ggYWxsIGJ1ZmZlcnMgYmVmb3JlIHRoaXMgb25lCisgICAgICAgIHVubGVzcyB0aGVyZSB3aWxsIGJlIGEgc2VlayBvdXRzaWRlIGZpbGVzaXplKi8KKyAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIkJ1ZmZlclNlbGVjdFdpdGhQb3Mgc2VsZWN0ZWQgYnVmZmVyIGlzIG91c2lkZSBmaWxlIGIuZmlsZXBvcz0lZCA+IGZpbGVTaXplPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRdLmZpbGVwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmZpbGVTaXplICk7CisgICAgICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbChhcENvbnRleHQsIHNlbGVjdGVkKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkXS5zdGF0ZSAmIE00T1NBX2tNb2RpZmllZCkgPT0gTTRPU0Ffa01vZGlmaWVkICkKKyAgICB7CisgICAgICAgIC8qIGluIGNhc2UgaXQgc2VsZWN0cyBhIG1vZGlmaWVkIGJ1ZmZlciBpbnNpZGUgZmlsZXNpemUsIHNpbXBseSBmbHVzaCBpdCovCisgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaChhcENvbnRleHQsIHNlbGVjdGVkKTsKKyAgICAgICAgaWYgKE00Tk9fRVJST1IhPSBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE9TQV9DQUNIRUJVRkZFUl9OT05FOworICAgICAgICB9CisgICAgfQorICAgIE00T1NBX1RSQUNFM18xKCItLS0tLS0tLS0tIEJ1ZmZlclNlbGVjdFdpdGhQb3MgcmV0dXJucyAgaSA9ICVkIiwgc2VsZWN0ZWQpOworICAgICByZXR1cm4gc2VsZWN0ZWQ7Cit9CisKKworLyogY2hvb3NlcyBhIGJ1ZmZlciBieSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUgYW5kIHJldHVybnMgaSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTTRPU0FfSW50OCBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFNwYWNlKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfSW50OCBpOworICAgIE00T1NBX1VJbnQ4IHNlbGVjdGVkID0gMDsKKyAgICBNNE9TQV9VSW50MzIgaiwgdG9Tb3J0OworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBidWZTdGF0W000T1NBX0NBQ0hFQlVGRkVSX05CXTsKKyAgICBNNE9TQV9FUlIgZXJyOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAxLyBpZiB0aGVyZSBpcyBzdGlsbCBhIG5ldyBidWZmZXIsIHVzZSBpdCAqLworCisgICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgPT0gTTRPU0Ffa0luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxlY3RlZCA9IGk7CisgICAgICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpPTA7CisgICAgLyogc29ydCBhbGwgYnVmZmVycyB3aXRoIG9yZGVyIG9mIG5iQWNjZXNzZWQgKi8KKyAgICBmb3Ioaj0wOyBqPE00T1NBX0NBQ0hFQlVGRkVSX05COyBqKyspCisgICAgeworICAgICAgICBidWZTdGF0W2ldID0gYXBDb250ZXh0LT5idWZmZXJbal0ubmJBY2Nlc3NlZCArIGFwQ29udGV4dC0+YnVmZmVyW2pdLnRpbWVBY2Nlc3NlZCoyOyAvKiB0cnkgaHlicmlkICovCisgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICB0b1NvcnQgPSBpOworICAgIGlmICh0b1NvcnQgPT0gMCApCisgICAgeworICAgICAgICBzZWxlY3RlZCA9IDA7CisgICAgICAgIGdvdG8gZW5kX3NlbGVjdGlvbjsKKyAgICB9CisgICAgZWxzZSBpZiAodG9Tb3J0ID09MSApCisgICAgeworICAgICAgICBnb3RvIHNraXBfc29ydDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTTRPU0FfRmlsZUNhY2hlX1FTX3F1aWNrU29ydChidWZTdGF0LCB0b1NvcnQpOworICAgIH0KKworc2tpcF9zb3J0OgorICAgIC8qIHRha2UgdGhlIHNtYWxsZXN0IG5iQWNjZXNzZWQgKi8KKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBpZiAoKE00T1NBX0ludDY0KSBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkFjY2Vzc2VkICArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnRpbWVBY2Nlc3NlZCoyID09IGJ1ZlN0YXRbMF0pIC8qIGh5YnJpZCAqLworICAgICAgICB7CisgICAgICAgICAgICBzZWxlY3RlZCA9IGk7CisgICAgICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247CisgICAgICAgIH0KKyAgICB9CisKK2VuZF9zZWxlY3Rpb246CisgICAgaWYgKGFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkXS5maWxlcG9zID4gYXBDb250ZXh0LT5maWxlU2l6ZSApCisgICAgeworICAgICAgICAvKiBpbiBjYXNlIGl0IHNlbGVjdHMgYSBtb2RpZmllZCBidWZmZXIgb3V0c2lkZSByZWFsIGZpbGUgc2l6ZSwKKyAgICAgICAgaW4gdGhhdCBjYXNlLCBmbHVzaCBhbGwgYnVmZmVycyBiZWZvcmUgdGhpcyBvbmUKKyAgICAgICAgdW5sZXNzIHRoZXJlIHdpbGwgYmUgYSBzZWVrIG91dHNpZGUgZmlsZXNpemUqLworICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZsdXNoVW50aWwoYXBDb250ZXh0LCBzZWxlY3RlZCk7CisgICAgfQorICAgIGVsc2UgaWYgKChhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF0uc3RhdGUgJiBNNE9TQV9rTW9kaWZpZWQpID09IE00T1NBX2tNb2RpZmllZCApCisgICAgeworICAgICAgICAvKiBpbiBjYXNlIGl0IHNlbGVjdHMgYSBtb2RpZmllZCBidWZmZXIgaW5zaWRlIGZpbGVzaXplLCBzaW1wbHkgZmx1c2ggaXQqLworICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmx1c2goYXBDb250ZXh0LCBzZWxlY3RlZCk7CisgICAgICAgIGlmIChNNE5PX0VSUk9SIT0gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKyAgICBNNE9TQV9UUkFDRTNfMSgiLS0tLS0tLS0tLSBCdWZmZXJTZWxlY3QgcmV0dXJucyAgaSA9ICVkIiwgc2VsZWN0ZWQpOworICAgICByZXR1cm4gc2VsZWN0ZWQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTTRPU0FfSW50OCBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0Rm9yUmVhZChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIE00T1NBX0ludDggaSxqLCBzZWxlY3RlZDsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gbWluX2Ftb3VudCxtYXhfYW1vdW50OworICAgIE00T1NBX0ludDggbWluX2ksbWF4X2NvdW50OworICAgIE00T1NBX0VSUiBlcnI7CisKKyAgICAvKiB1cGRhdGUgbmJGaWxsU2luY2VMYXN0QWNlc3MgZmllbGQgKi8KKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyArKzsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogUGxhbiBBLyBpZiB0aGVyZSBpcyBzdGlsbCBhIG5ldyBidWZmZXIsIHVzZSBpdCAqLworCisgICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgPT0gTTRPU0Ffa0luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBzZWxlY3RlZCA9IGk7CisgICAgICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtYXhfY291bnQgPSBNNE9TQV9DQUNIRUJVRkZFUl9OQjsKKyAgICBtYXhfYW1vdW50ID0gTUFYX0ZJTExTX1NJTkNFX0xBU1RfQUNDRVNTOworCisgICAgLyogUGxhbiBCIDogU2NhbiBmb3IgZGVhZCBidWZmZXIgKi8KKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA+PSAoTTRPU0FfVUludDMyKSBtYXhfYW1vdW50KQorICAgICAgICB7CisgICAgICAgICAgICBtYXhfYW1vdW50ID0gYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3M7CisgICAgICAgICAgICBtYXhfY291bnQgPSBpOworICAgICAgICB9CisgICAgfQorICAgIGlmKG1heF9jb3VudDxNNE9TQV9DQUNIRUJVRkZFUl9OQikKKyAgICB7CisgICAgICAgIE00T1NBX1RSQUNFM18yKCJERUFEIEJVRkZFUjogJWQsICVkIixtYXhfY291bnQsYXBDb250ZXh0LT5idWZmZXJbbWF4X2NvdW50XS5uYkZpbGxTaW5jZUxhc3RBY2Vzcyk7CisgICAgICAgIHNlbGVjdGVkID0gbWF4X2NvdW50OworICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247CisgICAgfQorCisgICAgbWluX2kgPSAwOworICAgIG1pbl9hbW91bnQgPSBNNE9TQV9DQUNIRUJVRkZFUl9OQjsKKworICAgIC8qIFNlbGVjdCB0aGUgYnVmZmVyIHdoaWNoIGlzIHRoZSBtb3N0ICJlbXB0eSIgKi8KKyAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCisgICAgeworICAgICAgICBqID0gaSAlIE00T1NBX0NBQ0hFQlVGRkVSX05COworCisgICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2pdLnJlbWFpbiA8IG1pbl9hbW91bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pbl9hbW91bnQgPSBhcENvbnRleHQtPmJ1ZmZlcltqXS5yZW1haW47CisgICAgICAgICAgICBtaW5faSA9IGo7CisgICAgICAgIH0KKyAgICB9CisgICAgc2VsZWN0ZWQgPSBtaW5faTsKKworZW5kX3NlbGVjdGlvbjoKKyAgICBpZiAoYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRdLmZpbGVwb3MgPiBhcENvbnRleHQtPmZpbGVTaXplICkKKyAgICB7CisgICAgICAgIC8qIGluIGNhc2UgaXQgc2VsZWN0cyBhIG1vZGlmaWVkIGJ1ZmZlciBvdXRzaWRlIHJlYWwgZmlsZSBzaXplLAorICAgICAgICBpbiB0aGF0IGNhc2UsIGZsdXNoIGFsbCBidWZmZXJzIGJlZm9yZSB0aGlzIG9uZQorICAgICAgICB1bmxlc3MgdGhlcmUgd2lsbCBiZSBhIHNlZWsgb3V0c2lkZSBmaWxlc2l6ZSovCisgICAgICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbChhcENvbnRleHQsIHNlbGVjdGVkKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkXS5zdGF0ZSAmIE00T1NBX2tNb2RpZmllZCkgPT0gTTRPU0Ffa01vZGlmaWVkICkKKyAgICB7CisgICAgICAgIC8qIGluIGNhc2UgaXQgc2VsZWN0cyBhIG1vZGlmaWVkIGJ1ZmZlciBpbnNpZGUgZmlsZXNpemUsIHNpbXBseSBmbHVzaCBpdCovCisgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaChhcENvbnRleHQsIHNlbGVjdGVkKTsKKyAgICAgICAgaWYgKE00Tk9fRVJST1IhPSBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE9TQV9DQUNIRUJVRkZFUl9OT05FOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNlbGVjdGVkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK000T1NBX0VSUiBNNE9TQV9GaWxlQ2FjaGVfQ2FsY3VsYXRlU2l6ZShNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworeworICAgIE00T1NBX0VSUiAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgIE00T1NBX0ludDMyICByZXRfdmFsOworICAgIE00T1NBX1VJbnQxNiBlcnJSZXR1cm5lZDsKKworICAgIC8qIGdvIHRvIHRoZSBlbmQgb2YgZmlsZSovCisgICAgcmV0X3ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfU2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJSZXR1cm5lZCk7CisKKyAgICBpZiAocmV0X3ZhbCAhPSAwKQorICAgIHsKKyAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IE00T1NBX0VPRjsKKyAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJSZXR1cm5lZCk7CisgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9GaWxlQ2FjaGVfQ2FsY3VsYXRlU2l6ZSBFUlIgPSAweCV4IiwgZXJyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmV0cmlldmUgc2l6ZSBvZiB0aGUgZmlsZSAqLworICAgICAgICBhcENvbnRleHQtPmZpbGVTaXplID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyclJldHVybmVkKTsKKyAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+ZmlsZVNpemU7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgKi8KKy8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICovCisvKnwgT1NBTCBmaWxlc3lzdGVtIGZ1bmN0aW9ucyBkZXBlbmRlbnQgb24gUGxhdGZvcm0gRmlsZVN5c3RlbSAgfCAqLworLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wgKi8KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICBPcGVucyBhIGZpbGUKKyAqIEBub3RlCisgKiBAcGFyYW0gICBwRmlsZURlc2NyaXB0b3IgOiAgICBJTiAgICB1cmwgb2YgdGhlIGZpbGUKKyAqICAgICAgICAgIEZpbGVNb2RlQWNjZXNzICA6ICAgIElOICAgIGFjY2VzcyBtb2RlIGZvciBvcGVuaW5nIHRoZSBmaWxlCisgKiAgICAgICAgICBlcnJub19mZnMgICAgICAgICAgIDogICBPVVQgaW50ZXJuYWwgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIGZpbGVzeXN0ZW0KKyAqIEByZXR1cm4gIHBDICAgICAgICAgICAgICA6ICAgaW50ZXJuYWwgY29udGV4dAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX1ZvaWQqIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX09wZW5fY2FjaGUoIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICkKK3sKKworICAgIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGUgICAgICpwQyA9IE00T1NBX05VTEw7CisgICAgRklMRSogZnA7CisKKyAgICBNNE9TQV9DaGFyICBtb2RlWzRdICAgICAgICAgICAgPSAiIjsKKyAgICBNNE9TQV9DaGFyKiBwUmVhZFN0cmluZyAgICAgICAgPSAoTTRPU0FfQ2hhciopInIiOworICAgIE00T1NBX0NoYXIqIHBXcml0ZVN0cmluZyAgICA9IChNNE9TQV9DaGFyKikidyI7CisgICAgTTRPU0FfQ2hhciogcEFwcGVuZFN0cmluZyAgICA9IChNNE9TQV9DaGFyKikiYSI7CisgICAgTTRPU0FfQ2hhciogcEJpbmFyeVN0cmluZyAgICA9IChNNE9TQV9DaGFyKikiYiI7CisgICAgTTRPU0FfQ2hhciogcFBsdXNTdHJpbmcgICAgICAgID0gKE00T1NBX0NoYXIqKSIrIjsKKworICAgIGZwID0gTTRPU0FfTlVMTDsKKyAgICAqZXJybm9fZmZzID0gMDsKKworICAgIE00T1NBX1RSQUNFM18wKCJNNE9TQV9GaWxlU3lzdGVtX0ZGU19PcGVuX2NhY2hlIDogT3BlbiAqKioqIFxuIik7CisKKyAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgLyogIFZlcmlmeSBhY2Nlc3MgbW9kZSAgKi8KKyAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qCisgICAgQWxsIHBvc3NpYmxlIGZpbGUgYWNjZXNzZXM6CisKKyAgICAgICAgciA6IFJlYWQgb25seSwgZmlsZSBtdXN0IGV4aXN0CisKKyAgICAgICAgdyA6IFdyaXRlIG9ubHkuIElmIHRoZSBmaWxlIGV4aXN0cywgaXQgaXMgb3ZlcndyaXR0ZW4uIElmIGl0IGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgorCisgICAgICAgIGEgOiB3cml0ZSBhdCBlbmQgb2YgZmlsZSAoYXBwZW5kKS4gSWYgdGhlIGZpbGUgZXhpc3RzLCBpdCBpcyBleHRlbmRlZC4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuCisKKyAgICAgICAgcisgOiB1cGRhdGUgKGkuZS4gcmVhZCBhbmQgd3JpdGUpLiBUaGUgZmlsZSBtdXN0IGV4aXN0LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZG8gYSByZWFkIGFmdGVyIGEgd3JpdGUgKG9yIGEgd3JpdGUgYWZ0ZXIgYSByZWFkKQorICAgICAgICB1bmxlc3Mgd2UgcmVwb3NpdGlvbiB0aGUgZmlsZSBwb2ludGVyLgorCisgICAgICAgIHcrIDogY3JlYXRpb24sIHRvIHVwZGF0ZS4gSWYgdGhlIGZpbGUgZXhpc3RzLCBpdCBpcyBvdmVyd3JpdHRlbi4gSWYgdGhlIGZpbGVzIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgorICAgICAgICBhKyA6IGV4dGVuc2lvbiBhbmQgdXBkYXRlLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4gSWYgdGhlIGZpbGUgZXhpc3RzLCB0aGUgZmlsZSBwb2ludGVyIGlzIHB1dCBhdCBlbmQgb2YgZmlsZS4KKworICAgIEFsbCBwb3NzaWJsZSBjYXNlcyBmb3IgZmlsZU1vZGVBY2Nlc3MgcGFyYW1ldGVyOgorCisgICAgICAgIFdyaXRlKDIpICAgICAgICAgICAgdworICAgICAgICBXcml0ZVJlYWQoMykgICAgICAgIHIrICAgIC8vIHIrYiBVc2VkIGJ5IE1NCisgICAgICAgIFdyaXRlUmVhZENyZWF0ZSgxMSkgICAgdysgICAgLy8gdytiIFVzZWQgYnkgTU0KKyAgICAgICAgV3JpdGVSZWFkQXBwZW5kKDcpICAgIGErCisgICAgICAgIFdyaXRlQ3JlYXRlKDEwKSAgICAgICAgdworICAgICAgICBXcml0ZUFwcGVuZCgxMikgICAgICAgIGEKKyAgICAgICAgUmVhZCAgICAgICAgICAgICAgICByICAgIC8vIHJiIFVzZWQgYnkgTU0KKyAgICAgICAgRXJyb3IKKyAgICAqLworCisKKyAgICBpZiAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkgJiYgKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSAmJiAoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSkpIC8qIFVzZWQgYnkgTU0gKi8KKyAgICB7CisgICAgICAgIC8qKiAidysiICovCisgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFdyaXRlU3RyaW5nLCAxKTsKKyAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwUGx1c1N0cmluZywgMSk7CisgICAgfQorICAgIGVsc2UgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpICYmIChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgJiYgKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpKQorICAgIHsKKyAgICAgICAgLyoqICJhKyIgKi8KKyAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwQXBwZW5kU3RyaW5nLCAxKTsKKyAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwUGx1c1N0cmluZywgMSk7CisgICAgfQorICAgIGVsc2UgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpICYmIChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkpICAgIC8qIFVzZWQgYnkgTU0gKi8KKyAgICB7CisgICAgICAgIC8qKiAicisiICovCisgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFJlYWRTdHJpbmcsIDEpOworICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBQbHVzU3RyaW5nLCAxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkgJiYgKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpKQorICAgIHsKKyAgICAgICAgLyoqICJ3IiAqLworICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBXcml0ZVN0cmluZywgMSk7CisgICAgfQorICAgIGVsc2UgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpICYmIChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSkKKyAgICB7CisgICAgICAgIC8qKiAiYSIgKi8KKyAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwQXBwZW5kU3RyaW5nLCAxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpCisgICAgeworICAgICAgICAvKiogInIiICovCisgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFJlYWRTdHJpbmcsIDEpOworICAgIH0KKyAgICBlbHNlIGlmIChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpCisgICAgeworICAgICAgICAvKiogInciICovCisgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFdyaXRlU3RyaW5nLCAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVTeXN0ZW1fRkZTX09wZW5fY2FjaGUgOiBpbnZhbGlkIEZpbGVNb2RlQWNjZXNzID0gJXgiLCBGaWxlTW9kZUFjY2Vzcyk7CisgICAgICAgICplcnJub19mZnMgPSAoTTRPU0FfVUludDE2KU00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOworICAgIH0KKworICAgIC8qIGFkZCB0aGUgYiAqLworICAgIE00T1NBX2Nock5DYXQobW9kZSwgcEJpbmFyeVN0cmluZywgMSk7CisKKyAgICBmcCA9IGZvcGVuKChjb25zdCBjaGFyICopIHBGaWxlRGVzY3JpcHRvciwgKGNvbnN0IGNoYXIgKiltb2RlKTsgLyogT3BlbiBpbiByYiBvciBpbiByK2IqLworICAgIGlmKCBmcCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHBDID0gKE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGUgKikgTTRPU0FfbWFsbG9jKHNpemVvZiAqIHBDLCBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIqKSJNNE9TQV9GaWxlU3lzdGVtX0ZGU19PcGVuX2NhY2hlIik7CisKKyAgICAgICAgaWYgKHBDID09IE00T1NBX05VTEwpIHJldHVybiBNNE9TQV9OVUxMOyAvKmVycm9yIG9jY3VyZWQgPT4gcmV0dXJuIE5VTEwgcG9pbnRlciovCisKKyAgICAgICAgcEMtPkZpbGVEZXNjID0gZnA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaChlcnJubykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBFTk9FTlQ6CisgICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTk9UX0ZPVU5ELCAiTTRPU0FfZmlsZVJlYWRPcGVuOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgICplcnJub19mZnM9KE00T1NBX1VJbnQxNilNNEVSUl9GSUxFX05PVF9GT1VORDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRUFDQ0VTOgorICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTE9DS0VELCAiTTRPU0FfZmlsZVJlYWRPcGVuOiBQZXJtaXNzaW9uIGRlbmllZCIpOworICAgICAgICAgICAgICAgICplcnJub19mZnM9KE00T1NBX1VJbnQxNilNNEVSUl9GSUxFX0xPQ0tFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBFSU5WQUw6CisgICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlUmVhZE9wZW46IEludmFsaWQgQXJndW1lbnQiKTsKKyAgICAgICAgICAgICAgICAqZXJybm9fZmZzPShNNE9TQV9VSW50MTYpTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICBjYXNlIEVNRklMRToKKyAgICAgICAgICAgICBjYXNlIEVOT1NQQzoKKyAgICAgICAgICAgICBjYXNlIEVOT01FTToKKyAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVSZWFkT3BlbjogVG9vIG1hbnkgb3BlbiBmaWxlcyIpOworICAgICAgICAgICAgICAgICplcnJub19mZnM9KE00T1NBX1VJbnQxNilNNEVSUl9BTExPQzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZVJlYWRPcGVuIik7CisgICAgICAgICAgICAgICAgKmVycm5vX2Zmcz0oTTRPU0FfVUludDE2KU00RVJSX05PVF9JTVBMRU1FTlRFRDsKKworICAgICAgICB9IC8qIGVuZCBzd2l0Y2ggKi8KKyAgICB9IC8qIGVuZCBlbHNlICovCisKKyAgICByZXR1cm4gKE00T1NBX1ZvaWQqKXBDOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgIFJlYWRzIGRhdGEgZnJvbSBmaWxlCisgKiBAbm90ZQorICogQHBhcmFtICAgcENvbnRleHQgICAgICAgIDogICBJTiAgaW50ZXJuYWwgY29udGV4dAorICogICAgICAgICAgZGF0YSAgICAgICAgICAgIDogICAgSU4gIGJ1ZmZlciBmb3IgcmVhZGluZyBkYXRhCisgKiAgICAgICAgICBzaXplICAgICAgICAgICAgOiAgICBJTiAgICBhbW91bnQgb2YgYnl0ZXMgdG8gcmVhZAorICogICAgICAgICAgZXJybm9fZmZzICAgICAgICAgICA6ICAgT1VUIGludGVybmFsIGVycm9yIHJldHVybmVkIGJ5IHRoZSBmaWxlc3lzdGVtCisgKiBAcmV0dXJuICByZXQgICAgICAgICAgICAgOiAgIGVmZmVjdGl2ZSBhbW91bnQgb2YgYnl0ZXMgcmVhZCAvIC0xIGlmIGFuIGVycm9yIG9jY3VycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19SZWFkX2NhY2hlKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApCit7CisgICAgTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqcEMgPSAoTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqKXBDb250ZXh0OworICAgIE00T1NBX0ludDMyICAgIHJlczsKKworICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9GaWxlU3lzdGVtX0ZGU19SZWFkICBzaXplID0gJWxkIiwgc2l6ZSk7CisKKyAgICByZXMgPSAtMTsKKworICAgIHJlcyA9IGZyZWFkKGRhdGEsc2l6ZW9mKE00T1NBX0NoYXIpLCBzaXplLCBwQy0+RmlsZURlc2MpOworICAgIGlmKCAtMSA8IHJlcyApCisgICAgeworICAgICAgICAqZXJybm9fZmZzID0gTTROT19FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmVycm5vX2ZmcyA9IGVycm5vOworICAgIH0KKworICAgIHJldHVybiAoTTRPU0FfRmlsZVBvc2l0aW9uKXJlczsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgV3JpdGVzIGRhdGEgdG8gZmlsZQorICogQG5vdGUKKyAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICA6ICAgSU4gIGludGVybmFsIGNvbnRleHQKKyAqICAgICAgICAgIGRhdGEgICAgICAgICAgICA6ICAgIElOICBidWZmZXIgd2l0aCBkYXRhIHRvIHdyaXRlCisgKiAgICAgICAgICBzaXplICAgICAgICAgICAgOiAgICBJTiAgICBhbW91bnQgb2YgYnl0ZXMgdG8gcmVhZAorICogICAgICAgICAgZXJybm9fZmZzICAgICAgICAgICA6ICAgT1VUIGludGVybmFsIGVycm9yIHJldHVybmVkIGJ5IHRoZSBmaWxlc3lzdGVtCisgKiBAcmV0dXJuICByZXQgICAgICAgICAgICAgOiAgIGVmZmVjdGl2ZSBhbW91bnQgb2YgYnl0ZXMgcmVhZCAvIGFuIGVycm9yIGNvZGUgaWYgYW4gZXJyb3Igb2NjdXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRmlsZVBvc2l0aW9uIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX1dyaXRlX2NhY2hlKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApCit7CisgICAgTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqcEMgPSAoTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqKXBDb250ZXh0OworICAgIE00T1NBX0ludDMyICAgIHJlczsKKworICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9GaWxlU3lzdGVtX0ZGU19Xcml0ZSAgc2l6ZSA9ICVsZCIsIHNpemUpOworCisgICAgcmVzID0gMDsKKworICAgIHJlcyA9IGZ3cml0ZShkYXRhLHNpemVvZihNNE9TQV9DaGFyKSwgc2l6ZSwgcEMtPkZpbGVEZXNjKTsKKyAgICBpZiggLTEgPCByZXMgKQorICAgIHsKKyAgICAgICAgKmVycm5vX2ZmcyA9IE00Tk9fRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICplcnJub19mZnMgPSBlcnJubzsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVTeXN0ZW1fRkZTX1dyaXRlICBlcnJvciIsICplcnJub19mZnMpOworICAgIH0KKworICAgIGZmbHVzaChwQy0+RmlsZURlc2MpOworCisgICAgcmV0dXJuIChNNE9TQV9GaWxlUG9zaXRpb24pcmVzOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgIFNlZWtzIGF0IGdpdmVuIHBvc2l0aW9uIGluIGEgZmlsZQorICogQG5vdGUKKyAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICA6ICAgSU4gIGludGVybmFsIGNvbnRleHQKKyAqICAgICAgICAgIHBvcyAgICAgICAgICAgICA6ICAgIElOICBhbW91bnQgb2YgYnl0ZXMgZm9yIHRoZSBtb3ZlCisgKiAgICAgICAgICBtb2RlICAgICAgICAgICAgOiAgICBJTiAgICBraW5kIG9mIHNlZWsgdG8gcGVyZm9ybQorICogICAgICAgICAgZXJybm9fZmZzICAgICAgICAgICA6ICAgT1VUIGludGVybmFsIGVycm9yIHJldHVybmVkIGJ5IHRoZSBmaWxlc3lzdGVtCisgKiBAcmV0dXJuICByZXQgICAgICAgICAgICAgOiAgIDAgb24gc3VjY2VzcyAvIGFueSBvdGhlciB2YWx1ZSBpZiBhbiBlcnJvciBvY2N1cnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9JbnQzMiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19TZWVrX2NhY2hlKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICkKK3sKKyAgICBNNE9TQV9GaWxlU3lzdGVtX0ZGU190X2NhY2hlICpwQyA9IChNNE9TQV9GaWxlU3lzdGVtX0ZGU190X2NhY2hlICopcENvbnRleHQ7CisKKyAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfRmlsZVN5c3RlbV9GRlNfU2VlayAgcG9zID0gJWxkICBtb2RlID0gJWQiLCBwb3MsIG1vZGUpOworCisgICAgc3dpdGNoKG1vZGUpCisgICAgeworICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA6CisgICAgICAgICAgICAqZXJybm9fZmZzID0gZnNlZWsocEMtPkZpbGVEZXNjLCBwb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA6CisgICAgICAgICAgICAqZXJybm9fZmZzPSBmc2VlayhwQy0+RmlsZURlc2MsIHBvcywgU0VFS19DVVIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQgOgorICAgICAgICAgICAgKmVycm5vX2ZmcyA9IGZzZWVrKHBDLT5GaWxlRGVzYywgcG9zLCBTRUVLX0VORCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gKmVycm5vX2ZmczsKKworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgIFRlbGxzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlsZSBwb2ludGVyCisgKiBAbm90ZQorICogQHBhcmFtICAgcENvbnRleHQgICAgICAgIDogICBJTiAgaW50ZXJuYWwgY29udGV4dAorICogICAgICAgICAgZXJybm9fZmZzICAgICAgICAgICA6ICAgT1VUIGludGVybmFsIGVycm9yIHJldHVybmVkIGJ5IHRoZSBmaWxlc3lzdGVtCisgKiBAcmV0dXJuICByZXQgICAgICAgICAgICAgOiAgIHBvc2l0aW9uIG9mIHRoZSBmaWxlIHBvaW50ZXIvIC0xIGlmIGFuIGVycm9yIG9jY3VycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19UZWxsX2NhY2hlKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApCit7CisgICAgTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqcEMgPSAoTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqKXBDb250ZXh0OworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3M7CisKKyAgICBwb3MgPSBmdGVsbChwQy0+RmlsZURlc2MpOworCisgICAgKmVycm5vX2ZmcyA9IDA7CisKKyAgICByZXR1cm4gcG9zOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgIENsb3NlcyB0aGUgZmlsZQorICogQG5vdGUKKyAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICA6ICAgSU4gIGludGVybmFsIGNvbnRleHQKKyAqICAgICAgICAgIGVycm5vX2ZmcyAgICAgICAgICAgOiAgIE9VVCBpbnRlcm5hbCBlcnJvciByZXR1cm5lZCBieSB0aGUgZmlsZXN5c3RlbQorICogQHJldHVybiAgcmV0ICAgICAgICAgICAgIDogICAwIG9uIHN1Y2Nlc3MgLyBhbnkgb3RoZXIgdmFsdWUgaWYgYW4gZXJyb3Igb2NjdXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfSW50MzIgTTRPU0FfRmlsZVN5c3RlbV9GRlNfQ2xvc2VfY2FjaGUoIE00T1NBX1ZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICkKK3sKKyAgICBNNE9TQV9GaWxlU3lzdGVtX0ZGU190X2NhY2hlICpwQyA9IChNNE9TQV9GaWxlU3lzdGVtX0ZGU190X2NhY2hlICopcENvbnRleHQ7CisKKyAgICAqZXJybm9fZmZzID0gZmNsb3NlKHBDLT5GaWxlRGVzYyk7CisKKyAgICByZXR1cm4gKmVycm5vX2ZmczsKK30KKworLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLworLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLworLyp8ICAgICAgICAgICAgICAgICAgICBPU0FMIGZpbGVDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgIHwqLworLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNNE9TQV9FUlIgTTRPU0FfZmlsZU9wZW5fY2FjaGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0cl9jYWNoZSAqRlM7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBGaWxlIFN5c3RlbSBpbnRlcmZhY2UgKi8KKyAgICBGUyA9IChNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0cl9jYWNoZSAqKU00T1NBX21hbGxvYyhzaXplb2YgKiBGUywKKyAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwoTTRPU0FfQ2hhciopIk00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyX2NhY2hlIik7CisKKyAgICBpZihNNE9TQV9OVUxMID09IEZTKQorICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisKKyAgICBGUy0+cEZjdFB0cl9PcGVuID0gTTRPU0FfRmlsZVN5c3RlbV9GRlNfT3Blbl9jYWNoZTsKKyAgICBGUy0+cEZjdFB0cl9SZWFkID0gTTRPU0FfRmlsZVN5c3RlbV9GRlNfUmVhZF9jYWNoZTsKKyAgICBGUy0+cEZjdFB0cl9Xcml0ZSA9IE00T1NBX0ZpbGVTeXN0ZW1fRkZTX1dyaXRlX2NhY2hlOworICAgIEZTLT5wRmN0UHRyX1NlZWsgPSBNNE9TQV9GaWxlU3lzdGVtX0ZGU19TZWVrX2NhY2hlOworICAgIEZTLT5wRmN0UHRyX1RlbGwgPSBNNE9TQV9GaWxlU3lzdGVtX0ZGU19UZWxsX2NhY2hlOworICAgIEZTLT5wRmN0UHRyX0Nsb3NlID0gTTRPU0FfRmlsZVN5c3RlbV9GRlNfQ2xvc2VfY2FjaGU7CisKKyAgICByZXR1cm4gTTRPU0FfZmlsZU9wZW5fY2FjaGVfaW50ZXJuYWwocENvbnRleHQsIHBGaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVNb2RlQWNjZXNzLCBGUyk7Cit9CisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBvcGVucyB0aGUgcHJvdmlkZWQgZmlsZURlc2NyaXB0b3IgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCisqIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKE9VVCkgRmlsZSBDYWNoZSBjb250ZXh0LgorKiBAcGFyYW0gICAgICAgcEZpbGVEZXNjcmlwdG9yIDogICAgICAgKElOKSBGaWxlIERlc2NyaXB0b3Igb2YgdGhlIGlucHV0IGZpbGUuCisqIEBwYXJhbSAgICAgICBGaWxlTW9kZUFjY2VzcyA6ICAgICAgICAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MuCisqIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSIHBDb250ZXh0IG9yIGZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKKyogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTICAgICAgdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QKKyogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIFRoZSBmaWxlIGNhbiBub3QgYmUgb3BlbmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVPcGVuX2NhY2hlX2ludGVybmFsKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHJfY2FjaGUgKkZTKQoreworICAgIE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQgPSBNNE9TQV9OVUxMOworCisgICAgTTRPU0FfRVJSICAgZXJyICAgICAgID0gTTROT19FUlJPUjsKKyAgICBNNE9TQV9Wb2lkKiBhRmlsZURlc2MgPSBNNE9TQV9OVUxMOworICAgIE00T1NBX0Jvb2wgIGJ1ZmZlcnNfYWxsb2NhdGVkID0gTTRPU0FfRkFMU0U7CisgICAgTTRPU0FfVUludDE2IGVyclJldHVybmVkID0gMDsKKyAgICBNNE9TQV9JbnQzMiBsZW4sbmFtZV9sZW47CisgICAgTTRPU0FfQ2hhciogcENoYXJGaWxlRGVzYyA9IChNNE9TQV9DaGFyKilwRmlsZURlc2NyaXB0b3I7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUworICAgIE00T1NBX1RpbWUgdGltZTEgPSAwOworICAgIE00T1NBX1RpbWUgdGltZTIgPSAwOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCisKKyAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZU9wZW5fY2FjaGUgZmQgPSAlcyBtb2RlID0gJWQiLCBwRmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU1vZGVBY2Nlc3MpOworCisgICAgLyogICAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7CisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwRmlsZURlc2NyaXB0b3IpOworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgRlMpOworCisgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQuICovCisgICAgYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0ICopTTRPU0FfbWFsbG9jKHNpemVvZihNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIqKSJNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCIpOworCisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIGFwQ29udGV4dCk7CisKKworI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCisgICAgICAgIE00T1NBX0ZpbGVDYWNoZV9pbml0VGltZU1lYXMoYXBDb250ZXh0KTsKKyAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMSwxMDAwKTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLworCisgICAgLyogU2V0IGZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCisgICAgYXBDb250ZXh0LT5GUyA9IEZTOworCisgICAgaWYgKE00T1NBX2tGaWxlV3JpdGUgPT0gRmlsZU1vZGVBY2Nlc3MpCisgICAgeworICAgICAgICBGaWxlTW9kZUFjY2VzcyB8PSBNNE9TQV9rRmlsZVdyaXRlIHwgTTRPU0Ffa0ZpbGVDcmVhdGU7ICAgIC8qIGZvciBWQSBpbiBjYXNlIG9mIG9wZW4gd2l0aCBvbmx5IFdyaXRlIGZsYWcsIHdlIGFkZCB0aGUgQ3JlYXRlICovCisgICAgfQorCisgICAgLyogRm9yIFZBIGFuZCBWRVMsIHdlIG5lZWQgdG8gYWRkIGFjY2VzcyBpbiByZWFkLCB0byB3cml0ZSB0aGUgbW9vdiBmb3IgZXhhbXBsZSAqLworICAgIC8qIEFkZCB0aGUgZmxhZyBSZWFkIGluIGFsbCBjYXNlcywgYmVjYXVzZSBPc2FsIEZpbGUgQ2FjaGUgdXNlcyByZWFkIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICBGaWxlTW9kZUFjY2VzcyB8PSBNNE9TQV9rRmlsZVJlYWQ7CisKKyAgICBhRmlsZURlc2MgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX09wZW4ocEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJSZXR1cm5lZCk7CisKKyAgICBpZiAoYUZpbGVEZXNjICE9IE00T1NBX05VTEwpCisgICAgeworICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLworICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVyclJldHVybmVkKTsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX2ZpbGVPcGVuX2NhY2hlIGVycm9yIDB4JXggZm9yIGZkID0gJXMiLCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZURlc2NyaXB0b3IpOworICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7CisKKyAgICAgICAgLypmcmVlIHRoZSBjb250ZXh0IGFuZCBhc3NvY2lhdGVkIEZTIHBvaW50ZXJzKi8KKyAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gYXBDb250ZXh0KSAvKnNob3VsZCBuZXZlciBiZSBudWxsKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gYXBDb250ZXh0LT5GUykgLypzaG91bGQgbmV2ZXIgYmUgbnVsbCovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWFwQ29udGV4dC0+RlMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYXBDb250ZXh0KTsKKyAgICAgICAgICAgIGFwQ29udGV4dCA9IE00T1NBX05VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBidWZmZXJzICovCisgICAgZXJyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcnNJbml0KGFwQ29udGV4dCk7CisgICAgYnVmZmVyc19hbGxvY2F0ZWQgPSBNNE9TQV9UUlVFOworCisgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7CisKKyAgICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgKi8KKyAgICBhcENvbnRleHQtPmZpbGVTaXplID0gMDsKKyAgICBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSA9IDA7CisgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IDA7CisgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zID0gMDsKKworCisgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IDA7CisKKyAgICAvKiBSZXRyaWV2ZSB0aGUgRmlsZSBEZXNjcmlwdG9yKi8KKyAgICBhcENvbnRleHQtPmFGaWxlRGVzYyA9IGFGaWxlRGVzYzsKKworICAgIC8qIFJldHJpZXZlIHRoZSBGaWxlIG1vZGUgQWNjZXNzICovCisgICAgYXBDb250ZXh0LT5GaWxlQXR0cmlidXRlLm1vZGVBY2Nlc3MgPSAoTTRPU0FfRmlsZU1vZGVBY2Nlc3MpRmlsZU1vZGVBY2Nlc3M7CisKKyAgICBhcENvbnRleHQtPmNocm9ubyA9IDA7CisKKyNpZmRlZiBGSUxFQ0FDSEVfU1RBVFMKKyAgICBhcENvbnRleHQtPm5iUmVhZENhY2hlID0gMDsKKyAgICBhcENvbnRleHQtPm5iV3JpdGVDYWNoZSA9IDA7CisKKyAgICBhcENvbnRleHQtPm5iUmVhZEZGUyA9IDA7CisgICAgYXBDb250ZXh0LT5uYldyaXRlRkZTID0gMDsKKyNlbmRpZgorCisgICAgLypSZXRyaWV2ZSB0aGUgRmlsZSByZWFkZXIgY29udGV4dCAqLworICAgICpwQ29udGV4dD0gKE00T1NBX0NvbnRleHQpYXBDb250ZXh0OworCisgICAgLyogQ29tcHV0ZSBmaWxlIHNpemUgKi8KKyAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQ2FsY3VsYXRlU2l6ZShhcENvbnRleHQpOworCisgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7CisKKyAgICBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSA9IGFwQ29udGV4dC0+ZmlsZVNpemU7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUworICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTIsMTAwMCk7CisgICAgaWYgKHRpbWUyPnRpbWUxKQorICAgICAgICBhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ZpbGVPcGVudGltZV0gKz0gdGltZTItdGltZTE7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworICAgIE00T1NBX211dGV4T3BlbigmKGFwQ29udGV4dC0+bV9tdXRleCkpOworCisgICAgLyogZmlsZW5hbWUgZXh0cmFjdGlvbiwganVzdCBmb3IgdHJhY2VzICAqLworICAgIE00T1NBX21lbXNldChhcENvbnRleHQtPm1fZmlsZW5hbWUsIDI1NiwgMCk7CisgICAgbGVuPSggTTRPU0FfY2hyTGVuZ3RoKHBDaGFyRmlsZURlc2MpICkrMTsKKyAgICBmb3IoIC0tbGVuIDsgKGxlbiA+PSAwICYmIHBDaGFyRmlsZURlc2NbbGVuXSAhPSAnXFwnICYmIHBDaGFyRmlsZURlc2NbbGVuXSAhPSAnLycpIDsgbGVuLS0gKTsKKyAgICBuYW1lX2xlbj1NNE9TQV9jaHJMZW5ndGgoICZwQ2hhckZpbGVEZXNjW2xlbisxXSApOworICAgIGVycj1NNE9TQV9jaHJOQ29weShhcENvbnRleHQtPm1fZmlsZW5hbWUsICZwQ2hhckZpbGVEZXNjW2xlbisxXSwgbmFtZV9sZW4pOworCisgICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVPcGVuX2NhY2hlIG9mICVzIGhhcyBwQyA9IDB4JXgiLCBhcENvbnRleHQtPm1fZmlsZW5hbWUsIGFwQ29udGV4dCk7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKKworY2xlYW51cDoKKworICAgIC8qIGZyZWUgY29udGV4dCAqLworICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmKGJ1ZmZlcnNfYWxsb2NhdGVkID09IE00T1NBX1RSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRnJlZShhcENvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gYXBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYXBDb250ZXh0KTsKKyAgICAgICAgICAgIGFwQ29udGV4dCA9IE00T1NBX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgcmVhZHMgdGhlICdzaXplJyBieXRlcyBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykKKyogICAgICAgICAgICAgICAgICAgICAgYW5kIHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgJ2RhdGEnIHBvaW50ZXIuIElmICdzaXplJyBieXRlIGNhbiBub3QgYmUgcmVhZCBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciwKKyogICAgICAgICAgICAgICAgICAgICAgJ3NpemUnIHBhcmFtZXRlciBpcyB1cGRhdGVkIHRvIG1hdGNoIHRoZSBjb3JyZWN0IG51bWJlciBvZiByZWFkIGJ5dGVzLgorKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KKyogQHBhcmFtICAgICAgIHBEYXRhIDogKE9VVCkgRGF0YSBwb2ludGVyIG9mIHRoZSByZWFkIGRhdGEuCisqIEBwYXJhbSAgICAgICBwU2l6ZSA6IChJTk9VVCkgU2l6ZSBvZiB0aGUgZGF0YSB0byByZWFkIChpbiBieXRlKS4KKyogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisqIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgcFNpemUsIGZpbGVEZXNjcmlwdG9yIG9yIHBEYXRhIGlzIE5VTEwKKyogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YV9jYWNoZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LE00T1NBX01lbUFkZHI4IHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBTaXplKQoreworICAgIE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqKSBwQ29udGV4dDsKKworICAgIE00T1NBX0VSUiBlcnI7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGFTaXplOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBjb3BpZWRTaXplOworICAgIE00T1NBX0ludDggc2VsZWN0ZWRfYnVmZmVyLCBjdXJyZW50X2J1ZmZlcjsKKyAgICBNNE9TQV9JbnQzMiBjYXN0ZWRTaXplOworCisjaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKKyAgICBNNE9TQV9UaW1lIHRpbWUxID0gMDsKKyAgICBNNE9TQV9UaW1lIHRpbWUyID0gMDsKKworICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTEsMTAwMCk7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworICAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9maWxlUmVhZERhdGFfY2FjaGUgb2YgJXMgc2l6ZT0lZCBhdCBwb3M9JWQgICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5tX2ZpbGVuYW1lLCAqcFNpemUsIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOworCisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcERhdGEpOworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFNpemUpOworCisgICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKKyAgICB9CisKK0xPQ0sKKworLyogMjAwODAxMjUgU3RhcnQgOiBpZiAqcFNpemUgaXMgdG9vIGhpZ2gsIGFkanVzdCBpdCB0byB0aGUgc2l6ZSBsZWZ0IGluIHRoZSBmaWxlLiBNSS05NTgqLworICAgIGNhc3RlZFNpemUgPSAqIHBTaXplOworICAgIGlmIChjYXN0ZWRTaXplIDwgMCkKKyAgICB7CisgICAgICAgIGNvcGllZFNpemUgPSAwOworICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOworI2lmZGVmIE00T1NBX0ZJTEVDQUNIRV9NTQorICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsgLyogbm9fZGF0YV95ZXQgZm9yIE1NICovCisjZW5kaWYKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKy8qIDIwMDgwMTI1IEVuZCA6IGlmICpwU2l6ZSBpcyB0b28gaGlnaCwgYWRqdXN0IGl0IHRvIHRoZSBzaXplIGxlZnQgaW4gdGhlIGZpbGUuIE1JLTk1OCovCisKKyAgICAvKiBQcmV2ZW50IHJlYWRpbmcgYmV5b25kIEVPRiAqLworICAgIGlmKCgqcFNpemUgPiAwKSAmJiAoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA+PSBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSkpIC8qIHZpcnR1YWwgRlNpemUqLworICAgIHsKKyAgICAgICAgY29waWVkU2l6ZSA9IDA7CisgICAgICAgIGVyciA9IE00V0FSX05PX01PUkVfQVU7IC8qIGZvciBWQSBhbmQgVlBTICovCisjaWZkZWYgTTRPU0FfRklMRUNBQ0hFX01NCisgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOyAvKiBub19kYXRhX3lldCBmb3IgTU0gKi8KKyNlbmRpZgorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisvKiAyMDA4MDEyNSBTdGFydCA6IGlmICpwU2l6ZSBpcyB0b28gaGlnaCwgYWRqdXN0IGl0IHRvIHRoZSBzaXplIGxlZnQgaW4gdGhlIGZpbGUuIE1JLTk1OCovCisgICAgaWYgKCpwU2l6ZSA+IChNNE9TQV9VSW50MzIpKGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplIC0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvcykpCisgICAgeworICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfZmlsZVJlYWREYXRhX2NhY2hlIDogQXR0ZW1wdGVkIHRvIHJlYWQgYmV5b25kIGZpbGUgc2l6ZSwgYWRqdXN0ZWQgc2l6ZSIpOworICAgICAgICAqcFNpemUgPSBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSAtIGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7CisgICAgfQorLyogMjAwODAxMjUgRW5kIDogaWYgKnBTaXplIGlzIHRvbyBoaWdoLCBhZGp1c3QgaXQgdG8gdGhlIHNpemUgbGVmdCBpbiB0aGUgZmlsZS4gTUktOTU4Ki8KKworICAgIC8qIENoZWNrIGlmIGRhdGEgY2FuIGJlIHJlYWQgZnJvbSBhIGJ1ZmZlciAqLworICAgIC8qIElmIG5vdCwgZmlsbCBvbmUgYWNjb3JkaW5nIHRvIHF1YW50aXplZCBwb3NpdGlvbnMgKi8KKyAgICBjb3BpZWRTaXplID0gMDsKKyAgICBlcnIgPSBNNE5PX0VSUk9SOworCisgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlck1hdGNoVG9SZWFkKGFwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7CisKKyAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORSkKKyAgICB7CisKKyNpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfSU5JVElBTCkKKyAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdEZvclJlYWQoYXBDb250ZXh0KTsKKyNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1RJTUUpCisgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoVGltZShhcENvbnRleHQpOworI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfU1BBQ0UpCisgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoU3BhY2UoYXBDb250ZXh0KTsKKyNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1BPUykKKyAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhQb3MoYXBDb250ZXh0KTsKKyNlbmRpZgorCisgICAgICAgIGlmIChNNE9TQV9DQUNIRUJVRkZFUl9OT05FID09IHNlbGVjdGVkX2J1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7IC8qIHRlbXBvcmFyeSBlcnJvciBjb2RlICovCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7CisgICAgfQorI2lmZGVmIEZJTEVDQUNIRV9TVEFUUworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGJ1ZmZlck1hdGNoIGhhcyBzdWNjZXNzIGluIHJlYWQgICovCisgICAgICAgIGFwQ29udGV4dC0+bmJSZWFkQ2FjaGUrKzsKKyAgICB9CisjZW5kaWYgLyogRklMRUNBQ0hFX1NUQVRTICovCisKKyAgICBpZihlcnIgIT0gTTROT19FUlJPUikKKyAgICB7CisgICAgICAgIGlmKChlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQpICYmICgqcFNpemUgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpKQorICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7CisgICAgICAgIGVsc2UgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIE00T1NBX1RSQUNFM18zKCJyZWFkRGF0YSAgc2l6ZSA9ICVkICBidWZmZXIgPSAlZCAgcG9zID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZSwgc2VsZWN0ZWRfYnVmZmVyLCBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKKworICAgIC8qIENvcHkgYnVmZmVyIGludG8gcERhdGEgKi8KKyAgICB3aGlsZSgoKE00T1NBX1VJbnQzMiljb3BpZWRTaXplIDwgKnBTaXplKSAmJiAoZXJyID09IE00Tk9fRVJST1IpKQorICAgIHsKKyAgICAgICAgYVNpemUgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOworICAgICAgICBjb3BpZWRTaXplICs9IGFTaXplOworCisgICAgICAgIGlmKGFTaXplID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMiljb3BpZWRTaXplIDwgKnBTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyID0gc2VsZWN0ZWRfYnVmZmVyOworICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJNYXRjaFRvUmVhZChhcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUpOworCisgICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX0NBQ0hFQlVGRkVSX05PTkUpCisgICAgICAgICAgICAgICAgeworI2lmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9JTklUSUFMKQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0Rm9yUmVhZChhcENvbnRleHQpOworI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfVElNRSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhUaW1lKGFwQ29udGV4dCk7CisjZWxpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfV0lUSF9TUEFDRSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhTcGFjZShhcENvbnRleHQpOworI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfUE9TKQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFBvcyhhcENvbnRleHQpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX0NBQ0hFQlVGRkVSX05PTkUgPT0gc2VsZWN0ZWRfYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsgLyogdGVtcG9yYXJ5IGVycm9yIGNvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkgJiYgKCgqcFNpemUtY29waWVkU2l6ZSkgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgRklMRUNBQ0hFX1NUQVRTCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYnVmZmVyTWF0Y2ggaGFzIHN1Y2Nlc3MgaW4gcmVhZCAgKi8KKyAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5uYlJlYWRDYWNoZSsrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGSUxFQ0FDSEVfU1RBVFMgKi8KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitjbGVhbnVwIDoKKworICAgIC8qIFVwZGF0ZSB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyICovCisgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyBjb3BpZWRTaXplOworCisjaWZkZWYgTTRPU0FfRklMRUNBQ0hFX01NCisgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFQ0FDSEVfTU0gKi8KKworICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQorICAgIHsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2ZpbGVSZWFkRGF0YV9jYWNoZSBzaXplID0gJWQgIGNvcGllZCA9ICVkICBlcnIgPSAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUsIGNvcGllZFNpemUsIGVycik7CisgICAgfQorCisgICAgLyogRWZmZWN0aXZlIGNvcGllZCBzaXplIG11c3QgYmUgcmV0dXJuZWQgKi8KKyAgICAqcFNpemUgPSBjb3BpZWRTaXplOworCisjaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKKyAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUyLDEwMDApOworICAgIGlmICh0aW1lMj50aW1lMSkKKyAgICAgICAgYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlUmVhZERhdGF0aW1lXSArPSB0aW1lMi10aW1lMTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLworCitVTkxPQ0sKKworICAgIC8qIFJlYWQgaXMgZG9uZSAqLworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgJ3NpemUnIGJ5dGVzIHN0b3JlZCBhdCAnZGF0YScgbWVtb3J5CisgKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBzZWxlY3RlZCBieSBpdHMgY29udGV4dC4KKyAqIEBub3RlICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKKyAqICAgICAgICAgICAgIG1lbW9yeSBmb3IgJ2RhdGEnIHBhcmFtZXRlci4KKyAqIEBub3RlICAgICAgIE1vcmVvdmVyIHRoZSBkYXRhIHBvaW50ZXIgbXVzdCBiZSBhbGxvY2F0ZWQgdG8gc3RvcmUgYXQgbGVhc3QKKyAqICAgICAgICAgICAgICdzaXplJyBieXRlcy4KKyAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCisgKiBAcGFyYW0gICAgICBwRGF0YTogKElOKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHdyaXRlIGRhdGEKKyAqIEBwYXJhbSAgICAgIHNpemU6IChJTikgU2l6ZSBvZiB0aGUgZGF0YSB0byB3cml0ZSAoaW4gYnl0ZXMpCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGFfY2FjaGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCxNNE9TQV9NZW1BZGRyOCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUpCit7CisgICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCopIHBDb250ZXh0OworCisgICAgTTRPU0FfRVJSIGVycjsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gYVNpemU7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGNvcGllZFNpemU7CisgICAgTTRPU0FfSW50OCBzZWxlY3RlZF9idWZmZXIsIGN1cnJlbnRfYnVmZmVyOworCisjaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKKyAgICBNNE9TQV9UaW1lIHRpbWUxID0gMDsKKyAgICBNNE9TQV9UaW1lIHRpbWUyID0gMDsKKworICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTEsMTAwMCk7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworICAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9maWxlV3JpdGVEYXRhX2NhY2hlIG9mICVzIHNpemU9JWQgYXQgcG9zPSVkICAgIiwKKyAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPm1fZmlsZW5hbWUsIHNpemUsIGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyk7CisKKyAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7CisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwRGF0YSk7CisKKworICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7CisgICAgfQorCisgICAgLypwcm90ZWN0aW9uKi8KKyAgICBpZiAoYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zID4gYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpCisgICAgeworICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfZmlsZVdyaXRlRGF0YV9jYWNoZSBFUlJPUiA6IGF0dGVtcHRpbmcgdG8gd3JpdGUgYmV5b25kIEVPRiIpOworICAgICAgICByZXR1cm4gTTRXQVJfTk9fREFUQV9ZRVQ7CisgICAgfQorCitMT0NLCisKKyAgICAvKiBDaGVjayBpZiBkYXRhIGhhcyBiZWVuIHJlYWQgaW50byBhIGJ1ZmZlciAqLworICAgIC8qIElmIG5vdCwgd2Ugc2hvdWxkIHJlYWQgdGhhdCBidWZmZXIgZmlyc3QgYW5kIHRoZW4gZmlsbCBpdCAqLworICAgIGNvcGllZFNpemUgPSAwOworICAgIGVyciA9IE00Tk9fRVJST1I7CisKKyAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyTWF0Y2hUb1dyaXRlKGFwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyk7CisKKyAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORSkKKyAgICB7CisjaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX0lOSVRJQUwpCisgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RGb3JXcml0ZShhcENvbnRleHQpOworI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfVElNRSkKKyAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhUaW1lKGFwQ29udGV4dCk7CisjZWxpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfV0lUSF9TUEFDRSkKKyAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhTcGFjZShhcENvbnRleHQpOworI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfUE9TKQorICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFBvcyhhcENvbnRleHQpOworI2VuZGlmCisKKyAgICAgICAgaWYgKE00T1NBX0NBQ0hFQlVGRkVSX05PTkUgPT0gc2VsZWN0ZWRfYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVdyaXRlRGF0YV9jYWNoZSBFUlIxIGVycj0weCV4IiwgZXJyKTsKKyAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOyAvKiB0ZW1wb3JhcnkgZXJyb3IgY29kZSAqLworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyAtIE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUgPCBhcENvbnRleHQtPmZpbGVTaXplKSAvKiBhYnNvbHV0ZVBvcyBub3QgcmVhZGZpbGVwbyBzdHJpY3RseSA8ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJSZWluaXRpYWxpemUoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MpOworICAgICAgICB9CisKKyAgICB9CisjaWZkZWYgRklMRUNBQ0hFX1NUQVRTCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogYnVmZmVyTWF0Y2ggaGFzIHN1Y2Nlc3MgaW4gd3JpdGUgKi8KKyAgICAgICAgYXBDb250ZXh0LT5uYldyaXRlQ2FjaGUrKzsKKyAgICB9CisjZW5kaWYgLyogRklMRUNBQ0hFX1NUQVRTICovCisKKyAgICBpZihlcnIgIT0gTTROT19FUlJPUikKKyAgICB7CisgICAgICAgIGlmKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkgLyogbWVhbnMgdGhlIGJ1ZmZlciBpcyBzbWFsbCwgaXQgaXMgYXQgRU9GLCBidWZmZXJGaWxsIGRpZG4ndCBmdWxseSBmaWxsIGl0Ki8KKyAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgICAgICBlbHNlIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBNNE9TQV9UUkFDRTNfMygid3JpdGVEYXRhICBzaXplID0gJWQgIGJ1ZmZlciA9ICVkICBwb3MgPSAlZCIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyLCBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MpOworCisgICAgLyogQ29weSBidWZmZXIgaW50byBwRGF0YSAqLworICAgIHdoaWxlKCgoTTRPU0FfVUludDMyKWNvcGllZFNpemUgPCBzaXplKSAmJiAoZXJyID09IE00Tk9fRVJST1IpKQorICAgIHsKKyAgICAgICAgYVNpemUgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyTW9kaWZ5Q29udGVudChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MrY29waWVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOworICAgICAgICBjb3BpZWRTaXplICs9IGFTaXplOworCisgICAgICAgIC8qIHVwZGF0ZSB2aXJ0dWFsRmlsZVNpemUgaW4gY2FzZSB3ZSB3cml0ZSBhdCB0aGUgZW5kICAqLworICAgICAgICBpZiAoYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zK2NvcGllZFNpemU+YXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplID0gYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zK2NvcGllZFNpemU7CisgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgidmlydHVhbEZpbGVTaXplIGluY3JlbWVudGVkIHRvICVkIiwgYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYoKE00T1NBX1VJbnQzMiljb3BpZWRTaXplIDwgc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudF9idWZmZXIgPSBzZWxlY3RlZF9idWZmZXI7CisgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyTWF0Y2hUb1dyaXRlKGFwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MrY29waWVkU2l6ZSk7CisKKyAgICAgICAgICAgIGlmKHNlbGVjdGVkX2J1ZmZlciA9PSBNNE9TQV9DQUNIRUJVRkZFUl9OT05FKQorICAgICAgICAgICAgeworI2lmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9JTklUSUFMKQorICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RGb3JXcml0ZShhcENvbnRleHQpOworI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfVElNRSkKKyAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFRpbWUoYXBDb250ZXh0KTsKKyNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1NQQUNFKQorICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoU3BhY2UoYXBDb250ZXh0KTsKKyNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1BPUykKKyAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFBvcyhhcENvbnRleHQpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAoTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORSA9PSBzZWxlY3RlZF9idWZmZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVdyaXRlRGF0YV9jYWNoZSBFUlIyIGVycj0weCV4IiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7IC8qIHRlbXBvcmFyeSBlcnJvciBjb2RlICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zK2NvcGllZFNpemUgPCBhcENvbnRleHQtPmZpbGVTaXplKSAvKiBhYnNvbHV0ZVBvcyBub3QgcmVhZGZpbGVwbyBzdHJpY3RseSA8ICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MrY29waWVkU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJSZWluaXRpYWxpemUoYXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MrY29waWVkU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgZ290byBjbGVhbnVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZmRlZiBGSUxFQ0FDSEVfU1RBVFMKKyAgICBlbHNlICAvKiAoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX0NBQ0hFQlVGRkVSX05PTkUpICovCisgICAgeworICAgICAgICAvKiBidWZmZXJNYXRjaCBoYXMgc3VjY2VzcyBpbiB3cml0ZSAqLworICAgICAgICBhcENvbnRleHQtPm5iV3JpdGVDYWNoZSsrOworICAgIH0KKyNlbmRpZiAvKiBGSUxFQ0FDSEVfU1RBVFMgKi8KKworICAgICAgICB9CisKKyAgICB9CisKK2NsZWFudXAgOgorCisgICAgLyogVXBkYXRlIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgKi8KKyAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MgKyBjb3BpZWRTaXplOworI2lmZGVmIE00T1NBX0ZJTEVDQUNIRV9NTQorICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3M7CisjZW5kaWYgLyogTTRPU0FfRklMRUNBQ0hFX01NICovCisKKyAgICBpZihlcnIgIT0gTTROT19FUlJPUikKKyAgICB7CisgICAgICAgIE00T1NBX1RSQUNFM18zKCJNNE9TQV9maWxlV3JpdGVEYXRhX2NhY2hlIHNpemUgPSAlZCAgY29waWVkID0gJWQgIGVyciA9IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgY29waWVkU2l6ZSwgZXJyKTsKKyAgICB9CisKKyAgICAvKiBFZmZlY3RpdmUgY29waWVkIHNpemUgbXVzdCBiZSByZXR1cm5lZCAqLworICAgIHNpemUgPSBjb3BpZWRTaXplOworCisjaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKKyAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUyLDEwMDApOworICAgIGlmICh0aW1lMj50aW1lMSkKKyAgICAgICAgYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlV3JpdGVEYXRhdGltZV0gKz0gdGltZTItdGltZTE7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworVU5MT0NLCisKKyAgICAvKiBSZWFkIGlzIGRvbmUgKi8KKyAgICByZXR1cm4gZXJyOworfQorCisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24gaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpLgorKiAgICAgICAgICAgICAgVGhlIHBvc2l0aW9uIGlzIHJlbGF0ZWQgdG8gdGhlIHNlZWtNb2RlIHBhcmFtZXRlciBpdCBjYW4gYmUgZWl0aGVyIDoKKyogICAgICAgICAgICAgIEZyb20gdGhlIGJlZ2lubmluZyAocG9zaXRpb24gTVVTVCBiZSBwb3NpdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBwb3NpdGlvbgorKiAgICAgICAgICAgICAgRnJvbSB0aGUgZW5kIChwb3NpdGlvbiBNVVNUIGJlIG5lZ2F0aXZlKSA6IGVuZCBwb3NpdGlvbiA9IGZpbGUgc2l6ZSArIHBvc2l0aW9uCisqICAgICAgICAgICAgICBGcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIChzaWduZWQgb2Zmc2V0KSA6IGVuZCBwb3NpdGlvbiA9IGN1cnJlbnQgcG9zaXRpb24gKyBwb3NpdGlvbi4KKyogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEZpbGUgcmVhZGVyIGNvbnRleHQuCisqIEBwYXJhbSAgICAgICBTZWVrTW9kZSA6ICAgICAgKElOKSBTZWVrIGFjY2VzcyBtb2RlLgorKiBAcGFyYW0gICAgICAgcFBvc2l0aW9uIDogICAgIChJTikgUG9zaXRpb24gaW4gdGhlIGZpbGUuCisqIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSIFNlZWttb2RlIG9yIGZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKKyogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgorKiBAcmV0dXJuICAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OIHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWtfY2FjaGUoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgU2Vla01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKK3sKKyAgICBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KikgcENvbnRleHQ7CisgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZpbmFsUG9zOworCisjaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKKyAgICBNNE9TQV9UaW1lIHRpbWUxID0gMDsKKyAgICBNNE9TQV9UaW1lIHRpbWUyID0gMDsKKworICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTEsMTAwMCk7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlUmVhZFNlZWtfY2FjaGUgbW9kZSA9ICVkIHBvcyA9ICVkIiwgU2Vla01vZGUsICpwUG9zaXRpb24pOworCisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFBvc2l0aW9uKTsKKyAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIFNlZWtNb2RlKTsKKworICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KKyAgICB9CisKK0xPQ0sKKworICAgIC8qIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCisgICAgc3dpdGNoKFNlZWtNb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgOgorICAgICAgICAgICAgZmluYWxQb3MgPSAqcFBvc2l0aW9uOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQgOgorICAgICAgICAgICAgZmluYWxQb3MgPSBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSArICpwUG9zaXRpb247CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgOgorICAgICAgICAgICAgZmluYWxQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgVU5MT0NLCisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkU2Vla19jYWNoZSB0byBhYnNvbHV0ZVBvcyA9ICVkICIsIGZpbmFsUG9zKTsKKworLyogMjAwODAxMjUgU3RhcnQgOiBQcm90ZWN0IGFnYWluc3Qgc2VlayBvdXRzaWRlIGZpbGUuIE1JLTk1OCovCisgICAgaWYgKGZpbmFsUG9zIDw9IGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplICYmIGZpbmFsUG9zPj0wKQorICAgIHsKKyAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGZpbmFsUG9zOworICAgICAgICAqcFBvc2l0aW9uID0gZmluYWxQb3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9maWxlUmVhZFNlZWtfY2FjaGU6IGF0dGVtcHRlZCB0byBzZWVrIGF0ICVkIHdoaWxzdCBmaWxlc2l6ZT0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBvcywgYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpOworICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsgICAgLyoga2VlcCB0aGUgcHJldmlvdXMgcG9zaXRpb24gKi8KKyAgICAgICAgLy9lcnIgPSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT047CisgICAgICAgIGVyciA9IE00Tk9fRVJST1I7ICAvKiBmb3IgVkEgKi8KKyAgICB9CisvKiAyMDA4MDEyNSBFbmQgOiBQcm90ZWN0IGFnYWluc3Qgc2VlayBvdXRzaWRlIGZpbGUuIE1JLTk1OCovCisKKyNpZmRlZiBNNE9TQV9GSUxFQ0FDSEVfTU0KKyAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFQ0FDSEVfTU0gKi8KKworI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCisgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMiwxMDAwKTsKKyAgICBpZiAodGltZTI+dGltZTEpCisgICAgICAgIGFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZVNlZWt0aW1lXSArPSB0aW1lMi10aW1lMTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLworCitVTkxPQ0sKKworICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCisgICAgcmV0dXJuIGVycjsKK30KKworCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4KKyogICAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciA6CisqICAgICAgICAgICAgICBGcm9tIHRoZSBiZWdpbm5pbmcgKHBvc2l0aW9uIE1VU1QgYmUgcG9zaXRpdmUpIDogZW5kIHBvc2l0aW9uID0gcG9zaXRpb24KKyogICAgICAgICAgICAgIEZyb20gdGhlIGVuZCAocG9zaXRpb24gTVVTVCBiZSBuZWdhdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBmaWxlIHNpemUgKyBwb3NpdGlvbgorKiAgICAgICAgICAgICAgRnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAoc2lnbmVkIG9mZnNldCkgOiBlbmQgcG9zaXRpb24gPSBjdXJyZW50IHBvc2l0aW9uICsgcG9zaXRpb24uCisqIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgorKiBAcGFyYW0gICAgICAgU2Vla01vZGUgOiAgICAgIChJTikgU2VlayBhY2Nlc3MgbW9kZS4KKyogQHBhcmFtICAgICAgIHBQb3NpdGlvbiA6ICAgICAoSU4pIFBvc2l0aW9uIGluIHRoZSBmaWxlLgorKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBTZWVrbW9kZSBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCisqIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisqIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KKyogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2Vla19jYWNoZSggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgU2Vla01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24pCit7CisgICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCopIHBDb250ZXh0OworICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmaW5hbFBvczsKKworI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCisgICAgTTRPU0FfVGltZSB0aW1lMSA9IDA7CisgICAgTTRPU0FfVGltZSB0aW1lMiA9IDA7CisKKyAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUxLDEwMDApOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCisKKyAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZVdyaXRlU2Vla19jYWNoZSBtb2RlID0gJWQgcG9zID0gJWQiLCBTZWVrTW9kZSwgKnBQb3NpdGlvbik7CisKKyAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7CisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwUG9zaXRpb24pOworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgU2Vla01vZGUpOworCisgICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyo8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLworICAgIH0KKworTE9DSworCisgICAgLyogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KKyAgICBzd2l0Y2goU2Vla01vZGUpCisgICAgeworICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA6CisgICAgICAgICAgICBmaW5hbFBvcyA9ICpwUG9zaXRpb247CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0VuZCA6CisgICAgICAgICAgICBmaW5hbFBvcyA9IGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplICsgKnBQb3NpdGlvbjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA6CisgICAgICAgICAgICBmaW5hbFBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyArICpwUG9zaXRpb247CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIFVOTE9DSworICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVTZWVrX2NhY2hlIHRvIGFic29sdXRlV3JpdGVQb3MgPSAlZCAiLCBmaW5hbFBvcyk7CisKKy8qIDIwMDgwMTI1IFN0YXJ0IDogUHJvdGVjdCBhZ2FpbnN0IHNlZWsgb3V0c2lkZSBmaWxlLiBNSS05NTgqLworICAgIGlmIChmaW5hbFBvcyA8PSBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSAmJiBmaW5hbFBvcz49MCkKKyAgICB7CisgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyA9IGZpbmFsUG9zOworICAgICAgICAqcFBvc2l0aW9uID0gZmluYWxQb3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9maWxlV3JpdGVTZWVrX2NhY2hlOiBhdHRlbXB0ZWQgdG8gc2VlayBhdCAlZCB3aGlsc3QgZmlsZXNpemU9JWQgICAgICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBvcywgYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpOworICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zOyAgICAvKiBrZWVwIHRoZSBwcmV2aW91cyBwb3NpdGlvbiAqLworICAgICAgICAvL2VyciA9IE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgZXJyID0gTTROT19FUlJPUjsgIC8qIGZvciBWQSAqLworICAgIH0KKy8qIDIwMDgwMTI1IEVuZCA6IFByb3RlY3QgYWdhaW5zdCBzZWVrIG91dHNpZGUgZmlsZS4gTUktOTU4Ki8KKworI2lmZGVmIE00T1NBX0ZJTEVDQUNIRV9NTQorICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3M7CisjZW5kaWYgLyogTTRPU0FfRklMRUNBQ0hFX01NICovCisKKyNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUworICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTIsMTAwMCk7CisgICAgaWYgKHRpbWUyPnRpbWUxKQorICAgICAgICBhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ZpbGVTZWVrdGltZV0gKz0gdGltZTItdGltZTE7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworVU5MT0NLCisKKyAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLworICAgIHJldHVybiBlcnI7Cit9CisKK000T1NBX0VSUiBNNE9TQV9maWxlRmx1c2hfY2FjaGUoIE00T1NBX0NvbnRleHQgcENvbnRleHQpCit7CisgICAgLyogRG8gbm90aGluZywgTTRPU0FfZmlsZUNhY2hlIG1vZHVsZSBtYW5hZ2VzIGl0cyBjYWNoZXMgYnkgaXRzZWxmICovCisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KS4KKyogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEZpbGUgcmVhZGVyIGNvbnRleHQuCisqIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZUNsb3NlX2NhY2hlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCit7CisgICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCopIHBDb250ZXh0OworCisgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfSW50MzIgYVJldF9WYWwgPSAwOworICAgIE00T1NBX1VJbnQxNiBlcnJSZXR1cm5lZCA9IDA7CisKKworI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCisgICAgTTRPU0FfVGltZSB0aW1lMSA9IDA7CisgICAgTTRPU0FfVGltZSB0aW1lMiA9IDA7CisKKyAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUxLDEwMDApOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCisKKyAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZUNsb3NlX2NhY2hlIHBDID0gMHgleCIsIHBDb250ZXh0KTsKKworICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKKworICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCisgICAgfQorCitMT0NLCisKKyNpZmRlZiBCVUZGRVJfRElTUExBWQorICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJEaXNwbGF5KGFwQ29udGV4dCk7CisjZW5kaWYKKworICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbChhcENvbnRleHQsIE00T1NBX0NBQ0hFQlVGRkVSX0FMTCk7CisKKyAgICAvKiBidWZmZXIgKi8KKyAgICBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZyZWUoYXBDb250ZXh0KTsKKworICAgIC8qIENsb3NlIHRoZSBmaWxlICovCisgICAgYVJldF9WYWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX0Nsb3NlKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJyUmV0dXJuZWQpOworCisgICAgaWYgKGFSZXRfVmFsICE9IDApCisgICAgeworICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCisgICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJyUmV0dXJuZWQpOworICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZUNsb3NlX2NhY2hlIEVSUjEgPSAweCV4IiwgZXJyKTsKKyAgICB9CisgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOworCisgICAgLyogRnJlZSB0aGUgY29udGV4dCAqLworICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilhcENvbnRleHQtPkZTKTsKKyAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYXBDb250ZXh0LT5hRmlsZURlc2MpOworCisjaWZkZWYgRklMRUNBQ0hFX1NUQVRTCit7CisgICAgTTRPU0FfSW50MzIgc3VjY2Vzc1JhdGVSZWFkLCBzdWNjZXNzUmF0ZVdyaXRlOworCisgICAgc3VjY2Vzc1JhdGVSZWFkPSAoYXBDb250ZXh0LT5uYlJlYWRGRlMgKyBhcENvbnRleHQtPm5iUmVhZENhY2hlID09MCk/ICgtMSkgOiAoYXBDb250ZXh0LT5uYlJlYWRDYWNoZSkqMTAwIC8gKGFwQ29udGV4dC0+bmJSZWFkQ2FjaGUgKyBhcENvbnRleHQtPm5iUmVhZEZGUyk7CisKKyAgICBzdWNjZXNzUmF0ZVdyaXRlID0gKGFwQ29udGV4dC0+bmJXcml0ZUZGUyArIGFwQ29udGV4dC0+bmJXcml0ZUNhY2hlID09IDApPyAoLTEpIDogKGFwQ29udGV4dC0+bmJXcml0ZUNhY2hlKSoxMDAgLyAoYXBDb250ZXh0LT5uYldyaXRlQ2FjaGUgKyBhcENvbnRleHQtPm5iV3JpdGVGRlMpOworCisjaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX0lOSVRJQUwpCisgICAgTTRPU0FfVFJBQ0UxXzAoIkJVRkZFUl9TRUxFQ1RfSU5JVElBTCIpOworI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfVElNRSkKKyAgICBNNE9TQV9UUkFDRTFfMCgiQlVGRkVSX1NFTEVDVF9XSVRIX1RJTUUiKTsKKyNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1NQQUNFKQorICAgIE00T1NBX1RSQUNFMV8wKCJCVUZGRVJfU0VMRUNUX1dJVEhfU1BBQ0UiKTsKKyNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1BPUykKKyAgICBNNE9TQV9UUkFDRTFfMCgiQlVGRkVSX1NFTEVDVF9XSVRIX1BPUyIpOworI2VuZGlmCisKKyAgICBNNE9TQV9UUkFDRTFfMSgiT3NhbCBGaWxlIENhY2hlIFN0YXRzIGZvciAlcyIsIGFwQ29udGV4dC0+bV9maWxlbmFtZSk7CisgICAgTTRPU0FfVFJBQ0UxXzIoIkZJTEVDQUNIRV9TVEFUUzogbmJSZWFkQ2FjaGU9JWQgLyBuYlJlYWRGRlM9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+bmJSZWFkQ2FjaGUsIGFwQ29udGV4dC0+bmJSZWFkRkZTKTsKKyAgICBNNE9TQV9UUkFDRTFfMigiRklMRUNBQ0hFX1NUQVRTOiBuYldyaXRlQ2FjaGU9JWQgLyBuYldyaXRlRkZTPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5uYldyaXRlQ2FjaGUsIGFwQ29udGV4dC0+bmJXcml0ZUZGUyk7CisgICAgTTRPU0FfVFJBQ0UxXzIoIkZJTEVDQUNIRV9TVEFUUzogU3VjY2VzcyBpbiByZWFkaW5nIDogJWQgcGVyY2VudCAtIFN1Y2Nlc3MgaW4gd3JpdGluZyAlZCBwZXJjZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NSYXRlUmVhZCwgc3VjY2Vzc1JhdGVXcml0ZSk7CisgICAgTTRPU0FfVFJBQ0UxXzAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworfQorI2VuZGlmIC8qIEZJTEVDQUNIRV9TVEFUUyAqLworCisgICAgVU5MT0NLCisKKyAgICBpZiAoYXBDb250ZXh0LT5tX211dGV4ICE9IE00T1NBX05VTEwpCisgICAgeworICAgICAgICBNNE9TQV9tdXRleENsb3NlKGFwQ29udGV4dC0+bV9tdXRleCk7CisgICAgICAgIGFwQ29udGV4dC0+bV9tdXRleCA9IE00T1NBX05VTEw7CisgICAgfQorCisjaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKKyAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMiwxMDAwKTsKKyAgICAgICAgaWYgKHRpbWUyPnRpbWUxKQorICAgICAgICAgICAgYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlQ2xvc2V0aW1lXSArPSB0aW1lMi10aW1lMTsKKworICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfZGlzcGxheVRpbWVNZWFzKGFwQ29udGV4dCk7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpYXBDb250ZXh0LCBzaXplb2YoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQpLCAwKTsKKworICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilhcENvbnRleHQpOworCisgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVDbG9zZV9jYWNoZSBsZWF2aW5nIHdpdGggZXJyID0gMHgleCIsIGVycik7CisKKyAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KKyogICAgICAgICAgICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgorKiBAbm90ZSAgICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgorKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCisqIEBwYXJhbSAgICAgICBPcHRpb25WYWx1ZSA6ICAgKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uLgorKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHBDb250ZXh0IGlzIE5VTEwKKyogQHJldHVybiAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQgdGhlIG9wdGlvbiBpZCBpcyBub3QgdmFsaWQuCisqIEByZXR1cm4gICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgVGhlIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVTZXRPcHRpb25fY2FjaGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIE9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBPcHRpb25WYWx1ZSkKK3sKKyAgICBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KikgcENvbnRleHQ7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUworICAgIE00T1NBX1RpbWUgdGltZTEgPSAwOworICAgIE00T1NBX1RpbWUgdGltZTIgPSAwOworCisgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMSwxMDAwKTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLworCisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOworCisgICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyoqPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIGRlc2lyZWQgb3B0aW9uIGlmIGl0IGlzIGF2YWxhaWJsZSAqLworICAgIHN3aXRjaChPcHRpb25JRCkKKyAgICB7CisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUgOiAgICAgICAvKio8IEdldCBzaXplIG9mIHRoZSBmaWxlLCBsaW1pdGVkIHRvIDMyIGJpdCBzaXplICovCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZSA6ICAvKio8IEdldCB0aGUgZmlsZSBhdHRyaWJ1dGUqLworICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldFVSTCA6ICAgICAgICAgICAgLyoqPCBHZXQgdGhlIGRpcmVjdG9yeSArIG5hbWUgb2YgdGhlIGZpbGUgKi8KKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRiA6ICAgICAgICAgICAgIC8qKjwgU2VlIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uIDogICAvKio8IEdldCBmaWxlIHBvc2l0aW9uICovCisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBRF9PTkxZOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlRGVzY01vZGU6CisgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgICAgICAgICAgICAgICAgICAgIC8qIGZvciBNTSAqLworCisgICAgICAgIGRlZmF1bHQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJhZCBvcHRpb24gSUQgKi8KKyAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKKyAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUyLDEwMDApOworICAgIGlmICh0aW1lMj50aW1lMSkKKyAgICAgICAgYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlU2V0T3B0aW9udGltZV0gKz0gdGltZTItdGltZTE7CisjZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KKworICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KKyogICAgICAgICAgICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgorKiBAbm90ZSAgICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgorKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCisqIEBwYXJhbSAgICAgICBwT3B0aW9uVmFsdWUgOiAgKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbi4KKyogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisqIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwQ29udGV4dCBpcyBOVUxMCisqIEByZXR1cm4gICAgICBNNEVSUl9CQURfT1BUSU9OX0lEIHRoZSBvcHRpb24gaWQgaXMgbm90IHZhbGlkLgorKiBAcmV0dXJuICAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlR2V0T3B0aW9uX2NhY2hlKE00T1NBX0NvbnRleHQgcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBPcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKK3sKKyAgICBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KikgcENvbnRleHQ7CisgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfQm9vbCBpc0VvZjsKKworI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCisgICAgTTRPU0FfVGltZSB0aW1lMSA9IDA7CisgICAgTTRPU0FfVGltZSB0aW1lMiA9IDA7CisKKyAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUxLDEwMDApOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCisKKworICAgIC8qICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCisgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7CisKKyAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLworICAgIH0KKworTE9DSworCisgICAgLyogR2V0IHRoZSBkZXNpcmVkIG9wdGlvbiBpZiBpdCBpcyBhdmFsYWlibGUgKi8KKyAgICBzd2l0Y2goT3B0aW9uSUQpCisgICAgeworICAgICAgICAvKiBHZXQgRmlsZSBTaXplICovCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemU6LyoqPCBHZXQgc2l6ZSBvZiB0aGUgZmlsZSwgbGltaXRlZCB0byAzMiBiaXQgc2l6ZSAqLworICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVHZXRPcHRpb25fY2FjaGUgUmVhZEdldEZpbGVTaXplIHJldHVybiBmaWxlc2l6ZSA9ICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpOworICAgICAgICAgICAgKCooTTRPU0FfVUludDMyICopcE9wdGlvblZhbHVlKSA9IGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplOyAvKiByZXR1cm4gdmlydHVhbCAqLworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlU2l6ZTovKio8IEdldCBzaXplIG9mIHRoZSBmaWxlLCBsaW1pdGVkIHRvIDMyIGJpdCBzaXplICovCisgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZUdldE9wdGlvbl9jYWNoZSBXcml0ZUdldEZpbGVTaXplIHJldHVybiBmaWxlc2l6ZSA9ICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpOworICAgICAgICAgICAgKCooTTRPU0FfVUludDMyICopcE9wdGlvblZhbHVlKSA9IGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplOyAvKiByZXR1cm4gdmlydHVhbCAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogQ2hlY2sgRW5kIG9mIGZpbGUgT2NjdXJzICovCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkSXNFT0YgOiAgICAgLyoqPCBTZWUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KKyAgICAgICAgICAgIGlzRW9mID0gKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPj0gYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOyAvKiB2aXJ0dWFsICovCisgICAgICAgICAgICAoKihNNE9TQV9Cb29sICopcE9wdGlvblZhbHVlKSA9IGlzRW9mOworICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVHZXRPcHRpb25fY2FjaGUgUmVhZElzRU9GIHJldHVybiBpc0VvZj0lZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRW9mKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIEdldCBGaWxlIFBvc2l0aW9uICovCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uIDogICAvKio8IEdldCBmaWxlIHBvc2l0aW9uICovCisgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZUdldE9wdGlvbl9jYWNoZSBSZWFkR2V0RmlsZVBvc2l0aW9uIHJldHVybiBycG9zPSVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOworICAgICAgICAgICAgKihNNE9TQV9GaWxlUG9zaXRpb24gKilwT3B0aW9uVmFsdWUgPSBhcENvbnRleHQtPmFic29sdXRlUG9zOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogR2V0IEZpbGUgUG9zaXRpb24gKi8KKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uIDogICAgLyoqPCBHZXQgZmlsZSBwb3NpdGlvbiAqLworICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVHZXRPcHRpb25fY2FjaGUgV3JpdGVHZXRGaWxlUG9zaXRpb24gcmV0dXJuIHdwb3M9JWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyk7CisgICAgICAgICAgICAqKE00T1NBX0ZpbGVQb3NpdGlvbiAqKXBPcHRpb25WYWx1ZSA9IGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIEdldCBBdHRyaWJ1dGUgKi8KKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlQXR0cmlidXRlIDogIC8qKjwgR2V0IHRoZSBmaWxlIGF0dHJpYnV0ZSA9IGFjY2VzcyBtb2RlICovCisgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZUdldE9wdGlvbl9jYWNoZSBSZWFkR2V0RmlsZUF0dHJpYnV0ZSByZXR1cm4gbW9kZT0lZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzKTsKKyAgICAgICAgICAgICgqKE00T1NBX0ZpbGVBdHRyaWJ1dGUgKilwT3B0aW9uVmFsdWUpLm1vZGVBY2Nlc3MgPSBhcENvbnRleHQtPkZpbGVBdHRyaWJ1dGUubW9kZUFjY2VzczsKKyAgICAgICAgICAgIGJyZWFrOworICAgLyoqIEdldCB0aGUgcmVhZGVyIGNvbnRleHQgZm9yIHJlYWQgJiB3cml0ZSBmaWxlLiAoTTRPU0FfQ29udGV4dCopKi8KKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0UmVhZGVyQ29udGV4dDoKKyAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlR2V0T3B0aW9uX2NhY2hlIFdyaXRlR2V0UmVhZGVyQ29udGV4dCByZXR1cm4gYz0weCV4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQpOworICAgICAgICAgICAgKCooTTRPU0FfQ29udGV4dCAqKXBPcHRpb25WYWx1ZSkgPSBhcENvbnRleHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qKjwgQmFkIG9wdGlvbiBJRCAqLworICAgICAgICAgICAgVU5MT0NLCisgICAgICAgICAgICByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUworICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTIsMTAwMCk7CisgICAgaWYgKHRpbWUyPnRpbWUxKQorICAgICAgICBhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ZpbGVHZXRPcHRpb250aW1lXSArPSB0aW1lMi10aW1lMTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLworCisgICAgVU5MT0NLCisKKworICAgIC8qUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KKyAgICByZXR1cm4gZXJyOworfQorCisvKiBGb3IgVkEgKi8KK000T1NBX0VSUiBNNE9TQV9maWxlRXh0cmFmVHJ1bmNhdGVfY2FjaGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9VSW50MzIgbGVuZ3RoKQoreworICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOworICAgIE00T1NBX1VJbnQxNiByZXN1bHQgPSBNNE9TQV9GQUxTRTsKKyAgICBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0ID0gY29udGV4dDsKKworCisgICAgRklMRSogZmlsZWRlc2MxID0gKChNNE9TQV9GaWxlU3lzdGVtX0ZGU190X2NhY2hlKikgKCBhcENvbnRleHQtPmFGaWxlRGVzYykpLT5GaWxlRGVzYzsKKworICAgIHJlc3VsdCA9IGZ0cnVuY2F0ZShmaWxlZGVzYzEtPl9maWxlLCBsZW5ndGgpOworCisgICAgaWYocmVzdWx0ICE9IDApCisgICAgeworICAgICAgICBlcnIgPSBlcnJubzsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIlNldEVuZE9mRmlsZSByZXR1cm5zIGVycjogMHgleFxuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0VYVFJBLCBlcnIpOworICAgIH0KKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKyNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE00T1NBX0ZpbGVDYWNoZV9pbml0VGltZU1lYXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3sKKyAgICBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KikgcENvbnRleHQ7CisgICAgTTRPU0FfVGltZSB0aW1lMSA9IDA7CisKKyAgICBtZW1zZXQoYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYiwgMCwgc2l6ZW9mKGFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWIpKTsgLy9SZXNldCBwZXJmIG1lYXN1cmVtZW50IGFycmF5CisKKyAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUxLDEwMDApOworICAgIGFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZW51bV9zaXplXSA9IHRpbWUxOyAgICAgICAgIC8vdG8gY29tcHV0ZSB0b3RhbCBhcHBsaWNhdGlvbiB0aW1lCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBNNE9TQV9GaWxlQ2FjaGVfZGlzcGxheVRpbWVNZWFzKE00T1NBX0NvbnRleHQgcENvbnRleHQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit7CisgICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCopIHBDb250ZXh0OworCisgICAgTTRPU0FfVGltZSBnbG9iYWxmaWxlcGVyZm1lYXMgPSAwOworICAgIE00T1NBX1RpbWUgdGltZTIgPSAwOworICAgIE00T1NBX1VJbnQzMiBpPTA7CisKKyAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUyLDEwMDApOworCisgICAgLyogVGltZSBzcGVudCBpbiBhcHBsaWNhdGlvbiAqLworICAgIHRpbWUyID0gdGltZTItYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltlbnVtX3NpemVdOworCisgICAgLyogVGltZSBzcGVudCBpbiBGaWxlIFN5c3RlbSBwcm9jZWR1cmVzICovCisgICAgZm9yIChpPTA7IGk8ZW51bV9zaXplOyBpKyspCisgICAgICAgIGdsb2JhbGZpbGVwZXJmbWVhcyArPSBhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ldOworCisgICAgTTRPU0FfVFJBQ0UxXzEoIk9zYWwgRmlsZSBDYWNoZSBUaW1lIG1lYXN1cmVtZW50IGZvciAlcyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5tX2ZpbGVuYW1lKTsKKyAgICBNNE9TQV9UUkFDRTFfMigiQXBwbGljYXRpb24gdGltZSA9JWQsIGZpbGVDYWNoZSB0b3RhbCB0aW1lID0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMil0aW1lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKWdsb2JhbGZpbGVwZXJmbWVhcyk7CisgICAgTTRPU0FfVFJBQ0UxXzQoIk9wZW50aW1lOiVkLCBSZWFkRGF0YXRpbWU6JWQsIFdyaXRlRGF0YXRpbWU6ICVkLCBTZWVrdGltZTolZCIsCisgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlT3BlbnRpbWVdICwKKyAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ZpbGVSZWFkRGF0YXRpbWVdICwKKyAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ZpbGVXcml0ZURhdGF0aW1lXSAsCisgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlU2Vla3RpbWVdICk7CisgICAgTTRPU0FfVFJBQ0UxXzQoIkdldE9wdGlvbnRpbWU6JWQsIFNldE9wdGlvbnRpbWU6JWQsIEV4dGVybmFsRmx1c2g6ICVkLCBDbG9zZXRpbWU6ICVkIiwKKyAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ZpbGVHZXRPcHRpb250aW1lXSAsCisgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlU2V0T3B0aW9udGltZV0sCisgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlRXh0ZXJuYWxGbHVzaHRpbWVdLAorICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKWFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZUNsb3NldGltZV0pOworICAgIE00T1NBX1RSQUNFMV8wKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworfQorCisjZW5kaWYgLyogTTRPU0FfRklMRV9JTlRFUkZBQ0VfTU1fVElNRV9NRUFTICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlQ29tbW9uLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlQ29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjUxNjNlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYwpAQCAtMCwwICsxLDY3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uLmMKKyAqIEBicmllZiAgICAgICAgRmlsZSBjb21tb24gZm9yIEFuZHJvaWQKKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHVzZWQgYnkgYm90aCB0aGUgZmlsZSB3cml0ZXIKKyAqICAgICAgICAgICAgICAgYW5kIGZpbGUgcmVhZGVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTCisjZXJyb3IgIlVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgaXMgbm90IGRlZmluZWQiCisjZW5kaWYgVVNFX1NUQUdFRlJJR0hUX0NPREVDUworCisjaWZkZWYgVVRGX0NPTlZFUlNJT04KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZiAvKlVURl9DT05WRVJTSU9OKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKworI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgorI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb25fcHJpdi5oIgorI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgorI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgorICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCisgKiBAcGFyYW0gICAgICBjb3JlX2lkOiAoSU4pIENvcmUgSUQgb2YgdGhlIGNhbGxlciAoTTRPU0FfRklMRV9SRUFERVIgb3IgTTRPU0FfRklMRV9XUklURVIpCisgKiBAcGFyYW0gICAgICBjb250ZXh0OiAoT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCisgKiBAcGFyYW0gICAgICB1cmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCisgKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgIGZpbGUKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTE9DS0VEOiB0aGUgZmlsZSBpcyBsb2NrZWQgYnkgYW4gb3RoZXIKKyAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uT3BlbihNNE9TQV9VSW50MTYgY29yZV9pZCwgTTRPU0FfQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcFVybCwgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgZmlsZU1vZGVBY2Nlc3MpCit7CisKKyAgICBNNE9TQV9JbnQzMiBpICAgICAgICAgICAgPSAwOworICAgIE00T1NBX0ludDMyIGlNb2RlICAgICAgICA9IDA7CisgICAgTTRPU0FfSW50MzIgaVNpemUgICAgICAgID0gMDsKKyAgICBNNE9TQV9JbnQzMiBpU2F2ZVBvcyAgICA9IDA7CisKKyAgICBNNE9TQV9DaGFyICBtb2RlWzRdICAgICAgICAgICAgPSAiIjsKKyAgICBNNE9TQV9DaGFyKiBwUmVhZFN0cmluZyAgICAgICAgPSAoTTRPU0FfQ2hhciopInIiOworICAgIE00T1NBX0NoYXIqIHBXcml0ZVN0cmluZyAgICA9IChNNE9TQV9DaGFyKikidyI7CisgICAgTTRPU0FfQ2hhciogcEFwcGVuZFN0cmluZyAgICA9IChNNE9TQV9DaGFyKikiYSI7CisgICAgTTRPU0FfQ2hhciogcEJpbmFyeVN0cmluZyAgICA9IChNNE9TQV9DaGFyKikiYiI7CisgICAgTTRPU0FfQ2hhciogcFBsdXNTdHJpbmcgICAgICAgID0gKE00T1NBX0NoYXIqKSIrIjsKKworICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOworCisgICAgRklMRSogcEZpbGVIYW5kbGVyID0gTTRPU0FfTlVMTDsKKyAgICBNNE9TQV9GaWxlQ29udGV4dCAqcEZpbGVDb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKKworI2lmZGVmIFVURl9DT05WRVJTSU9OCisgICAgLypGQjogdG8gdGVzdCB0aGUgVVRGMTYtPlVURjggY29udmVyc2lvbiBpbnRvIFZpZGVvIEFydGlzdCovCisgICAgLypDb252ZXJ0IHRoZSBVUkwgZnJvbSBVVEYxNiB0byBVVEY4Ki8KKyAgICBNNE9TQV9Wb2lkKiB0ZW1wQ29udmVyc2lvbkJ1ZjsKKyAgICBNNE9TQV9VSW50MzIgdGVtcENvbnZlcnNpb25TaXplID0gMTAwMDsKKworICAgIHRlbXBDb252ZXJzaW9uQnVmID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh0ZW1wQ29udmVyc2lvblNpemUgKzEsIDAsICJjb252ZXJzaW9uIGJ1ZiIpOworICAgIGlmKHRlbXBDb252ZXJzaW9uQnVmID09IE00T1NBX05VTEwpCisgICAgeworICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3Igd2hlbiBhbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICB9CisgICAgTTRPU0FfVG9VVEY4X09TQUwocFVybCwgdGVtcENvbnZlcnNpb25CdWYsICZ0ZW1wQ29udmVyc2lvblNpemUpOworICAgICgoTTRPU0FfQ2hhciopdGVtcENvbnZlcnNpb25CdWYpW3RlbXBDb252ZXJzaW9uU2l6ZSBdID0gJ1wwJzsKKworICAgIHByaW50ZigiZmlsZSBvcGVuICVzXG4iLCB0ZW1wQ29udmVyc2lvbkJ1Zik7CisjZW5kaWYgLypVVEYgQ09OVkVSU0lPTiovCisKKy8vLyp0bXBMU0EqL000T1NBX1RSQUNFMV8yKCIjIyMgTTRPU0FfZmlsZUNvbW1vbk9wZW4gJXMgMHglWCIsIHBVcmwsIGZpbGVNb2RlQWNjZXNzKTsKKyAgICBNNE9TQV9UUkFDRTNfNCgiTTRPU0FfZmlsZUNvbW1vbk9wZW5cdFx0TTRPU0FfVUludDE2ICVkXHRNNE9TQV9Db250ZXh0KiAweCV4XHQiCisgICAgICAgICJNNE9TQV9DaGFyKiAlc1x0ZmlsZU1vZGVBY2Nlc3MgJWQiLCBjb3JlX2lkLCBwQ29udGV4dCwgcFVybCwgZmlsZU1vZGVBY2Nlc3MpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBwVXJsICBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gZmlsZU1vZGVBY2Nlc3MsICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBmaWxlTW9kZUFjY2VzcyBpcyAwIik7CisKKyAgICAvKiBSZWFkIG1vZGUgbm90IHNldCBmb3IgdGhlIHJlYWRlciAqLworICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCksCisgICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlUmVhZCIpOworCisgICAgLyogUmVhZCBtb2RlIG5vdCBzZXQgZm9yIHRoZSByZWFkZXIgKi8KKyAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLAorICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVJlYWQiKTsKKworICAgIC8qIE00T1NBZmlsZVJlYWRPcGVuIGNhbm5vdCBiZSB1c2VkIHdpdGggV3JpdGUgZmlsZSBtb2RlIGFjY2VzcyAqLworICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksCisgICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlV3JpdGUiKTsKKworICAgIC8qIEFwcGVuZCBhbmQgQ3JlYXRlIGZsYWdzIGNhbm5vdCBiZSB1c2VkIHdpdGggUmVhZCAqLworICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpLAorICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZUFwcGVuZCIpOworCisgICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSksCisgICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlQ3JlYXRlIik7CisKKyAgICAvKiBXcml0ZSBtb2RlIG5vdCBzZXQgZm9yIHRoZSB3cml0ZXIgKi8KKyAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfV1JJVEVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSwKKyAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVXcml0ZSIpOworCisgICAgLyogQ3JlYXRlIGZsYWcgbmVjZXNzYXJ5IGZvciBvcGVuaW5nIGZpbGUgKi8KKyAgICBpZiAoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSAmJgorICAgICAgICAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSYmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpKQorICAgIHsKKyAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwV3JpdGVTdHJpbmcsIDEpOworICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBQbHVzU3RyaW5nLCAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwQXBwZW5kU3RyaW5nLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKQorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBSZWFkU3RyaW5nLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwV3JpdGVTdHJpbmcsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSYmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSxwUGx1c1N0cmluZywgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZighKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVJc1RleHRNb2RlKSkKKyAgICB7CisgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcEJpbmFyeVN0cmluZywgMSk7CisgICAgfQorCisgICAgLypPcGVuIHRoZSBmaWxlKi8KKworI2lmZGVmIFVURl9DT05WRVJTSU9OCisgICAgLypPcGVuIHRoZSBjb252ZXJ0ZWQgcGF0aCovCisgICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKil0ZW1wQ29udmVyc2lvbkJ1ZiwgKGNvbnN0IGNoYXIgKiltb2RlKTsKKyAgICAvKkZyZWUgdGhlIHRlbXBvcmFyeSBkZWNvZGVkIGJ1ZmZlciovCisgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXRlbXBDb252ZXJzaW9uQnVmKTsKKyNlbHNlCisgICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKilwVXJsLCAoY29uc3QgY2hhciAqKW1vZGUpOworI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCisKKyAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUhhbmRsZXIpCisgICAgeworICAgICAgICBzd2l0Y2goZXJybm8pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBFTk9FTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9OT1RfRk9VTkQsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGaWxlIG5vdCBmb3VuZDogJXMiLCBwVXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgRUFDQ0VTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTE9DS0VELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFBlcm1pc3Npb24gZGVuaWVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfTE9DS0VEOworICAgICAgICAgICAgfQorICAgICAgICAgY2FzZSBFSU5WQUw6CisgICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBJbnZhbGlkIEFyZ3VtZW50Iik7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7CisgICAgICAgICB9CisgICAgICAgIGNhc2UgRU1GSUxFOgorICAgICAgICAgY2FzZSBFTk9TUEM6CisgICAgICAgIGNhc2UgRU5PTUVNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFRvbyBtYW55IG9wZW4gZmlsZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgdGhlIGZpbGUgY29udGV4dCAqLworICAgIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopIE00T1NBX21hbGxvYyhzaXplb2YoTTRPU0FfRmlsZUNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICBjb3JlX2lkLCAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25PcGVuOiBmaWxlIGNvbnRleHQiKTsKKyAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQpCisgICAgeworICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOworICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisgICAgfQorCisgICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MgICAgICAgID0gcEZpbGVIYW5kbGVyOworICAgIHBGaWxlQ29udGV4dC0+YWNjZXNzX21vZGUgICAgPSBmaWxlTW9kZUFjY2VzczsKKyAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAgICA9IFNlZWtOb25lOworICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSAgICA9IE00T1NBX0ZBTFNFOworCisgICAgLyoqCisgICAgICogTm90ZTogTmV2ZXIgdXNlIHRoaXMgZXhwcmVzc2lvbiAiaSA9ICh2YWx1ZTEgPT0gdmFsdWUyKSA/IHg6IHk7IgorICAgICAqIGJlY2F1c2UgdGhhdCBkb2Vucyd0IGNvbXBpbGUgb24gb3RoZXIgcGxhdGZvcm1zIChBRFMgZm9yIGV4YW1wbGUpCisgICAgICogVXNlOiBpZih2YWx1ZTEgPT0gdmFsdWUyKQorICAgICAqICAgICAgICB7IGk9IHg7IC4uZXRjCisgICAgICovCisgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUgPSAwOworICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSAwOworICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSBNNE9TQV9rRGVzY05vbmVBY2Nlc3M7CisKKyAgICBpZiAoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkKKyAgICB7CisgICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSBjb3JlX2lkOworICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NSZWFkQWNjZXNzOworICAgIH0KKyAgICBlbHNlIGlmIChNNE9TQV9GSUxFX1dSSVRFUiA9PSBjb3JlX2lkKQorICAgIHsKKyAgICAgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUgPSBjb3JlX2lkOworICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NXcml0ZUFjY2VzczsKKyAgICB9CisKKyAgICBNNE9TQV9JTlRfVE9fRklMRV9QT1NJVElPTigwLCBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pOworICAgIE00T1NBX0lOVF9UT19GSUxFX1BPU0lUSU9OKDAsIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24pOworCisgICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSB0byBzdG9yZSB0aGUgVVJMIHN0cmluZyAqLworICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSAoTTRPU0FfQ2hhciopIE00T1NBX21hbGxvYyhNNE9TQV9jaHJMZW5ndGgocFVybCkrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaWQsIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFVSTCBuYW1lIik7CisgICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT51cmxfbmFtZSkKKyAgICB7CisgICAgICAgIGZjbG9zZShwRmlsZUhhbmRsZXIpOworICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEZpbGVDb250ZXh0KTsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOworICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisgICAgfQorICAgIE00T1NBX2Nock5Db3B5KHBGaWxlQ29udGV4dC0+dXJsX25hbWUsIHBVcmwsIE00T1NBX2Nockxlbmd0aChwVXJsKSsxKTsKKworICAgIC8qIEdldCB0aGUgZmlsZSBuYW1lICovCisgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKHBVcmwsICZwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSk7CisgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCisgICAgeworICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKKyAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBGaWxlQ29udGV4dC0+dXJsX25hbWUpOworICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEZpbGVDb250ZXh0KTsKKyAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0Ffc2VtYXBob3JlT3BlbigmKHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpLCAxKTsgLyogQWxsb2NhdGUgdGhlIHNlbWFwaG9yZSAqLworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworCisKKyNpZmRlZiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTCisgICAgLy8gV29ya2Fyb3VuZCBmb3IgZmlsZSBzeXN0ZW0gYnVnIG9uIFN0aW5ncmF5L0hvbmV5Y29tYiB3aGVyZSBhIGZpbGUgcmUtY3JlYXRlZCB3aWxsIGtlZXAKKyAgICAvLyB0aGUgb3JpZ2luYWwgZmlsZSdzIHNpemUgZmlsbGVkIHdpdGggMHMuIERvIG5vdCBzZWVrIHRvIHRoZSBlbmQgdG8gYXZvaWQgaWxsIGVmZmVjdHMKKyAgICBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSB7CisgICAgICAgIC8qIEdldCB0aGUgZmlsZSBzaXplICovCisgICAgICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KKyAgICAgICAgZnNlZWsocEZpbGVIYW5kbGVyLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKiAgICAyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlKi8KKyAgICAgICAgaVNpemUgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDMtIENoZWNrIHRoZSBmaWxlIHNpemUgICAgICAgICovCisgICAgICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgaVNhdmVQb3MsIFNFRUtfU0VUKTsvKiAgICA0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBpU2l6ZSA9IDA7CisgICAgfQorI2Vsc2UgLyogVVNFX1NUQUdFRlJJR0hUX0NPREVDUyAqLworICAgIC8qIEdldCB0aGUgZmlsZSBzaXplICovCisgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLworICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgMCwgU0VFS19FTkQpOyAgICAgICAgLyogICAgMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSovCisgICAgaVNpemUgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDMtIENoZWNrIHRoZSBmaWxlIHNpemUgICAgICAgICovCisgICAgZnNlZWsocEZpbGVIYW5kbGVyLCBpU2F2ZVBvcywgU0VFS19TRVQpOy8qICAgIDQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiAqLworI2VuZGlmIC8qIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgKi8KKworCisKKyAgICAvKiBXYXJuaW5nIHBvc3NpYmxlIG92ZXJmbG93IGlmIHRoZSBmaWxlIGlzIGhpZ2hlciB0aGFuIDJHQnl0ZXMgKi8KKyAgICBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSA9IGlTaXplOworCisgICAgKnBDb250ZXh0ID0gcEZpbGVDb250ZXh0OworLy8gICAgLyp0bXBMU0EqL000T1NBX1RSQUNFMV8xKCIjIyMgTTRPU0FfZmlsZUNvbW1vbk9wZW4gcEZpbGVDb250ZXh0IDB4JVgiLCBwRmlsZUNvbnRleHQpOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnQgZnJvbSBVVEYxNiB0byBVVEY4CisgKiBAcGFyYW0gICAgICBwQnVmZmVySW46IChJTikgVVRGMTYgaW5wdXQgcGF0aAorICogQHBhcmFtICAgICAgcEJ1ZmZlck91dDogKE9VVCkgVVRGOCBvdXRwdXQgcGF0aAorICogQHBhcmFtICAgICAgYnVmZmVyT3V0U2l6ZTogKElOL09VVCkgc2l6ZSBvZiB0aGUgb3V0cHV0IHBhdGgKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHRoZSBvdXRwdXQgcGF0aCBzaXplIGlzIG5vdCBlbm91Z2ggdG8gY29udGFpbgorICogICAgICAgICAgICAgICB0aGUgZGVjb2RlZCBwYXRoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworI2lmZGVmIFVURl9DT05WRVJTSU9OCitNNE9TQV9FUlIgTTRPU0FfVG9VVEY4X09TQUwgKE00T1NBX1ZvaWQgICAqcEJ1ZmZlckluLCBNNE9TQV9VSW50OCAgKnBCdWZmZXJPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpidWZmZXJPdXRTaXplKQoreworICAgIE00T1NBX1VJbnQxNiBpOworICAgIHdjaGFyX3QgICAgICAqd19zdHIgPSAod2NoYXJfdCAqKSBwQnVmZmVySW47CisgICAgTTRPU0FfVUludDMyIGxlbiwgc2l6ZV9uZWVkZWQsIHNpemVfZ2l2ZW47CisgICAgaWYgKHBCdWZmZXJJbiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgKnBCdWZmZXJPdXQ9TlVMTDsKKyAgICAgICAgKmJ1ZmZlck91dFNpemU9MTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGVuICAgICAgICAgPSB3Y3NsZW4od19zdHIpOworICAgICAgICBzaXplX25lZWRlZCA9IGxlbisxOworICAgICAgICBzaXplX2dpdmVuICA9ICpidWZmZXJPdXRTaXplOworCisgICAgICAgKmJ1ZmZlck91dFNpemU9c2l6ZV9uZWVkZWQ7CisgICAgICAgIGlmIChzaXplX2dpdmVuIDwgc2l6ZV9uZWVkZWQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJ1ZmZlck91dFtpXT0oTTRPU0FfVUludDgpd19zdHJbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQnVmZmVyT3V0W2xlbl09MDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKyNlbmRpZiAvKlVURiBDT05WRVJTSU9OKi8KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbi4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKKyAqIEBwYXJhbSAgICAgIHNlZWtNb2RlOiAoSU4pIFNlZWsgYWNjZXNzIG1vZGUKKyAqIEBwYXJhbSAgICAgIHBvc2l0aW9uOiAoSU4vT1VUKSBQb3NpdGlvbiBpbiB0aGUgZmlsZQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjogdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25TZWVrKE00T1NBX0NvbnRleHQgcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcEZpbGVQb3MpCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX2N1cnJlbnQ7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3Nfc2VlazsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19udWxsOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX25lZ191bjsKKyAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19maWxlX3NpemU7CisgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3Nfc2Vla19mcm9tX2JlZ2lubmluZzsKKworICAgIE00T1NBX1RSQUNFM18zKCJNNE9TQV9maWxlQ29tbW9uU2Vla1x0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgJWRcdE00T1NBX0ZpbGVQb3NpdGlvbiogMHgleCIsCisgICAgICAgIHBDb250ZXh0LCBzZWVrTW9kZSwgcEZpbGVQb3MpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25TZWVrIik7CisgICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gc2Vla01vZGUsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25TZWVrIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVQb3MsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25TZWVrIik7CisKKyAgICBNNE9TQV9JTlRfVE9fRklMRV9QT1NJVElPTigwLCBmcG9zX251bGwpOworICAgIE00T1NBX0lOVF9UT19GSUxFX1BPU0lUSU9OKC0xLCBmcG9zX25lZ191bik7CisgICAgTTRPU0FfRlBPU19TRVQoZnBvc19maWxlX3NpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplKTsKKworICAgIGlmKFNlZWtSZWFkID09IHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrKQorICAgIHsKKyAgICAgICAgTTRPU0FfRlBPU19TRVQoZnBvc19jdXJyZW50LCBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pOworICAgIH0KKyAgICBlbHNlIGlmKFNlZWtXcml0ZSA9PSBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlaykKKyAgICB7CisgICAgICAgIE00T1NBX0ZQT1NfU0VUKGZwb3NfY3VycmVudCwgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE00T1NBX0lOVF9UT19GSUxFX1BPU0lUSU9OKDAsIGZwb3NfY3VycmVudCk7CisgICAgfQorCisgICAgc3dpdGNoKHNlZWtNb2RlKQorICAgIHsKKyAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0ZQT1NfU0VUKGZwb3Nfc2VlaywgKnBGaWxlUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmc6CisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0ZQT1NfU1VCKGZwb3Nfc2VlaywgKnBGaWxlUG9zLCBmcG9zX2N1cnJlbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0VuZDoKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfRlBPU19BREQoZnBvc19zZWVrLCBmcG9zX2ZpbGVfc2l6ZSwgKnBGaWxlUG9zKTsKKyAgICAgICAgICAgIE00T1NBX0ZQT1NfU1VCKGZwb3Nfc2VlaywgZnBvc19zZWVrLCBmcG9zX2N1cnJlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorCisgICAgTTRPU0FfRlBPU19BREQoZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nLCBmcG9zX2N1cnJlbnQsIGZwb3Nfc2Vlayk7CisKKyAgICBpZihmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgZnBvc19zZWVrLCBTRUVLX0NVUikgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaChlcnJubykKKyAgICAgICAgeworICAgICAgICBjYXNlIEVJTlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG1lYW5pbmcgdGhlIHZhbHVlIGZvciBvcmlnaW4gaXMgaW52YWxpZCBvciB0aGUgcG9zaXRpb24KKyAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgb2Zmc2V0IGlzIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlICovCisgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEVCQURGOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsvKiBmaWxlIGhhbmRsZSBpcyBpbnZhbGlkICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIHJldHVybmVkIHBvc2l0aW9uIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAqLworICAgIE00T1NBX0ZQT1NfU0VUKCpwRmlsZVBvcywgZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nKTsKKworICAgIC8qIFNFRUsgZG9uZSwgcmVzZXQgZW5kIG9mIGZpbGUgdmFsdWUgKi8KKyAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgPSBNNE9TQV9GQUxTRTsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRvIGNsb3NlIHRoZSBmaWxlIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KQorICogQG5vdGUgICAgICAgVGhlIGNvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIvd3JpdGVyIGlzIGZyZWVkLgorICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK000T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfVUludDE2IGNvcmVfaWQsIE00T1NBX0NvbnRleHQgcENvbnRleHQpCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OworICAgIE00T1NBX0ludDMyIGkzMl9lcnJfY29kZT0wOworCisgICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25DbG9zZVx0TTRPU0FfVUludDE2ICVkXHRNNE9TQV9Db250ZXh0IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaWQsIHBDb250ZXh0KTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwKKyAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vbkNsb3NlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAorICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25DbG9zZTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKKyAgICBwRmlsZUNvbnRleHQtPnVybF9uYW1lID0gTTRPU0FfTlVMTDsKKworICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSk7CisgICAgcEZpbGVDb250ZXh0LT5maWxlX25hbWUgPSBNNE9TQV9OVUxMOworCisgICAgaTMyX2Vycl9jb2RlID0gZmNsb3NlKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKKworICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjID0gTTRPU0FfTlVMTDsKKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICBNNE9TQV9zZW1hcGhvcmVDbG9zZShwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsvKiBmcmVlIHRoZSBzZW1hcGhvcmUgKi8KKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEZpbGVDb250ZXh0KTsKKworICAgIGlmIChpMzJfZXJyX2NvZGUgIT0gMCkKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZUNvbW1vbkNsb3NlIik7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZmlsZSBhdHRyaWJ1dGVzIChhc3NvY2lhdGVkIHRvIHRoZQorICogICAgICAgICAgICAgY29udGV4dCkKKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTikgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgorICogQHBhcmFtICAgICAgYXR0cmlidXRlOiAoT1VUKSBUaGUgZmlsZSBhdHRyaWJ1dGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlQXR0cmlidXRlKiBwQXR0cmlidXRlKQoreworCisgICAgTTRPU0FfRmlsZUNvbnRleHQqIGZpbGVDb250ZXh0ID0gcENvbnRleHQ7CisKKyAgICBzdHJ1Y3Qgc3RhdCBUaGVTdGF0OworCisgICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGVcdE00T1NBX0NvbnRleHQgMHgleFx0IgorICAgICAgICAiTTRPU0FfRmlsZUF0dHJpYnV0ZSogMHgleCIsIHBDb250ZXh0LCBwQXR0cmlidXRlKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBBdHRyaWJ1dGUsICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUiKTsKKworICAgIGlmKHN0YXQoKGNoYXIqKWZpbGVDb250ZXh0LT51cmxfbmFtZSwgJlRoZVN0YXQpICE9IDApCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOworICAgIH0KKworICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIocEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnRpbWUsIFRoZVN0YXQuc3RfY3RpbWUpOworICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIocEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUudGltZSwgVGhlU3RhdC5zdF9hdGltZSk7CisgICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMihwQXR0cmlidXRlLT5tb2RpZmllZERhdGUudGltZSwgVGhlU3RhdC5zdF9tdGltZSk7CisKKyAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUudGltZVNjYWxlICAgID0gMTsKKyAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS50aW1lU2NhbGU9IDE7CisgICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWVTY2FsZSAgICA9IDE7CisKKyAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUucmVmZXJlbmNlWWVhciAgICA9IDE5NzA7CisgICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUucmVmZXJlbmNlWWVhcj0gMTk3MDsKKyAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUucmVmZXJlbmNlWWVhciAgICA9IDE5NzA7CisKKyAgICBwQXR0cmlidXRlLT5tb2RlQWNjZXNzID0gZmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBmaWxlIFVSTCAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCisgKiBAcGFyYW0gICAgICB1cmw6IChPVVQpIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVVJMIChhbGxvY2F0ZWQgYnkKKyAqICAgICAgICAgICAgIE00T1NBX2ZpbGVDb21tb25HZXRVUkwpCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NoYXIqKiBwVXJsKQoreworICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKKyAgICBNNE9TQV9VSW50MzIgICAgdWlMZW5ndGg7CisKKyAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldFVSTFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9DaGFyKiogMHgleCIsCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwVXJsKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsICAgIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogcFVybCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICB1aUxlbmd0aCA9IE00T1NBX2Nockxlbmd0aChwRmlsZUNvbnRleHQtPnVybF9uYW1lKSsxOworCisgICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSB0byBzdG9yZSB0aGUgdXJsX25hbWUgKi8KKyAgICAqcFVybCA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModWlMZW5ndGgsIE00T1NBX0ZJTEVfQ09NTU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uR2V0VVJMOiB1cmwiKTsKKyAgICBpZihNNE9TQV9OVUxMID09ICpwVXJsKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uR2V0VVJMIik7CisgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKKyAgICB9CisKKyAgICBNNE9TQV9jaHJOQ29weSgqcFVybCwgcEZpbGVDb250ZXh0LT51cmxfbmFtZSwgdWlMZW5ndGgpOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lIGFzc29jaWF0ZWQKKyAqICAgICAgICAgICAgIHRvIHRoZSBpbnB1dCBVUkwuCisgKiBAbm90ZSAgICAgICBUaGUgdXNlciBzaG91bGQgbm90IGZvcmdldCB0byBkZWxldGUgdGhlIG91dHB1dCBzdHJpbmcgdXNpbmcKKyAqICAgICAgICAgICAgIE00T1NBX3N0ckRlc3Ryb3kKKyAqIEBwYXJhbSAgICAgIHBVcmw6ICAgICAgICAgICAgKElOKSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVSTAorICogQHBhcmFtICAgICAgcEZpbGVOYW1lOiAgICAoT1VUKSBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTC4gSXQgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgIGZpbGUKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKE00T1NBX0NoYXIqIHBVcmwsIE00T1NBX0NoYXIqKiBwRmlsZU5hbWUpCit7CisgICAgTTRPU0FfSW50MzIgaSAgICAgICAgICAgID0gMDsKKyAgICBNNE9TQV9JbnQzMiBpVXJsTGVuICAgICAgICA9IDA7CisgICAgTTRPU0FfSW50MzIgRmlsZU5hbWVMZW4gPSAwOworCisgICAgTTRPU0FfQ2hhciogcHRyVXJsICAgICAgICA9IE00T1NBX05VTEw7CisgICAgTTRPU0FfQ2hhciogcHRyRmlsZW5hbWUgICAgPSBNNE9TQV9OVUxMOworCisgICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRVUkxcdE00T1NBX0NoYXIqICVzXHRNNE9TQV9DaGFyKiogMHgleCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXJsLCBwRmlsZU5hbWUpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZU5hbWUsICAgIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IHBGaWxlTmFtZSBpcyBNNE9TQV9OVUxMIik7CisKKyAgICAqcEZpbGVOYW1lID0gTTRPU0FfTlVMTDsKKworICAgIC8qUGFyc2UgVVJMKi8KKyAgICBpVXJsTGVuID0gTTRPU0FfY2hyTGVuZ3RoKHBVcmwpOworICAgIGZvcihpPWlVcmxMZW4tMTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgICAgaWYgKHBVcmxbaV0gIT0gJ1xcJyAmJiBwVXJsW2ldICE9ICcvJykKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZU5hbWVMZW4rKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBmaW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgbmFtZSAqLworICAgICAgICB9CisgICAgfQorCisgICAgcHRyRmlsZW5hbWUgPSAoTTRPU0FfQ2hhciopIE00T1NBX21hbGxvYyhGaWxlTmFtZUxlbisxLCBNNE9TQV9GSUxFX0NPTU1PTiwKKyAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IEZpbGVuYW1lIHN0cmluZyIpOworICAgIGlmIChwdHJGaWxlbmFtZSA9PSBNNE9TQV9OVUxMKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUiKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIH0KKworICAgIHB0clVybCA9IHBVcmwgKyAoaVVybExlbiAtIEZpbGVOYW1lTGVuKTsKKyAgICBNNE9TQV9jaHJOQ29weShwdHJGaWxlbmFtZSwgcHRyVXJsLCBGaWxlTmFtZUxlbisxKTsKKworICAgICpwRmlsZU5hbWUgPSBwdHJGaWxlbmFtZTsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlRXh0cmEuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVFeHRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRhN2I1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlRXh0cmEuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUV4dHJhLmMKKyogQGJyaWVmICAgICAgICBGaWxlIGV4dHJhIGZvciBBbmRyb2lkCisqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSBzZXQgb2YgYmFzaWMgZnVuY3Rpb25zIHRvIGhhbmRsZSBmaWxlCisqICAgICAgICAgICAgICAgaXRzZWxmLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZUV4dHJhLmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgorI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyB0aGUgcHJvdmlkZWQgVVJMLgorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIHBVcmw6IChJTikgVVJMIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZQorICogQHBhcmFtICAgICAgZmlsZU1vZGVBY2Nlc3M6IChJTikgRmlsZSBtb2RlIGFjY2VzcworICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCisgKiAgICAgICAgICAgICBmaWxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYURlbGV0ZShjb25zdCBNNE9TQV9DaGFyKiBwVXJsKQoreworCisgICAgTTRPU0FfSW50MzIgIGVycjsKKyNpZmRlZiBVVEZfQ09OVkVSU0lPTgorICAgIE00T1NBX1ZvaWQqIHRlbXBDb252ZXJzaW9uQnVmOworICAgIE00T1NBX1VJbnQzMiB0ZW1wQ29udmVyc2lvblNpemUgPSAxMDAwOyAgICAvKnNpemUgb2YgdGhlIGRlY29kZWQgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBpbmNyZWFzZSBpZiBuZWNlc3NhcnkqLworI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCisKKyAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZUV4dHJhRGVsZXRlXHRcdE00T1NBX0NoYXIqICVzIiwgcFVybCk7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhRGVsZXRlOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKKworI2lmZGVmIFVURl9DT05WRVJTSU9OCisgICAgLypGQjogdG8gdGVzdCB0aGUgVVRGMTYtPlVURjggY29udmVyc2lvbiBpbnRvIFZpZGVvIEFydGlzdCovCisgICAgLypDb252ZXJ0IHRoZSBVUkwgZnJvbSBVVEYxNiB0byBVVEY4Ki8KKyAgICB0ZW1wQ29udmVyc2lvbkJ1ZiA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModGVtcENvbnZlcnNpb25TaXplICsxLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiY29udmVyc2lvbiBidWYiKTsKKyAgICBpZih0ZW1wQ29udmVyc2lvbkJ1ZiA9PSBNNE9TQV9OVUxMKQorICAgIHsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIHdoZW4gYWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorICAgIE00T1NBX1RvVVRGOF9PU0FMKChNNE9TQV9Wb2lkKilwVXJsLCB0ZW1wQ29udmVyc2lvbkJ1ZiwgJnRlbXBDb252ZXJzaW9uU2l6ZSk7CisgICAgKChNNE9TQV9DaGFyKil0ZW1wQ29udmVyc2lvbkJ1ZilbdGVtcENvbnZlcnNpb25TaXplIF0gPSAnXDAnOworCisgICAgcHJpbnRmKCJyZW1vdmUgZmlsZSAlc1xuIiwgdGVtcENvbnZlcnNpb25CdWYpOworCisgICAgLypPcGVuIHRoZSBjb252ZXJ0ZWQgcGF0aCovCisgICAgZXJyID0gcmVtb3ZlICh0ZW1wQ29udmVyc2lvbkJ1Zik7CisgICAgLypGcmVlIHRoZSB0ZW1wb3JhcnkgZGVjb2RlZCBidWZmZXIqLworICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil0ZW1wQ29udmVyc2lvbkJ1Zik7CisjZWxzZQorICAgIGVyciA9IHJlbW92ZSgoY29uc3QgY2hhciAqKXBVcmwpOworI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCisKKyAgICBpZigtMSA9PSBlcnIpCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlRXh0cmFEZWxldGU6IENhbm5vdCByZW1vdmUgdGhlIGlucHV0IHVybCIpOworICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBmaWxlIGxvY2F0ZWQgYnkgJ3BTcmNVcmwnIHRvICdwRHN0VXJsJy4KKyAqIEBub3RlCisgKiBAcGFyYW0gICAgICBwU3JjVXJsOiAoSU4pIHNvdXJjZSBVUkwKKyAqIEBwYXJhbSAgICAgIHBEc3RVcmw6IChJTikgRGVzdGluYXRpb24gVVJMCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgIGZpbGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhQ29weShNNE9TQV9DaGFyKiBwU3JjVXJsLCBNNE9TQV9DaGFyKiBwRHN0VXJsKQoreworICAgIE00T1NBX0NvbnRleHQgcElucHV0RmlsZUNvbnRleHQgICAgPSBNNE9TQV9OVUxMOworICAgIE00T1NBX0NvbnRleHQgcE91dHB1dEZpbGVDb250ZXh0PSBNNE9TQV9OVUxMOworCisgICAgTTRPU0FfRVJSICAgICAgIGVycjsKKyAgICBNNE9TQV9VSW50MzIgICAgdWlTaXplUmVhZCA9IEJVRkZFUl9DT1BZX1NJWkU7CisgICAgTTRPU0FfTWVtQWRkcjMyIGNvcHlfYnVmZmVyOworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX2ZpbGVFeHRyYURlbGV0ZVx0XHRNNE9TQV9DaGFyKiAlc1x0TTRPU0FfQ2hhciogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjVXJsLCBwRHN0VXJsKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRHN0VXJsLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVFeHRyYUNvcHk6IHBEc3RVcmwgaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTcmNVcmwsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhQ29weTogcFNyY1VybCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICAvKiBPcGVuIGlucHV0IGZpbGUgKi8KKyAgICBlcnIgPSBNNE9TQV9maWxlUmVhZE9wZW4oJnBJbnB1dEZpbGVDb250ZXh0LCBwU3JjVXJsLCBNNE9TQV9rRmlsZVJlYWQpOworICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhQ29weTogTTRPU0FfZmlsZVJlYWRPcGVuIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogT3BlbiBvdXRwdXQgZmlsZSAqLworICAgIGVyciA9IE00T1NBX2ZpbGVXcml0ZU9wZW4oJnBPdXRwdXRGaWxlQ29udGV4dCwgcERzdFVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlV3JpdGV8TTRPU0Ffa0ZpbGVDcmVhdGUpOworICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhQ29weTogTTRPU0FfZmlsZVdyaXRlT3BlbiIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciAqLworICAgIGNvcHlfYnVmZmVyID0gTTRPU0FfbWFsbG9jKEJVRkZFUl9DT1BZX1NJWkUsIE00T1NBX0ZJTEVfRVhUUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlRXh0cmFDb3B5OiBjb3B5IGJ1ZmZlciIpOworICAgIGlmKE00T1NBX05VTEwgPT0gY29weV9idWZmZXIpCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVFeHRyYUNvcHkiKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIH0KKworICAgIC8qIENvcHkgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSB1c2luZyBjb3B5IGJ1ZmZlciAqLworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgLyogTG9hZCBkYXRhIGludG8gY29weSBidWZmZXIgKi8KKyAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWREYXRhKHBJbnB1dEZpbGVDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpY29weV9idWZmZXIsICZ1aVNpemVSZWFkKTsKKyAgICAgICAgaWYoTTROT19FUlJPUiA9PSBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdyaXRlIGRhdGEgdG8gb3V0cHV0IGZpbGUgKi8KKyAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVXcml0ZURhdGEocE91dHB1dEZpbGVDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWNvcHlfYnVmZmVyLCB1aVNpemVSZWFkKTsKKyAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKE00V0FSX05PX0RBVEFfWUVUID09IGVycikKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm8gbW9yZSBkYXRhIHRvIGNvcHksIGVuZCBvZiBmaWxlIHJlYWNoZWQgKi8KKyAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVXcml0ZURhdGEocE91dHB1dEZpbGVDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWNvcHlfYnVmZmVyLCB1aVNpemVSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7IC8qIGFuIGVycm9yIG9jY3VyICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIGNvcHkgYnVmZmVyICovCisgICAgTTRPU0FfZnJlZShjb3B5X2J1ZmZlcik7CisKKyAgICBlcnIgPSBNNE9TQV9maWxlV3JpdGVDbG9zZShwT3V0cHV0RmlsZUNvbnRleHQpOworICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhQ29weTogTTRPU0FfZmlsZVdyaXRlQ2xvc2UiKTsKKyAgICB9CisKKyAgICBlcnIgPSBNNE9TQV9maWxlUmVhZENsb3NlKHBJbnB1dEZpbGVDb250ZXh0KTsKKyAgICBpZihNNE5PX0VSUk9SICE9IGVycikKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVFeHRyYUNvcHk6IE00T1NBX2ZpbGVSZWFkQ2xvc2UiKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZW5hbWVzIHRoZSAncFNyY1VybCcgdG8gJ3BEc3RVcmwnLgorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIHBTcmNVcmw6IChJTikgc291cmNlIFVSTAorICogQHBhcmFtICAgICAgcERzdFVybDogKElOKSBEZXN0aW5hdGlvbiBVUkwKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAorICogICAgICAgICAgICAgZmlsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlRXh0cmFSZW5hbWUoTTRPU0FfQ2hhciogcFNyY1VybCwgTTRPU0FfQ2hhciogcERzdFVybCkKK3sKKyAgICBNNE9TQV9FUlIgICAgZXJyOworICAgIE00T1NBX0ludDMyIGlWYWx1ZTsKKyAgICBNNE9TQV9DaGFyKiAgICBwU3JjRmlsZW5hbWUgPSBNNE9TQV9OVUxMOworICAgIE00T1NBX0NoYXIqICAgIHBEc3RGaWxlbmFtZSA9IE00T1NBX05VTEw7CisKKyAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfZmlsZUV4dHJhUmVuYW1lXHRcdE00T1NBX0NoYXIqICVzXHRNNE9TQV9DaGFyKiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNVcmwsIHBEc3RVcmwpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcERzdFVybCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhUmVuYW1lOiBwU3JjVXJsIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3JjVXJsLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlRXh0cmFSZW5hbWU6IHBEc3RVcmwgaXMgTTRPU0FfTlVMTCIpOworCisgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKHBTcmNVcmwsICZwU3JjRmlsZW5hbWUpOworICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhUmVuYW1lOiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUiKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUocERzdFVybCwgJnBEc3RGaWxlbmFtZSk7CisgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCisgICAgeworICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFNyY0ZpbGVuYW1lKTsKKyAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhUmVuYW1lOiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUiKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBSZW5hbWUgZmlsZSAqLworICAgIGlWYWx1ZSA9IHJlbmFtZSgoY29uc3QgY2hhciAqKXBTcmNGaWxlbmFtZSwgKGNvbnN0IGNoYXIgKilwRHN0RmlsZW5hbWUpOworICAgIGlmICgwICE9IGlWYWx1ZSkKKyAgICB7CisgICAgLyoKKyAgICAgICAgV2hhdCBlcnJvciBjb2RlIHNoYWxsIGJlIHJldHVybmVkID8gRnJvbSBNU0ROOgorICAgICAgICBFYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm5zIDAgaWYgaXQgaXMgc3VjY2Vzc2Z1bC4gT24gYW4gZXJyb3IsIHRoZQorICAgICAgICBmdW5jdGlvbiAgcmV0dXJucyBhIG5vbnplcm8gdmFsdWUgYW5kIHNldHMgZXJybm8gdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgdmFsdWVzOgorICAgICAgICAtIEVBQ0NFUzogRmlsZSBvciBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IG5ld25hbWUgYWxyZWFkeSBleGlzdHMgb3IgY291bGQKKyAgICAgICAgbm90IGJlIGNyZWF0ZWQgKGludmFsaWQgcGF0aCk7IG9yIG9sZG5hbWUgaXMgYSBkaXJlY3RvcnkgYW5kIG5ld25hbWUKKyAgICAgICAgc3BlY2lmaWVzIGEgZGlmZmVyZW50IHBhdGguCisgICAgICAgIC0gRU5PRU5UOiBGaWxlIG9yIHBhdGggc3BlY2lmaWVkIGJ5IG9sZG5hbWUgbm90IGZvdW5kLgorICAgICAgICAtIEVJTlZBTDogTmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuCisgICAgICAgIEZvciBvdGhlciBwb3NzaWJsZSByZXR1cm4gdmFsdWVzLCBzZWUgX2Rvc2Vycm5vLCBfZXJybm8sIHN5c2Vycmxpc3QsIGFuZAorICAgICAgICAgICAgX3N5c19uZXJyLiAqLworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlRXh0cmFSZW5hbWU6IHJlbmFtZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcERzdEZpbGVuYW1lKTsKKyAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFNyY0ZpbGVuYW1lKTsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIHRoZSBzcGVjaWZpZWQgbmV3CisgKiAgICAgICAgICAgICBkaXJlY3RvcnkgJ3VybCcuCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgcFVybDogKElOKSBEaXJlY3RvcnkgdG8gd2hpY2ggY3VycmVudCBkaXJlY3RvcnkgdG8gYmUgY2hhbmdlZAorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCisgKiAgICAgICAgICAgICBmaWxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitNNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhQ2hhbmdlQ3VycmVudERpcihjb25zdCBNNE9TQV9DaGFyKiBwVXJsKQoreworICAgIE00T1NBX0VSUiAgICBlcnI7CisgICAgTTRPU0FfQ2hhciogcEZpbGVOYW1lID0gTTRPU0FfTlVMTDsKKyAgICBNNE9TQV9JbnQzMiBpVmFsdWUgPSAwOworCisgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVFeHRyYUNoYW5nZUN1cnJlbnREaXJcdFx0TTRPU0FfQ2hhciogJXMiLCBwVXJsKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVFeHRyYUNoYW5nZUN1cnJlbnREaXI6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOworCisgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKChNNE9TQV9DaGFyKilwVXJsLCAmcEZpbGVOYW1lKTsKKyAgICBpZihNNE5PX0VSUk9SICE9IGVycikKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKGVyciwKKyAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhQ2hhbmdlQ3VycmVudERpcjogTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaVZhbHVlID0gY2hkaXIoKGNoYXIqKXBGaWxlTmFtZSk7CisKKyAgICBpZiAoaVZhbHVlICE9IDApCisgICAgeworICAgIC8qCisgICAgV2hhdCBlcnJvciBjb2RlIHNoYWxsIGJlIHJldHVybmVkID8gRnJvbSBNU0ROOgorICAgIEVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zIHJldHVybnMgYSB2YWx1ZSBvZiAwIGlmIHN1Y2Nlc3NmdWwuIEEgcmV0dXJuCisgICAgdmFsdWUgb2YgLTEgaW5kaWNhdGVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXRoIGNvdWxkIG5vdCBiZSBmb3VuZCwgaW4KKyAgICB3aGljaCBjYXNlIGVycm5vIGlzIHNldCB0byBFTk9FTlQuKi8KKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlRXh0cmFDaGFuZ2VDdXJyZW50RGlyOiBjaGRpciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuKE00RVJSX1BBUkFNRVRFUik7CisgICAgfQorCisgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBGaWxlTmFtZSk7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IHRvIHRoZSBzcGVjaWZpZWQgJ3VybCcuCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgcFVybDogKElOKSBQYXRoIHRvIGNyZWF0ZSBuZXcgZGlyZWN0b3J5IHdpdGggbmFtZQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCisgKiAgICAgICAgICAgICBmaWxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYUNyZWF0ZURpcihjb25zdCBNNE9TQV9DaGFyKiBwVXJsKQoreworICAgIE00T1NBX0ludDMyICAgICAgICBlcnI7CisKKyAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZUV4dHJhQ3JlYXRlRGlyICVzIiwgcFVybCk7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhQ3JlYXRlRGlyOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKKworICAgIGVyciA9IG1rZGlyKChjaGFyKilwVXJsLCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOworCisgICAgaWYoIGVyciA8IDAgKQorICAgIHsKKyAgICAgICAgICAgcmV0dXJuIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0VYVFJBLCBlcnJubyk7CisgICAgfQorCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIHBVcmw6IChJTikgUGF0aCBvZiBkaXJlY3Rvcnkgd2l0aCBuYW1lCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgIGZpbGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhUmVtb3ZlRGlyKGNvbnN0IE00T1NBX0NoYXIqIHBVcmwpCit7CisgICAgTTRPU0FfSW50MzIgICAgZXJyOworCisgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVFeHRyYVJlbW92ZURpciAlcyIsIHBVcmwpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVFeHRyYVJlbW92ZURpcjogcFVybCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBlcnIgPSBybWRpcigoY2hhciopcFVybCk7CisgICAgaWYoZXJyIDwgMCApCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlRXh0cmFSZW1vdmVEaXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9FWFRSQSwgZXJybm8pOworICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIHJldHJpZXZlcyB0aGUgZnJlZSBzcGFjZS4KKyAqIEBub3RlCisgKiBAcGFyYW0gICAgICBwVXJsOiAoSU4pIHJvb3QgZGlyZWN0b3J5CisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgIGZpbGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9VSW50MzIgTTRPU0FfZmlsZUV4dHJhR2V0RnJlZVNwYWNlKGNvbnN0IE00T1NBX0NoYXIqIHBVcmwpCit7CisgICAgTTRPU0FfVUludDMyIHNpemUgPSAwOworICAgIHN0cnVjdCBzdGF0ZnMgc3RhdDsKKworICAgIGlmICggTTRPU0FfTlVMTCAhPSBwVXJsICkKKyAgICB7CisgICAgICAgIGlmICgwID09IHN0YXRmcyggKGNvbnN0IGNoYXIgKilwVXJsLCAmc3RhdCApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHN0YXQuZl9iZnJlZSAqIHN0YXQuZl9ic2l6ZSkgPiBNNE9TQV9VSU5UMzJfTUFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSBNNE9TQV9VSU5UMzJfTUFYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSAoTTRPU0FfVUludDMyKShzdGF0LmZfYmZyZWUgKiBzdGF0LmZfYnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzaXplKTsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHRvdGFsIHNwYWNlCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgcFVybDogKElOKSBQYXRoIG9mIGRpcmVjdG9yeSB3aXRoIG5hbWUKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAorICogICAgICAgICAgICAgZmlsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX1VJbnQzMiBNNE9TQV9maWxlRXh0cmFHZXRUb3RhbFNwYWNlKGNvbnN0IE00T1NBX0NoYXIqIHBVcmwpCit7CisgICAgTTRPU0FfVUludDMyIHNpemUgPSAwOworICAgIHN0cnVjdCBzdGF0ZnMgc3RhdDsKKworICAgIGlmICggTTRPU0FfTlVMTCAhPSBwVXJsICkKKyAgICB7CisgICAgICAgIGlmICgwID09IHN0YXRmcyggKGNvbnN0IGNoYXIgKilwVXJsLCAmc3RhdCApKQorICAgICAgICB7CisgICAgICAgICAgICAgaWYgKChzdGF0LmZfYmxvY2tzICogc3RhdC5mX2JzaXplKSA+IE00T1NBX1VJTlQzMl9NQVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IE00T1NBX1VJTlQzMl9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IChNNE9TQV9VSW50MzIpKHN0YXQuZl9ibG9ja3MgKiBzdGF0LmZfYnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzaXplKTsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlIHRoZSBmaWxlIHR5cGUgKERpcmVjdG9yeSBvciBmaWxlKS4KKyAqIEBub3RlCisgKiBAcGFyYW0gICAgICBwVXJsOiAoSU4pIFBhdGggb2YgZGlyZWN0b3J5IHdpdGggbmFtZQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCisgKiAgICAgICAgICAgICBmaWxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRW50cnlUeXBlIE00T1NBX2ZpbGVFeHRyYUdldFR5cGUoY29uc3QgTTRPU0FfQ2hhciogcFVybCkKK3sKKyAgICBNNE9TQV9FbnRyeVR5cGUgdHlwZSA9IE00T1NBX1R5cGVJbnZhbGlkOworICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0OworCisgICAgaWYgKCBNNE9TQV9OVUxMICE9IHBVcmwgKQorICAgIHsKKyAgICAgICAgaWYgKDAgPT0gc3RhdCggKGNvbnN0IGNoYXIgKilwVXJsLCAmZmlsZVN0YXQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIFNfSVNESVIoIGZpbGVTdGF0LnN0X21vZGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9IE00T1NBX1R5cGVEaXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9IE00T1NBX1R5cGVGaWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICh0eXBlKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gdHJ1bmNhdGUgYSBmaWxlLgorICogICAgICAgICAgICAgICB0aGUgZmlsZSBtdXN0IGJlIHByZXZpb3VzbHkgb3BlbmVkIGluIHdyaXRlIG1vZGUKKyAqIEBub3RlICAgICAgIHRoZSBwb3NpdGlvbiBwb2ludGVyIGluIHRoZSBmaWxlIGlzIHNldCB0byB0aGUgYmVnaW5uaW5nCisgKiAgICAgICAgICAgICAgIG9mIHRoZSBmaWxlIGFmdGVyIHRoZSB0cnVuY2F0ZQorICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBtZWRpYSBjb250ZXh0CisgKiBAcGFyYW0gICAgICBsZW5ndGg6IChJTikgbGVuZ3RoIG9mIHRoZSBmaWxlIGFmdGVyIHRydW5jYXRpb24KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlRXh0cmFmVHJ1bmNhdGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9GaWxlUG9zaXRpb24gbGVuZ3RoKQoreworICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOworICAgIE00T1NBX1VJbnQxNiByZXN1bHQgPSBNNE9TQV9GQUxTRTsKKyAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gY29udGV4dDsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVFeHRyYWZUcnVuY2F0ZTogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gbGVuZ3RoLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhZlRydW5jYXRlOiBsZW5ndGggaXMgTTRPU0FfTlVMTCIpOworCisgICAgcmVzdWx0ID0gZnRydW5jYXRlKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLT5fZmlsZSwgbGVuZ3RoKTsKKworICAgIGlmKHJlc3VsdCAhPSAwKQorICAgIHsKKyAgICAgICAgZXJyID0gZXJybm87CisgICAgICAgIE00T1NBX1RSQUNFMV8xKCJTZXRFbmRPZkZpbGUgcmV0dXJucyBlcnI6IDB4JXhcbiIsIGVycik7CisgICAgICAgIHJldHVybiBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9FWFRSQSwgZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlM2JiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyLmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyLmMKKyAqIEBhdXRob3IgICAgICAgQ2VkcmljIExlY291dHJlIChjZWRyaWMubGVjb3V0cmVAcGhpbGlwcy5jb20pCisgKiAgICAgICAgICAgICAgIExhdXJlbnQgRmF5IChsYXVyZW50LmZheUBwaGlsaXBzLmNvbSkKKyAqIEBwYXIgT3JnOiAgICAgUGhpbGlwcyBEaWdpdGFsIFN5c3RlbXMgTGFib3JhdG9yaWVzIC0gUGFyaXMgKFBEU0wtUCkKKyAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZm9yIEFuZHJvaWQKKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHJlYWQgYSBmaWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworCisjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisjaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KKyogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCisqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKKyogQHBhcmFtICAgICAgdXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQorKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCisqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAorKiAgICAgICAgICAgICBmaWxlCisqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKKyogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgorKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCisqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpCit7CisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2ZpbGVSZWFkT3BlbiA6IHBDID0gMHglcCAgZmQgPSAweCVwICBtb2RlID0gJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcEZpbGVEZXNjcmlwdG9yLCBmaWxlTW9kZUFjY2Vzcyk7CisKKyAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfRklMRV9SRUFERVIsIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZURlc2NyaXB0b3IsIGZpbGVNb2RlQWNjZXNzKTsKK30KKworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyCisqICAgICAgICAgICAgIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKSBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScKKyogICAgICAgICAgICAgcG9pbnRlci4KKyogQG5vdGUgICAgICAgSWYgJ3NpemUnIGJ5dGUgY2Fubm90IGJlIHJlYWQgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIsICdzaXplJworKiAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgdXBkYXRlZCB0byBtYXRjaCB0aGUgY29ycmVjdAorKiBAbm90ZSAgICAgICBudW1iZXIgb2YgcmVhZCBieXRlcy4KKyogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgorKiBAcGFyYW0gICAgICBidWZmZXI6IChPVVQpIERhdGEgcG9pbnRlciBvZiB0aGUgcmVhZCBkYXRhCisqIEBwYXJhbSAgICAgIHNpemU6IChJTi9PVVQpIFNpemUgb2YgdGhlIGRhdGEgdG8gcmVhZCAoaW4gYnl0ZXMpCisqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisqIEByZXR1cm4gICAgIE00V0FSX05PX0RBVEFfWUVUOiB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSB0byBmaWxsIHRoZSAnZGF0YScKKyogICAgICAgICAgICAgYnVmZmVyLCBzbyB0aGUgc2l6ZSBwYXJhbWV0ZXIgaGFzIGJlZW4gdXBkYXRlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFNpemUpCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OworICAgIE00T1NBX0VSUiAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgIE00T1NBX0ludDMyICAgIHVpU2l6ZVJlYWQ7CisKKyAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVJlYWREYXRhIDogZGF0YSA9IDB4JXAgIHNpemUgPSAlbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgKE00T1NBX05VTEwgIT0gcFNpemUpID8gKCpwU2l6ZSkgOiAwKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGRhdGEsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogZGF0YSBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFNpemUsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBwU2l6ZSBpcyBNNE9TQV9OVUxMIik7CisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCisgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVSZWFkRGF0YTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIGlmKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykgLyogcmVhZCB3cml0ZSAqLworICAgIHsKKyAgICAgICAgdWlTaXplUmVhZCA9IGZyZWFkKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgKnBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKKyAgICAgICAgaWYoLTEgPT0gdWlTaXplUmVhZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogaGFuZGxlIGlzIGludmFsaWQsIG9yIHRoZSBmaWxlIGlzIG5vdCBvcGVuIGZvciByZWFkaW5nLCBvciB0aGUgZmlsZSBpcyBsb2NrZWQgKi8KKyAgICAgICAgICAgICpwU2l6ZSA9IDA7CisgICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0ZQT1NfQUREX0NPTlNUX1VJTlQzMihwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24sIHVpU2l6ZVJlYWQpOworICAgICAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpdWlTaXplUmVhZCA8ICpwU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOworICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIGVuZCBvZiBmaWxlICovCisgICAgICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfVFJVRTsKKyAgICAgICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIGlmKHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrICE9IFNlZWtSZWFkKQorICAgIHsKKyAgICAgICAgLyogZnNlZWsgdG8gdGhlIGxhc3QgcmVhZCBwb3NpdGlvbiAqLworICAgICAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pKTsKKyAgICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVSZWFkRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrUmVhZDsKKyAgICB9CisKKyAgICAvKiBSZWFkIGRhdGEgKi8KKyAgICB1aVNpemVSZWFkID0gZnJlYWQoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCAqcFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOworICAgIGlmKC0xID09IHVpU2l6ZVJlYWQpCisgICAgeworICAgICAgICAvKiBoYW5kbGUgaXMgaW52YWxpZCwgb3IgdGhlIGZpbGUgaXMgbm90IG9wZW4gZm9yIHJlYWRpbmcsCisgICAgICAgICBvciB0aGUgZmlsZSBpcyBsb2NrZWQgKi8KKyAgICAgICAgKnBTaXplID0gMDsKKyAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE00T1NBX0ZQT1NfQUREX0NPTlNUX1VJTlQzMihwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiwgdWlTaXplUmVhZCk7CisgICAgICAgIGlmICgoTTRPU0FfVUludDMyKXVpU2l6ZVJlYWQgPCAqcFNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7CisKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIGVuZCBvZiBmaWxlICovCisgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgPSBNNE9TQV9UUlVFOworCisgICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUKKyAqICAgICAgICAgICAgIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvCisgKiAgICAgICAgICAgICB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgZnJvbSB0aGUgYmVnaW5uaW5nLCBmcm9tCisgKiAgICAgICAgICAgICB0aGUgZW5kIG9yIGZyb20gdGhlIGN1cnJlbnQgcG9zdGlvbi4gVG8gc3VwcG9ydCBsYXJnZSBmaWxlCisgKiAgICAgICAgICAgICBhY2Nlc3MgKG1vcmUgdGhhbiAyR0J5dGVzKSwgdGhlIHBvc2l0aW9uIGlzIHByb3ZpZGVkIG9uIGEgNjQKKyAqICAgICAgICAgICAgIGJpdHMuCisgKiBAbm90ZSAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gcG9pbnRlcgorICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgbXVzdCBub3QgY2hhbmdlLiBFbHNlIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICBwb3NpdGlvbiBwb2ludGVyIG11c3QgYmUgdXBkYXRlZC4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKKyAqIEBwYXJhbSAgICAgIHNlZWtNb2RlOiAoSU4pIFNlZWsgYWNjZXNzIG1vZGUKKyAqIEBwYXJhbSAgICAgIHBvc2l0aW9uOiAoSU4vT1VUKSBQb3NpdGlvbiBpbiB0aGUgZmlsZQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjogdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24pCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7CisgICAgTTRPU0FfRVJSIGVycjsKKworICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlUmVhZFNlZWsgOiBtb2RlID0gJWQgIHBvcyA9ICVsdSIsIHNlZWtNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUG9zaXRpb24gIT0gTTRPU0FfTlVMTCkgPyAoKnBQb3NpdGlvbikgOiAwKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2VlazogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMigwID09IHNlZWtNb2RlLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2Vlazogc2Vla01vZGUgaXMgMCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBQb3NpdGlvbiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2VlazogcFBvc2l0aW9uIGlzIE00T1NBX05VTEwiKTsKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKKyAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVJlYWRTZWVrOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgaWYgKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykKKyAgICB7CisgICAgICAgICBNNE9TQV9VSW50MzIgICAgU2Vla01vZGVPcHRpb247CisgICAgICAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLworICAgICAgICBpZiAoTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nID09IHNlZWtNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfU0VUOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0VuZCA9PSBzZWVrTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0VORDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtDdXJyZW50ID09IHNlZWtNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfQ1VSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX2ZpbGVSZWFkU2VlazogRU5EIFdJVEggRVJST1IgISEhIChDT05WRVJJT04gRVJST1IgRk9SIFRIRSBTRUVLIE1PREUpIik7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCisgICAgICAgIGVyciA9IGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCAqcFBvc2l0aW9uLCBTZWVrTW9kZU9wdGlvbik7CisgICAgICAgIGlmKGVyciAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCisgICAgICAgICAgICBlcnI9KChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShlcnIpOworICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkU2VlayBlcnJvcjoleCIsZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgaWYocEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgIT0gU2Vla1JlYWQpCisgICAgeworCisgICAgICAgIC8qIGZzZWVrIHRvIHRoZSBsYXN0IHJlYWQgcG9zaXRpb24gKi8KKyAgICAgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uKSk7CisgICAgICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlUmVhZERhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1JlYWQ7CisgICAgfQorCisgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIHNlZWtNb2RlLCBwUG9zaXRpb24pOworICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVJlYWREYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBNNE9TQV9GUE9TX1NFVChwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24sICpwUG9zaXRpb24pOworICAgIH0KKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gY2xvc2UgdGhlIGZpbGUKKyAqICAgICAgICAgICAgIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KS4KKyAqIEBub3RlICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyIGlzIGZyZWVkLgorICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKK3sKKyAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKKworICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9maWxlUmVhZENsb3NlIDogcEMgPSAweCVwIiwgcENvbnRleHQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZENsb3NlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICBpZihNNE9TQV9GSUxFX1dSSVRFUiA9PSBwRmlsZUNvbnRleHQtPmNvcmVJRF93cml0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfRklMRV9SRUFERVIsIHBDb250ZXh0KTsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZQorICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KKyAqIEBub3RlICAgICAgICd2YWx1ZScgbXVzdCBiZSBjYXN0IGFjY29yZGluZyB0byB0aGUgdHlwZSByZWxhdGVkIHRvIHRoZQorICogICAgICAgICAgICAgb3B0aW9uSUQgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkKKyAqICAgICAgICAgICAgIHRoaXMgZmllbGQgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgorICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKKyAqIEBwYXJhbSAgICAgIHBPcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCisgKiBAcGFyYW0gICAgICBwT3B0aW9uVmFsdWU6IChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9XUklURV9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHdyaXRlIG9ubHkgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKK3sKKyAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7CisKKyAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IDAsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOiBvcHRpb25JRCBpcyAwIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9wdGlvblZhbHVlLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOiBwT3B0aW9uVmFsdWUgaXMgTTRPU0FfTlVMTCIpOworCisgICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1JFQURFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiIpOworICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1JFQURBQkxFKG9wdGlvbklEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfV1JJVEVfT05MWSwgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIik7CisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgc3dpdGNoKG9wdGlvbklEKQorICAgIHsKKyNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfUE9TSVRJT04gPT0gTTRPU0FfVFJVRSkKKyAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgICAgICAgICAqcFBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uOworCisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfUE9TSVRJT04qLworCisjaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0lTX0VPRiA9PSBNNE9TQV9UUlVFKQorICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkSXNFT0Y6CisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0Jvb2wqIGJJc0VuZE9mRmlsZSA9IChNNE9TQV9Cb29sKilwT3B0aW9uVmFsdWU7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgICAgICAgICAqYklzRW5kT2ZGaWxlID0gcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlOworCisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfSVNfRU9GKi8KKworCisjaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUgPT0gTTRPU0FfVFJVRSkKKyAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplOgorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKKyAgICAgICAgICAgIE00T1NBX0ludDMyIGlTYXZlUG9zICAgID0gMDsKKyAgICAgICAgICAgIE00T1NBX0ludDMyIGlTaXplICAgICAgICA9IDA7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAqIEJ1Z2ZpeDogdXBkYXRlIHRoZSBmaWxlIHNpemUuCisgICAgICAgICAgICAqIFdoZW4gYSBmaWxlIGlzIGluIHJlYWQgbW9kZSwgbWF5IGJlIGFub3RoZXIgYXBwbGljYXRpb24gaXMgd3JpdGluZyBpbi4KKyAgICAgICAgICAgICogU28sIHdlIGhhdmUgdG8gdXBkYXRlIHRoZSBmaWxlIHNpemUgKi8KKyAgICAgICAgICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgIC8qMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCisgICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgMCwgU0VFS19FTkQpOyAgICAgICAgLyoyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisgICAgICAgICAgICBpU2l6ZSA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAgICAgLyozLSBDaGVjayB0aGUgZmlsZSBzaXplKi8KKyAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCBpU2F2ZVBvcywgU0VFS19TRVQpOyAgICAvKjQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiovCisgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSA9IGlTaXplOworCisgICAgICAgICAgICAqcFBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5maWxlX3NpemU7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgICAgIH0KKyNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9TSVpFKi8KKworI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUgPT0gTTRPU0FfVFJVRSkKKyAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZUF0dHJpYnV0ZSopcE9wdGlvblZhbHVlKTsKKyAgICAgICAgfQorI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX0FUVFJJQlVURSovCisKKyNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX1VSTCA9PSBNNE9TQV9UUlVFKQorICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0VVJMOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldFVSTChwQ29udGV4dCwgKE00T1NBX0NoYXIqKilwT3B0aW9uVmFsdWUpOworICAgICAgICB9CisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX1VSTCovCisKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZToKKyAgICAgICAgeworICAgICAgICAgICAgKihNNE9TQV9VSW50MzIqKXBPcHRpb25WYWx1ZSA9IHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlOworICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiIpOworCisgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZm4gICAgICAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAqICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkpCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gc2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgorICogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgorICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkCisgKiAgICAgICAgICAgICB0byBpdHMgaW50ZXJuYWwgdmFyaWFibGUuCisgKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgorICogQHBhcmFtICAgICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgorICogQHBhcmFtICAgICAgdmFsdWU6IChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKK3sKKyAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7CisKKyAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gb3B0aW9uSUQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7CisgICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1JFQURFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOworCisgICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfV1JJVEFCTEUob3B0aW9uSUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUkVBRF9PTkxZLCAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICBzd2l0Y2gob3B0aW9uSUQpCisgICAgeworICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZExvY2tNb2RlOgorICAgICAgICB7CisgICAgICAgICAgICBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZT0gKE00T1NBX1VJbnQzMikqKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7CisgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyX1JBTS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlcl9SQU0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNGFjZmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlcl9SQU0uYwpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyUmFtLmMKKyAqIEBpbmdyb3VwICAgICAgT1NBTAorICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBmcm9tIFJBTQorICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gcmVhZCBhICJmaWxlIiBzdG9yZWQgaW4gUkFNLgorICogQGRhdGUgICAgICAgICAtIDIwMDQtMDUtMTE6IGNyZWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyUmFtLmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dAorICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgcmVhZGVyIGluIFJhbSBjb250ZXh0IChwcml2YXRlKQorICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBGaWxlIFJlYWRlciBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTTRPU0FfTWVtQWRkcjggIHBGaWxlRGVzYzsgIC8qIFBvaW50ZXIgb24gZmlsZSBkYXRhICovCisgICAgTTRPU0FfVUludDMyICAgIGRhdGFTaXplOyAgIC8qIFNpemUgb2YgZGF0YSB0byByZWFkICovCisgICAgTTRPU0FfVUludDMyICAgIGRhdGFPZmZzZXQ7IC8qIEFjdHVhbCBvZmZzZXQgKi8KKyAgICBNNE9TQV9Cb29sICAgICAgSXNPcGVuZWQ7ICAgLyogTWljcm8gc3RhdGUgbWFjaGluZSAqLworfSBNNE9TQV9GaWxlUmVhZGVyUmFtX0NvbnRleHQ7CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSByZWFkIHBvaW50ZXIgYXQgdGhlIHByb3ZpZGVkIGFkcmVzcyBhbmQKKyAqICAgICAgICAgICAgIHJldHVybnMgYSBjb250ZXh0LgorICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCisgKiBAcGFyYW0gICAgICBjb250ZXh0OiAoT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCisgKiBAcGFyYW0gICAgICB1cmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCisgKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgIGZpbGUKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTE9DS0VEOiB0aGUgZmlsZSBpcyBsb2NrZWQgYnkgYW4gb3RoZXIKKyAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbU9wZW4oIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcyApCit7CisgICAgTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0KiBwQ29udGV4dD1NNE9TQV9OVUxMOworICAgIE00T1NBX0ZpbGVSZWFkZXJSYW1fRGVzY3JpcHRvciogcERlc2NyaXB0b3I9ZmlsZURlc2NyaXB0b3I7CisgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CisKKyAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVJlYWRSYW1PcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdE00T1NBX1ZvaWQqIDB4JXgiCisgICAgICAgICAgICAgICAgICAiXHRNNE9TQV9VSW50MzIgJWQiLCBjb250ZXh0LCBmaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgIGZpbGVNb2RlQWNjZXNzKTsKKworICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICBpZihNNE9TQV9OVUxMID09IGNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgIH0KKyAgICAqY29udGV4dCA9IE00T1NBX05VTEw7CisgICAgaWYoTTRPU0FfTlVMTCA9PSBmaWxlRGVzY3JpcHRvcikKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgLyogQWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlIGNvbnRleHQgKi8KKyAgICBwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyUmFtX0NvbnRleHQqKU00T1NBX21hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRklMRV9SRUFERVIsIChNNE9TQV9DaGFyKikiQ29udGV4dCBhbGxvY2F0aW9uIik7CisgICAgaWYocENvbnRleHQgPT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKKyAgICB9CisKKyAgICAvKiBWZXJpZnkgYWNjZXNzIG1vZGUgKi8KKyAgICBpZiAoKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSAhPSAwKQorICAgICAgIHx8KDAgPT0gKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSkpCisgICAgeworICAgICAgICBlcnI9TTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBPcGVuIGZpbGUgaW4gcmVhZCBtb2RlIGFuZCBpbiBiaW5hcnkvdGV4dCBtb2RlICB3aXRoL3dpdGhvdXQgY3JlYXRpb24gcmlnaHQgKi8KKyAgICBpZigoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSkgIT0gMCkKKyAgICB7CisgICAgICAgIGVycj1NNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wRmlsZURlc2MgPSAoTTRPU0FfTWVtQWRkcjgpKHBEZXNjcmlwdG9yLT5wRmlsZURlc2MpOworICAgICAgICAgICAgcENvbnRleHQtPmRhdGFTaXplID0gKE00T1NBX0ludDMyKShwRGVzY3JpcHRvci0+ZGF0YVNpemUpOworICAgICAgICAgICAgcENvbnRleHQtPmRhdGFPZmZzZXQgPSAwOworICAgICAgICAgICAgcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycj1NNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKworY2xlYW51cDoKKyAgICBpZihlcnIgIT0gTTROT19FUlJPUikKKyAgICB7CisgICAgICAgIGlmKHBDb250ZXh0ICE9IE00T1NBX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQ29udGV4dCk7CisgICAgICAgICAgICAqY29udGV4dCA9IE00T1NBX05VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmNvbnRleHQgPSBwQ29udGV4dDsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIG1lbW9yeQorICogICAgICAgICAgICAgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpIGFuZCB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlICdkYXRhJworICogICAgICAgICAgICAgcG9pbnRlci4KKyAqIEBub3RlICAgICAgIElmICdzaXplJyBieXRlIGNhbm5vdCBiZSByZWFkIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyLCAnc2l6ZScKKyAqICAgICAgICAgICAgIHBhcmFtZXRlciBpcyB1cGRhdGVkIHRvIG1hdGNoIHRoZSBjb3JyZWN0CisgKiAgICAgICAgICAgICBudW1iZXIgb2YgcmVhZCBieXRlcy4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKKyAqIEBwYXJhbSAgICAgIGRhdGE6IChPVVQpIERhdGEgcG9pbnRlciBvZiB0aGUgcmVhZCBkYXRhCisgKiBAcGFyYW0gICAgICBzaXplOiAoSU4vT1VUKSBTaXplIG9mIHRoZSBkYXRhIHRvIHJlYWQgKGluIGJ5dGVzKQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00V0FSX05PX0RBVEFfWUVUOiB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSB0byBmaWxsIHRoZSAnZGF0YScKKyAqICAgICAgICAgICAgIGJ1ZmZlciwgc28gdGhlIHNpemUgcGFyYW1ldGVyIGhhcyBiZWVuIHVwZGF0ZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkUmFtRGF0YSggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9NZW1BZGRyOCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBTaXplICkKK3sKKyAgICBNNE9TQV9GaWxlUmVhZGVyUmFtX0NvbnRleHQqIHBDb250ZXh0PShNNE9TQV9GaWxlUmVhZGVyUmFtX0NvbnRleHQqKWNvbnRleHQ7CisgICAgTTRPU0FfVUludDMyIGFTaXplID0gKnBTaXplOworICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOworCisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCB8fCBkYXRhID09IE00T1NBX05VTEwgfHwgcFNpemUgPT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorICAgIGlmIChwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggZGF0YSB0byByZWFkIG9yIG5vdCAqLworICAgIGlmKChwQ29udGV4dC0+ZGF0YU9mZnNldCArIGFTaXplKSA+IHBDb250ZXh0LT5kYXRhU2l6ZSkKKyAgICB7CisgICAgICAgIGFTaXplID0gcENvbnRleHQtPmRhdGFTaXplIC0gcENvbnRleHQtPmRhdGFPZmZzZXQ7CisgICAgICAgIE00T1NBX21lbWNweShkYXRhLCAocENvbnRleHQtPnBGaWxlRGVzYyArIHBDb250ZXh0LT5kYXRhT2Zmc2V0KSwgYVNpemUpOworICAgICAgICAqcFNpemUgPSBhU2l6ZTsKKyAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE00T1NBX21lbWNweShkYXRhLCAocENvbnRleHQtPnBGaWxlRGVzYyArIHBDb250ZXh0LT5kYXRhT2Zmc2V0KSwgYVNpemUpOworICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgIH0KKworICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ICs9IGFTaXplOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24gaW4gdGhlIGNvcmUgZmlsZQorICogICAgICAgICAgICAgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4gVGhlIHBvc2l0aW9uIGlzIHJlbGF0ZWQgdG8KKyAqICAgICAgICAgICAgIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcsIGZyb20KKyAqICAgICAgICAgICAgIHRoZSBlbmQgb3IgZnJvbSB0aGUgY3VycmVudCBwb3N0aW9uLgorICogQG5vdGUgICAgICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKKyAqICAgICAgICAgICAgIGluIHRoZSBmaWxlIG11c3Qgbm90IGNoYW5nZS4gRWxzZSB0aGUgY3VycmVudAorICogICAgICAgICAgICAgcG9zaXRpb24gcG9pbnRlciBtdXN0IGJlIHVwZGF0ZWQuCisgKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCisgKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCisgKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisgKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbVNlZWsoIE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gKQoreworICAgIE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dCopY29udGV4dDsKKyAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKKworICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwgfHwgc2Vla01vZGUgPT0gTTRPU0FfTlVMTCB8fCBwb3NpdGlvbiA9PSBNNE9TQV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICB9CisgICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOworICAgIH0KKworICAgIC8qICovCisgICAgc3dpdGNoKHNlZWtNb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmc6CisgICAgICAgICAgICAvKiBDaGVjayBpZiBwb3NpdGlvbiBpcyByZWFjaGFibGUgYW5kIHVwZGF0ZSBkYXRhT2Zmc2V0ICovCisgICAgICAgICAgICBpZigoKE00T1NBX1VJbnQzMikoKnBvc2l0aW9uKSA8PSBwQ29udGV4dC0+ZGF0YVNpemUpICYmICgqcG9zaXRpb24gPj0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPmRhdGFPZmZzZXQgPSAqcG9zaXRpb247CisgICAgICAgICAgICAgICAgKnBvc2l0aW9uID0gcENvbnRleHQtPmRhdGFPZmZzZXQ7CisgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0VuZDoKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHBvc2l0aW9uIGlzIHJlYWNoYWJsZSBhbmQgdXBkYXRlIGRhdGFPZmZzZXQgKi8KKyAgICAgICAgICAgIGlmKCgoTTRPU0FfSW50MzIpKHBDb250ZXh0LT5kYXRhU2l6ZSkgKyAqcG9zaXRpb24gPj0gMCkgJiYgKCpwb3NpdGlvbiA8PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+ZGF0YU9mZnNldCA9IHBDb250ZXh0LT5kYXRhU2l6ZSArICpwb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAqcG9zaXRpb24gPSBwQ29udGV4dC0+ZGF0YU9mZnNldDsKKyAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudDoKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHBvc2l0aW9uIGlzIHJlYWNoYWJsZSBhbmQgdXBkYXRlIGRhdGFPZmZzZXQgKi8KKyAgICAgICAgICAgIGlmKCgqcG9zaXRpb24gKyAoTTRPU0FfSW50MzIpKHBDb250ZXh0LT5kYXRhT2Zmc2V0KSA+PSAwKSAmJgorICAgICAgICAgICAgICAgKCpwb3NpdGlvbiArIChNNE9TQV9JbnQzMikocENvbnRleHQtPmRhdGFPZmZzZXQpIDw9CisgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcENvbnRleHQtPmRhdGFTaXplKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+ZGF0YU9mZnNldCArPSAqcG9zaXRpb247CisgICAgICAgICAgICAgICAgKnBvc2l0aW9uID0gcENvbnRleHQtPmRhdGFPZmZzZXQ7CisgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gY2xvc2UgdGhlIGZpbGUKKyAqICAgICAgICAgICAgIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KS4KKyAqIEBub3RlICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyIGlzIGZyZWVkLgorICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRSYW1DbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCit7CisgICAgTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0KiBwQ29udGV4dD0oTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0Kiljb250ZXh0OworCisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorICAgIGlmIChwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKKyAgICB9CisKKyAgICBwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKKworICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQ29udGV4dCk7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZQorICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KKyAqIEBub3RlICAgICAgICd2YWx1ZScgbXVzdCBiZSBjYXN0IGFjY29yZGluZyB0byB0aGUgdHlwZSByZWxhdGVkIHRvIHRoZQorICogICAgICAgICAgICAgb3B0aW9uSUQgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkKKyAqICAgICAgICAgICAgIHRoaXMgZmllbGQgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgorICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgorICogQHBhcmFtICAgICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgorICogQHBhcmFtICAgICAgdmFsdWU6IChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbUdldE9wdGlvbiggTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBvcHRpb25WYWx1ZSApCit7CisgICAgTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0KiBwQ29udGV4dD0oTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0Kiljb250ZXh0OworICAgIE00T1NBX0VSUiBlcnI9TTROT19FUlJPUjsKKworICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgIH0KKyAgICBpZiAocENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7CisgICAgfQorCisgICAgc3dpdGNoKG9wdGlvbklEKQorICAgIHsKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZToKKyAgICAgICAgICAgICgqKE00T1NBX1VJbnQzMiAqKW9wdGlvblZhbHVlKSA9IChwQ29udGV4dC0+ZGF0YVNpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRjoKKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5kYXRhT2Zmc2V0ID09IHBDb250ZXh0LT5kYXRhU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKihNNE9TQV9VSW50OCAqKW9wdGlvblZhbHVlKSA9IE00T1NBX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCooTTRPU0FfVUludDggKilvcHRpb25WYWx1ZSkgPSBNNE9TQV9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZToKKyAgICAgICAgICAgIGVyciA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0VVJMOgorICAgICAgICAgICAgZXJyID0gTTRFUlJfTk9UX0lNUExFTUVOVEVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24gOgorICAgICAgICAgICAgKCooTTRPU0FfVUludDMyICopb3B0aW9uVmFsdWUpID0gcENvbnRleHQtPmRhdGFPZmZzZXQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKKyAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9maWxlUmVhZFJhbUdldE9wdGlvbiBpbnZhbGlkIG9wdGlvbiBJRCAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25JRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmbiAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbiAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkpCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gc2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgorICogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgorICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkCisgKiAgICAgICAgICAgICB0byBpdHMgaW50ZXJuYWwgdmFyaWFibGUuCisgKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCisgKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCisgKiBAcGFyYW0gICAgICB2YWx1ZTogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQorICogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkUmFtU2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUgKQoreworICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmYzczZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyLmMKQEAgLTAsMCArMSw1NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5jCisgKiBAYnJpZWYgICAgICAgIEZpbGUgd3JpdGVyIGZvciBBbmRyb2lkCisgKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byB3cml0ZSBpbiBhIGZpbGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKKyNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisjaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KKyAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgorICogQHBhcmFtICAgICAgcENvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKKyAqIEBwYXJhbSAgICAgIHBVcmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCisgKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgIGZpbGUKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTE9DS0VEOiB0aGUgZmlsZSBpcyBsb2NrZWQgYnkgYW4gb3RoZXIKKyAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVPcGVuKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKQoreworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9maWxlV3JpdGVPcGVuIDogcEMgPSAweCVwICBmZCA9IDB4JXAgIG1vZGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFVybCwgZmlsZU1vZGVBY2Nlc3MpOworCisgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX0ZJTEVfV1JJVEVSLCBwQ29udGV4dCwgcFVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1vZGVBY2Nlc3MpOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlICdzaXplJyBieXRlcyBzdG9yZWQgYXQgJ2RhdGEnIG1lbW9yeQorICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgc2VsZWN0ZWQgYnkgaXRzIGNvbnRleHQuCisgKiBAbm90ZSAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCisgKiAgICAgICAgICAgICBtZW1vcnkgZm9yICdkYXRhJyBwYXJhbWV0ZXIuCisgKiBAbm90ZSAgICAgICBNb3Jlb3ZlciB0aGUgZGF0YSBwb2ludGVyIG11c3QgYmUgYWxsb2NhdGVkIHRvIHN0b3JlIGF0IGxlYXN0CisgKiAgICAgICAgICAgICAnc2l6ZScgYnl0ZXMuCisgKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgorICogQHBhcmFtICAgICAgYnVmZmVyOiAoSU4pIERhdGEgcG9pbnRlciBvZiB0aGUgd3JpdGUgZGF0YQorICogQHBhcmFtICAgICAgc2l6ZTogKElOKSBTaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlIChpbiBieXRlcykKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVNpemUpCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OworICAgIE00T1NBX0VSUiBlcnI7CisgICAgTTRPU0FfVUludDMyIHVpU2l6ZVdyaXRlOworCisgICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVXcml0ZURhdGEgOiBkYXRhID0gMHglcCAgc2l6ZSA9ICVsdSIsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVNpemUpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZGF0YSwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBkYXRhIGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSB1aVNpemUsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHVpU2l6ZSBpcyAwIik7CisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQorICAgIHsKKyAgICAgICAgTTRPU0FfVUludDMyICAgIFdyaXRlU2l6ZTsKKyAgICAgICAgZXJyID0gTTROT19FUlJPUjsKKyAgICAgICAgV3JpdGVTaXplID0gZndyaXRlKCh2b2lkICopZGF0YSwxLCB1aVNpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKKyAgICAgICAgaWYoV3JpdGVTaXplICE9IHVpU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLworICAgICAgICAgICAgZXJyID0gKChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShXcml0ZVNpemUpOworICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVXcml0ZURhdGEgZXJyb3I6JXgiLGVycik7CisgICAgICAgIH0KKyAgICAgICAgZmZsdXNoKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKKworICAgICAgICBNNE9TQV9GUE9TX0FERF9DT05TVF9VSU5UMzIocEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiwgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiwgV3JpdGVTaXplKTsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIGZpbGUgc2l6ZSAqLworICAgICAgICBpZihNNE9TQV9GUE9TX0NPTVBBUkUocEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiwgcEZpbGVDb250ZXh0LT5maWxlX3NpemUpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfRlBPU19TRVQocEZpbGVDb250ZXh0LT5maWxlX3NpemUsIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrV3JpdGUpCisgICAgeworICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCisgICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCisgICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24pKTsKKworICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKKyAgICAgICAgeworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVdyaXRlRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtXcml0ZTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSBkYXRhICovCisgICAgdWlTaXplV3JpdGUgPSBmd3JpdGUoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCB1aVNpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKKworICAgIGlmKHVpU2l6ZVdyaXRlID09IChNNE9TQV9VSW50MzIpLTEpCisgICAgeworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICAgICAgLyogQW4gZXJyb3Igb2NjdXJlZCAqLworCisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVdyaXRlRGF0YTogZndyaXRlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7CisgICAgfQorCisgICAgTTRPU0FfRlBPU19BRERfQ09OU1RfVUlOVDMyKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpU2l6ZVdyaXRlKTsKKworICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSBzaXplICovCisgICAgaWYoTTRPU0FfRlBPU19DT01QQVJFKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24sIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplKSA+IDApCisgICAgeworICAgICAgICBNNE9TQV9GUE9TX1NFVChwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSwgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbik7CisgICAgfQorCisgICAgaWYoKE00T1NBX1VJbnQzMil1aVNpemVXcml0ZSA8IHVpU2l6ZSkKKyAgICB7CisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVXcml0ZURhdGEiKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIH0KKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24gaW4gdGhlIGNvcmUgZmlsZQorICogICAgICAgICAgICAgd3JpdGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4gVGhlIHBvc2l0aW9uIGlzIHJlbGF0ZWQgdG8KKyAqICAgICAgICAgICAgIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcsCisgKiAgICAgICAgICAgICBmcm9tIHRoZSBlbmQgb3IgZnJvbSB0aGUgY3VycmVudCBwb3N0aW9uLiBUbyBzdXBwb3J0IGxhcmdlIGZpbGUKKyAqICAgICAgICAgICAgIGFjY2VzcyAobW9yZSB0aGFuIDJHQnl0ZXMpLCB0aGUgcG9zaXRpb24gaXMgcHJvdmlkZWQgb24gYSA2NAorICogICAgICAgICAgICAgYml0cy4KKyAqIEBub3RlICAgICAgIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCisgKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBtdXN0IG5vdCBjaGFuZ2UuIEVsc2UgdGhlIGN1cnJlbnQgcG9zaXRpb24gcG9pbnRlcgorICogICAgICAgICAgICAgbXVzdCBiZSB1cGRhdGVkLgorICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKKyAqIEBwYXJhbSAgICAgIHNlZWtNb2RlOiAoSU4pIFNlZWsgYWNjZXNzIG1vZGUKKyAqIEBwYXJhbSAgICAgIHBvc2l0aW9uOiAoSU4vT1VUKSBQb3NpdGlvbiBpbiB0aGUgZmlsZQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjogdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNlZWsoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24pCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7CisgICAgTTRPU0FfRVJSIGVycjsKKworICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlV3JpdGVTZWVrIDogbW9kZSA9ICVkICBwb3MgPSAlbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vla01vZGUsIChNNE9TQV9OVUxMICE9IHBQb3NpdGlvbikgPyAoKnBQb3NpdGlvbikgOiAwKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2VlazogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworICAgIE00T1NBX0RFQlVHX0lGMigwID09IHNlZWtNb2RlLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2Vlazogc2VlbU1vZGUgaXMgMCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBQb3NpdGlvbiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2VlazogcFBvc2l0aW9uIGlzIE00T1NBX05VTEwiKTsKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2Vlazogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIGlmIChNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpIC8qIHJlYWQgd3JpdGUgKi8KKyAgICB7CisgICAgICAgICBNNE9TQV9VSW50MzIgICAgU2Vla01vZGVPcHRpb247CisgICAgICAgIC8qVGhlIHBvc2l0aW9uIGZvciB0aGUgc2VlayBtb2RlIGJldHdlZW4gdGhlIFNIUCBhbmQgdGhlIE9TQWwgcGFydCBhcmUgZGlmZmVyZW50ICovCisgICAgICAgIGlmIChNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgPT0gc2Vla01vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19TRVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrRW5kID09IHNlZWtNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfRU5EOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgPT0gc2Vla01vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19DVVI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfZmlsZVdyaXRlU2VlazogRU5EIFdJVEggRVJST1IgISEhIChDT05WRVJJT04gRVJST1IgRk9SIFRIRSBTRUVLIE1PREUpICIpOworICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLworICAgICAgICBlcnIgPSBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywqcFBvc2l0aW9uLFNlZWtNb2RlT3B0aW9uKTsKKyAgICAgICAgaWYoZXJyICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KKyAgICAgICAgICAgIGVycj0oKE00T1NBX1VJbnQzMikoTTRfRVJSKTw8MzApKygoKE00T1NBX0ZJTEVfV1JJVEVSKSYweDAwM0ZGRik8PDE2KSsoTTRPU0FfSW50MTYpKGVycik7CisgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVdyaXRlU2VlayBlcnJvcjoleCIsZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBzZWVrTW9kZSwgcFBvc2l0aW9uKTsKKworICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVdyaXRlU2VlazogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBNNE9TQV9GUE9TX1NFVChwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uLCAqcFBvc2l0aW9uKTsKKworICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1dyaXRlOworCisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gY2xvc2UgdGhlIGZpbGUKKyAqICAgICAgICAgICAgIChhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0KS4KKyAqIEBub3RlICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyIGlzIGZyZWVkLgorICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK000T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVDbG9zZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQoreworICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OworCisgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVXcml0ZUNsb3NlIDogcEMgPSAweCVwIiwgcENvbnRleHQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUNsb3NlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisKKyAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX0ZJTEVfV1JJVEVSLCBwQ29udGV4dCk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGZsdXNoZXMgdGhlIHN0cmVhbSBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0LgorICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUZsdXNoKE00T1NBX0NvbnRleHQgcENvbnRleHQpCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OworICAgIE00T1NBX0VSUiAgICBlcnIgPSBNNE5PX0VSUk9SOworCisgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVXcml0ZUZsdXNoIDogcEMgPSAweCVwIiwgcENvbnRleHQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUZsdXNoOiBwY29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVGbHVzaDogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgaWYgKGZmbHVzaChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYykgIT0gMCkKKyAgICB7CisgICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOworICAgIH0KKworI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKKyAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZQorICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KKyAqICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKKyAqICAgICAgICAgICAgIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCisgKiBAbm90ZSAgICAgICAndmFsdWUnIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKKyAqICAgICAgICAgICAgIG9wdGlvbklECisgKiAgICAgICAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCisgKiAgICAgICAgICAgICAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkCisgKiAgICAgICAgICAgICB0byBpdHMgaW50ZXJuYWwgdmFyaWFibGUuCisgKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgorICogQHBhcmFtICAgICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgorICogQHBhcmFtICAgICAgdmFsdWU6IChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9XUklURV9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHdyaXRlIG9ubHkgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwT3B0aW9uVmFsdWUpCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OworCisgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gMCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9wdGlvblZhbHVlLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogcE90aW9uVmFsdWUgaXMgTTRPU0FfTlVMTCIpOworCisgICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1dSSVRFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOworICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1JFQURBQkxFKG9wdGlvbklEKSwgTTRFUlJfV1JJVEVfT05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7CisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAorICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICBzd2l0Y2gob3B0aW9uSUQpCisgICAgeworI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfUE9TSVRJT04gPT0gTTRPU0FfVFJVRSkKKyAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlUG9zaXRpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7CisjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLworCisgICAgICAgICAgICAqcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOworCisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKKyNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCisKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1BPU0lUSU9OKi8KKworI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfU0laRSA9PSBNNE9TQV9UUlVFKQorICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVTaXplOgorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOworCisgICAgICAgICAgICBpZihNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNhdmVQb3MgICAgPSAwOworICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlTaXplICAgICAgICA9IDA7CisKKyAgICAgICAgICAgICAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAvKjEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLworICAgICAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKjItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KKyAgICAgICAgICAgICAgICAqcG9zaXRpb24gPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgLyozLSBDaGVjayB0aGUgZmlsZSBzaXplKi8KKyAgICAgICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgaVNhdmVQb3MsIFNFRUtfU0VUKTsgICAgLyo0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24qLworICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICAgICAgfQorCisjaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQorICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgICAgICAgICAgKnBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5maWxlX3NpemU7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgICAgIH0KKyNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfU0laRSovCisKKyNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9VUkwgPT0gTTRPU0FfVFJVRSkKKyAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRVUkw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMIChwQ29udGV4dCwgKE00T1NBX0NoYXIqKilwT3B0aW9uVmFsdWUpOworICAgICAgICB9CisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9VUkwqLworCisjaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9BVFRSSUJVVEUgPT0gTTRPU0FfVFJVRSkKKyAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRBdHRyaWJ1dGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKHBDb250ZXh0LAorICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlQXR0cmlidXRlKilwT3B0aW9uVmFsdWUpOworICAgICAgICB9CisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX0FUVFJJQlVURSovCisKKyNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCA9PSBNNE9TQV9UUlVFKQorICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldFJlYWRlckNvbnRleHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGFjY2VzcyA9IHBGaWxlQ29udGV4dC0+YWNjZXNzX21vZGU7CisKKyAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMSghKGFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCksIE00RVJSX0JBRF9DT05URVhULAorICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IE00T1NBX2tGaWxlUmVhZCIpOworCisgICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoIShhY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSwgTTRFUlJfQkFEX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogTTRPU0Ffa0ZpbGVXcml0ZSIpOworCisgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF9yZWFkID0gTTRPU0FfRklMRV9SRUFERVI7CisKKyAgICAgICAgICAgICpwT3B0aW9uVmFsdWUgPSBwQ29udGV4dDsKKworICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgICAgIH0KKyNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1JFQURFUl9DT05URVhUKi8KKworICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUxvY2tNb2RlOgorICAgICAgICB7CisgICAgICAgICAgICAqKE00T1NBX1VJbnQzMiopcE9wdGlvblZhbHVlID0gcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGU7CisgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7CisKKyAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOworfQorCisKKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byBzZXQgdGhlIHZhbHVlCisqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCisqICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKKyogICAgICAgICAgICAgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KKyogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQorKiAgICAgICAgICAgICAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbAorKiAgICAgICAgICAgICB2YXJpYWJsZS4KKyogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKKyogQHBhcmFtICAgICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgorKiBAcGFyYW0gICAgICB2YWx1ZTogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCisqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCisqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCisqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK000T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCit7CisgICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OworCisgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24iKTsKKworICAgIE00T1NBX0RFQlVHX0lGMigwID09IG9wdGlvbklELCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24iKTsKKworICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9XUklURVIpLAorICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIik7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19XUklUQUJMRShvcHRpb25JRCksIE00RVJSX1JFQURfT05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7CisKKyNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOworI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KKworICAgIHN3aXRjaChvcHRpb25JRCkKKyAgICB7CisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUxvY2tNb2RlOgorICAgICAgICB7CisgICAgICAgICAgICBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZSA9IChNNE9TQV9VSW50MzIpKihNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOworICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVEZXNjTW9kZToKKyAgICAgICAgeworICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IChNNE9TQV9JbnQzMikqKE00T1NBX0ludDMyKilvcHRpb25WYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7CisgICAgfQorCisgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlcl9SQU0uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXJfUkFNLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM0MWNhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXJfUkFNLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlclJhbS5jCisKKyAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZnJvbSBSQU0KKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHJlYWQgYSAiZmlsZSIgc3RvcmVkIGluIFJBTS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlclJhbS5oIgorI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXJSYW0uaCIKKyNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN0cnVjdHVyZSAgICBNNE9TQV9GaWxlV3JpdGVSYW1fQ29udGV4dAorICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIHdyaXRlciBjb250ZXh0IChwcml2YXRlKQorICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBGaWxlIHdyaXRlciBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTTRPU0FfTWVtQWRkcjggICAgcEZpbGVEZXNjOyAgICAvKiBQb2ludGVyIG9uIGZpbGUgZGF0YSAqLworICAgIE00T1NBX1VJbnQzMiAgICBkYXRhU2l6ZTsgICAgLyogU2l6ZSBvZiBkYXRhIHRvIHdyaXRlICovCisgICAgTTRPU0FfVUludDMyICAgIGRhdGFPZmZzZXQ7ICAgIC8qIEFjdHVhbCBvZmZzZXQgKi8KKyAgICBNNE9TQV9Cb29sICAgICAgICBJc09wZW5lZDsgICAgLyogTWljcm8gc3RhdGUgbWFjaGluZSAqLworICAgIE00T1NBX1VJbnQzMiAgICBidWZmZXJTaXplOyAgICAvKiBBY3R1YWwgdXNlZCBzaXplIGluc2lkZSB0aGUgYnVmZmVyICovCit9IE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dDsKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICBUaGlzIG1ldGhvZCAib3BlbnMiIHRoZSBwcm92aWRlZCBmaWxlRGVzY3JpcHRvciAoaW4gZmFjdCBhZGRyZXNzKQorICogICAgICAgICAgICBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KKyAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKE9VVCkgRmlsZSB3cml0ZXIgY29udGV4dC4KKyAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3IgOiAgICAoSU4pIEZpbGUgRGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgZmlsZS4KKyAqIEBwYXJhbSAgICBGaWxlTW9kZUFjY2VzcyA6ICAgIChJTikgRmlsZSBtb2RlIGFjY2Vzcy4KKyAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIGZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCisgKiBAcmV0dXJuICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTICAgIHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0CisgKiBAcmV0dXJuICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIFRoZSBmaWxlIGNhbiBub3QgYmUgb3BlbmVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1PcGVuKE00T1NBX0NvbnRleHQqIGNvbnRleHQsIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcykKK3sKKyAgICBNNE9TQV9GaWxlV3JpdGVyUmFtX0NvbnRleHQqIHBDb250ZXh0PU00T1NBX05VTEw7CisgICAgTTRPU0FfRmlsZVdyaXRlclJhbV9EZXNjcmlwdG9yKiBwRGVzY3JpcHRvciA9IGZpbGVEZXNjcmlwdG9yOworICAgIE00T1NBX0ludDMyIGFGaWxlRGVzYz0tMTsKKyAgICBNNE9TQV9FUlIgICBlcnI9TTROT19FUlJPUjsKKworICAgIC8qICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgIH0KKyAgICAqY29udGV4dCA9IE00T1NBX05VTEw7CisgICAgaWYoZmlsZURlc2NyaXB0b3IgPT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgLyogICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRmlsZSB3cml0ZXIgY29udGV4dC4gKi8KKyAgICBwQ29udGV4dCA9IChNNE9TQV9GaWxlV3JpdGVyUmFtX0NvbnRleHQgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfV1JJVEVSLCAoTTRPU0FfQ2hhciopIkNvbnRleHQgYWxsb2NhdGlvbiIpOworICAgIGlmKHBDb250ZXh0ID09IE00T1NBX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisgICAgfQorCisgICAgaWYgKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpKQorICAgIHsKKyAgICAgICAgcENvbnRleHQtPnBGaWxlRGVzYyA9IChNNE9TQV9NZW1BZGRyOCkocERlc2NyaXB0b3ItPnBGaWxlRGVzYyk7CisgICAgICAgIHBDb250ZXh0LT5kYXRhU2l6ZSA9IChNNE9TQV9JbnQzMikocERlc2NyaXB0b3ItPmRhdGFTaXplKTsKKyAgICAgICAgcENvbnRleHQtPmRhdGFPZmZzZXQgPSAwOworICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZSA9IDA7CisgICAgICAgIHBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX1RSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOworICAgIH0KKyAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCisgICAgeworICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcENvbnRleHQpOworICAgICAgICB9CisgICAgICAgICpjb250ZXh0PU00T1NBX05VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpjb250ZXh0ID0gcENvbnRleHQ7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgVGhpcyBtZXRob2Qgd3JpdGVzIHRoZSAnc2l6ZScgYnl0ZXMgc3RvcmVkIGF0ICdkYXRhJyBtZW1vcnkgYXQgdGhlIGVuZAorICogICAgICAgICAgICBvZiB0aGUgZmlsZSBzZWxlY3RlZCBieSBpdHMgY29udGV4dC4KKyAqICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgZm9yICdkYXRhJyBwYXJhbWV0ZXIuCisgKiAgICAgICAgICAgIE1vcmVvdmVyLCB0aGUgZGF0YSBwb2ludGVyIG11c3QgYmUgYWxsb2NhdGVkIHRvIHN0b3JlIGF0IGxlYXN0ICdzaXplJyBieXRlcy4KKyAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBGaWxlIHdyaXRlciBjb250ZXh0LgorICogQHBhcmFtICAgIHBEYXRhIDogICAgKElOKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHdyaXR0ZW4gZGF0YS4KKyAqIEBwYXJhbSAgICBTaXplIDogICAgKElOKSBTaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlIChpbiBieXRlcykuCisgKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgcERhdGEgaXMgTlVMTAorICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbURhdGEoTTRPU0FfQ29udGV4dCBjb250ZXh0LE00T1NBX01lbUFkZHI4IGRhdGEsIE00T1NBX1VJbnQzMiBTaXplKQoreworICAgIE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCopY29udGV4dDsKKyAgICBNNE9TQV9FUlIgZXJyPU00Tk9fRVJST1I7CisKKyAgICAvKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCisgICAgaWYoY29udGV4dCA9PSBNNE9TQV9OVUxMIHx8IGRhdGEgPT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAvKiBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byB3cml0ZSBvciBub3QgKi8KKyAgICBpZiAocENvbnRleHQtPmRhdGFPZmZzZXQgKyBTaXplIDwgcENvbnRleHQtPmRhdGFTaXplICkKKyAgICB7CisgICAgICAgIE00T1NBX21lbWNweSgocENvbnRleHQtPnBGaWxlRGVzYyArIHBDb250ZXh0LT5kYXRhT2Zmc2V0KSwgZGF0YSwgU2l6ZSk7CisgICAgICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ICs9IFNpemU7CisgICAgICAgIGlmKHBDb250ZXh0LT5kYXRhT2Zmc2V0PiBwQ29udGV4dC0+YnVmZmVyU2l6ZSkgcENvbnRleHQtPmJ1ZmZlclNpemUgPSBwQ29udGV4dC0+ZGF0YU9mZnNldDsKKyAgICAgICAgZXJyID0gTTROT19FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlIHdyaXRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuCisgKiAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciA6CisgKiAgICAgICAgICAgICAgICBGcm9tIHRoZSBiZWdpbm5pbmcgKHBvc2l0aW9uIE1VU1QgYmUgcG9zaXRpdmUpIDogZW5kIHBvc2l0aW9uID0gcG9zaXRpb24KKyAqICAgICAgICAgICAgICAgIEZyb20gdGhlIGVuZCAocG9zaXRpb24gTVVTVCBiZSBuZWdhdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBmaWxlIHNpemUgKyBwb3NpdGlvbgorICogICAgICAgICAgICAgICAgRnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAoc2lnbmVkIG9mZnNldCkgOiBlbmQgcG9zaXRpb24gPSBjdXJyZW50IHBvc2l0aW9uICsgcG9zaXRpb24uCisgKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KKyAqIEBwYXJhbSAgICBTZWVrTW9kZSA6ICAgIChJTikgU2VlayBhY2Nlc3MgbW9kZS4KKyAqIEBwYXJhbSAgICBwUG9zaXRpb24gOiAgICAoSU4pIFBvc2l0aW9uIGluIHRoZSBmaWxlLgorICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgU2Vla21vZGUgb3IgZmlsZURlc2NyaXB0b3IgaXMgTlVMTAorICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKKyAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCisgKiBAcmV0dXJuICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbVNlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgU2Vla01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKQoreworICAgIE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCopY29udGV4dDsKKyAgICBNNE9TQV9FUlIgZXJyPU00Tk9fRVJST1I7CisKKyAgICAvKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCisgICAgaWYoY29udGV4dCA9PSBNNE9TQV9OVUxMIHx8IFNlZWtNb2RlID09IE00T1NBX05VTEwgfHwgcG9zaXRpb24gPT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAvKiBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KKyAgICB9CisKKyAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLworICAgIHN3aXRjaChTZWVrTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nOgorICAgICAgICAgICAgLyogQ2hlY2sgaWYgcG9zaXRpb24gaXMgcmVhY2hhYmxlIGFuZCB1cGRhdGUgZGF0YU9mZnNldCAqLworICAgICAgICAgICAgaWYgKCgoKnBvc2l0aW9uKSA+PSAwKSAmJiAoKE00T1NBX1VJbnQzMikoKnBvc2l0aW9uKSA8PSBwQ29udGV4dC0+ZGF0YVNpemUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ID0gKnBvc2l0aW9uOworICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQ6CisgICAgICAgICAgICAvKiBDaGVjayBpZiBwb3NpdGlvbiBpcyByZWFjaGFibGUgYW5kIHVwZGF0ZSBkYXRhT2Zmc2V0ICovCisgICAgICAgICAgICBpZiAoKCpwb3NpdGlvbikgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+ZGF0YVNpemUgPj0gKE00T1NBX1VJbnQzMikoLSgqcG9zaXRpb24pKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ID0gKE00T1NBX1VJbnQzMikgKHBDb250ZXh0LT5wRmlsZURlc2MgKyBwQ29udGV4dC0+ZGF0YVNpemUgKyAoKnBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoKnBvc2l0aW9uKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBwQ29udGV4dC0+ZGF0YU9mZnNldCA9IChNNE9TQV9VSW50MzIpKHBDb250ZXh0LT5wRmlsZURlc2MgKyBwQ29udGV4dC0+ZGF0YVNpemUpOworICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudDoKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHBvc2l0aW9uIGlzIHJlYWNoYWJsZSBhbmQgdXBkYXRlIGRhdGFPZmZzZXQgKi8KKyAgICAgICAgICAgIGlmICgoKnBvc2l0aW9uKSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5kYXRhT2Zmc2V0ID49IChNNE9TQV9VSW50MzIpKC0oKnBvc2l0aW9uKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+ZGF0YU9mZnNldCA9IChNNE9TQV9VSW50MzIpIChwQ29udGV4dC0+ZGF0YU9mZnNldCArICgqcG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPmRhdGFTaXplID49IChNNE9TQV9VSW50MzIpKHBDb250ZXh0LT5kYXRhT2Zmc2V0ICsgKCpwb3NpdGlvbikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPmRhdGFPZmZzZXQgPSAoTTRPU0FfVUludDMyKSAocENvbnRleHQtPmRhdGFPZmZzZXQgKyAoKnBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byBjbG9zZSB0aGUgZmlsZSAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCisgKiAgICAgICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyIG11c3QgYmUgZnJlZWQuCisgKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KKyAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbUNsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKK3sKKyAgICBNNE9TQV9GaWxlV3JpdGVyUmFtX0NvbnRleHQqIHBDb250ZXh0PShNNE9TQV9GaWxlV3JpdGVyUmFtX0NvbnRleHQqKWNvbnRleHQ7CisgICAgTTRPU0FfRVJSIGVycj1NNE5PX0VSUk9SOworCisgICAgLyogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIGlmKHBDb250ZXh0ID09IE00T1NBX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgLyogVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCisgICAgfQorCisgICAgcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7CisKKyAgICAvKiBGcmVlIHRoZSBjb250ZXh0ICovCisgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDb250ZXh0KTsKKworICAgIC8qICAgIFJldHVybiBlcnJvciAqLworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gZmx1c2ggdGhlIHBlbmRpbmcgZGF0YQorICogICAgICAgICAgICB0byB0aGUgZmlsZSAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCisgKiAgICAgICAgICAgIEFsbCBwZW5kaW5nIHdyaXR0ZW4gZGF0YSBhcmUgd3JpdHRlbiBpbiB0aGUgZmlsZS4KKyAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgorICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtRmx1c2goTTRPU0FfQ29udGV4dCBjb250ZXh0KQoreworICAgIE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCopY29udGV4dDsKKworICAgIC8qICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgLyogVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBETyBOT1RISU5HICovCisKKyAgICAvKioKKyAgICAgKiAgICBSZXR1cm4gd2l0aG91dCBlcnJvciAqLworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KKyAqICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgorICogQG5vdGUgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KKyAqIEBwYXJhbSAgICBPcHRpb25JZCA6ICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCisgKiBAcGFyYW0gICAgT3B0aW9uVmFsdWUgOiAgICAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24uCisgKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgIHBDb250ZXh0IGlzIE5VTEwKKyAqIEByZXR1cm4gICAgTTRFUlJfUkVBRF9PTkxZIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KKyAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCB0aGUgb3B0aW9uIGlkIGlzIG5vdCB2YWxpZC4KKyAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgT3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gT3B0aW9uVmFsdWUpCit7CisgICAgTTRPU0FfRmlsZVdyaXRlclJhbV9Db250ZXh0KiBwQ29udGV4dD0oTTRPU0FfRmlsZVdyaXRlclJhbV9Db250ZXh0Kiljb250ZXh0OworCisgICAgLyogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLworICAgIH0KKworICAgIC8qICAgIFNldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCisgICAgc3dpdGNoKE9wdGlvbklEKQorICAgIHsKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0UmVhZGVyQ29udGV4dCA6ICAgIC8qIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGUqLworICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRVUkwgOiAgICAgICAgICAgIC8qIEdldCB0aGUgZGlyZWN0b3J5ICsgbmFtZSBvZiB0aGUgZmlsZSAqLworICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlUG9zaXRpb24gOiAgICAvKiBHZXQgZmlsZSBwb3NpdGlvbiAqLworICAgICAgICAgICAgcmV0dXJuIE00RVJSX1JFQURfT05MWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZSA6CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEdldCB0aGUgcmVhZGVyIGNvbnRleHQgZm9yIHJlYWQgJiB3cml0ZSBmaWxlLiBJdCBpcyBOVUxMIGlmIHRoZSBmaWxlIGlzIG9wZW5lZAorICAgICAgICAgICAgICogd2l0aCB3cml0ZSBhdHRyaWJ1dGUgb25seSAqLworICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKKworICAgICAgICBkZWZhdWx0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhZCBvcHRpb24gSUQgKi8KKyAgICAgICAgICAgIHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOworICAgIH0KKworICAgIC8qICAgIFJldHVybiB3aXRob3V0IGVycm9yICovCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgorICogICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCisgKiBAbm90ZSAgICBUaGUgb3B0aW9ucyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgorICogQHBhcmFtICAgIE9wdGlvbklkIDogICAgKElOKSBJZCBvZiB0aGUgb3B0aW9uIHRvIHNldC4KKyAqIEBwYXJhbSAgICBwT3B0aW9uVmFsdWUgOiAgICAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uLgorICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICBwQ29udGV4dCBpcyBOVUxMCisgKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgdGhlIG9wdGlvbiBpZCBpcyBub3QgdmFsaWQuCisgKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQorICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgVGhlIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1HZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBPcHRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpCit7CisgICAgTTRPU0FfRmlsZVdyaXRlclJhbV9Db250ZXh0KiBwQ29udGV4dD0oTTRPU0FfRmlsZVdyaXRlclJhbV9Db250ZXh0Kiljb250ZXh0OworICAgIE00T1NBX0VSUiAgIGVycj1NNE5PX0VSUk9SOworCisgICAgLyogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLworICAgIH0KKworICAgIC8qICAgIEdldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCisgICAgc3dpdGNoKE9wdGlvbklEKQorICAgIHsKKyAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemU6LyogR2V0IHNpemUgb2YgdGhlIGZpbGUsIGxpbWl0ZWQgdG8gMzIgYml0IHNpemUgKi8KKyAgICAgICAgICAgICgqKE00T1NBX1VJbnQzMiAqKW9wdGlvblZhbHVlKSA9IChwQ29udGV4dC0+YnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRVUkwgOiAgICAvKiBHZXQgdGhlIGRpcmVjdG9yeSArIG5hbWUgb2YgdGhlIGZpbGUgKi8KKyAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7CisKKyAgICAgICAgZGVmYXVsdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJhZCBvcHRpb24gSUQgKi8KKyAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogICAgUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfTXV0ZXguYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQ4NTdmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgICAgTXV0ZXggZm9yIEFuZHJvaWQKKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgbXV0ZXgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgorI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisjaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKKyNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKKyNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKworLyogQ29udGV4dCBmb3IgdGhlIG11dGV4ICovCit0eXBlZGVmIHN0cnVjdAoreworICAgTTRPU0FfVUludDMyICAgICBjb3JlSUQ7ICAgICAgICAgICAgICAgLyogbXV0ZXggY29udGV4dCBpZGVudGlmaWFudCAqLworICAgcHRocmVhZF9tdXRleF90ICBtdXRleDsgICAgICAgICAgICAgICAgLyogbXV0ZXggKi8KKyAgIHB0aHJlYWRfdCAgICAgICAgdGhyZWFkT3duZXJJRDsgICAgICAgIC8qIHRocmVhZCBvd25lciBpZGVudGlmaWFudCAqLworfSBNNE9TQV9NdXRleENvbnRleHQ7CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbXV0ZXguCisgKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGFsbG9jYXRlcyBhIHVuaXF1ZSBjb250ZXh0LiBJdCdzIHRoZQorICogICAgICAgICAgICAgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cyBjb250ZXh0LiBJdCBtdXN0CisgKiAgICAgICAgICAgICBiZSBmcmVlZCBieSB0aGUgTTRPU0FfbXV0ZXhDbG9zZSBmdW5jdGlvbi4gVGhlIGNvbnRleHQgcGFyYW1ldGVyCisgKiAgICAgICAgICAgICB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIG11dGV4IGZ1bmN0aW9ucyB0byBhbGxvdworICogICAgICAgICAgICAgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZCBtdXRleC4KKyAqIEBwYXJhbSAgICAgIHBDb250ZXh0OihPVVQpIENvbnRleHQgb2YgdGhlIGNyZWF0ZWQgbXV0ZXgKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5CisgKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKK3sKKyAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0KilNNE9TQV9OVUxMOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cmlidXRlID0geyAwIH07CisgICAgTTRPU0FfQm9vbCBvcGVuZWQgPSBNNE9TQV9GQUxTRTsKKworICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleE9wZW5cdFx0TTRPU0FfQ29udGV4dCogMHgleCIsIHBDb250ZXh0KTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleE9wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKKworICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7CisKKyAgICBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopTTRPU0FfbWFsbG9jKHNpemVvZihNNE9TQV9NdXRleENvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICBNNE9TQV9NVVRFWCwgKE00T1NBX0NoYXIqKSJNNE9TQV9tdXRleE9wZW46IG11dGV4IGNvbnRleHQiKTsKKworICAgIGlmKE00T1NBX05VTEwgPT0gcE11dGV4Q29udGV4dCkKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfbXV0ZXhPcGVuIik7CisgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleCBhdHRyaWJ1dGUuICovCisgICAgaWYgKCAwID09IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICZhdHRyaWJ1dGUgKSApCisgICAgeworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleCB0eXBlLiAqLworICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSggJmF0dHJpYnV0ZSwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIG11dGV4LiAqLworICAgICAgICAgICAgaWYgKDAgPT0gcHRocmVhZF9tdXRleF9pbml0KCAmcE11dGV4Q29udGV4dC0+bXV0ZXgsICZhdHRyaWJ1dGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3BlbmVkID0gTTRPU0FfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIERlc3Ryb3kgdGhlIG11dGV4IGF0dHJpYnV0ZS4gKi8KKyAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSggJmF0dHJpYnV0ZSApOworICAgIH0KKworICAgIGlmKCFvcGVuZWQpCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9DT05URVhUX0ZBSUxFRCwgIk00T1NBX211dGV4T3BlbjogT1MgbXV0ZXggY3JlYXRpb24gZmFpbGVkIik7CisgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwTXV0ZXhDb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIE00RVJSX0NPTlRFWFRfRkFJTEVEIDsKKyAgICB9CisKKyAgICBwTXV0ZXhDb250ZXh0LT5jb3JlSUQgPSBNNE9TQV9NVVRFWDsKKworICAgIHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgPSAwOworCisgICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpIHBNdXRleENvbnRleHQ7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBsb2NrcyB0aGUgbXV0ZXguICJDb250ZXh0IiBpZGVudGlmaWVzIHRoZSBtdXRleC4KKyAqIEBub3RlICAgICAgIElmIHRoZSBtdXRleCBpcyBhbHJlYWR5IGxvY2tlZCwgdGhlIGNhbGxpbmcgdGhyZWFkIGJsb2NrcyB1bnRpbAorICogICAgICAgICAgICAgdGhlIG11dGV4IGJlY29tZXMgYXZhaWxhYmxlIChieSBjYWxsaW5nIE00T1NBX211dGV4VW5sb2NrKSBvcgorICogICAgICAgICAgICAgInRpbWVvdXQiIGlzIHJlYWNoZWQuIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgorICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBtdXRleAorICogQHBhcmFtICAgICAgdGltZW91dDooSU4pIFRpbWUgb3V0IGluIG1pbGxpc2Vjb25kcworICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNFdBUl9USU1FX09VVDogdGltZSBvdXQgaXMgZWxhcHNlZCBiZWZvcmUgbXV0ZXggaGFzIGJlZW4KKyAqICAgICAgICAgICAgIGF2YWlsYWJsZQorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX211dGV4TG9jayhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1VJbnQzMiB0aW1lb3V0KQoreworICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKWNvbnRleHQ7CisgICAgcHRocmVhZF90ICAgICAgICAgICBjdXJyZW50VGhyZWFkOworICAgIGludCAgICAgICAgICAgICAgICAgcmVzdWx0OworICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgdHM7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICBsZWZ0OworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX211dGV4TG9ja1x0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCisgICAgICAgIGNvbnRleHQsIHRpbWVvdXQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhMb2NrOiBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIocE11dGV4Q29udGV4dC0+Y29yZUlEICE9IE00T1NBX01VVEVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2siKTsKKworICAgIGN1cnJlbnRUaHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKKworICAgIGlmKHBNdXRleENvbnRleHQgLT50aHJlYWRPd25lcklEID09IGN1cnJlbnRUaHJlYWQpCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jazogVGhyZWFkIHRyaWVkIHRvIGxvY2sgYSBtdXRleCBpdCBhbHJlYWR5IG93bnMiKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUIDsKKyAgICB9CisKKyAgICAvKiBMb2NrIHRoZSBtdXRleC4gKi8KKyAgICBpZiAoIE00T1NBX1dBSVRfRk9SRVZFUiA9PSB0aW1lb3V0KQorICAgIHsKKyAgICAgICAgaWYgKCAwICE9IHB0aHJlYWRfbXV0ZXhfbG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpICkKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2s6IE9TIG11dGV4IHdhaXQgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7CisgICAgICAgIHdoaWxlICggKCBFQlVTWSA9PSByZXN1bHQgKSAmJiAoIDAgPCB0aW1lb3V0ICkgKQorICAgICAgICB7CisgICAgICAgICAgICB0cy50dl9zZWMgID0gMDsKKyAgICAgICAgICAgIGlmICgxIDw9IHRpbWVvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IDEwMDAwMDA7CisgICAgICAgICAgICAgICAgdGltZW91dCAtPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSB0aW1lb3V0ICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbm9zbGVlcCgmdHMsICZsZWZ0KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpOworICAgICAgICB9CisgICAgICAgIGlmICgwICE9IHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEVCVVNZID09IHJlc3VsdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfVElNRV9PVVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2s6IE9TIG11dGV4IHdhaXQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCA9IGN1cnJlbnRUaHJlYWQ7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgdW5sb2NrcyB0aGUgbXV0ZXguIFRoZSBtdXRleCBpcyBpZGVudGlmaWVkIGJ5CisgKiAgICAgICAgICAgICBpdHMgY29udGV4dAorICogQG5vdGUgICAgICAgVGhlIE00T1NBX211dGV4TG9jayB1bmJsb2NrcyB0aGUgdGhyZWFkIHdpdGggdGhlIGhpZ2hlc3QKKyAqICAgICAgICAgICAgIHByaW9yaXR5IGFuZCBtYWRlIGl0IHJlYWR5IHRvIHJ1bi4KKyAqIEBub3RlICAgICAgIE5vIGh5cG90aGVzZXMgY2FuIGJlIG1hZGUgb24gd2hpY2ggdGhyZWFkIHdpbGwgYmUgdW4tYmxvY2tlZAorICogICAgICAgICAgICAgYmV0d2VlbiB0aHJlYWRzIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkuCisgKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIG11dGV4CisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX211dGV4VW5sb2NrKE00T1NBX0NvbnRleHQgY29udGV4dCkKK3sKKyAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0Kiljb250ZXh0OworICAgIHB0aHJlYWRfdCBjdXJyZW50VGhyZWFkOworCisgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX211dGV4VW5sb2NrXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleFVubG9jazogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX01VVEVYICE9IHBNdXRleENvbnRleHQtPmNvcmVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4VW5sb2NrIik7CisKKyAgICBjdXJyZW50VGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CisKKyAgICBpZihwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEICE9IGN1cnJlbnRUaHJlYWQpCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4VW5sb2NrOiBUaHJlYWQgdHJpZWQgdG8gdW5sb2NrIGEgbXV0ZXggaXQgZG9lc24ndCBvd24iKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOworICAgIH0KKworICAgIHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgPSAwIDsKKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgbXV0ZXggKGlkZW50aWZ5IGJ5IGl0cyBjb250ZXh0KS4gQWZ0ZXIKKyAqICAgICAgICAgICAgIHRoaXMgY2FsbCwgdGhlIG11dGV4IGFuZCBpdHMgY29udGV4dCBpcyBubyBtb3JlIHVzZWFibGUuIFRoaXMKKyAqICAgICAgICAgICAgIGZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3J5IHJlbGF0ZWQgdG8gdGhpcyBtdXRleC4KKyAqIEBub3RlICAgICAgIEl0IGlzIGFuIGFwcGxpY2F0aW9uIGlzc3VlIHRvIHdhcnJhbnQgbm8gbW9yZSB0aHJlYWRzIGFyZSBsb2NrZWQKKyAqICAgICAgICAgICAgIG9uIHRoZSBkZWxldGVkIG11dGV4LgorICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBtdXRleAorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfbXV0ZXhDbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCit7CisgICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopY29udGV4dDsKKworICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleENsb3NlXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleENsb3NlOiBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIocE11dGV4Q29udGV4dC0+Y29yZUlEICE9IE00T1NBX01VVEVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhVbmxvY2siKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcE11dGV4Q29udGV4dC0+bXV0ZXgpOworCisgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSBwTXV0ZXhDb250ZXh0KTsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9SYW5kb20uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzZmRmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9SYW5kb20uYwpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgTTRQU1dfVHJhY2UuYworICogQGJyaWVmICAgICAgICBUcmFjZSBmdW5jdGlvbiBmb3IgdHJhY2UgbWFjcm9zCisgKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGdpdmVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb24gdXNlZAorICogICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlIGluc3RydW1lbnRhdGlvbiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPiAgLypmb3IgcHJpbnRmICovCisjaW5jbHVkZSA8c3RkYXJnLmg+IC8qIEFOU0kgQyBtYWNyb3MgYW5kIGRlZnMgZm9yIHZhcmlhYmxlIGFyZ3MgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgorI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisjaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZuICAgICAgICAgTTRPU0FfRVJSIE00T1NBX3JhbmRJbml0KCkKKyAqIEBicmllZiAgICAgIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB0aGUgbnVtYmVyIGdlbmVyYXRvcgorICogICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIGFueSBjYWxsIHRvIE00T1NBX3JhbmQoKQorICogICAgICAgICAgICAgICBuZWVkIHRoZSBzdGRsaWIgYW5kIHRpbWUgbGlicmFyaWVzCisgKiBAbm90ZQorICogQHBhcmFtCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitNNE9TQV9FUlIgTTRPU0FfcmFuZEluaXQoKQoreworICAgIGludCBpOworCisgICAgc3JhbmQodGltZShOVUxMKSk7CisKKyAgICAvKiBXaW5kb3dzJyByYW5kIGlzIHJvdHRlbiwgdGhlIGZpcnN0IGdlbmVyYXRlZCB2YWx1ZSBhZnRlciB0aGUgaW5pdAorICAgIGFib3ZlIGlzIG5vdCByYW5kb20gZW5vdWdoLCBzbyBsZXQncyBzaGFrZSB0aGluZ3MgYSBsaXR0bGUuLi4gKi8KKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKSByYW5kKCk7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZuICAgICAgICAgICBNNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLCBNNE9TQV9VSW50MzIgbWF4X3ZhbHVlKQorICogQGJyaWVmICAgICAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gMSBhbmQgbWF4X3ZhbHVlCisgKiAgICAgICAgICAgICAgIChpbmNsdXNpdmUpIHdpdGggYXBwcm94aW1hdGVseSBlcXVhbCBwcm9iYWJpbGl0eSwgYW5kCisgKiAgICAgICAgICAgICAgIHJldHVybnMgdGhpcyBudW1iZXIgaW4gb3V0X3ZhbHVlLiBGb3IgaW5zdGFuY2UsIGEgbWF4X3ZhbHVlCisgKiAgICAgICAgICAgICBvZiA2IHdpbGwgc2ltdWxhdGUgYSBmYWlyIDYtc2lkZWQgZGljZSByb2xsLgorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIG91dF92YWx1ZSAoT1VUKTogb24gcmV0dXJuLCBwb2ludHMgdG8gcmFuZG9tIHJlc3VsdAorICogQHBhcmFtICAgICAgIG1heF92YWx1ZSAoSU4pOiBtYXggZXhwZWN0ZWQgdmFsdWUKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK000T1NBX0VSUiBNNE9TQV9yYW5kKE00T1NBX0ludDMyKiBvdXRfdmFsdWUsIE00T1NBX1VJbnQzMiBtYXhfdmFsdWUpCit7CisgICAgaWYoIChvdXRfdmFsdWUgPT0gTTRPU0FfTlVMTCkgfHwgKG1heF92YWx1ZSA8IDEpICkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgKCpvdXRfdmFsdWUpID0gcmFuZCgpOworICAgIC8qIG5vdGljZSB0aGlzIGFsZ29yaXRobSB3aWxsIG9ubHkgd29yayBmb3IgbWF4X3ZhbHVlcyBzdWNoIHRoYXQgdGhlIG11bHRpcGxpY2F0aW9uCisgICAgd29uJ3Qgb3ZlcmZsb3csIHdoaWNoIG1lYW5zIHRoYXQgbWF4X3ZhbHVlIHR5cGljYWxseSBzaG91bGRuJ3QgZ28gb3ZlciB0aGUgcmFuZ2Ugb2YKKyAgICBhbiBJbnQxNi4gKi8KKyAgICAoKm91dF92YWx1ZSkgPSAoKCgqb3V0X3ZhbHVlKSAqIG1heF92YWx1ZSkgLyAoKE00T1NBX1VJbnQzMilSQU5EX01BWCArIDEpKSArIDE7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1NlbWFwaG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5OWIxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9TZW1hcGhvcmUuYworICogQGJyaWVmICAgICAgICBTZW1hcGhvcmUgZm9yIFdpbmRvd3MKKyAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgc2VtYXBob3JlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKworI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCisjaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKKyNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgorI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgorI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgorCisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworCisvKiBDb250ZXh0IGZvciB0aGUgc2VtYXBob3JlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICBNNE9TQV9VSW50MzIgICBjb3JlSUQ7ICAgICAvKiBzZW1hcGhvcmUgY29udGV4dCBpZGVudGlmaWFudCAqLworICAgc2VtX3QgICAgICAgICAgc2VtYXBob3JlOyAgLyogc2VtYXBob3JlICovCit9IE00T1NBX1NlbWFwaG9yZUNvbnRleHQ7CisKKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzZW1hcGhvcmUgd2l0aCB0aGUgImluaXRpYWxDb3VudGVyIgorICogICAgICAgICAgICAgdmFsdWUuCisgKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGFsbG9jYXRlcyBhIHVuaXF1ZSBjb250ZXh0LiBJdCdzIHRoZQorICogICAgICAgICAgICAgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cyBjb250ZXh0LiBJdCBtdXN0CisgKiAgICAgICAgICAgICBiZSBmcmVlZCBieSB0aGUgTTRPU0Ffc2VtYXBob3JlQ2xvc2UgZnVuY3Rpb24uIFRoZSBjb250ZXh0CisgKiAgICAgICAgICAgICBwYXJhbWV0ZXIgd2lsbCBiZSBzZW50IGJhY2sgdG8gYW55IE9TQUwgY29yZSBzZW1hcGhvcmUgZnVuY3Rpb25zCisgKiAgICAgICAgICAgICB0byBhbGxvdyByZXRyaWV2aW5nIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgb3BlbmVkIHNlbWFwaG9yZS4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCBzZW1hcGhvcmUKKyAqIEBwYXJhbSAgICAgIGluaXRpYWxfY291bnQ6KElOKSBJbml0aWFsIGNvdW50ZXIgb2YgdGhlIHNlbWFwaG9yZQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcHJvdmlkZWQgY29udGV4dCBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5CisgKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZU9wZW4oTTRPU0FfQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbml0aWFsX2NvdW50KQoreworICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IE00T1NBX05VTEw7CisKKyAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zZW1hcGhvcmVPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdE00T1NBX1VJbnQzMiAiCisgICAgICAgICAgICAgICAgICAiJWQiLCBjb250ZXh0LCBpbml0aWFsX2NvdW50KTsKKworICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVPcGVuIik7CisKKyAgICpjb250ZXh0ID0gTTRPU0FfTlVMTDsKKworICAgc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0KikgTTRPU0FfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9TZW1hcGhvcmVDb250ZXh0KSwgTTRPU0FfU0VNQVBIT1JFLAorICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0Ffc2VtYXBob3JlT3Blbjogc2VtYXBob3JlIGNvbnRleHQiKTsKKworICAgaWYoc2VtYXBob3JlQ29udGV4dCA9PSBNNE9TQV9OVUxMKQorICAgeworICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zZW1hcGhvcmVPcGVuIik7CisKKyAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKKyAgIH0KKworICAgaWYgKDAgIT0gc2VtX2luaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSwgMCwgaW5pdGlhbF9jb3VudCkpCisgICB7CisgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpc2VtYXBob3JlQ29udGV4dCk7CisKKyAgICAgIE00T1NBX0RFQlVHKE00RVJSX0NPTlRFWFRfRkFJTEVELAorICAgICAgICAgIk00T1NBX3NlbWFwaG9yZU9wZW46IE9TIHNlbWFwaG9yZSBjcmVhdGlvbiBmYWlsZWQiKTsKKworICAgICAgcmV0dXJuIE00RVJSX0NPTlRFWFRfRkFJTEVEOworICAgfQorCisgICBzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgPSBNNE9TQV9TRU1BUEhPUkUgOworICAgKmNvbnRleHQgPSAoTTRPU0FfQ29udGV4dClzZW1hcGhvcmVDb250ZXh0OworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWNyZW1lbnRzIChvbmUgYnkgb25lKSB0aGUgc2VtYXBob3JlIGNvdW50ZXIuIFRoZQorICogICAgICAgICAgICAgc2VtYXBob3JlIGlzIGlkZW50aWZpZWQgYnkgaXRzIGNvbnRleHQgVGhpcyBjYWxsIGlzIG5vdCBibG9ja2luZworICogICAgICAgICAgICAgaWYgdGhlIHNlbWFwaG9yZSBjb3VudGVyIGlzIHBvc2l0aXZlIG9yIHplcm8gKGFmdGVyCisgKiAgICAgICAgICAgICBkZWNyZW1lbnRhdGlvbikuIFRoaXMgY2FsbCBpcyBibG9ja2luZyBpZiB0aGUgc2VtYXBob3JlIGNvdW50ZXIKKyAqICAgICAgICAgICAgIGlzIGxlc3MgdGhhbiB6ZXJvIChhZnRlciBkZWNyZW1lbnRhdGlvbiksIHVudGlsIHRoZSBzZW1hcGhvcmUgaXMKKyAqICAgICAgICAgICAgIHVwcGVyIHRoYW4gemVybyAoc2VlIE00T1NBX3NlbWFwaG9yZVBvc3QpIG9yIHRpbWVfb3V0IGlzCisgKiAgICAgICAgICAgICByZWFjaGVkLgorICogQG5vdGUgICAgICAgSWYgInRpbWVvdXQiIHZhbHVlIGlzIE00T1NBX1dBSVRfRk9SRVZFUiwgdGhlIGNhbGxpbmcgdGhyZWFkCisgKiAgICAgICAgICAgICB3aWxsIGJsb2NrIGluZGVmaW5pdGVseSB1bnRpbCB0aGUgc2VtYXBob3JlICBpcyB1bmxvY2tlZC4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgc2VtYXBob3JlCisgKiBAcGFyYW0gICAgICB0aW1lb3V0OihJTikgVGltZSBvdXQgaW4gbWlsbGlzZWNvbmRzCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00V0FSX1RJTUVfT1VUOiB0aW1lIG91dCBpcyBlbGFwc2VkIGJlZm9yZSBzZW1hcGhvcmUgaGFzIGJlZW4KKyAqICAgICAgICAgICAgIGF2YWlsYWJsZS4KKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVXYWl0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfSW50MzIgdGltZW91dCkKK3sKKyAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopY29udGV4dDsKKyAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgIHRzOworICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgbGVmdDsKKyAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDsKKworICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3NlbWFwaG9yZVdhaXRcdFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgdGltZW91dCk7CisKKyAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCisgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlV2FpdCIpOworCisgICBNNE9TQV9ERUJVR19JRjIoc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1NFTUFQSE9SRSwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZVdhaXQiKTsKKworICAgaWYgKCAoTTRPU0FfSW50MzIpTTRPU0FfV0FJVF9GT1JFVkVSID09IHRpbWVvdXQpCisgICB7CisgICAgICAgaWYgKCAwICE9IHNlbV93YWl0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpICkKKyAgICAgICB7CisgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULAorICAgICAgICAgICAgICAgICAgIk00T1NBX3NlbWFwaG9yZVdhaXQ6IE9TIHNlbWFwaG9yZSB3YWl0IGZhaWxlZCIpOworCisgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVCA7CisgICAgICAgfQorICAgfQorICAgZWxzZQorICAgeworICAgICAgIHJlc3VsdCA9IHNlbV90cnl3YWl0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOworICAgICAgIHdoaWxlICggKChFQlVTWSA9PSByZXN1bHQpIHx8IChFQUdBSU4gPT0gcmVzdWx0KSkgJiYgKCAwIDwgdGltZW91dCApICkKKyAgICAgICB7CisgICAgICAgICAgIHRzLnR2X3NlYyAgPSAwOworICAgICAgICAgICBpZiAoMSA8PSB0aW1lb3V0KQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0cy50dl9uc2VjID0gMTAwMDAwMDsKKyAgICAgICAgICAgICAgIHRpbWVvdXQgLT0gMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSB0aW1lb3V0ICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwOworICAgICAgICAgICB9CisgICAgICAgICAgIG5hbm9zbGVlcCgmdHMsICZsZWZ0KTsKKyAgICAgICAgICAgcmVzdWx0ID0gc2VtX3RyeXdhaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7CisgICAgICAgfQorICAgICAgIGlmICgwICE9IHJlc3VsdCkKKyAgICAgICB7CisgICAgICAgICAgIGlmICgoRUJVU1kgPT0gcmVzdWx0KSB8fCAoRUFHQUlOID09IHJlc3VsdCkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9USU1FX09VVDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlV2FpdDogT1Mgc2VtYXBob3JlIHdhaXQgZmFpbGVkIik7CisgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICB9CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgaW5jcmVtZW50cyB0aGUgc2VtYXBob3JlIGNvdW50ZXIuIFRoZSBzZW1hcGhvcmUgaXMKKyAqICAgICAgICAgICAgIGlkZW50aWZpZWQgYnkgaXRzIGNvbnRleHQKKyAqIEBub3RlICAgICAgIElmIHRoZSBzZW1hcGhvcmUgY291bnRlciBpcyB1cHBlciB0aGFuIHplcm8gKGFmdGVyIGFkZGl0aW9uKSwKKyAqICAgICAgICAgICAgIHRoZSBNNE9TQV9zZW1hcGhvcmVXYWl0IGNhbGwgb2YgdGhlIHRocmVhZCB3aXRoIHRoZSBoaWdoZXN0CisgKiAgICAgICAgICAgICBwcmlvcml0eSBpcyB1bmJsb2NrZWQgYW5kIG1hZGUgcmVhZHkgdG8gcnVuLgorICogQG5vdGUgICAgICAgTm8gaHlwb3RoZXNlcyBjYW4gYmUgbWFkZSBvbiB3aGljaCB0aHJlYWQgd2lsbCBiZSB1bmJsb2NrZWQKKyAqICAgICAgICAgICAgIGJldHdlZW4gdGhyZWFkcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5LgorICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBzZW1hcGhvcmUKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlUG9zdChNNE9TQV9Db250ZXh0IGNvbnRleHQpCit7CisgICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKWNvbnRleHQ7CisKKyAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9zZW1hcGhvcmVQb3N0XHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOworCisgICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAorICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3NlbWFwaG9yZVBvc3QiKTsKKworICAgTTRPU0FfREVCVUdfSUYyKHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9TRU1BUEhPUkUsCisgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVQb3N0Iik7CisKKyAgIHNlbV9wb3N0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSBzZW1hcGhvcmUgKGlkZW50aWZ5IGJ5IGl0cyBjb250ZXh0KS4KKyAqICAgICAgICAgICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgc2VtYXBob3JlIGFuZCBpdHMgY29udGV4dCBpcyBubyBtb3JlCisgKiAgICAgICAgICAgICB1c2VhYmxlLiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3J5IHJlbGF0ZWQgdG8gdGhpcworICogICAgICAgICAgICAgc2VtYXBob3JlLgorICogQG5vdGUgICAgICAgSXQgaXMgYW4gYXBwbGljYXRpb24gaXNzdWUgdG8gd2FycmFudCBubyBtb3JlIHRocmVhZHMgYXJlIGxvY2tlZAorICogICAgICAgICAgICAgb24gdGhlIGRlbGV0ZWQgc2VtYXBob3JlLgorICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBzZW1hcGhvcmUKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZUNsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKK3sKKyAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopY29udGV4dDsKKworICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3NlbWFwaG9yZUNsb3NlXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOworCisgICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAorICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3NlbWFwaG9yZUNsb3NlIik7CisKKyAgIE00T1NBX0RFQlVHX0lGMihzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfU0VNQVBIT1JFLAorICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlQ2xvc2UiKTsKKworICAgc2VtX2Rlc3Ryb3koJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7CisKKyAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilzZW1hcGhvcmVDb250ZXh0KTsKKworICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1N0cmluZy5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWY5OGI0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1N0cmluZy5jCkBAIC0wLDAgKzEsMjQxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9TdHJpbmcuYworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisjaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKKyNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgorI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCisjaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgorI2luY2x1ZGUgIk00T1NBX1N0cmluZ19wcml2LmgiCisjaW5jbHVkZSAiTTRPU0FfU3RyaW5nLmgiCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gZW1wdHkgTTRPU0FfU3RyaW5nCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgcFN0ck91dAorICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0Ffc3RyQ3JlYXRlKE00T1NBX1N0cmluZyogcFN0ck91dCkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSBNNE9TQV9OVUxMOworCisgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3N0ckNyZWF0ZVx0XHRNNE9TQV9TdHJpbmcqIDB4JXgiLCBwU3RyT3V0KTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJPdXQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckNyZWF0ZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMICE9ICpwU3RyT3V0LCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ3JlYXRlIik7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgb3V0cHV0IE00T1NBX1N0cmluZyAqLworICAgIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX3N0clN0cnVjdCksIE00T1NBX1NUUklORywKKyAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2Q3JlYXRlOiBvdXRwdXQgc3RyaW5nIik7CisKKyAgICAvKiBDaGVjayBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciAqLworICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cikKKyAgICB7CisgICAgICAgICpwU3RyT3V0ID0gTTRPU0FfTlVMTCA7CisKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zdHJQcml2Q3JlYXRlIik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIH0KKworICAgIHBTdHItPmNvcmVJRCA9IE00T1NBX1NUUklORzsKKyAgICBwU3RyLT5wdWk4X2J1ZmZlciA9IE00T1NBX05VTEw7CisgICAgcFN0ci0+dWkzMl9sZW5ndGggPSAwOworICAgIHBTdHItPnVpMzJfc2l6ZSA9IDA7CisKKyAgICAqcFN0ck91dCA9IHBTdHI7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0IHRoZSBNNE9TQV9TdHJpbmcKKyAqIEBub3RlCisgKiBAcGFyYW0gICAgICBzdHJfaW4KKyAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK000T1NBX0VSUiBNNE9TQV9zdHJSZXNldChNNE9TQV9TdHJpbmcgc3RyX2luKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9DaGFyKiBwQnVmZmVyOworCisgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3N0clJlc2V0XHRcdE00T1NBX1N0cmluZyogMHgleCIsIHN0cl9pbik7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJSZXNldCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clJlc2V0Iik7CisKKyAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXI7CisKKyAgICBpZihNNE9TQV9OVUxMICE9IHBCdWZmZXIpCisgICAgeworICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEJ1ZmZlcik7CisKKyAgICAgICAgcFN0ci0+cHVpOF9idWZmZXIgPSBNNE9TQV9OVUxMOworICAgIH0KKworICAgIHBTdHItPnVpMzJfbGVuZ3RoID0gMDsKKyAgICBwU3RyLT51aTMyX3NpemUgPSAwOworCisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGZyZWUgdGhlIG1lbW9yeSBvZiB0aGUgaW5wdXQgTTRPU0FfU3RyaW5nCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgc3RyX2luCisgKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitNNE9TQV9FUlIgTTRPU0Ffc3RyRGVzdHJveShNNE9TQV9TdHJpbmcgc3RyX2luKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKworICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9zdHJEZXN0cm95XHRcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckRlc3Ryb3kiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRGVzdHJveSIpOworCisKKyAgICAvKiBGcmVlIE00T1NBX1N0cmluZyBidWZmZXIgKi8KKyAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKHBTdHItPnB1aThfYnVmZmVyKSk7CisKKyAgICAvKiBGcmVlIE00T1NBX1N0cmluZyBzdHJ1Y3R1cmUgbWVtb3J5ICovCisgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBTdHIpOworCisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgIHN0cl9pbiBjb250ZW50CisgKiBAbm90ZQorICogQHBhcmFtICAgICAgc3RyX2luCisgKiBAcGFyYW0gICAgICBwQ2hhcgorICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworTTRPU0FfRVJSIE00T1NBX3N0clNldENoYXJDb250ZW50KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIgKnBDaGFyKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKworICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJTZXRDb250ZW50XHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9DaGFyKiIKKyAgICAgICAgIiAweCV4Iiwgc3RyX2luLCBwQ2hhcik7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJTZXRDb250ZW50Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENoYXIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTZXRDb250ZW50Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNldENvbnRlbnQiKTsKKworICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIHBDaGFyLCBNNE9TQV9jaHJMZW5ndGgocENoYXIpKTsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucywgaW4gcGFjX2NvbnRlbnQsIHRoZSAiQy1TdHJpbmciIG9mIHN0cl9pbgorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIHN0cl9pbgorICogQHBhcmFtICAgICAgcGFjX2NvbnRlbnQKKyAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX3N0ckdldENoYXJDb250ZW50KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIqKiBwcGNoYXIpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0ckdldENvbnRlbnRcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0NoYXIqKiIKKyAgICAgICAgIiAweCV4Iiwgc3RyX2luLCBwcGNoYXIpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0Q29udGVudCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBwY2hhciwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldENvbnRlbnQiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0Q29udGVudCIpOworCisgICAgKnBwY2hhciA9IHBTdHItPnB1aThfYnVmZmVyOworCisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworTTRPU0FfRVJSIE00T1NBX3N0clNldENoYXIoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfQ2hhciBjX2luKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9FUlIgZXJyOworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldENoYXJcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0NoYXIgJWMiLAorICAgICAgICBzdHJfaW4sIGNfaW4pOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyU2V0Q2hhciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTZXRDaGFyIik7CisKKworICAgIGVyciA9IE00T1NBX3N0clByaXZSZWFsbG9jKHBTdHIsIDEpOworCisgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHBTdHItPnB1aThfYnVmZmVyWzBdID0gY19pbjsKKyAgICBwU3RyLT5wdWk4X2J1ZmZlclsxXSA9ICdcMCc7CisgICAgcFN0ci0+dWkzMl9sZW5ndGggICAgPSAxOworCisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworTTRPU0FfRVJSIE00T1NBX3N0ckdldENoYXIoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfQ2hhciogcGNfb3V0KQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKworICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJHZXRDaGFyXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9DaGFyKiAweCV4IiwKKyAgICAgICAgc3RyX2luLCBwY19vdXQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGNfb3V0LCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRDaGFyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0Q2hhciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRDaGFyIik7CisKKyAgICBpZihwU3RyLT51aTMyX2xlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKKyAgICB9CisKKyAgICAqcGNfb3V0ID0gcFN0ci0+cHVpOF9idWZmZXJbMF07CisKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCitNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0SW50OChNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9JbnQ4IGk4X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7CisgICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlcls4XTsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKyAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc3RyU2V0SW50OFx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfSW50OCAlZCIsCisgICAgICAgIHN0cl9pbiwgaThfaW4pOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyU2V0SW50OCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTZXRJbnQ4Iik7CisKKworICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLworICAgIHN3aXRjaChiYXNlKQorICAgIHsKKyAgICBjYXNlIE00T1NBX2tzdHJEZWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSIlZCIsIGk4X2luKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBjYXNlIE00T1NBX2tzdHJIZXhhOgorICAgICAgICB7CisgICAgICAgICAgICBpZihpOF9pbiA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCA4LCAoTTRPU0FfQ2hhciopIi0lWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtaThfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSIlWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaThfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgTTRPU0Ffa3N0ck9jdDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYoaThfaW4gPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSItJW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWk4X2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDgsIChNNE9TQV9DaGFyKikiJW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk4X2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBNNE9TQV9TdHJpbmcgY29udGVudCBsZW5ndGggKi8KKyAgICB1aTMyX2xlbmd0aCA9IE00T1NBX2Nockxlbmd0aChhdWk4X2J1ZmZlcikgOworCisKKyAgICByZXR1cm4gTTRPU0Ffc3RyUHJpdlNldChwU3RyLCBhdWk4X2J1ZmZlciwgdWkzMl9sZW5ndGgpOworfQorCitNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0SW50OChNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9JbnQ4KiBwaThfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyR2V0SW50OFx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfSW50OCogMHgleFx0IgorICAgICAgICAiTTRPU0Ffc3RyTnVtQmFzZSAlZCIsIHN0cl9pbiwgcGk4X291dCwgYmFzZSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRJbnQ4Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGk4X291dCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0SW50OCIpOworICAgIE00T1NBX0RFQlVHX0lGMigoYmFzZSAhPSBNNE9TQV9rc3RyRGVjKSAmJiAoYmFzZSAhPSBNNE9TQV9rc3RySGV4YSkgJiYKKyAgICAgICAgKGJhc2UgIT0gTTRPU0Ffa3N0ck9jdCksIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldEludDgiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCxNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRJbnQ4Iik7CisKKworICAgIGVycl9jb2RlID0gTTRPU0FfY2hyR2V0SW50OChwU3RyLT5wdWk4X2J1ZmZlciwgcGk4X291dCwgTTRPU0FfTlVMTCwgYmFzZSk7CisKKyAgICBpZihNNE5PX0VSUk9SICE9IGVycl9jb2RlKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RSX0NPTlZfRkFJTEVELCAiTTRPU0Ffc3RyR2V0SW50OCIpOworCisgICAgICAgIHJldHVybiBNNEVSUl9TVFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKK000T1NBX0VSUiBNNE9TQV9zdHJTZXRVSW50OChNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9VSW50OCB1aThfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7CisgICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlcls0XTsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisgICAgTTRPU0FfQ2hhciogcEZvcm1hdDsKKworICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJTZXRVSW50OFx0XHRNNE9TQV9TdHJpbmcqIDB4JXhcdE00T1NBX1VJbnQ4ICVkIiwKKyAgICAgICAgc3RyX2luLCB1aThfaW4pOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAgIk00T1NBX3N0clNldFVJbnQ4Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VUludDgiKTsKKworICAgIGlmIChiYXNlID09IE00T1NBX2tjaHJEZWMpCisgICAgeworICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIldSI7CisgICAgfQorICAgIGVsc2UgaWYgKGJhc2UgPT0gTTRPU0Ffa2NockhleGEpCisgICAgeworICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIlWCI7CisgICAgfQorICAgIGVsc2UgaWYgKGJhc2UgPT0gTTRPU0Ffa2Nock9jdCkKKyAgICB7CisgICAgICAgIHBGb3JtYXQgPSAoTTRPU0FfQ2hhciopIiVvIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEZvcm1hdCA9IE00T1NBX05VTEw7CisgICAgfQorCisgICAgLyogQ29udmVydCBpbnB1dCBudW1iZXIgaW50byAiQy1TdHJpbmciICovCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCA0LCBwRm9ybWF0LCB1aThfaW4pOworCisgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCisgICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKKworCisgICAgcmV0dXJuIE00T1NBX3N0clByaXZTZXQocFN0ciwgYXVpOF9idWZmZXIsIHVpMzJfbGVuZ3RoKTsKK30KKworCisKK000T1NBX0VSUiBNNE9TQV9zdHJHZXRVSW50OChNNE9TQV9TdHJpbmcgc3RyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwdWk4X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJHZXRVSW50OFx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDgqIDB4JXhcdCIKKyAgICAgICAgIk00T1NBX3N0ck51bUJhc2UgJWQiLCBzdHJfaW4sIHB1aThfb3V0LCAgYmFzZSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRVSW50OCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aThfb3V0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRVSW50OCIpOworICAgIE00T1NBX0RFQlVHX0lGMigoYmFzZSAhPSBNNE9TQV9rc3RyRGVjKSAmJiAoYmFzZSAhPSBNNE9TQV9rc3RySGV4YSkKKyAgICAgICAgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ck9jdCksIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldFVJbnQ4Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0VUludDgiKTsKKworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRVSW50OChwU3RyLT5wdWk4X2J1ZmZlciwgcHVpOF9vdXQsIE00T1NBX05VTEwsIGJhc2UpOworCisgICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldFVJbnQ4Iik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKK000T1NBX0VSUiBNNE9TQV9zdHJTZXRJbnQxNihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9JbnQxNiBpMTZfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7CisgICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlcls4XTsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKyAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc3RyU2V0SW50MTZcdFx0TTRPU0FfU3RyaW5nKiAweCV4XHRNNE9TQV9JbnQxNiAlZCIsCisgICAgICAgIHN0cl9pbiwgaTE2X2luKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldEludDE2Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0SW50MTYiKTsKKworICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLworICAgIHN3aXRjaChiYXNlKQorICAgIHsKKyAgICBjYXNlIE00T1NBX2tzdHJEZWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSIlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMTZfaW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgTTRPU0Ffa3N0ckhleGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGkxNl9pbiA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCA4LCAoTTRPU0FfQ2hhciopIi0lWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1pMTZfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSIlWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMTZfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgTTRPU0Ffa3N0ck9jdDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYoaTE2X2luIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDgsIChNNE9TQV9DaGFyKikiLSVvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWkxNl9pbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCA4LCAoTTRPU0FfQ2hhciopIiVvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxNl9pbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCisgICAgeworICAgICAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIE00T1NBX1N0cmluZyBjb250ZW50IGxlbmd0aCAqLworICAgIHVpMzJfbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKGF1aThfYnVmZmVyKSA7CisKKyAgICByZXR1cm4gTTRPU0Ffc3RyUHJpdlNldChwU3RyLCBhdWk4X2J1ZmZlciwgdWkzMl9sZW5ndGgpOworfQorCisKKworTTRPU0FfRVJSIE00T1NBX3N0ckdldEludDE2KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0ludDE2KiBwaTE2X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJHZXRJbnQxNlx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfSW50MTYqIDB4JXgiCisgICAgICAgICJcdE00T1NBX3N0ck51bUJhc2UgJWQiLCBzdHJfaW4sIHBpMTZfb3V0LCBiYXNlKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldEludDE2Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGkxNl9vdXQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEludDE2Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKChiYXNlICE9IE00T1NBX2tzdHJEZWMpICYmIChiYXNlICE9IE00T1NBX2tzdHJIZXhhKQorICAgICAgICAgICAgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ck9jdCksTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0SW50MTYiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRJbnQxNiIpOworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRJbnQxNihwU3RyLT5wdWk4X2J1ZmZlciwgcGkxNl9vdXQsIE00T1NBX05VTEwsIGJhc2UpOworCisgICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldEludDE2Iik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0VUludDE2KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX1VJbnQxNiB1aTE2X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aDsKKyAgICBNNE9TQV9DaGFyIGF1aThfYnVmZmVyWzhdOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKyAgICBNNE9TQV9DaGFyKiBwRm9ybWF0OworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldFVJbnQxNlx0XHRNNE9TQV9TdHJpbmcqIDB4JXhcdE00T1NBX1VJbnQxNiAlZCIsCisgICAgICAgIHN0cl9pbiwgdWkxNl9pbik7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJTZXRVSW50MTYiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VUludDE2Iik7CisKKyAgICBpZiAoTTRPU0Ffa2NockRlYyA9PSBiYXNlKQorICAgIHsKKyAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJXUiOworICAgIH0KKyAgICBlbHNlIGlmIChNNE9TQV9rY2hySGV4YSA9PSBiYXNlKQorICAgIHsKKyAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJVgiOworICAgIH0KKyAgICBlbHNlIGlmIChNNE9TQV9rY2hyT2N0ID09IGJhc2UpCisgICAgeworICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIlbyI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBGb3JtYXQgPSBNNE9TQV9OVUxMOworICAgIH0KKworICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLworICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgcEZvcm1hdCwgdWkxNl9pbik7CisKKyAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBNNE9TQV9TdHJpbmcgY29udGVudCBsZW5ndGggKi8KKyAgICB1aTMyX2xlbmd0aCA9IE00T1NBX2Nockxlbmd0aChhdWk4X2J1ZmZlcikgOworCisKKyAgICByZXR1cm4gTTRPU0Ffc3RyUHJpdlNldChwU3RyLCBhdWk4X2J1ZmZlciwgdWkzMl9sZW5ndGgpOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJHZXRVSW50MTYoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVUludDE2KiBwdWkxNl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckdldFVJbnQxNlx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDE2KiAiCisgICAgICAgICIweCV4XHRNNE9TQV9zdHJOdW1CYXNlICVkIiwgc3RyX2luLCBwdWkxNl9vdXQsIGJhc2UpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0VUludDE2Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcHVpMTZfb3V0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldFVJbnQxNiIpOworICAgIE00T1NBX0RFQlVHX0lGMigoYmFzZSAhPSBNNE9TQV9rc3RyRGVjKSAmJiAoYmFzZSAhPSBNNE9TQV9rc3RySGV4YSkKKyAgICAgICAgICAgICYmIChiYXNlICE9IE00T1NBX2tzdHJPY3QpLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRVSW50MTYiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldFVJbnQxNiIpOworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRVSW50MTYocFN0ci0+cHVpOF9idWZmZXIsIHB1aTE2X291dCwgTTRPU0FfTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7CisKKyAgICBpZihNNE5PX0VSUk9SICE9IGVycl9jb2RlKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RSX0NPTlZfRkFJTEVELCAiTTRPU0Ffc3RyR2V0VUludDE2Iik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0SW50MzIoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfSW50MzIgaTMyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOworICAgIE00T1NBX0NoYXIgYXVpOF9idWZmZXJbMTZdOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKyAgICBNNE9TQV9DaGFyKiBwRm9ybWF0OworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldEludDMyXHRcdE00T1NBX1N0cmluZyogMHgleFx0TTRPU0FfSW50MzIgJWQiLAorICAgICAgICBzdHJfaW4sIGkzMl9pbik7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJTZXRJbnQzMiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNldEludDMyIik7CisKKyAgICBpZiAoTTRPU0Ffa2NockRlYyA9PSBiYXNlKQorICAgIHsKKyAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJWQiOworICAgIH0KKyAgICBlbHNlIGlmIChNNE9TQV9rY2hySGV4YSA9PSBiYXNlKQorICAgIHsKKyAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJVgiOworICAgIH0KKyAgICBlbHNlIGlmIChNNE9TQV9rY2hyT2N0ID09IGJhc2UpCisgICAgeworICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIlbyI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBGb3JtYXQgPSBNNE9TQV9OVUxMOworICAgIH0KKworICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLworICAgIHN3aXRjaChiYXNlKQorICAgIHsKKyAgICBjYXNlIE00T1NBX2tzdHJEZWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMTYsIChNNE9TQV9DaGFyKikiJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2luKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBjYXNlIE00T1NBX2tzdHJIZXhhOgorICAgICAgICB7CisgICAgICAgICAgICBpZihpMzJfaW4gPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMTYsIChNNE9TQV9DaGFyKikiLSVYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWkzMl9pbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCAxNiwgKE00T1NBX0NoYXIqKSIlWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgTTRPU0Ffa3N0ck9jdDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYoaTMyX2luIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDE2LCAoTTRPU0FfQ2hhciopIi0lbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1pMzJfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMTYsIChNNE9TQV9DaGFyKikiJW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCisgICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKKworICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIGF1aThfYnVmZmVyLCB1aTMyX2xlbmd0aCk7Cit9CisKK000T1NBX0VSUiBNNE9TQV9zdHJHZXRJbnQzMihNNE9TQV9TdHJpbmcgc3RyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJHZXRJbnQzMlx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfSW50MzIqIDB4JXgiCisgICAgICAgICJcdE00T1NBX3N0ck51bUJhc2UgJWQiLCBzdHJfaW4sIHBpMzJfb3V0LCBiYXNlKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldEludDMyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGkzMl9vdXQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEludDMyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKChiYXNlICE9IE00T1NBX2tzdHJEZWMpICYmIChiYXNlICE9IE00T1NBX2tzdHJIZXhhKQorICAgICAgICAmJiAoYmFzZSAhPSBNNE9TQV9rc3RyT2N0KSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0SW50MzIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRJbnQzMiIpOworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRJbnQzMihwU3RyLT5wdWk4X2J1ZmZlciwgcGkzMl9vdXQsIE00T1NBX05VTEwsIGJhc2UpOworCisgICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldEludDMyIik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworTTRPU0FfRVJSIE00T1NBX3N0clNldFVJbnQzMihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9VSW50MzIgdWkzMl9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7CisgICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlclsxMl07CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworICAgIE00T1NBX0NoYXIqIHBGb3JtYXQ7CisKKyAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc3RyU2V0VUludDMyXHRcdE00T1NBX1N0cmluZyogMHgleFx0TTRPU0FfVUludDMyICVkIiwKKyAgICAgICAgc3RyX2luLCB1aTMyX2luKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldFVJbnQzMiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VUludDMyIik7CisKKyAgICBpZiAoTTRPU0Ffa2NockRlYyA9PSBiYXNlKQorICAgIHsKKyAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJXUiOworICAgIH0KKyAgICBlbHNlIGlmIChNNE9TQV9rY2hySGV4YSA9PSBiYXNlKQorICAgIHsKKyAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJVgiOworICAgIH0KKyAgICBlbHNlIGlmIChNNE9TQV9rY2hyT2N0ID09IGJhc2UpCisgICAgeworICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIlbyI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBGb3JtYXQgPSBNNE9TQV9OVUxMOworICAgIH0KKworICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLworICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMTIsIHBGb3JtYXQsIHVpMzJfaW4pOworCisgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCisgICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKKworCisgICAgcmV0dXJuIE00T1NBX3N0clByaXZTZXQocFN0ciwgYXVpOF9idWZmZXIsIHVpMzJfbGVuZ3RoKTsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0VUludDMyKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX1VJbnQzMiogcHVpMzJfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJHZXRVSW50MzJcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX1VJbnQzMiogIgorICAgICAgICAiMHgleFx0TTRPU0Ffc3RyTnVtQmFzZSAlZCIsIHN0cl9pbiwgcHVpMzJfb3V0LCBiYXNlKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldFVJbnQzMiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aTMyX291dCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRVSW50MzIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoKGJhc2UgIT0gTTRPU0Ffa3N0ckRlYykgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ckhleGEpCisgICAgICAgICYmIChiYXNlICE9IE00T1NBX2tzdHJPY3QpLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRVSW50MzIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldFVJbnQzMiIpOworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRVSW50MzIocFN0ci0+cHVpOF9idWZmZXIsIHB1aTMyX291dCwKKyAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCwgYmFzZSk7CisKKyAgICBpZihNNE5PX0VSUk9SICE9IGVycl9jb2RlKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RSX0NPTlZfRkFJTEVELCAiTTRPU0Ffc3RyR2V0VUludDMyIik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0SW50NjQoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfSW50NjQgaTY0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOworICAgIE00T1NBX0NoYXIgYXVpOF9idWZmZXJbMjRdOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldEludDY0XHRcdE00T1NBX1N0cmluZyogMHgleFx0TTRPU0FfSW50NjQgMHgleCIsCisgICAgICAgIHN0cl9pbiwgJmk2NF9pbik7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJTZXRJbnQ2NCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNldEludDY0Iik7CisKKyAgICAvKiBDb252ZXJ0IGlucHV0IG51bWJlciBpbnRvICJDLVN0cmluZyIgKi8KKyAgICBzd2l0Y2goYmFzZSkKKyAgICB7CisgICAgY2FzZSBNNE9TQV9rc3RyRGVjOgorICAgICAgICB7CisgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X2luKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBjYXNlIE00T1NBX2tzdHJIZXhhOgorICAgICAgICB7CisgICAgICAgICAgICBpZihNNE9TQV9JTlQ2NF9JU19QT1NJVElWRShpNjRfaW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiJWxsWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00T1NBX0lOVDY0X05FRyhpNjRfaW4sIGk2NF9pbik7CisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCAyNCwgKE00T1NBX0NoYXIqKSItJWxsWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgTTRPU0Ffa3N0ck9jdDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYoTTRPU0FfSU5UNjRfSVNfUE9TSVRJVkUoaTY0X2luKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiVsbG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNE9TQV9JTlQ2NF9ORUcoaTY0X2luLCBpNjRfaW4pOworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiLSVsbG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCisgICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKKworICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIGF1aThfYnVmZmVyLCB1aTMyX2xlbmd0aCk7Cit9CisKK000T1NBX0VSUiBNNE9TQV9zdHJHZXRJbnQ2NChNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9JbnQ2NCogcGk2NF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyR2V0SW50NjRcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0ludDY0KiAweCV4IgorICAgICAgICAiXHRNNE9TQV9zdHJOdW1CYXNlICVkIiwgc3RyX2luLCBwaTY0X291dCwgYmFzZSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRJbnQ2NCIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBpNjRfb3V0LCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRJbnQ2NCIpOworICAgIE00T1NBX0RFQlVHX0lGMigoYmFzZSAhPSBNNE9TQV9rc3RyRGVjKSAmJiAoYmFzZSAhPSBNNE9TQV9rc3RySGV4YSkKKyAgICAgICAgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ck9jdCksIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldEludDY0Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0SW50NjQiKTsKKworICAgIGVycl9jb2RlID0gTTRPU0FfY2hyR2V0SW50NjQocFN0ci0+cHVpOF9idWZmZXIsIHBpNjRfb3V0LCBNNE9TQV9OVUxMLCBiYXNlKTsKKworICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyX2NvZGUpCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVFJfQ09OVl9GQUlMRUQsICJNNE9TQV9zdHJHZXRJbnQ2NCIpOworCisgICAgICAgIHJldHVybiBNNEVSUl9TVFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0clNldERvdWJsZShNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9Eb3VibGUgZF9pbikKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOworICAgIE00T1NBX0NoYXIgYXVpOF9idWZmZXJbMjRdOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJTZXREb3VibGVcdFx0TTRPU0FfU3RyaW5nKiAweCV4XHRNNE9TQV9Eb3VibGUqICIKKyAgICAgICAgIjB4JXgiLCBzdHJfaW4sICZkX2luKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldERvdWJsZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0RG91YmxlIik7CisKKyAgICAvKiBDb252ZXJ0IGlucHV0IG51bWJlciBpbnRvICJDLVN0cmluZyIgKi8KKyAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiVlIiwgZF9pbik7CisKKyAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBNNE9TQV9TdHJpbmcgY29udGVudCBsZW5ndGggKi8KKyAgICB1aTMyX2xlbmd0aCA9IE00T1NBX2Nockxlbmd0aChhdWk4X2J1ZmZlcikgOworCisgICAgcmV0dXJuIE00T1NBX3N0clByaXZTZXQocFN0ciwgYXVpOF9idWZmZXIsIHVpMzJfbGVuZ3RoKTsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0RG91YmxlKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0RvdWJsZSogcGRfb3V0KQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKyAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc3RyR2V0RG91YmxlXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9Eb3VibGUqICIKKyAgICAgICAgIjB4JXgiLCBzdHJfaW4sIHBkX291dCk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXREb3VibGUiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwZF9vdXQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldERvdWJsZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0RG91YmxlIik7CisKKyAgICBlcnJfY29kZSA9IE00T1NBX2NockdldERvdWJsZShwU3RyLT5wdWk4X2J1ZmZlciwgcGRfb3V0LCBNNE9TQV9OVUxMKTsKKyAgICBpZihNNE5PX0VSUk9SICE9IGVycl9jb2RlKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RSX0NPTlZfRkFJTEVELCAiTTRPU0Ffc3RyR2V0RG91YmxlIik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0RmlsZVBvc2l0aW9uKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aDsKKyAgICBNNE9TQV9DaGFyIGF1aThfYnVmZmVyWzI0XTsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKworICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJTZXRGaWxlUG9zaXRpb25cdFx0TTRPU0FfU3RyaW5nKiAweCV4XHQiCisgICAgICAgICJNNE9TQV9GaWxlUG9zaXRpb24qIDB4JXgiLCBzdHJfaW4sICZmcG9zX2luKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0RmlsZVBvc2l0aW9uIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTZXRGaWxlUG9zaXRpb24iKTsKKworCisgICAgLyogQ29udmVydCBpbnB1dCBudW1iZXIgaW50byAiQy1TdHJpbmciICovCisgICAgc3dpdGNoKGJhc2UpCisgICAgeworICAgIGNhc2UgTTRPU0Ffa3N0ckRlYzoKKyAgICAgICAgeworICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCAyNCwgKE00T1NBX0NoYXIqKSIlYWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBvc19pbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgY2FzZSBNNE9TQV9rc3RySGV4YToKKyAgICAgICAgeworICAgICAgICAgICAgaWYoTTRPU0FfRlBPU19JU19QT1NJVElWRShmcG9zX2luKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiVhYVgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcG9zX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNE9TQV9GUE9TX05FRyhmcG9zX2luLCBmcG9zX2luKTsKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIi0lYWFYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBvc19pbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgY2FzZSBNNE9TQV9rc3RyT2N0OgorICAgICAgICB7CisgICAgICAgICAgICBpZihNNE9TQV9GUE9TX0lTX1BPU0lUSVZFKGZwb3NfaW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiJWFhbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwb3NfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00T1NBX0ZQT1NfTkVHKGZwb3NfaW4sIGZwb3NfaW4pOworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiLSVhYW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcG9zX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCisgICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKKworICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIGF1aThfYnVmZmVyLCB1aTMyX2xlbmd0aCk7Cit9CisKK000T1NBX0VSUiBNNE9TQV9zdHJHZXRGaWxlUG9zaXRpb24oTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfRmlsZVBvc2l0aW9uKiBwZnBvc19vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckdldEZpbGVQb3NpdGlvblx0XHRNNE9TQV9TdHJpbmcgMHgleFx0IgorICAgICAgICAiTTRPU0FfRmlsZVBvc2l0aW9uKiAweCV4XHRcdE00T1NBX3N0ck51bUJhc2UgJWQiLAorICAgICAgICBzdHJfaW4sIHBmcG9zX291dCwgYmFzZSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEZpbGVQb3NpdGlvbiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBmcG9zX291dCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRGaWxlUG9zaXRpb24iKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoKGJhc2UgIT0gTTRPU0Ffa3N0ckRlYykgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ckhleGEpCisgICAgICAgICYmIChiYXNlICE9IE00T1NBX2tzdHJPY3QpLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRGaWxlUG9zaXRpb24iKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEZpbGVQb3NpdGlvbiIpOworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRGaWxlUG9zaXRpb24ocFN0ci0+cHVpOF9idWZmZXIsIHBmcG9zX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwsIGJhc2UpOworCisgICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldEZpbGVQb3NpdGlvbiIpOworCisgICAgICAgIHJldHVybiBNNEVSUl9TVFJfQ09OVl9GQUlMRUQ7CisgICAgfQorCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0clNldFRpbWUoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVGltZSB0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7CisgICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlclsyNF07CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldERvdWJsZVx0XHRNNE9TQV9TdHJpbmcqIDB4JXhcdE00T1NBX1RpbWUqIDB4JXgiLAorICAgICAgICBzdHJfaW4sICZ0X2luKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldFRpbWUiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VGltZSIpOworCisgICAgLyogQ29udmVydCBpbnB1dCBudW1iZXIgaW50byAiQy1TdHJpbmciICovCisgICAgc3dpdGNoKGJhc2UpCisgICAgeworICAgIGNhc2UgTTRPU0Ffa3N0ckRlYzoKKyAgICAgICAgeworICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCAyNCwgKE00T1NBX0NoYXIqKSIldG1kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9pbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgY2FzZSBNNE9TQV9rc3RySGV4YToKKyAgICAgICAgeworICAgICAgICAgICAgaWYoTTRPU0FfVElNRV9JU19QT1NJVElWRSh0X2luKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiV0bVgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNE9TQV9USU1FX05FRyh0X2luLCB0X2luKTsKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIi0ldG1YIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9pbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgY2FzZSBNNE9TQV9rc3RyT2N0OgorICAgICAgICB7CisgICAgICAgICAgICBpZihNNE9TQV9USU1FX0lTX1BPU0lUSVZFKHRfaW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiJXRtbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00T1NBX1RJTUVfTkVHKHRfaW4sIHRfaW4pOworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiLSV0bW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCisgICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKKworICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIGF1aThfYnVmZmVyLCB1aTMyX2xlbmd0aCk7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0ckdldFRpbWUoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVGltZSogcHRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyR2V0VGltZVx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVGltZSogMHgleCIKKyAgICAgICAgIlx0TTRPU0Ffc3RyTnVtQmFzZSAlZCIsIHN0cl9pbiwgcHRfb3V0LCBiYXNlKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldFRpbWUiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdF9vdXQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldFRpbWUiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoKGJhc2UgIT0gTTRPU0Ffa3N0ckRlYykgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ckhleGEpCisgICAgICAgICYmIChiYXNlICE9IE00T1NBX2tzdHJPY3QpLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRUaW1lIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0VGltZSIpOworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRUaW1lKHBTdHItPnB1aThfYnVmZmVyLCBwdF9vdXQsIE00T1NBX05VTEwsIGJhc2UpOworCisgICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldFRpbWUiKTsKKworICAgICAgICByZXR1cm4gTTRFUlJfU1RSX0NPTlZfRkFJTEVEOworICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJHZXRMZW5ndGgoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVUludDMyKiBwdWkzMl9sZW4pCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0ckdldExlbmd0aFx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyKiAiCisgICAgICAgICIweCV4Iiwgc3RyX2luLCBwdWkzMl9sZW4pOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0TGVuZ3RoIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcHVpMzJfbGVuLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRMZW5ndGgiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsICJNNE9TQV9zdHJHZXRMZW5ndGgiKTsKKworICAgIC8qIEdldCB0aGUgTTRPU0FfU3RyaW5nU3R1Y3QgbGVuZ3RoIGZpZWxkICovCisgICAgKnB1aTMyX2xlbiA9IHBTdHItPnVpMzJfbGVuZ3RoIDsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJDb21wYXJlKE00T1NBX1N0cmluZyBzdHJfaW4xLCBNNE9TQV9TdHJpbmcgc3RyX2luMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIxID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMTsKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMjsKKyAgICBNNE9TQV9VSW50MzIgbGVuZ3RoLCBsZW5ndGgxLCBsZW5ndGgyOworICAgIE00T1NBX0ludDMyIHJlc3VsdDsKKyAgICBNNE9TQV9VSW50MzIgaTsKKyAgICBNNE9TQV9DaGFyKiBidWZmZXIxOworICAgIE00T1NBX0NoYXIqIGJ1ZmZlcjI7CisgICAgTTRPU0FfQ2hhciogcFRtcDE7CisgICAgTTRPU0FfQ2hhciogcFRtcDI7CisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyQ29tcGFyZVx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nIDB4JXhcdCIKKyAgICAgICAgIk00T1NBX1VJbnQzMiogMHgleCIsIHN0cl9pbjEsIHN0cl9pbjIsIHBpMzJfcmVzdWx0KTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIxLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb21wYXJlIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0cjIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckNvbXBhcmUiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwaTMyX3Jlc3VsdCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyQ29tcGFyZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0cjEtPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsICJNNE9TQV9zdHJDb21wYXJlIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywgIk00T1NBX3N0ckNvbXBhcmUiKTsKKworICAgIGJ1ZmZlcjEgPSBwU3RyMS0+cHVpOF9idWZmZXI7CisgICAgYnVmZmVyMiA9IHBTdHIyLT5wdWk4X2J1ZmZlcjsKKworICAgIGxlbmd0aDEgPSBwU3RyMS0+dWkzMl9sZW5ndGg7CisgICAgbGVuZ3RoMiA9IHBTdHIyLT51aTMyX2xlbmd0aDsKKworICAgIGxlbmd0aCA9IChsZW5ndGgxIDwgbGVuZ3RoMikgPyBsZW5ndGgxIDogbGVuZ3RoMjsKKworICAgIHBUbXAxID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYygyICogbGVuZ3RoICogc2l6ZW9mKE00T1NBX0NoYXIpLAorICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJDb21wYXJlIik7CisKKyAgICBNNE9TQV9DSEVDS19NQUxMT0MocFRtcDEsICJNNE9TQV9zdHJDb21wYXJlIik7CisKKyAgICBwVG1wMiA9IHBUbXAxICsgbGVuZ3RoOworCisgICAgTTRPU0FfbWVtY3B5KHBUbXAxLCBidWZmZXIxLCBsZW5ndGgpOworCisgICAgTTRPU0FfbWVtY3B5KHBUbXAyLCBidWZmZXIyLCBsZW5ndGgpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIHBUbXAxW2ldID0gTTRPU0FfY2hyVG9Mb3dlcihidWZmZXIxW2ldKTsKKyAgICAgICAgcFRtcDJbaV0gPSBNNE9TQV9jaHJUb0xvd2VyKGJ1ZmZlcjJbaV0pOworICAgIH0KKworICAgIE00T1NBX2Nock5Db21wYXJlKHBUbXAxLCBwVG1wMiwgbGVuZ3RoLCAmcmVzdWx0KTsKKworICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwVG1wMSk7CisKKyAgICBpZihyZXN1bHQgIT0gMCkKKyAgICB7CisgICAgICAgICpwaTMyX3Jlc3VsdCA9IHJlc3VsdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGxlbmd0aDEgPT0gbGVuZ3RoMikKKyAgICAgICAgeworICAgICAgICAgICAgKnBpMzJfcmVzdWx0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsZW5ndGgxICA+IGxlbmd0aDIpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwaTMyX3Jlc3VsdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcGkzMl9yZXN1bHQgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCitNNE9TQV9FUlIgTTRPU0Ffc3RyQ29tcGFyZVN1YlN0cihNNE9TQV9TdHJpbmcgc3RyX2luMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIxID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMTsKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMjsKKyAgICBNNE9TQV9DaGFyKiBwQnVmZmVyMTsKKyAgICBNNE9TQV9DaGFyKiBwQnVmZmVyMjsKKyAgICBNNE9TQV9DaGFyKiBwVG1wMTsKKyAgICBNNE9TQV9DaGFyKiBwVG1wMjsKKyAgICBNNE9TQV9VSW50MzIgbGVuZ3RoMSwgbGVuZ3RoMiwgaTsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGUsIHJldHVybl9jb2RlID0gTTROT19FUlJPUjsKKworICAgIE00T1NBX1RSQUNFMV81KCJNNE9TQV9zdHJDb21wYXJlU3ViU3RyXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9VSW50MzIgIgorICAgICAgICAiJWRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9VSW50MzIgJWRcdE00T1NBX1VJbnQzMiogMHgleCIKKyAgICAgICAgIlx0TTRPU0FfSW50MzIqIDB4JXgiLCBzdHJfaW4xLCB1aTMyX29mZnNldDEsIHN0cl9pbjIsCisgICAgICAgIHVpMzJfb2Zmc2V0MiwgKnB1aTMyX251bSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMSwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvbXBhcmVTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvbXBhcmVTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwaTMyX3Jlc3VsdCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvbXBhcmVTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdWkzMl9udW0sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb21wYXJlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKCpwdWkzMl9udW0gPT0gMCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0cjEtPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0cjItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMih1aTMyX29mZnNldDEgPj0gcFN0cjEtPnVpMzJfbGVuZ3RoLCBNNEVSUl9TVFJfT1ZFUkZMT1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMih1aTMyX29mZnNldDIgPj0gcFN0cjItPnVpMzJfbGVuZ3RoLCBNNEVSUl9TVFJfT1ZFUkZMT1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOworCisgICAgbGVuZ3RoMSA9IHBTdHIxLT51aTMyX2xlbmd0aCAtIHVpMzJfb2Zmc2V0MTsKKyAgICBsZW5ndGgyID0gcFN0cjItPnVpMzJfbGVuZ3RoIC0gdWkzMl9vZmZzZXQyOworCisgICAgcEJ1ZmZlcjEgPSBwU3RyMS0+cHVpOF9idWZmZXIgKyB1aTMyX29mZnNldDE7CisgICAgcEJ1ZmZlcjIgPSBwU3RyMi0+cHVpOF9idWZmZXIgKyB1aTMyX29mZnNldDI7CisKKyAgICBpZihsZW5ndGgxIDwgKnB1aTMyX251bSkKKyAgICB7CisgICAgICAgICpwdWkzMl9udW0gPSBsZW5ndGgxOworCisgICAgICAgIHJldHVybl9jb2RlID0gTTRXQVJfU1RSX09WRVJGTE9XOworICAgIH0KKworICAgIGlmKGxlbmd0aDIgPCAqcHVpMzJfbnVtKQorICAgIHsKKyAgICAgICAgKnB1aTMyX251bSA9IGxlbmd0aDI7CisKKyAgICAgICAgcmV0dXJuX2NvZGUgPSBNNFdBUl9TVFJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgcFRtcDEgPSAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKDIgKiAoKnB1aTMyX251bSkgKiBzaXplb2YoTTRPU0FfQ2hhciksCisgICAgICAgICAgICBNNE9TQV9TVFJJTkcsIChNNE9TQV9DaGFyKikiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOworCisgICAgTTRPU0FfQ0hFQ0tfTUFMTE9DKHBUbXAxLCAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOworCisgICAgcFRtcDIgPSBwVG1wMSArICgqcHVpMzJfbnVtKTsKKworICAgIE00T1NBX21lbWNweShwVG1wMSwgcEJ1ZmZlcjEsICpwdWkzMl9udW0pOworCisgICAgTTRPU0FfbWVtY3B5KHBUbXAyLCBwQnVmZmVyMiwgKnB1aTMyX251bSk7CisKKyAgICBmb3IoaT0wOyBpPCgqcHVpMzJfbnVtKTsgaSsrKQorICAgIHsKKyAgICAgICAgcFRtcDFbaV0gPSBNNE9TQV9jaHJUb0xvd2VyKHBCdWZmZXIxW2ldKTsKKyAgICAgICAgcFRtcDJbaV0gPSBNNE9TQV9jaHJUb0xvd2VyKHBCdWZmZXIyW2ldKTsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9IE00T1NBX2Nock5Db21wYXJlKHBUbXAxLCBwVG1wMiwgKnB1aTMyX251bSwgcGkzMl9yZXN1bHQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9FUlIpTTRFUlJfUEFSQU1FVEVSID09IGVycl9jb2RlLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb21wYXJlU3ViU3RyOiBNNE9TQV9jaHJOQ29tcGFyZSIpOworCisgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUbXAxKTsKKworICAgIHJldHVybiByZXR1cm5fY29kZTsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyQ2FzZUNvbXBhcmUoTTRPU0FfU3RyaW5nIHN0cl9pbjEsIE00T1NBX1N0cmluZyBzdHJfaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIxID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMTsKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMjsKKyAgICBNNE9TQV9VSW50MzIgbGVuZ3RoLCBsZW5ndGgxLCBsZW5ndGgyOworICAgIE00T1NBX0NoYXIgKnBCdWZmZXIxLCAqcEJ1ZmZlcjI7CisgICAgTTRPU0FfSW50MzIgcmVzdWx0OworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJDYXNlQ29tcGFyZVx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nICIKKyAgICAgICAgIjB4JXhcdE00T1NBX1VJbnQzMiogMHgleCIsIHN0cl9pbjEsIHN0cl9pbjIsIHBpMzJfcmVzdWx0KTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIxLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDYXNlQ29tcGFyZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDYXNlQ29tcGFyZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBpMzJfcmVzdWx0LE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlIik7CisKKyAgICBsZW5ndGgxID0gcFN0cjEtPnVpMzJfbGVuZ3RoOworICAgIGxlbmd0aDIgPSBwU3RyMi0+dWkzMl9sZW5ndGg7CisKKyAgICAvKiogTkI6ICBOZXZlciB1c2UgdGhpcyBleHByZXNzaW9uICJpID0gKHZhbHVlMSA9PSB2YWx1ZTIpID8geDogeTsiCisgICAgICogYmVjYXVzZSB0aGF0IGRvZW5zJ3QgY29tcGlsZSBvbiBvdGhlciBwbGF0Zm9ybXMgKEFEUyBmb3IgZXhhbXBsZSkKKyAgICAgKiBVc2U6IGlmKHZhbHVlMSA9PSB2YWx1ZTIpCisgICAgICogICAgICAgIHsgaT0geDsgLi5ldGMKKyAgICAgKi8KKyAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyMS0+cHVpOF9idWZmZXIpCisgICAgeworICAgICAgICBwQnVmZmVyMSA9IChNNE9TQV9DaGFyKikiIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJ1ZmZlcjEgPSBwU3RyMS0+cHVpOF9idWZmZXI7CisgICAgfQorCisgICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cjItPnB1aThfYnVmZmVyKQorICAgIHsKKyAgICAgICAgcEJ1ZmZlcjIgPSAoTTRPU0FfQ2hhciopIiI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCdWZmZXIyID0gcFN0cjItPnB1aThfYnVmZmVyOworICAgIH0KKworICAgIGlmICgobGVuZ3RoMSA8IGxlbmd0aDIpKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gIGxlbmd0aDI7CisgICAgfQorCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJOQ29tcGFyZShwQnVmZmVyMSwgcEJ1ZmZlcjIsIGxlbmd0aCwgJnJlc3VsdCk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX0VSUilNNEVSUl9QQVJBTUVURVIgPT0gZXJyX2NvZGUsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ2FzZUNvbXBhcmU6IE00T1NBX2Nock5Db21wYXJlIik7CisKKyAgICBpZiAocmVzdWx0ICE9IDApCisgICAgeworICAgICAgICAqcGkzMl9yZXN1bHQgPSByZXN1bHQ7CisgICAgfQorICAgIGVsc2UgaWYgKGxlbmd0aDEgPiBsZW5ndGgyKQorICAgIHsKKyAgICAgICAgKnBpMzJfcmVzdWx0ID0gMSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwaTMyX3Jlc3VsdCA9IC0xOworICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBhdXRob3IgICAgIE5pY29sYXMgU2FudGluaSAoUERTTC1QKQorICogQGF1dGhvciAgICAgSGlsYWlyZSBWZXJzY2h1ZXJlIChQRFNMLVApCisgKiBAYnJpZWYKKyAqIEBub3RlCisgKiBAcGFyYW0gICAgICBzdHJfaW4KKyAqIEBwYXJhbQorICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKKyAqIEBkYXRlICAgICAgIC0gMjAwMi0xMi0zMjogY3JlYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworTTRPU0FfRVJSIE00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyKE00T1NBX1N0cmluZyBzdHJfaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcGkzMl9yZXN1bHQpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMSA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjE7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMiA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjI7CisgICAgTTRPU0FfQ2hhciogcEJ1ZmZlcjE7CisgICAgTTRPU0FfQ2hhciogcEJ1ZmZlcjI7CisgICAgTTRPU0FfVUludDMyIGxlbmd0aDEsIGxlbmd0aDI7CisgICAgTTRPU0FfRVJSIGVycl9jb2RlID0gTTROT19FUlJPUjsKKworICAgIE00T1NBX1RSQUNFMV81KCJNNE9TQV9zdHJDYXNlQ29tcGFyZVN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0IgorICAgICAgICAiTTRPU0FfVUludDMyICVkXHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkXHQiCisgICAgICAgICJNNE9TQV9VSW50MzIqIDB4JXhcdE00T1NBX0ludDMyKiAweCV4Iiwgc3RyX2luMSwKKyAgICAgICAgdWkzMl9vZmZzZXQxLCBzdHJfaW4yLCB1aTMyX29mZnNldDIsICpwdWkzMl9udW0pOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0cjEsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0cjIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGkzMl9yZXN1bHQsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcHVpMzJfbnVtLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDYXNlQ29tcGFyZVN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMigqcHVpMzJfbnVtID09IDAsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKHVpMzJfb2Zmc2V0MSA+PSBwU3RyMS0+dWkzMl9sZW5ndGgsIE00RVJSX1NUUl9PVkVSRkxPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKHVpMzJfb2Zmc2V0MiA+PSBwU3RyMi0+dWkzMl9sZW5ndGgsIE00RVJSX1NUUl9PVkVSRkxPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7CisKKworICAgIGxlbmd0aDEgPSBwU3RyMS0+dWkzMl9sZW5ndGggLSB1aTMyX29mZnNldDE7CisgICAgbGVuZ3RoMiA9IHBTdHIyLT51aTMyX2xlbmd0aCAtIHVpMzJfb2Zmc2V0MjsKKworICAgIHBCdWZmZXIxID0gcFN0cjEtPnB1aThfYnVmZmVyICsgdWkzMl9vZmZzZXQxOworICAgIHBCdWZmZXIyID0gcFN0cjItPnB1aThfYnVmZmVyICsgdWkzMl9vZmZzZXQyOworCisgICAgaWYobGVuZ3RoMSA8ICpwdWkzMl9udW0pCisgICAgeworICAgICAgICAqcHVpMzJfbnVtID0gbGVuZ3RoMTsKKworICAgICAgICBlcnJfY29kZSA9IE00V0FSX1NUUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICBpZihsZW5ndGgyIDwgKnB1aTMyX251bSkKKyAgICB7CisgICAgICAgICpwdWkzMl9udW0gPSBsZW5ndGgyOworCisgICAgICAgIGVycl9jb2RlID0gTTRXQVJfU1RSX09WRVJGTE9XOworICAgIH0KKworICAgIE00T1NBX2Nock5Db21wYXJlKHBCdWZmZXIxLCBwQnVmZmVyMiwgKnB1aTMyX251bSwgcGkzMl9yZXN1bHQpOworCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJTcGFuKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIqIGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX3BvcykKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOworICAgIE00T1NBX0NoYXIqIHBCdWZmZXI7CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyU3Bhblx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfQ2hhciogMHgleFx0IgorICAgICAgICAiTTRPU0FfVUludDMyKiAweCV4Iiwgc3RyX2luLCBjaGFyc2V0LCBwdWkzMl9wb3MpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyU3BhbiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNoYXJzZXQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNwYW4iKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdWkzMl9wb3MsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNwYW4iKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU3BhbiIpOworCisgICAgcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbiA7CisKKyAgICBpZigqcHVpMzJfcG9zID49IHBTdHItPnVpMzJfbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXIgKyAqcHVpMzJfcG9zOworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTcGFuKHBCdWZmZXIsIGNoYXJzZXQsICZ1aTMyX2xlbmd0aCk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX0VSUilNNEVSUl9QQVJBTUVURVIgPT0gZXJyX2NvZGUsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTcGFuOiBNNE9TQV9jaHJTcGFuIik7CisKKyAgICAqcHVpMzJfcG9zICs9IHVpMzJfbGVuZ3RoOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworCisKKworTTRPU0FfRVJSIE00T1NBX3N0clNwYW5Db21wbGVtZW50KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIqIGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9wb3MpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX0VSUiBlcnJfY29kZTsKKyAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7CisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyU3BhbkNvbXBsZW1lbnRcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0NoYXIqICIKKyAgICAgICAgIjB4JXhcdE00T1NBX1VJbnQzMiogMHgleCIsIHN0cl9pbiwgY2hhcnNldCwgcHVpMzJfcG9zKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNwYW5Db21wbGVtZW50Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY2hhcnNldCwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU3BhbkNvbXBsZW1lbnQiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdWkzMl9wb3MsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNwYW5Db21wbGVtZW50Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU3BhbkNvbXBsZW1lbnQiKTsKKworICAgIGlmKCpwdWkzMl9wb3MgPj0gcFN0ci0+dWkzMl9sZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfU1RSX09WRVJGTE9XOworICAgIH0KKworICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU3BhbkNvbXBsZW1lbnQocFN0ci0+cHVpOF9idWZmZXIgKyAqcHVpMzJfcG9zLAorICAgICAgICAgICAgICAgICAgICBjaGFyc2V0LCAmdWkzMl9sZW5ndGgpOworCisgICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9FUlIpTTRFUlJfUEFSQU1FVEVSID09IGVycl9jb2RlLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgIk00T1NBX3N0clNwYW5Db21wbGVtZW50OiBNNE9TQV9jaHJTcGFuQ29tcGxlbWVudCIpOworCisgICAgaWYoTTRXQVJfQ0hSX05PVF9GT1VORCA9PSBlcnJfY29kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgIH0KKworICAgICpwdWkzMl9wb3MgKz0gdWkzMl9sZW5ndGg7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyRmluZEZpcnN0Q2hhcihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9DaGFyIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX3BvcykKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfQ2hhciogcEJ1ZmZlcjsKKyAgICBNNE9TQV9DaGFyKiBwY2hhcjsKKyAgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyRmluZEZpcnN0Q2hhclx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfQ2hhciIKKyAgICAgICAgIiAweCV4XHRNNE9TQV9VSW50MzIqIDB4JXgiLCBzdHJfaW4sIGMsIHB1aTMyX3Bvcyk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0Q2hhciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aTMyX3BvcywgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckZpbmRGaXJzdENoYXIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0Q2hhciIpOworCisgICAgaWYoKnB1aTMyX3BvcyA+PSBwU3RyLT51aTMyX2xlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9TVFJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgcEJ1ZmZlciA9IHBTdHItPnB1aThfYnVmZmVyICsgKnB1aTMyX3BvczsKKworICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZENoYXIocEJ1ZmZlciwgYywgJnBjaGFyKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihlcnJfY29kZSA9PSAoTTRPU0FfRVJSKU00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyRmluZEZpcnN0Q2hhciIpOworCisgICAgaWYoTTRXQVJfQ0hSX05PVF9GT1VORCA9PSBlcnJfY29kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgIH0KKworICAgICpwdWkzMl9wb3MgPSBwY2hhciAtIHBTdHItPnB1aThfYnVmZmVyOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0ckZpbmRMYXN0Q2hhcihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9DaGFyIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfcG9zKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9DaGFyKiBwQnVmZmVyOworICAgIE00T1NBX1VJbnQzMiBpOworCisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckZpbmRMYXN0Q2hhclx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfQ2hhciIKKyAgICAgICAgIiAweCV4XHRNNE9TQV9VSW50MzIqIDB4JXgiLCBzdHJfaW4sIGMsIHB1aTMyX3Bvcyk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsIk00T1NBX3N0ckZpbmRMYXN0Q2hhciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aTMyX3BvcywgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kTGFzdENoYXIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckZpbmRMYXN0Q2hhciIpOworCisgICAgaWYoKnB1aTMyX3BvcyA+IHBTdHItPnVpMzJfbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXI7CisKKyAgICBmb3IoaT0oKnB1aTMyX3Bvcyk7IGkhPTA7IGktLSkKKyAgICB7CisgICAgICAgIGlmKHBCdWZmZXJbaV0gPT0gYykKKyAgICAgICAgeworICAgICAgICAgICAgKnB1aTMyX3BvcyA9IGk7CisKKyAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0ckZpbmRGaXJzdFN1YlN0cihNNE9TQV9TdHJpbmcgc3RyX2luMSwgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfcG9zKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0cjEgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW4xOworICAgIE00T1NBX3N0clN0cnVjdCogcFN0cjIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW4yOworICAgIE00T1NBX0NoYXIqIHBSZXN1bHQ7CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckZpbmRGaXJzdFN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nIgorICAgICAgICAiIDB4JXhcdE00T1NBX1VJbnQzMiogMHgleCIsIHN0cl9pbjEsIHN0cl9pbjIsIHB1aTMyX3Bvcyk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMSwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kRmlyc3RTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kRmlyc3RTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdWkzMl9wb3MsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0U3ViU3RyIik7CisKKyAgICBpZigqcHVpMzJfcG9zID49IHBTdHIxLT51aTMyX2xlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9TVFJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgaWYocFN0cjItPnVpMzJfbGVuZ3RoID09IDApCisgICAgeworICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9IE00T1NBX2NockZpbmRQYXR0ZXJuKHBTdHIxLT5wdWk4X2J1ZmZlciArICgqcHVpMzJfcG9zKSwKKyAgICAgICAgICAgICAgICBwU3RyMi0+cHVpOF9idWZmZXIsICZwUmVzdWx0KTsKKworICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfRVJSKU00RVJSX1BBUkFNRVRFUiA9PSBlcnJfY29kZSwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckZpbmRGaXJzdFN1YlN0cjogTTRPU0FfY2hyRmluZFBhdHRlcm4iKTsKKworICAgIGlmKE00V0FSX0NIUl9OT1RfRk9VTkQgPT0gZXJyX2NvZGUpCisgICAgeworICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAqcHVpMzJfcG9zID0gcFJlc3VsdCAtIHBTdHIxLT5wdWk4X2J1ZmZlcjsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJGaW5kTGFzdFN1YlN0cihNNE9TQV9TdHJpbmcgc3RyX2luMSwgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9wb3MpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMSA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjE7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMiA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjI7CisgICAgTTRPU0FfSW50MzIgaTMyX3Jlc3VsdDsKKworCisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckZpbmRMYXN0U3ViU3RyXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9TdHJpbmciCisgICAgICAgICIgMHgleFx0TTRPU0FfVUludDMyKiAweCV4Iiwgc3RyX2luMSwgc3RyX2luMiwgcHVpMzJfcG9zKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIxLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kTGFzdFN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIyLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kTGFzdFN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aTMyX3BvcywgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZExhc3RTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHIxLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZExhc3RTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHIyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZExhc3RTdWJTdHIiKTsKKworICAgIGlmKCpwdWkzMl9wb3MgPiBwU3RyMS0+dWkzMl9sZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm4gTTRFUlJfU1RSX09WRVJGTE9XOworICAgIH0KKworICAgIGlmKChwU3RyMi0+dWkzMl9sZW5ndGggPT0gMCkgfHwgKHBTdHIxLT51aTMyX2xlbmd0aCA9PSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGkzMl9yZXN1bHQgPSBNNE9TQV9zdHJQcml2RmluZExhc3RTdWJTdHIocFN0cjEsIHBTdHIyLCAqcHVpMzJfcG9zKTsKKworICAgIGlmKGkzMl9yZXN1bHQgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgKnB1aTMyX3BvcyA9IGkzMl9yZXN1bHQ7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyVHJ1bmNhdGUoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKworICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJUcm9uY2F0ZVx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkIiwKKyAgICAgICAgc3RyX2luLCB1aTMyX2xlbmd0aCk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJUcm9uY2F0ZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clRyb25jYXRlIik7CisKKyAgICBpZih1aTMyX2xlbmd0aCA+PSBwU3RyLT51aTMyX2xlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNFdBUl9TVFJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgcFN0ci0+dWkzMl9sZW5ndGggPSB1aTMyX2xlbmd0aDsKKworICAgIGlmKHBTdHItPnB1aThfYnVmZmVyICE9IE00T1NBX05VTEwpCisgICAgeworICAgICAgICBwU3RyLT5wdWk4X2J1ZmZlclt1aTMyX2xlbmd0aF0gPSAnXDAnOworICAgIH0KKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCitNNE9TQV9FUlIgTTRPU0Ffc3RyQ29weShNNE9TQV9TdHJpbmcgc3RyX291dCwgTTRPU0FfU3RyaW5nIHN0cl9pbikKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBJc3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX3N0clN0cnVjdCogcE9zdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfb3V0OworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0ckNvcHlcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX1N0cmluZyAweCV4IiwKKyAgICAgICAgc3RyX2luLCBzdHJfb3V0KTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBJc3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb3B5Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9zdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckNvcHkiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBJc3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvcHkiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBPc3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvcHkiKTsKKworICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBPc3RyLCBwSXN0ci0+cHVpOF9idWZmZXIsIHBJc3RyLT51aTMyX2xlbmd0aCk7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0ckNvcHlTdWJTdHIoTTRPU0FfU3RyaW5nIHN0cl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiB1aTMyX251bSkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QgKnBJc3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX3N0clN0cnVjdCAqcE9zdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfb3V0OworICAgIE00T1NBX0VSUiBlcnJfY29kZSA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoLCBvbGVuZ3RoOworICAgIE00T1NBX0NoYXIqIHBTcmM7CisgICAgTTRPU0FfQ2hhciogcERlc3Q7CisKKworICAgIE00T1NBX1RSQUNFMV81KCJNNE9TQV9zdHJDb3B5U3ViU3RyXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9VSW50MzIgJWQiCisgICAgICAgICJcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9VSW50MzIgJWRcdE00T1NBX1VJbnQzMiogJTB4JXgiLAorICAgICAgICBzdHJfb3V0LCBzdHJfaW4sIHN0cl9vdXQsIHVpMzJfcG9zLCB1aTMyX251bSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSXN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyQ29weVN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBPc3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gdWkzMl9udW0sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKCp1aTMyX251bSA9PSAwLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwT3N0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwSXN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKHVpMzJfcG9zID4gcE9zdHItPnVpMzJfbGVuZ3RoLCBNNEVSUl9TVFJfT1ZFUkZMT1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29weVN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMih1aTMyX29mZnNldCA+IHBJc3RyLT51aTMyX2xlbmd0aCwgTTRFUlJfU1RSX09WRVJGTE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvcHlTdWJTdHIiKTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGVyZSBpcyBlbm91Z2ggY2hhciBpbiBzdHJfaW4gYWZ0ZXIgdWkzMl9vZmZzZXQgKi8KKyAgICB1aTMyX2xlbmd0aCA9IHBJc3RyLT51aTMyX2xlbmd0aCAtIHVpMzJfb2Zmc2V0OworCisgICAgaWYoKnVpMzJfbnVtID4gdWkzMl9sZW5ndGgpCisgICAgeworICAgICAgICAqdWkzMl9udW0gPSB1aTMyX2xlbmd0aDsKKworICAgICAgICBlcnJfY29kZSA9IE00V0FSX1NUUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGZ1dHVyZSBsZW5ndGggb2Ygc3RyMiAqLworICAgIHVpMzJfbGVuZ3RoID0gdWkzMl9wb3MgKyAqdWkzMl9udW07CisKKyAgICBvbGVuZ3RoID0gcE9zdHItPnVpMzJfbGVuZ3RoOworCisgICAgaWYodWkzMl9sZW5ndGggPj0gb2xlbmd0aCkKKyAgICB7CisgICAgICAgIG9sZW5ndGggPSB1aTMyX2xlbmd0aDsKKyAgICB9CisKKyAgICAvKiBSZWFsbG9jYXRpb24gaWYgbmVlZGVkICovCisgICAgaWYoTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KHBPc3RyLCBvbGVuZ3RoKSAhPSBNNE5PX0VSUk9SKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIH0KKworICAgIHBTcmMgID0gcElzdHItPnB1aThfYnVmZmVyICsgdWkzMl9vZmZzZXQ7CisgICAgcERlc3QgPSBwT3N0ci0+cHVpOF9idWZmZXIgKyB1aTMyX3BvczsKKworICAgIE00T1NBX21lbWNweShwRGVzdCwgcFNyYywgKnVpMzJfbnVtKTsKKworICAgIHBPc3RyLT51aTMyX2xlbmd0aCA9IG9sZW5ndGg7CisgICAgcE9zdHItPnB1aThfYnVmZmVyW3BPc3RyLT51aTMyX2xlbmd0aF0gPSAnXDAnOworCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJDb25jYXQoTTRPU0FfU3RyaW5nIHN0cl9maXJzdCwgTTRPU0FfU3RyaW5nIHN0cl9zZWNvbmQpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMSA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9maXJzdDsKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX3NlY29uZDsKKyAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7CisgICAgTTRPU0FfQ2hhciogcEJ1ZmZlcjsKKworICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJDb25jYXRcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX1N0cmluZyAweCV4IiwKKyAgICAgICAgc3RyX2ZpcnN0LCBzdHJfc2Vjb25kKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIxLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb25jYXQiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMiwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyQ29uY2F0Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29uY2F0Iik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29uY2F0Iik7CisKKyAgICBpZihwU3RyMi0+dWkzMl9sZW5ndGggPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgIH0KKworICAgIHVpMzJfbGVuZ3RoID0gcFN0cjEtPnVpMzJfbGVuZ3RoICsgcFN0cjItPnVpMzJfbGVuZ3RoOworCisgICAgaWYoTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KHBTdHIxLCB1aTMyX2xlbmd0aCkgIT0gTTROT19FUlJPUikKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc3RyQ29uY2F0Iik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIH0KKworICAgIHBCdWZmZXIgPSBwU3RyMS0+cHVpOF9idWZmZXIgKyBwU3RyMS0+dWkzMl9sZW5ndGg7CisKKyAgICAvKiBGaWxsIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KKyAgICBNNE9TQV9tZW1jcHkocEJ1ZmZlciwgcFN0cjItPnB1aThfYnVmZmVyLCBwU3RyMi0+dWkzMl9sZW5ndGgrMSk7CisKKyAgICBwU3RyMS0+dWkzMl9sZW5ndGggPSB1aTMyX2xlbmd0aDsKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJJbnNlcnRTdWJTdHIoTTRPU0FfU3RyaW5nIHN0cl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHVpMzJfbnVtKQoreworICAgIE00T1NBX3N0clN0cnVjdCAqcElzdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0Ffc3RyU3RydWN0ICpwT3N0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9vdXQ7CisgICAgTTRPU0FfRVJSIGVycl9jb2RlLCByZXR1cm5fY29kZSA9IE00Tk9fRVJST1I7CisgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOworCisgICAgTTRPU0FfVFJBQ0UxXzUoIk00T1NBX3N0ckluc2VydFN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkIgorICAgICAgICAiXHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkXHRNNE9TQV9VSW50MzIqICUweCV4IiwKKyAgICAgICAgc3RyX291dCwgc3RyX2luLCBzdHJfb3V0LCB1aTMyX3BvcywgdWkzMl9udW0pOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcElzdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9zdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gdWkzMl9udW0sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKCp1aTMyX251bSA9PSAwLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckluc2VydFN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcElzdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckluc2VydFN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcE9zdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckluc2VydFN1YlN0ciIpOworICAgIE00T1NBX0RFQlVHX0lGMih1aTMyX3BvcyA+IHBPc3RyLT51aTMyX2xlbmd0aCwgTTRFUlJfU1RSX09WRVJGTE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJJbnNlcnRTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIodWkzMl9vZmZzZXQgPiBwSXN0ci0+dWkzMl9sZW5ndGgsIE00RVJSX1NUUl9PVkVSRkxPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlcmUgaXMgZW5vdWdoIGNoYXIgaW4gc3RyX2luIGFmdGVyIHVpMzJfb2Zmc2V0ICovCisgICAgdWkzMl9sZW5ndGggPSBwSXN0ci0+dWkzMl9sZW5ndGggLSB1aTMyX29mZnNldDsKKworICAgIGlmKCp1aTMyX251bSA+IHVpMzJfbGVuZ3RoKQorICAgIHsKKyAgICAgICAgKnVpMzJfbnVtID0gdWkzMl9sZW5ndGg7CisKKyAgICAgICAgcmV0dXJuX2NvZGUgPSBNNFdBUl9TVFJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0cihwT3N0ciwgdWkzMl9wb3MsIDAsCisgICAgICAgIHBJc3RyLT5wdWk4X2J1ZmZlciArIHVpMzJfb2Zmc2V0LCAqdWkzMl9udW0pOworCisgICAgaWYoZXJyX2NvZGUgPT0gKE00T1NBX0VSUilNNEVSUl9BTExPQykKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7CisKKyAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fY29kZTsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyRGVsU3ViU3RyKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiB1aTMyX251bSkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOworICAgIE00T1NBX0NoYXIqIHBCdWZmZXI7CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckRlbFN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkXHQiCisgICAgICAgICJNNE9TQV9VSW50MzIqIDB4JXgiLCBzdHJfaW4sIHVpMzJfb2Zmc2V0LCB1aTMyX251bSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJEZWxTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSB1aTMyX251bSwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJEZWxTdWJTdHIiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckRlbFN1YlN0ciIpOworCisgICAgcEJ1ZmZlciA9IHBTdHItPnB1aThfYnVmZmVyOworCisgICAgdWkzMl9sZW5ndGggPSBwU3RyLT51aTMyX2xlbmd0aCA7CisKKyAgICBpZih1aTMyX29mZnNldCA+PSB1aTMyX2xlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBNNEVSUl9TVFJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgdWkzMl9sZW5ndGggLT0gdWkzMl9vZmZzZXQ7CisKKyAgICBpZigqdWkzMl9udW0gPj0gdWkzMl9sZW5ndGgpCisgICAgeworICAgICAgICAqdWkzMl9udW0gPSB1aTMyX2xlbmd0aDsKKworICAgICAgICBwU3RyLT51aTMyX2xlbmd0aCAtPSB1aTMyX2xlbmd0aDsKKworICAgICAgICBwQnVmZmVyW3BTdHItPnVpMzJfbGVuZ3RoXSA9ICdcMCc7CisKKyAgICAgICAgZXJyX2NvZGUgPSBNNFdBUl9TVFJfT1ZFUkZMT1c7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIocFN0ciwgdWkzMl9vZmZzZXQsICp1aTMyX251bSwKKyAgICAgICAgICAgIE00T1NBX05VTEwsIDApOworICAgIH0KKworICAgIHJldHVybiBlcnJfY29kZTsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyUmVwbGFjZVN1YlN0cihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9TdHJpbmcgc3RyX29sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfbmV3LCBNNE9TQV9zdHJNb2RlIG1vZGUpCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwSXN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBPc3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX29sZDsKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBOc3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX25ldzsKKyAgICBNNE9TQV9VSW50MzIgb2xlbmd0aCwgbmxlbmd0aCwgaWxlbmd0aDsKKyAgICBNNE9TQV9Cb29sIG9zdHIyZnJlZSA9IE00T1NBX0ZBTFNFOworICAgIE00T1NBX0Jvb2wgbnN0cjJmcmVlID0gTTRPU0FfRkFMU0U7CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisKKyAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0Ffc3RyUmVwbGFjZVN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nICIKKyAgICAgICAgIjB4JXhcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9zdHJTdXBwck1vZGUgJWQiLAorICAgICAgICBzdHJfaW4sIHN0cl9vbGQsIHN0cl9uZXcsIG1vZGUpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcElzdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9zdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE5zdHIsIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKChtb2RlICE9IE00T1NBX2tzdHJBbGwpICYmIChtb2RlICE9IE00T1NBX2tzdHJFbmQpCisgICAgICAgICYmIChtb2RlICE9IE00T1NBX2tzdHJCZWdpbiksIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwSXN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwT3N0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwTnN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7CisKKyAgICBvbGVuZ3RoID0gcE9zdHItPnVpMzJfbGVuZ3RoOworICAgIG5sZW5ndGggPSBwTnN0ci0+dWkzMl9sZW5ndGg7CisgICAgaWxlbmd0aCA9IHBJc3RyLT51aTMyX2xlbmd0aDsKKworICAgIGlmKChvbGVuZ3RoID09IDApIHx8IChpbGVuZ3RoID09IDApIHx8IChvbGVuZ3RoID4gaWxlbmd0aCkpCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNFdBUl9TVFJfTk9UX0ZPVU5ELCAiTTRPU0Ffc3RyUmVwbGFjZVN1YlN0ciIpOworCisgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGlmKHBJc3RyID09IHBPc3RyKQorICAgIHsKKyAgICAgICAgTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZSgmcE9zdHIsIHBJc3RyKTsKKworICAgICAgICBvc3RyMmZyZWUgPSBNNE9TQV9UUlVFOworICAgIH0KKworICAgIGlmKHBJc3RyID09IHBOc3RyKQorICAgIHsKKyAgICAgICAgTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZSgmcE5zdHIsIHBJc3RyKTsKKworICAgICAgICBuc3RyMmZyZWUgPSBNNE9TQV9UUlVFOworICAgIH0KKworICAgIGlmKG5sZW5ndGggPT0gb2xlbmd0aCkKKyAgICB7CisgICAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlJlcGxhY2VTYW1lU2l6ZVN0cihwSXN0ciwgcE9zdHIsIHBOc3RyLCBtb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZihubGVuZ3RoIDwgb2xlbmd0aCkKKyAgICB7CisgICAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlJlcGxhY2VTbWFsbGVyU3RyKHBJc3RyLCBwT3N0ciwgcE5zdHIsIG1vZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlcnJfY29kZSA9IE00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyKHBJc3RyLCBwT3N0ciwgcE5zdHIsIG1vZGUpOworICAgIH0KKworICAgIGlmKG9zdHIyZnJlZSA9PSBNNE9TQV9UUlVFKQorICAgIHsKKyAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBPc3RyLT5wdWk4X2J1ZmZlcik7CisgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwT3N0cik7CisgICAgfQorCisgICAgaWYobnN0cjJmcmVlID09IE00T1NBX1RSVUUpCisgICAgeworICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcE5zdHItPnB1aThfYnVmZmVyKTsKKyAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBOc3RyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyX2NvZGU7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0ckdldEZpcnN0VG9rZW4oTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfU3RyaW5nIHN0cl90b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfZGVsaW0pCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwSW4gPSAgICAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwVG9rZW4gPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfdG9rZW47CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwRGVsaW0gPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfZGVsaW07CisgICAgTTRPU0FfVUludDMyIGxlbmd0aF90b2tlbiwgbGVuZ3RoX2RlbGltOworICAgIE00T1NBX0NoYXIqIHBCdWZmZXI7CisgICAgTTRPU0FfQ2hhciogcGNoYXI7CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisKKyAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyR2V0Rmlyc3RUb2tlblx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nIgorICAgICAgICAiIDB4JXhcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luLCBzdHJfdG9rZW4sIHN0cl9kZWxpbSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSW4sIE00RVJSX1BBUkFNRVRFUiwiTTRPU0Ffc3RyR2V0Rmlyc3RUb2tlbiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBUb2tlbiwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEZpcnN0VG9rZW4iKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRGVsaW0sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRGaXJzdFRva2VuIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwSW4tPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0Rmlyc3RUb2tlbiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFRva2VuLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEZpcnN0VG9rZW4iKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBEZWxpbS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRGaXJzdFRva2VuIik7CisKKyAgICBsZW5ndGhfZGVsaW0gPSBwRGVsaW0tPnVpMzJfbGVuZ3RoOworCisgICAgaWYocERlbGltLT51aTMyX2xlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRXQVJfU1RSX05PVF9GT1VORCwgIk00T1NBX3N0ckdldEZpcnN0VG9rZW4iKTsKKworICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBwQnVmZmVyID0gcEluLT5wdWk4X2J1ZmZlcjsKKworICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZFBhdHRlcm4ocEJ1ZmZlcixwRGVsaW0tPnB1aThfYnVmZmVyLCAmcGNoYXIpOworCisgICAgaWYoZXJyX2NvZGUgIT0gTTROT19FUlJPUikKKyAgICB7CisgICAgICAgIE00T1NBX0RFQlVHKE00V0FSX1NUUl9OT1RfRk9VTkQsICJNNE9TQV9zdHJHZXRGaXJzdFRva2VuIik7CisKKyAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgbGVuZ3RoX3Rva2VuID0gcGNoYXIgLSBwQnVmZmVyOworCisgICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U2V0KHBUb2tlbiwgcEJ1ZmZlciwgbGVuZ3RoX3Rva2VuKTsKKworICAgIGlmKGVycl9jb2RlID09IChNNE9TQV9FUlIpTTRFUlJfQUxMT0MpCisgICAgeworICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX3N0ckdldEZpcnN0VG9rZW46IE00T1NBX3N0clByaXZTZXQiKTsKKworICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisgICAgfQorCisgICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0cihwSW4sIDAsIGxlbmd0aF90b2tlbiArIGxlbmd0aF9kZWxpbSwKKyAgICAgICAgTTRPU0FfTlVMTCwgMCk7CisKKyAgICBpZihlcnJfY29kZSA9PSAoTTRPU0FfRVJSKU00RVJSX0FMTE9DKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsCisgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0Rmlyc3RUb2tlbjogTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIiKTsKKworICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisgICAgfQorCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0ckdldExhc3RUb2tlbihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9TdHJpbmcgc3RyX3Rva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2RlbGltKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcEluID0gICAgKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX3N0clN0cnVjdCogcFRva2VuID0gKE00T1NBX3N0clN0cnVjdCopc3RyX3Rva2VuOworICAgIE00T1NBX3N0clN0cnVjdCogcERlbGltID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2RlbGltOworICAgIE00T1NBX1VJbnQzMiBpbl9sZW5ndGgsIHRva2VuX2xlbmd0aCwgZGVsaW1fbGVuZ3RoOworICAgIE00T1NBX0NoYXIqIHBJbl9idWZmZXI7CisgICAgTTRPU0FfQ2hhciogcFRva2VuX2J1ZmZlcjsKKyAgICBNNE9TQV9JbnQzMiBkZWxpbV9wb3M7CisgICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisgICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckdldExhc3RUb2tlblx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nIgorICAgICAgICAiIDB4JXhcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luLCBzdHJfdG9rZW4sIHN0cl9kZWxpbSk7CisKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSW4sIE00RVJSX1BBUkFNRVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0TGFzdFRva2VuIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFRva2VuLCBNNEVSUl9QQVJBTUVURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldExhc3RUb2tlbiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBEZWxpbSwgTTRFUlJfUEFSQU1FVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRMYXN0VG9rZW4iKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBJbi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0TGFzdFRva2VuIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwVG9rZW4tPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldExhc3RUb2tlbiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcERlbGltLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRMYXN0VG9rZW4iKTsKKworICAgIGluX2xlbmd0aCA9IHBJbi0+dWkzMl9sZW5ndGg7CisgICAgZGVsaW1fbGVuZ3RoID0gcERlbGltLT51aTMyX2xlbmd0aDsKKyAgICBwSW5fYnVmZmVyID0gcEluLT5wdWk4X2J1ZmZlcjsKKworICAgIGlmKHBEZWxpbS0+dWkzMl9sZW5ndGggPiBwSW4tPnVpMzJfbGVuZ3RoKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRXQVJfU1RSX05PVF9GT1VORCwgIk00T1NBX3N0ckdldExhc3RUb2tlbiIpOworCisgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGRlbGltX3BvcyA9IE00T1NBX3N0clByaXZGaW5kTGFzdFN1YlN0cihwSW4sIHBEZWxpbSwgaW5fbGVuZ3RoLWRlbGltX2xlbmd0aCk7CisKKyAgICBpZihkZWxpbV9wb3MgPCAwKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRXQVJfU1RSX05PVF9GT1VORCwgIk00T1NBX3N0ckdldExhc3RUb2tlbiIpOworCisgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHBUb2tlbl9idWZmZXIgPSBwSW5fYnVmZmVyICsgZGVsaW1fcG9zICsgZGVsaW1fbGVuZ3RoOworICAgIHRva2VuX2xlbmd0aCA9IGluX2xlbmd0aCAtIGRlbGltX3BvcyArIGRlbGltX2xlbmd0aDsKKworICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlNldChzdHJfdG9rZW4sIHBUb2tlbl9idWZmZXIsIHRva2VuX2xlbmd0aCk7CisKKyAgICBpZihlcnJfY29kZSA9PSAoTTRPU0FfRVJSKU00RVJSX0FMTE9DKQorICAgIHsKKyAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsCisgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0TGFzdFRva2VuOiBNNE9TQV9zdHJQcml2U2V0Iik7CisKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgIH0KKworICAgIHBJbl9idWZmZXJbZGVsaW1fcG9zXSA9ICdcMCc7CisKKyAgICBwSW4tPnVpMzJfbGVuZ3RoID0gZGVsaW1fcG9zOworCisgICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworTTRPU0FfRVJSIE00T1NBX3N0clNldFVwcGVyQ2FzZShNNE9TQV9TdHJpbmcgc3RyX2luKQoreworICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKKyAgICBNNE9TQV9DaGFyKiBwQnVmZmVyOworICAgIE00T1NBX0NoYXIqIHBjaGFyOworCisKKyAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc3RyU2V0VXBwZXJDYXNlXHRcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldFVwcGVyQ2FzZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VXBwZXJDYXNlIik7CisKKyAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXI7CisKKyAgICBmb3IocGNoYXI9cEJ1ZmZlcjsgcGNoYXIhPShwQnVmZmVyK3BTdHItPnVpMzJfbGVuZ3RoKTsgcGNoYXIrKykKKyAgICB7CisgICAgICAgICpwY2hhciA9IE00T1NBX2NoclRvVXBwZXIoKnBjaGFyKTsKKyAgICB9CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0TG93ZXJDYXNlKE00T1NBX1N0cmluZyBzdHJfaW4pCit7CisgICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOworICAgIE00T1NBX0NoYXIqIHBCdWZmZXI7CisgICAgTTRPU0FfQ2hhciogcGNoYXI7CisKKyAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc3RyU2V0TG93ZXJDYXNlXHRcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldExvd2VyQ2FzZSIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0TG93ZXJDYXNlIik7CisKKyAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXI7CisKKyAgICBmb3IocGNoYXI9cEJ1ZmZlcjsgcGNoYXIhPShwQnVmZmVyK3BTdHItPnVpMzJfbGVuZ3RoKTsgcGNoYXIrKykKKyAgICB7CisgICAgICAgICpwY2hhciA9IE00T1NBX2NoclRvTG93ZXIoKnBjaGFyKTsKKyAgICB9CisKKworICAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJTcHJpbnRmKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIqIHBGb3JtYXQsIC4uLikKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfRVJSIGVycl9jb2RlID0gTTRFUlJfU1RSX09WRVJGTE9XOworICAgIE00T1NBX1VJbnQzMiB1aTMyX3NpemU7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNwcmludGZcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0NoYXIqIDB4JXgiLAorICAgICAgICBzdHJfaW4sIHBGb3JtYXQpOworCisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZvcm1hdCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyU3ByaW50ZiIpOworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNwcmludGYiKTsKKyAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNldExvd2VyQ2FzZSIpOworCisgICAgdWkzMl9zaXplID0gcFN0ci0+dWkzMl9sZW5ndGggKyAoTTRPU0FfVUludDMyKSgxLjUgKiBNNE9TQV9jaHJMZW5ndGgocEZvcm1hdCkpOworCisgICAgdmFfc3RhcnQoYXJncywgcEZvcm1hdCk7CisKKyAgICB3aGlsZShlcnJfY29kZSA9PSAoTTRPU0FfRVJSKU00RVJSX1NUUl9PVkVSRkxPVykKKyAgICB7CisgICAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KHBTdHIsIHVpMzJfc2l6ZSk7CisKKyAgICAgICAgaWYoZXJyX2NvZGUgPT0gKE00T1NBX0VSUilNNEVSUl9BTExPQykKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zdHJTcHJpbnRmIik7CisKKyAgICAgICAgICAgIHZhX2VuZChhcmdzKTsKKworICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgICAgICB9CisKKyAgICAgICAgdWkzMl9zaXplICo9IDI7CisKKyAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U1ByaW50ZihwU3RyLCBwRm9ybWF0LCBhcmdzKTsKKyAgICB9CisKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICBwU3RyLT51aTMyX2xlbmd0aCA9IE00T1NBX2Nockxlbmd0aChwU3RyLT5wdWk4X2J1ZmZlcik7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0TWluQWxsb2NhdGlvblNpemUoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVUludDMyIHVpMzJfbmV3c2l6ZSkKK3sKKyAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47CisgICAgTTRPU0FfVUludDMyIHVpMzJfc2l6ZTsKKyAgICBNNE9TQV9DaGFyKiBwQnVmZmVyOworICAgIE00T1NBX0NoYXIqIHBJYnVmZmVyOworCisgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldE1pbkFsbG9jYXRpb25TaXplXHRcdE00T1NBX1N0cmluZyAweCV4XHQiCisgICAgICAgICJNNE9TQV9JbnQzMiAlZCIsIHN0cl9pbiwgdWkzMl9uZXdzaXplKTsKKworICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldEludDMyIik7CisgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0SW50MzIiKTsKKworICAgIHVpMzJfc2l6ZSA9IHBTdHItPnVpMzJfc2l6ZTsKKyAgICBwSWJ1ZmZlciA9IHBTdHItPnB1aThfYnVmZmVyOworCisgICAgaWYodWkzMl9uZXdzaXplID4gdWkzMl9zaXplKQorICAgIHsKKyAgICAgICAgdWkzMl9zaXplID0gdWkzMl9uZXdzaXplICsgKCg0IC0gKHVpMzJfbmV3c2l6ZSAlIDQpKSAlIDQpOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KKyAgICBwQnVmZmVyID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh1aTMyX3NpemUgKiBzaXplb2YoTTRPU0FfQ2hhciksCisgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJTZXRNaW5BbGxvY2F0aW9uU2l6ZSIpOworCisgICAgTTRPU0FfQ0hFQ0tfTUFMTE9DKHBCdWZmZXIsICJNNE9TQV9zdHJTZXRNaW5BbGxvY2F0aW9uU2l6ZSIpOworCisgICAgaWYocElidWZmZXIgIT0gTTRPU0FfTlVMTCkKKyAgICB7CisgICAgICAgIE00T1NBX21lbWNweShwQnVmZmVyLCBwSWJ1ZmZlciwgcFN0ci0+dWkzMl9sZW5ndGgrMSk7CisKKyAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBJYnVmZmVyKTsKKyAgICB9CisKKyAgICBwU3RyLT5wdWk4X2J1ZmZlciA9IHBCdWZmZXI7CisKKyAgICBwU3RyLT51aTMyX3NpemUgPSB1aTMyX3NpemU7CisKKyAgICByZXR1cm4gTTROT19FUlJPUjsKK30KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU3RyaW5nX3ByaXYuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1N0cmluZ19wcml2LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDdjZWYzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1N0cmluZ19wcml2LmMKQEAgLTAsMCArMSwxMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgIE00T1NBX1N0cmluZ19wcml2LmMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgorI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisjaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKKyNpbmNsdWRlICJNNE9TQV9TdHJpbmdfcHJpdi5oIgorI2luY2x1ZGUgIk00T1NBX1N0cmluZy5oIgorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgYSBzdHJpbmcgYnVmZmVyIGJ5IGEgbmV3ICJDLVN0cmluZyIKKyAqICAgICAgICAgICAgIGFuZCBtYW5hZ2UgbWVtb3J5IGlmIG5lZWRlZAorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIHBzdHJfc3JjCisgKiBAcGFyYW0gICAgICBwYWNfaW4KKyAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK000T1NBX0VSUiBNNE9TQV9zdHJQcml2UmVhbGxvYyhNNE9TQV9zdHJTdHJ1Y3QqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgpCit7CisgICBNNE9TQV9VSW50MzIgdWkzMl9zaXplOworICAgTTRPU0FfQ2hhciogYnVmZmVyOworCisgICBNNE9TQV9UUkFDRTJfMigiTTRPU0Ffc3RyUHJpdlJlYWxsb2NcdFx0TTRPU0Ffc3RyU3RydWN0KiAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0FfVUludDMyKiAlZCIsIHN0ciwgdWkzMl9sZW5ndGgpOworCisgICB1aTMyX3NpemUgPSBzdHItPnVpMzJfc2l6ZTsKKworICAgLyogUmVhbGxvYyBpZiBzaXplIGlzIG5vdCBzdWZmaWNpZW50IHRvIGNvbnRhaW4gaXQgZW50aXJlbHkgKi8KKyAgIGlmKHVpMzJfbGVuZ3RoID49IHVpMzJfc2l6ZSkKKyAgIHsKKyAgICAgIGlmKHVpMzJfc2l6ZSA9PSAwKQorICAgICAgeworICAgICAgICAgdWkzMl9zaXplID0gMTY7CisgICAgICB9CisKKyAgICAgIHdoaWxlKHVpMzJfbGVuZ3RoID49IHVpMzJfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgIHVpMzJfc2l6ZSA8PD0gMTsKKyAgICAgIH0KKworICAgICAgYnVmZmVyID0gc3RyLT5wdWk4X2J1ZmZlcjsKKworICAgICAgaWYoYnVmZmVyICE9IE00T1NBX05VTEwpCisgICAgICB7CisgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYnVmZmVyKTsKKyAgICAgIH0KKworICAgICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBNNE9TQV9TdHJpbmcgY29udGVudCAqLworICAgICAgYnVmZmVyID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh1aTMyX3NpemUgKiBzaXplb2YoTTRPU0FfQ2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU1RSSU5HLCAoTTRPU0FfQ2hhciopIk00T1NBX3N0clByaXZSZWFsbG9jIik7CisKKyAgICAgIC8qIENoZWNrIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yICovCisgICAgICBpZihidWZmZXIgPT0gTTRPU0FfTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc3RyUHJpdlJlYWxsb2MiKTsKKworICAgICAgICAgc3RyLT5wdWk4X2J1ZmZlciA9IE00T1NBX05VTEw7CisgICAgICAgICBzdHItPnVpMzJfc2l6ZSA9IDA7CisgICAgICAgICBzdHItPnVpMzJfbGVuZ3RoID0gMDsKKworICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgICAgfQorCisgICAgICBzdHItPnB1aThfYnVmZmVyID0gYnVmZmVyOworICAgICAgc3RyLT51aTMyX3NpemUgPSB1aTMyX3NpemU7CisgICB9CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgYSBzdHJpbmcgYnVmZmVyIGJ5IGEgbmV3ICJDLVN0cmluZyIKKyAqICAgICAgICAgICAgIGFuZCBtYW5hZ2UgbWVtb3J5IGlmIG5lZWRlZAorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIHBzdHJfc3JjCisgKiBAcGFyYW0gICAgICBwYWNfaW4KKyAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK000T1NBX0VSUiBNNE9TQV9zdHJQcml2UmVhbGxvY0NvcHkoTTRPU0Ffc3RyU3RydWN0KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aCkKK3sKKyAgIE00T1NBX1VJbnQzMiB1aTMyX3NpemU7CisgICBNNE9TQV9DaGFyKiBidWZmZXI7CisgICBNNE9TQV9DaGFyKiBwdWk4X2J1ZmZlcjsKKworICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX3N0clByaXZSZWFsbG9jQ29weVx0XHRNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdCIKKyAgICAgICAgICAgICAgICAgICJNNE9TQV9VSW50MzIqICVkIiwgc3RyLCB1aTMyX2xlbmd0aCk7CisKKworICAgdWkzMl9zaXplID0gc3RyLT51aTMyX3NpemU7CisKKyAgIC8qIFJlYWxsb2MgaWYgc2l6ZSBpcyBub3Qgc3VmZmljaWVudCB0byBjb250YWluIGl0IGVudGlyZWx5ICovCisgICBpZih1aTMyX2xlbmd0aCA+PSB1aTMyX3NpemUpCisgICB7CisgICAgICBpZih1aTMyX3NpemUgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIHVpMzJfc2l6ZSA9IDE2OworICAgICAgfQorCisgICAgICB3aGlsZSh1aTMyX2xlbmd0aCA+PSB1aTMyX3NpemUpCisgICAgICB7CisgICAgICAgICB1aTMyX3NpemUgPDw9IDE7CisgICAgICB9CisKKyAgICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KKyAgICAgIGJ1ZmZlciA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModWkzMl9zaXplICogc2l6ZW9mKE00T1NBX0NoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2UmVhbGxvY0NvcHkiKTsKKworICAgICAgLyogQ2hlY2sgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgKi8KKyAgICAgIGlmKGJ1ZmZlciA9PSBNNE9TQV9OVUxMKQorICAgICAgeworICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zdHJQcml2UmVhbGxvY0NvcHkiKTsKKworICAgICAgICAgc3RyLT5wdWk4X2J1ZmZlciA9IE00T1NBX05VTEw7CisgICAgICAgICBzdHItPnVpMzJfc2l6ZSA9IDA7CisgICAgICAgICBzdHItPnVpMzJfbGVuZ3RoID0gMDsKKworICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgICAgfQorCisgICAgICBwdWk4X2J1ZmZlciA9IHN0ci0+cHVpOF9idWZmZXI7CisKKyAgICAgIGlmKHB1aThfYnVmZmVyICE9IE00T1NBX05VTEwpCisgICAgICB7CisgICAgICAgICBNNE9TQV9tZW1jcHkoYnVmZmVyLCBwdWk4X2J1ZmZlciwgc3RyLT51aTMyX2xlbmd0aCArIDEpOworCisgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcHVpOF9idWZmZXIpOworICAgICAgfQorCisgICAgICBzdHItPnB1aThfYnVmZmVyID0gYnVmZmVyOworICAgICAgc3RyLT51aTMyX3NpemUgPSB1aTMyX3NpemU7CisgICB9CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKK000T1NBX0VSUiBNNE9TQV9zdHJQcml2RHVwbGljYXRlKE00T1NBX3N0clN0cnVjdCoqIG9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqIGlzdHIpCit7CisgICBNNE9TQV9zdHJTdHJ1Y3QqIHN0cjsKKyAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX3N0clByaXZEdXBsaWNhdGVcdFx0TTRPU0Ffc3RyU3RydWN0KiogMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clN0cnVjdCoqIDB4JXgiLCBvc3RyLCBpc3RyKTsKKworICAgLyogQWxsb2NhdGUgdGhlIG91dHB1dCBNNE9TQV9TdHJpbmcgKi8KKyAgIHN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKU00T1NBX21hbGxvYyhzaXplb2YoTTRPU0Ffc3RyU3RydWN0KSwgTTRPU0FfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2RHVwbGljYXRlOiBvdXRwdXQgc3RyaW5nIik7CisKKyAgIC8qIENoZWNrIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yICovCisgICBpZihzdHIgPT0gTTRPU0FfTlVMTCkKKyAgIHsKKyAgICAgICpvc3RyID0gTTRPU0FfTlVMTCA7CisKKyAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZSIpOworCisgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisgICB9CisKKyAgIHN0ci0+Y29yZUlEID0gTTRPU0FfU1RSSU5HOworICAgc3RyLT5wdWk4X2J1ZmZlciA9IE00T1NBX05VTEw7CisgICBzdHItPnVpMzJfbGVuZ3RoID0gMDsKKyAgIHN0ci0+dWkzMl9zaXplID0gMDsKKworICAgZXJyX2NvZGUgPSAgTTRPU0Ffc3RyUHJpdlNldChzdHIsIGlzdHItPnB1aThfYnVmZmVyLCBpc3RyLT51aTMyX2xlbmd0aCk7CisKKyAgIGlmKGVycl9jb2RlICE9IE00Tk9fRVJST1IpCisgICB7CisgICAgICByZXR1cm4gZXJyX2NvZGU7CisgICB9CisKKyAgICpvc3RyID0gc3RyOworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGEgc3RyaW5nIGJ1ZmZlciBieSBhIG5ldyAiQy1TdHJpbmciCisgKiAgICAgICAgICAgICBhbmQgbWFuYWdlIG1lbW9yeSBpZiBuZWVkZWQKKyAqIEBub3RlCisgKiBAcGFyYW0gICAgICBwc3RyX3NyYworICogQHBhcmFtICAgICAgcGFjX2luCisgKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV9zdHJQcml2U2V0KE00T1NBX3N0clN0cnVjdCogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgpCit7CisgICBNNE9TQV9VSW50MzIgbGVuZ3RoOworICAgTTRPU0FfQ2hhciogYnVmZmVyOworCisgICBNNE9TQV9UUkFDRTJfMygiTTRPU0Ffc3RyUHJpdlNldFx0XHRNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdE00T1NBX0NoYXIqICIKKyAgICAgICAgICAgICAgICAgICIweCV4XHRNNE9TQV9VSW50MzIgJWQiLCBzdHIsIHBjaGFyLCB1aTMyX2xlbmd0aCk7CisKKyAgIGlmKHVpMzJfbGVuZ3RoICE9IDApCisgICB7CisgICAgICBsZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocGNoYXIpOworCisgICAgICBpZihsZW5ndGggPCB1aTMyX2xlbmd0aCkKKyAgICAgIHsKKyAgICAgICAgIHVpMzJfbGVuZ3RoID0gbGVuZ3RoOworICAgICAgfQorCisgICAgICBpZihNNE9TQV9zdHJQcml2UmVhbGxvYyhzdHIsIHVpMzJfbGVuZ3RoKSAhPSBNNE5PX0VSUk9SKQorICAgICAgeworICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zdHJQcml2U2V0Iik7CisKKyAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKKyAgICAgIH0KKworICAgICAgYnVmZmVyID0gc3RyLT5wdWk4X2J1ZmZlcjsKKworICAgICAgLyogRmlsbCB0aGUgYWN0dWFsIE00T1NBX1N0cmluZyBjb250ZW50ICovCisgICAgICBNNE9TQV9tZW1jcHkoYnVmZmVyLCBwY2hhciwgdWkzMl9sZW5ndGgpOworCisgICAgICBidWZmZXJbdWkzMl9sZW5ndGhdID0gJ1wwJzsKKyAgIH0KKyAgIGVsc2UgaWYoc3RyLT5wdWk4X2J1ZmZlciAhPSBNNE9TQV9OVUxMKQorICAgeworICAgICAgc3RyLT5wdWk4X2J1ZmZlclswXSA9ICdcMCc7CisgICB9CisKKyAgIHN0ci0+dWkzMl9sZW5ndGggPSB1aTMyX2xlbmd0aDsKKworICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhIHN0cmluZyBidWZmZXIgYnkgYSBuZXcgIkMtU3RyaW5nIgorICogICAgICAgICAgICAgYW5kIG1hbmFnZSBtZW1vcnkgaWYgbmVlZGVkCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgcHN0cl9zcmMKKyAqIEBwYXJhbSAgICAgIHBhY19pbgorICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9JbnQzMiBNNE9TQV9zdHJQcml2RmluZExhc3RTdWJTdHIoTTRPU0Ffc3RyU3RydWN0KiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0clN0cnVjdCogc3RyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9wb3MpCit7CisgICBNNE9TQV9DaGFyICpwY2hhcjsKKyAgIE00T1NBX0NoYXIgKmJ1ZmZlcjE7CisgICBNNE9TQV9DaGFyICpidWZmZXIyOworICAgTTRPU0FfSW50MzIgaTMyX3Jlc3VsdDsKKyAgIE00T1NBX1VJbnQzMiBsZW5ndGgxLCBsZW5ndGgyOworICAgTTRPU0FfSW50MzIgZGlzdDsKKworICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX3N0clByaXZGaW5kTGFzdFN1YlN0clx0XHRNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdCIKKyAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCisgICAgICAgICAgICAgICAgICBzdHIxLCBzdHIyLCB1aTMyX3Bvcyk7CisKKyAgIGxlbmd0aDEgPSBzdHIxLT51aTMyX2xlbmd0aDsKKyAgIGxlbmd0aDIgPSBzdHIyLT51aTMyX2xlbmd0aDsKKworICAgaWYoKGxlbmd0aDEgPT0gMCkgfHwgKGxlbmd0aDIgPT0gMCkpCisgICB7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIGJ1ZmZlcjEgPSBzdHIxLT5wdWk4X2J1ZmZlcjsKKyAgIGJ1ZmZlcjIgPSBzdHIyLT5wdWk4X2J1ZmZlcjsKKworICAgZGlzdCA9IGxlbmd0aDEgLSBsZW5ndGgyOworCisgICBpZihkaXN0IDwgMCkKKyAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgaWYoKE00T1NBX0ludDMyKXVpMzJfcG9zID4gZGlzdCkKKyAgIHsKKyAgICAgIHVpMzJfcG9zID0gZGlzdDsKKyAgIH0KKworICAgZm9yKHBjaGFyID0gYnVmZmVyMSArIHVpMzJfcG9zOyBwY2hhciAhPSBidWZmZXIxOyBwY2hhci0tKQorICAgeworICAgICAgTTRPU0FfY2hyTkNvbXBhcmUocGNoYXIsIGJ1ZmZlcjIsIGxlbmd0aDIsICZpMzJfcmVzdWx0KTsKKworICAgICAgaWYoaTMyX3Jlc3VsdCA9PSAwKQorICAgICAgeworICAgICAgICAgcmV0dXJuIHBjaGFyIC0gYnVmZmVyMTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIC0xOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgYSBzdHJpbmcgYnVmZmVyIGJ5IGEgbmV3ICJDLVN0cmluZyIKKyAqICAgICAgICAgICAgIGFuZCBtYW5hZ2UgbWVtb3J5IGlmIG5lZWRlZAorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIHBzdHJfc3JjCisgKiBAcGFyYW0gICAgICBwYWNfaW4KKyAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK000T1NBX0VSUiBNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0cihNNE9TQV9zdHJTdHJ1Y3QqIGlzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBvbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIG5idWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBubGVuZ3RoKQoreworICAgTTRPU0FfQ2hhciogYnVmZmVyOworICAgTTRPU0FfQ2hhciogaWJ1ZmZlcjsKKyAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aCwgdWkzMl9zaXplLCB1aTMyX2xlbmQsIHVpMzJfcG9zbywgdWkzMl9wb3NuOworCisgICBNNE9TQV9UUkFDRTJfNSgiTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHJcdFx0TTRPU0Ffc3RyU3RydWN0KiAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0FfVUludDMyICVkXHRNNE9TQV9VSW50MzIgJWRcdE00T1NBX0NoYXIqIDB4JXhcdCIKKyAgICAgICAgICAgICAgICAgICJNNE9TQV9VSW50MzIgJWQiLCBpc3RyLCB1aTMyX3Bvcywgb2xlbmd0aCwgbmJ1ZmYsIG5sZW5ndGgpOworCisgICB1aTMyX2xlbmd0aCA9IGlzdHItPnVpMzJfbGVuZ3RoIC0gb2xlbmd0aCArIG5sZW5ndGg7CisKKyAgIGlidWZmZXIgPSBpc3RyLT5wdWk4X2J1ZmZlcjsKKworICAgLyogc3RyaW5nIHRvIHJlcGxhY2UgaGFzIHRoZSBzYW1lIHRoaXMgdGhhdCBuZXcgc3RyaW5nICovCisgICBpZihubGVuZ3RoID09IG9sZW5ndGgpCisgICB7CisgICAgICBpZihubGVuZ3RoID09IDApCisgICAgICB7CisgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgICAgIH0KKworICAgICAgTTRPU0FfbWVtY3B5KGlidWZmZXIgKyB1aTMyX3BvcywgbmJ1ZmYsIG5sZW5ndGgpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgdWkzMl9sZW5kID0gaXN0ci0+dWkzMl9sZW5ndGggLSB1aTMyX3BvcyAtIG9sZW5ndGg7CisgICAgICB1aTMyX3Bvc28gPSB1aTMyX3BvcyArIG9sZW5ndGg7CisgICAgICB1aTMyX3Bvc24gPSB1aTMyX3BvcyArIG5sZW5ndGg7CisKKyAgICAgIC8qIHN0cmluZyB0byByZXBsYWNlIGlzIGJpZ2dlciB0aGF0IG5ldyBzdHJpbmcgKi8KKyAgICAgIGlmKG5sZW5ndGggPCBvbGVuZ3RoKQorICAgICAgeworICAgICAgICAgaWYobmxlbmd0aCA+IDApCisgICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9tZW1jcHkoaWJ1ZmZlciArIHVpMzJfcG9zLCBuYnVmZiwgbmxlbmd0aCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmKChvbGVuZ3RoIC0gbmxlbmd0aCkgPj0gdWkzMl9sZW5kKQorICAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGlidWZmZXIgKyB1aTMyX3Bvc24sIGlidWZmZXIgKyB1aTMyX3Bvc28sIHVpMzJfbGVuZCk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBidWZmZXIgPSAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKHVpMzJfbGVuZCAqIHNpemVvZihNNE9TQV9DaGFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU1RSSU5HLCAoTTRPU0FfQ2hhciopIk00T1NBX3N0clByaXZTZXRBbmRSZXBsZWNlU3RyIik7CisKKyAgICAgICAgICAgIE00T1NBX0NIRUNLX01BTExPQyhidWZmZXIsICJNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0ciIpOworICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGJ1ZmZlciwgaWJ1ZmZlciArIHVpMzJfcG9zbywgdWkzMl9sZW5kKTsKKyAgICAgICAgICAgIE00T1NBX21lbWNweShpYnVmZmVyICsgdWkzMl9wb3NuLCBidWZmZXIsIHVpMzJfbGVuZCk7CisgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYnVmZmVyKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIHN0cmluZyB0byByZXBsYWNlIGlzIHNtYWxsZXIgdGhhdCBuZXcgc3RyaW5nICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB1aTMyX3NpemUgPSBpc3RyLT51aTMyX3NpemU7CisKKyAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGluIGlzdHIgKi8KKyAgICAgICAgIGlmKHVpMzJfbGVuZ3RoID49IHVpMzJfc2l6ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHVpMzJfc2l6ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdWkzMl9zaXplID0gMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlKHVpMzJfbGVuZ3RoID49IHVpMzJfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHVpMzJfc2l6ZSA8PD0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh1aTMyX3NpemUgKiBzaXplb2YoTTRPU0FfQ2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0ciIpOworCisgICAgICAgICAgICBNNE9TQV9DSEVDS19NQUxMT0MoYnVmZmVyLCAiTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIiKTsKKworICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGJ1ZmZlciwgaWJ1ZmZlciwgdWkzMl9wb3MpOworCisgICAgICAgICAgICBNNE9TQV9tZW1jcHkoYnVmZmVyICsgdWkzMl9wb3MsIG5idWZmLCBubGVuZ3RoKTsKKworICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGJ1ZmZlciArIHVpMzJfcG9zbiwgaWJ1ZmZlciArIHVpMzJfcG9zbywgdWkzMl9sZW5kKTsKKworICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWlidWZmZXIpOworCisgICAgICAgICAgICBpc3RyLT5wdWk4X2J1ZmZlciA9IGJ1ZmZlcjsKKworICAgICAgICAgICAgaXN0ci0+dWkzMl9zaXplID0gdWkzMl9zaXplOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgYnVmZmVyID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh1aTMyX2xlbmQgKiBzaXplb2YoTTRPU0FfQ2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0ciIpOworCisgICAgICAgICAgICBNNE9TQV9DSEVDS19NQUxMT0MoYnVmZmVyLCAiTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIiKTsKKworICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGJ1ZmZlciwgaWJ1ZmZlciArIHVpMzJfcG9zbywgdWkzMl9sZW5kKTsKKworICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGlidWZmZXIgKyB1aTMyX3BvcywgbmJ1ZmYsIG5sZW5ndGgpOworCisgICAgICAgICAgICBNNE9TQV9tZW1jcHkoaWJ1ZmZlciArIHVpMzJfcG9zbiwgYnVmZmVyLCB1aTMyX2xlbmQpOworCisgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYnVmZmVyKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworCisgICBpc3RyLT5wdWk4X2J1ZmZlclt1aTMyX2xlbmd0aF0gPSAnXDAnOworCisgICBpc3RyLT51aTMyX2xlbmd0aCA9IHVpMzJfbGVuZ3RoOworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGEgc3RyaW5nIGJ1ZmZlciBieSBhIG5ldyAiQy1TdHJpbmciCisgKiAgICAgICAgICAgICBhbmQgbWFuYWdlIG1lbW9yeSBpZiBuZWVkZWQKKyAqIEBub3RlCisgKiBAcGFyYW0gICAgICBwc3RyX3NyYworICogQHBhcmFtICAgICAgcGFjX2luCisgKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitNNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlJlcGxhY2VTYW1lU2l6ZVN0cihNNE9TQV9zdHJTdHJ1Y3QqIGlzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqIG9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqIG5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJNb2RlIG1vZGUpCit7CisgICBNNE9TQV9DaGFyKiBpYnVmZmVyOworICAgTTRPU0FfQ2hhciogb2J1ZmZlcjsKKyAgIE00T1NBX0NoYXIqIG5idWZmZXI7CisgICBNNE9TQV9DaGFyKiBwdHI7CisgICBNNE9TQV9VSW50MzIgaWxlbmd0aCwgbmxlbmd0aDsKKyAgIE00T1NBX0ludDMyIGkzMl9wb3M7CisgICBNNE9TQV9FUlIgZXJyX2NvZGU7CisKKyAgIE00T1NBX1RSQUNFMl80KCJNNE9TQV9zdHJQcml2UmVwbGFjZVNhbWVTaXplU3RyXHRcdE00T1NBX3N0clN0cnVjdCogMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clN0cnVjdCogMHgleFx0TTRPU0Ffc3RyU3RydWN0KiAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyTW9kZSAlZCIsIGlzdHIsIG9zdHIsIG5zdHIsIG1vZGUpOworCisgICBpYnVmZmVyID0gaXN0ci0+cHVpOF9idWZmZXI7CisgICBvYnVmZmVyID0gb3N0ci0+cHVpOF9idWZmZXI7CisgICBuYnVmZmVyID0gbnN0ci0+cHVpOF9idWZmZXI7CisKKyAgIGlsZW5ndGggPSBpc3RyLT51aTMyX2xlbmd0aDsKKyAgIG5sZW5ndGggPSBuc3RyLT51aTMyX2xlbmd0aDsKKworICAgaWYobW9kZSAhPSBNNE9TQV9rc3RyRW5kKQorICAgeworICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJGaW5kUGF0dGVybihpYnVmZmVyLCBvYnVmZmVyLCAmcHRyKTsKKworICAgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSksIGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJQcml2UmVwbGFjZVNhbWVTaXplU3RyIik7CisKKyAgICAgIGlmKGVycl9jb2RlID09IE00V0FSX0NIUl9OT1RfRk9VTkQpCisgICAgICB7CisgICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKKyAgICAgIH0KKworICAgICAgaWYobW9kZSA9PSBNNE9TQV9rc3RyQWxsKQorICAgICAgeworICAgICAgICAgZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX21lbWNweShwdHIsIG5idWZmZXIsIG5sZW5ndGgpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NockZpbmRQYXR0ZXJuKHB0citubGVuZ3RoLCBvYnVmZmVyLCAmcHRyKTsKKworICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSksIGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJQcml2UmVwbGFjZVNhbWVTaXplU3RyIik7CisKKyAgICAgICAgIH0gd2hpbGUoZXJyX2NvZGUgIT0gTTRXQVJfQ0hSX05PVF9GT1VORCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBNNE9TQV9tZW1jcHkocHRyLCBuYnVmZmVyLCBubGVuZ3RoKTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGkzMl9wb3MgPSBNNE9TQV9zdHJQcml2RmluZExhc3RTdWJTdHIoaXN0ciwgb3N0ciwgaWxlbmd0aC0xKTsKKworICAgICAgaWYoaTMyX3BvcyA8IDApCisgICAgICB7CisgICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKKyAgICAgIH0KKworICAgICAgTTRPU0FfbWVtY3B5KGlidWZmZXIgKyBpMzJfcG9zLCBuYnVmZmVyLCBubGVuZ3RoKTsKKyAgIH0KKworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGEgc3RyaW5nIGJ1ZmZlciBieSBhIG5ldyAiQy1TdHJpbmciCisgKiAgICAgICAgICAgICBhbmQgbWFuYWdlIG1lbW9yeSBpZiBuZWVkZWQKKyAqIEBub3RlCisgKiBAcGFyYW0gICAgICBwc3RyX3NyYworICogQHBhcmFtICAgICAgcGFjX2luCisgKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitNNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlJlcGxhY2VTbWFsbGVyU3RyKE00T1NBX3N0clN0cnVjdCogaXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqIG5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck1vZGUgbW9kZSkKK3sKKyAgIE00T1NBX0NoYXIqIGlidWZmZXI7CisgICBNNE9TQV9DaGFyKiBvYnVmZmVyOworICAgTTRPU0FfQ2hhciogbmJ1ZmZlcjsKKyAgIE00T1NBX0NoYXIqIGJ1ZmZlcjsKKyAgIE00T1NBX0NoYXIqIHB0cl9zcmM7CisgICBNNE9TQV9DaGFyKiBwdHJfZGVzdDsKKyAgIE00T1NBX1VJbnQzMiBpbGVuZ3RoLCBubGVuZ3RoLCBvbGVuZ3RoLCBzaXplLCBsZW5ndGg7CisgICBNNE9TQV9JbnQzMiBpMzJfcG9zOworICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisgICBNNE9TQV9UUkFDRTJfNCgiTTRPU0Ffc3RyUHJpdlJlcGxhY2VTbWFsbGVyU3RyXHRcdE00T1NBX3N0clN0cnVjdCogMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clN0cnVjdCogMHgleFx0TTRPU0Ffc3RyU3RydWN0KiAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyTW9kZSAlZCIsIGlzdHIsIG9zdHIsIG5zdHIsIG1vZGUpOworCisgICBpYnVmZmVyID0gaXN0ci0+cHVpOF9idWZmZXI7CisgICBvYnVmZmVyID0gb3N0ci0+cHVpOF9idWZmZXI7CisgICBuYnVmZmVyID0gbnN0ci0+cHVpOF9idWZmZXI7CisKKyAgIGlsZW5ndGggPSBpc3RyLT51aTMyX2xlbmd0aDsKKyAgIG9sZW5ndGggPSBvc3RyLT51aTMyX2xlbmd0aDsKKyAgIG5sZW5ndGggPSBuc3RyLT51aTMyX2xlbmd0aDsKKworICAgbGVuZ3RoID0gaWxlbmd0aDsKKworICAgaWYobW9kZSA9PSBNNE9TQV9rc3RyQWxsKQorICAgeworICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJGaW5kUGF0dGVybihpYnVmZmVyLCBvYnVmZmVyLCAmcHRyX3NyYyk7CisKKyAgICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpLCBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyUHJpdlJlcGxhY2VTYW1lU2l6ZVN0ciIpOworCisgICAgICBpZihlcnJfY29kZSA9PSBNNFdBUl9DSFJfTk9UX0ZPVU5EKQorICAgICAgeworICAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7CisgICAgICB9CisKKyAgICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KKyAgICAgIGJ1ZmZlciA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2MoaXN0ci0+dWkzMl9zaXplICogc2l6ZW9mKE00T1NBX0NoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2UmVwbGFjZVNtYWxsZXJTdHIiKTsKKworICAgICAgTTRPU0FfQ0hFQ0tfTUFMTE9DKGJ1ZmZlciwgIk00T1NBX3N0clByaXZSZXBsYWNlU21hbGxlclN0ciIpOworCisgICAgICBwdHJfZGVzdCA9IGJ1ZmZlcjsKKworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgIHNpemUgPSAoTTRPU0FfVUludDMyKXB0cl9zcmMgLSAoTTRPU0FfVUludDMyKWlidWZmZXI7CisKKyAgICAgICAgIGxlbmd0aCArPSAobmxlbmd0aCAtIG9sZW5ndGgpOworCisgICAgICAgICBNNE9TQV9tZW1jcHkocHRyX2Rlc3QsIGlidWZmZXIsIHNpemUpOworCisgICAgICAgICBwdHJfZGVzdCArPSBzaXplOworCisgICAgICAgICBNNE9TQV9tZW1jcHkocHRyX2Rlc3QsIG5idWZmZXIsIG5sZW5ndGgpOworCisgICAgICAgICBwdHJfZGVzdCArPSBubGVuZ3RoOworCisgICAgICAgICBpYnVmZmVyICs9IChzaXplICsgb2xlbmd0aCk7CisKKyAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZFBhdHRlcm4oaWJ1ZmZlciwgb2J1ZmZlciwgJnB0cl9zcmMpOworCisgICAgICAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSwgZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clByaXZSZXBsYWNlU2FtZVNpemVTdHIiKTsKKworICAgICAgfSB3aGlsZShlcnJfY29kZSAhPSBNNFdBUl9DSFJfTk9UX0ZPVU5EKTsKKworICAgICAgc2l6ZSA9IGlsZW5ndGggLSAoTTRPU0FfVUludDMyKShpYnVmZmVyIC0gaXN0ci0+cHVpOF9idWZmZXIpOworCisgICAgICBNNE9TQV9tZW1jcHkocHRyX2Rlc3QsIGlidWZmZXIsIHNpemUpOworCisgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpaXN0ci0+cHVpOF9idWZmZXIpOworCisgICAgICBpc3RyLT51aTMyX2xlbmd0aCA9IGxlbmd0aCA7CisKKyAgICAgIGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKKworICAgICAgaXN0ci0+cHVpOF9idWZmZXIgPSBidWZmZXI7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZihtb2RlID09IE00T1NBX2tzdHJCZWdpbikKKyAgICAgIHsKKyAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZFBhdHRlcm4oaWJ1ZmZlciwgb2J1ZmZlciwgJnB0cl9zcmMpOworCisgICAgICAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSwgZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clByaXZSZXBsYWNlU2FtZVNpemVTdHIiKTsKKworICAgICAgICAgaWYoZXJyX2NvZGUgPT0gTTRXQVJfQ0hSX05PVF9GT1VORCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgICAgICAgfQorCisgICAgICAgICBpMzJfcG9zID0gKE00T1NBX1VJbnQzMilwdHJfc3JjIC0gKE00T1NBX1VJbnQzMilpYnVmZmVyOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaTMyX3BvcyA9IE00T1NBX3N0clByaXZGaW5kTGFzdFN1YlN0cihpc3RyLCBvc3RyLCBpbGVuZ3RoLTEpOworCisgICAgICAgICBpZihpMzJfcG9zID09IC0xKQorICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIoaXN0ciwgaTMyX3Bvcywgb2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJ1ZmZlciwgbmxlbmd0aCk7CisKKyAgICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCisgICAgICB7CisgICAgICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3N0clByaXZSZXBsYWNlU21hbGxlclN0ciIpOworCisgICAgICAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgYSBzdHJpbmcgYnVmZmVyIGJ5IGEgbmV3ICJDLVN0cmluZyIKKyAqICAgICAgICAgICAgIGFuZCBtYW5hZ2UgbWVtb3J5IGlmIG5lZWRlZAorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIHBzdHJfc3JjCisgKiBAcGFyYW0gICAgICBwYWNfaW4KKyAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK000T1NBX0VSUiBNNE9TQV9zdHJQcml2UmVwbGFjZUJpZ2dlclN0cihNNE9TQV9zdHJTdHJ1Y3QqIGlzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0clN0cnVjdCogbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJNb2RlIG1vZGUpCit7CisgICBNNE9TQV9DaGFyKiBpYnVmZmVyOworICAgTTRPU0FfQ2hhciogb2J1ZmZlcjsKKyAgIE00T1NBX0NoYXIqIG5idWZmZXI7CisgICBNNE9TQV9DaGFyKiBidWZmZXI7CisgICBNNE9TQV9DaGFyKiBwdHI7CisgICBNNE9TQV9VSW50MzIgaWxlbmd0aCwgbmxlbmd0aCwgb2xlbmd0aCwgbGVuZ3RoOworICAgTTRPU0FfSW50MzIgaTMyX3BvczsKKyAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgTTRPU0FfVFJBQ0UyXzQoIk00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyXHRcdE00T1NBX3N0clN0cnVjdCogMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clN0cnVjdCogMHgleFx0TTRPU0Ffc3RyU3RydWN0KiAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyTW9kZSAlZCIsIGlzdHIsIG9zdHIsIG5zdHIsIG1vZGUpOworCisgICBpYnVmZmVyID0gaXN0ci0+cHVpOF9idWZmZXI7CisgICBvYnVmZmVyID0gb3N0ci0+cHVpOF9idWZmZXI7CisgICBuYnVmZmVyID0gbnN0ci0+cHVpOF9idWZmZXI7CisKKyAgIGlsZW5ndGggPSBpc3RyLT51aTMyX2xlbmd0aDsKKyAgIG9sZW5ndGggPSBvc3RyLT51aTMyX2xlbmd0aDsKKyAgIG5sZW5ndGggPSBuc3RyLT51aTMyX2xlbmd0aDsKKworCisgICBpZihtb2RlID09IE00T1NBX2tzdHJBbGwpCisgICB7CisgICAgICBNNE9TQV9VSW50MzIgbj0wLCBpOworICAgICAgTTRPU0FfSW50MzIqIHBhdHRlcm5zOworICAgICAgTTRPU0FfVUludDMyIHBvcz0wLCBzaXplOworICAgICAgTTRPU0FfVUludDMyIG1heF9wYXR0ZXJuID0gaWxlbmd0aCAvIG9sZW5ndGg7CisgICAgICBNNE9TQV9VSW50MzIgdWkzMl9zaXplID0gaXN0ci0+dWkzMl9zaXplOworICAgICAgTTRPU0FfQ2hhciogc3JjOworICAgICAgTTRPU0FfQ2hhciogZGVzdDsKKworICAgICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBNNE9TQV9TdHJpbmcgY29udGVudCAqLworICAgICAgcGF0dGVybnMgPSAoTTRPU0FfSW50MzIqKU00T1NBX21hbGxvYyhtYXhfcGF0dGVybiAqIHNpemVvZihNNE9TQV9VSW50MzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU1RSSU5HLCAoTTRPU0FfQ2hhciopIk00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyIik7CisKKyAgICAgIE00T1NBX0NIRUNLX01BTExPQyhwYXR0ZXJucywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2UmVwbGFjZUJpZ2dlclN0ciIpOworCisKKyAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZFBhdHRlcm4oaWJ1ZmZlciwgb2J1ZmZlciwgJnB0cik7CisKKyAgICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpLCBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyUHJpdlJlcGxhY2VCaWdnZXJTdHIiKTsKKworICAgICAgaWYoZXJyX2NvZGUgPT0gTTRXQVJfQ0hSX05PVF9GT1VORCkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgICAgfQorCisgICAgICBkbworICAgICAgeworICAgICAgICAgcGF0dGVybnNbbl0gPSAoTTRPU0FfVUludDMyKXB0ciAtIChNNE9TQV9VSW50MzIpaWJ1ZmZlcjsKKworICAgICAgICAgbisrOworCisgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NockZpbmRQYXR0ZXJuKHB0ciArIG9sZW5ndGgsIG9idWZmZXIsICZwdHIpOworCisgICAgICAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSwgZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyIik7CisKKyAgICAgIH0gd2hpbGUoZXJyX2NvZGUgIT0gTTRXQVJfQ0hSX05PVF9GT1VORCk7CisKKyAgICAgIGxlbmd0aCA9IGlsZW5ndGggLSAobiAqIG9sZW5ndGgpICsgKG4gKiBubGVuZ3RoKTsKKworCisgICAgICBpZihsZW5ndGggPj0gdWkzMl9zaXplKQorICAgICAgeworICAgICAgICAgZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHVpMzJfc2l6ZSA8PD0gMTsKKworICAgICAgICAgfSB3aGlsZShsZW5ndGggPj0gdWkzMl9zaXplKTsKKyAgICAgIH0KKworICAgICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBNNE9TQV9TdHJpbmcgY29udGVudCAqLworICAgICAgYnVmZmVyID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh1aTMyX3NpemUgKiBzaXplb2YoTTRPU0FfQ2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU1RSSU5HLCAoTTRPU0FfQ2hhciopIk00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyIik7CisKKyAgICAgIE00T1NBX0NIRUNLX01BTExPQyhidWZmZXIsICJNNE9TQV9zdHJQcml2UmVwbGFjZUJpZ2dlclN0ciIpOworCisgICAgICBzcmMgPSBpYnVmZmVyOworICAgICAgZGVzdCA9IGJ1ZmZlcjsKKworICAgICAgZm9yKGk9MDsgaTxuOyBpKyspCisgICAgICB7CisgICAgICAgICBzaXplID0gcGF0dGVybnNbaV0gLSBwb3M7CisKKyAgICAgICAgIE00T1NBX21lbWNweShkZXN0LCBzcmMsIHNpemUpOworCisgICAgICAgICBwb3MgPSBwYXR0ZXJuc1tpXSArIG9sZW5ndGg7CisKKyAgICAgICAgIHNyYyA9IGlidWZmZXIgKyBwb3M7CisKKyAgICAgICAgIGRlc3QgKz0gc2l6ZTsKKworICAgICAgICAgTTRPU0FfbWVtY3B5KGRlc3QsIG5idWZmZXIsIG5sZW5ndGgpOworCisgICAgICAgICBkZXN0ICs9IG5sZW5ndGg7CisgICAgICB9CisKKyAgICAgIHNpemUgPSBpbGVuZ3RoIC0gKE00T1NBX1VJbnQzMikoc3JjIC0gaWJ1ZmZlcik7CisKKyAgICAgIE00T1NBX21lbWNweShkZXN0LCBzcmMsIHNpemUpOworCisgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcGF0dGVybnMpOworCisgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpaWJ1ZmZlcik7CisKKyAgICAgIGlzdHItPnVpMzJfbGVuZ3RoID0gbGVuZ3RoOworCisgICAgICBpc3RyLT5wdWk4X2J1ZmZlciA9IGJ1ZmZlcjsKKworICAgICAgaXN0ci0+cHVpOF9idWZmZXJbbGVuZ3RoXSA9ICdcMCc7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZihtb2RlID09IE00T1NBX2tzdHJCZWdpbikKKyAgICAgIHsKKyAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZFBhdHRlcm4oaWJ1ZmZlciwgb2J1ZmZlciwgJnB0cik7CisKKyAgICAgICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpLCBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyUHJpdlJlcGxhY2VTYW1lU2l6ZVN0ciIpOworCisgICAgICAgICBpZihlcnJfY29kZSA9PSBNNFdBUl9DSFJfTk9UX0ZPVU5EKQorICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7CisgICAgICAgICB9CisKKyAgICAgICAgIGkzMl9wb3MgPSAoTTRPU0FfVUludDMyKXB0ciAtIChNNE9TQV9VSW50MzIpaWJ1ZmZlcjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGkzMl9wb3MgPSBNNE9TQV9zdHJQcml2RmluZExhc3RTdWJTdHIoaXN0ciwgb3N0ciwgaWxlbmd0aC0xKTsKKworICAgICAgICAgaWYoaTMyX3BvcyA9PSAtMSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICBlcnJfY29kZSA9IE00T1NBX3N0clByaXZTZXRBbmRSZXBsZWNlU3RyKGlzdHIsIGkzMl9wb3MsIG9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5idWZmZXIsIG5sZW5ndGgpOworCisgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQorICAgICAgeworICAgICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV9zdHJQcml2UmVwbGFjZVNtYWxsZXJTdHIiKTsKKworICAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCitNNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlNQcmludGYoTTRPU0Ffc3RyU3RydWN0KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgbWFya2VyKQoreworICAgIE00T1NBX0NoYXIgKnRlbXA7CisgICAgTTRPU0FfQ2hhciAqcGVyY2VudFBvaW50ZXI7CisgICAgTTRPU0FfQ2hhciAqbmV3Rm9ybWF0OworICAgIE00T1NBX0NoYXIqIHN0ck91dCA9IHN0ci0+cHVpOF9idWZmZXIgKyBzdHItPnVpMzJfbGVuZ3RoOworICAgIE00T1NBX1VJbnQzMiBzdHJPdXRNYXhMZW4gPSBzdHItPnVpMzJfc2l6ZS0xOworICAgIE00T1NBX0ludDMyIG5ld0Zvcm1hdExlbmd0aCA9IDA7CisgICAgTTRPU0FfVUludDMyIGNvdW50X2xsID0gMDsKKyAgICBNNE9TQV9VSW50MzIgY291bnRfdG0gPSAwOworICAgIE00T1NBX1VJbnQzMiBjb3VudF9hYSA9IDA7CisgICAgTTRPU0FfVUludDMyIGNvdW50OworICAgIE00T1NBX1VJbnQzMiBuYkNoYXI7CisgICAgTTRPU0FfSW50MzIgIGlSZXN1bHQ7CisKKyAgICBNNE9TQV9JbnQzMiBlcnI7CisgICAgTTRPU0FfQ2hhciBmbGFnQ2hhcltdICAgICAgICAgICAgID0gIictKyAjMCI7CisgICAgTTRPU0FfQ2hhciB3aWR0aE9yUHJlY2lzaW9uQ2hhcltdID0gIiowMTIzNDU2Nzg5IjsKKyAgICBNNE9TQV9DaGFyIG90aGVyUHJlZml4Q2hhcltdICAgICAgPSAiaGxMIjsKKyAgICBNNE9TQV9DaGFyIGNvbnZlcnNpb25DaGFyW10gICAgICAgPSAiZGlvdXhYbmZlRWdHY0NzU3AlIjsKKworICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9zdHJTUHJpbnRmXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9DaGFyKiAweCV4IiwKKyAgICAgICAgc3RyLCBmb3JtYXQpOworCisKKyAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXWxsW2NvbnZlcnNpb25dICovCisgICAgdGVtcCA9IGZvcm1hdDsKKworICAgIHdoaWxlKCp0ZW1wKQorICAgIHsKKyAgICAgICAgLyogZ2V0IHRoZSBuZXh0IHBlcmNlbnQgY2hhcmFjdGVyICovCisgICAgICAgIGVyciA9IE00T1NBX2NockZpbmRDaGFyICh0ZW1wLCAnJScsICZwZXJjZW50UG9pbnRlcik7CisKKyAgICAgICAgaWYoKCFwZXJjZW50UG9pbnRlcikgfHwgKE00V0FSX0NIUl9OT1RfRk9VTkQgPT0gZXJyKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KKyAgICAgICAgfQorCisgICAgICAgIHRlbXAgPSBwZXJjZW50UG9pbnRlcisxOyAgICAgICAgICAgLyogc3BhbiBpdCAqLworICAgICAgICBpZighKnRlbXApIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogc3BhbiB0aGUgb3B0aW9uYWwgZmxhZ3MgKi8KKyAgICAgICAgTTRPU0FfY2hyU3Bhbihmb3JtYXQsIGNvbnZlcnNpb25DaGFyLCAmbmJDaGFyKTsKKyAgICAgICAgdGVtcCArPSBuYkNoYXI7CisKKyAgICAgICAgaWYoISp0ZW1wKSAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLworICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNwYW4gdGhlIG9wdGlvbmFsIHdpZHRoICovCisgICAgICAgIE00T1NBX2NoclNwYW4odGVtcCwgd2lkdGhPclByZWNpc2lvbkNoYXIsICZuYkNoYXIpOworICAgICAgICB0ZW1wICs9IG5iQ2hhcjsKKyAgICAgICAgaWYoISp0ZW1wKSAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLworICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCp0ZW1wPT0nLicpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNwYW4gdGhlIG9wdGlvbmFsIHByZWNpc2lvbiAqLworICAgICAgICAgICAgTTRPU0FfY2hyU3BhbigrK3RlbXAsIHdpZHRoT3JQcmVjaXNpb25DaGFyLCAmbmJDaGFyKTsKKyAgICAgICAgICAgIHRlbXAgKz0gbmJDaGFyOworICAgICAgICB9CisgICAgICAgIGlmKCEqdGVtcCkgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihNNE9TQV9jaHJMZW5ndGgodGVtcCk+PTIpCisgICAgICAgIHsKKworICAgICAgICAgICAgTTRPU0FfY2hyTkNvbXBhcmUodGVtcCwgKE00T1NBX0NoYXIqKSJsbCIsMiwgJmlSZXN1bHQpOworICAgICAgICAgICAgaWYgKGlSZXN1bHQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudF9sbCsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEkgZ290IE9ORSAqLworICAgICAgICAgICAgICAgIHRlbXAgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImxsIiBwcmVmaXggKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNE9TQV9jaHJOQ29tcGFyZSh0ZW1wLCAoTTRPU0FfQ2hhciopInRtIiwyLCAmaVJlc3VsdCk7CisgICAgICAgICAgICAgICAgaWYgKGlSZXN1bHQgIT0gMCkgLyog4CB2b2lyIHNpIGNlIG4nZXN0IHBhcyA9PSAwICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudF90bSsrOworICAgICAgICAgICAgICAgICAgICB0ZW1wICs9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNvbXBhcmUodGVtcCwgKE00T1NBX0NoYXIqKSJhYSIsMiwgJmlSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaVJlc3VsdCAhPSAwKSAvKiDgIHZvaXIgc2kgY2Ugbidlc3QgcGFzID09IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfYWErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc3BhbiB0aGUgb3RoZXIgb3B0aW9uYWwgcHJlZml4ICovCisgICAgICAgIE00T1NBX2NoclNwYW4odGVtcCwgb3RoZXJQcmVmaXhDaGFyLCAmbmJDaGFyKTsKKyAgICAgICAgdGVtcCArPSBuYkNoYXI7CisgICAgICAgIGlmKCEqdGVtcCkgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBNNE9TQV9jaHJTcGFuKHRlbXAsIGNvbnZlcnNpb25DaGFyLCAmbmJDaGFyKTsKKyAgICAgICAgdGVtcCArPSBuYkNoYXI7CisgICAgICAgIGlmKCEqdGVtcCkgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGNvdW50ID0gY291bnRfbGwgKyBjb3VudF90bSArIGNvdW50X2FhOworCisgICAgaWYoIWNvdW50KQorICAgIHsKKyAgICAgICAgZXJyID0gTTRPU0FfY2hyU1ByaW50ZihzdHJPdXQsc3RyT3V0TWF4TGVuLGZvcm1hdCxtYXJrZXIpOworCisgICAgICAgIGlmKE00RVJSX0NIUl9TVFJfT1ZFUkZMT1cgPT0gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RSX09WRVJGTE9XOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgfQorCisKKyAgICBuZXdGb3JtYXRMZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoZm9ybWF0KSArIDE7CisKKyNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECisjaWZkZWYgTTRPU0FfRklMRV9QT1NfNjRfQklUU19TVVBQT1JURUQKKyAgICBuZXdGb3JtYXRMZW5ndGggKz0gKGNvdW50X2xsK2NvdW50X3RtK2NvdW50X2FhKTsKKyNlbHNlCisgICAgbmV3Rm9ybWF0TGVuZ3RoICs9IChjb3VudF9sbCtjb3VudF90bS1jb3VudF9hYSk7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQgTTRPU0FfNjRCSVRTX05PVF9TVVBQT1JURUQKKyAgICBuZXdGb3JtYXRMZW5ndGggLT0gKGNvdW50X2xsK2NvdW50X3RtK2NvdW50X2FhKTsKKyNlbHNlCisgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKKyNlbmRpZgorCisgICAgbmV3Rm9ybWF0ID0oTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKG5ld0Zvcm1hdExlbmd0aCwKKyAgICAgICAgTTRPU0FfQ0hBUlNUQVIsIChNNE9TQV9DaGFyKikiTTRPU0FfY2hyUHJpbnRmOiBuZXdGb3JtYXQiKTsKKyAgICBpZihuZXdGb3JtYXQgPT0gTTRPU0FfTlVMTCkgcmV0dXJuIE00RVJSX0FMTE9DOworICAgIG5ld0Zvcm1hdFtuZXdGb3JtYXRMZW5ndGgtMV0gPSAnXDAnOworICAgIHRlbXAgPSBuZXdGb3JtYXQ7CisgICAgLyogY29weSBmb3JtYXQgdG8gbmV3Rm9ybWF0LCByZXBsYWNpbmcKKyAgICAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1sbFtjb252ZXJzaW9uXQorICAgIGJ5ICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXUk2NFtjb252ZXJzaW9uXSAqLworICAgIHdoaWxlKCpmb3JtYXQpCisgICAgeworICAgICAgICBNNE9TQV9jaHJTcGFuQ29tcGxlbWVudChmb3JtYXQsIChNNE9TQV9DaGFyKikiJSIsICZuYkNoYXIpOworICAgICAgICBpZihuYkNoYXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIE00T1NBX2Nock5Db3B5KHRlbXAsZm9ybWF0LG5iQ2hhcik7ICAgICAgLyogY29weSBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgJSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKKyAgICAgICAgICAgIHRlbXAgICArPW5iQ2hhcjsKKyAgICAgICAgfQorICAgICAgICBpZighKmZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKnRlbXArKyA9ICpmb3JtYXQrKzsgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlICUgY2hhcmFjdGVyICovCisKKyAgICAgICAgTTRPU0FfY2hyU3Bhbihmb3JtYXQsIGZsYWdDaGFyLCAmbmJDaGFyKTsKKyAgICAgICAgaWYobmJDaGFyKQorICAgICAgICB7CisgICAgICAgICAgICBNNE9TQV9jaHJOQ29weSh0ZW1wLGZvcm1hdCxuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIGZsYWcgY2hhcmFjdGVycyAqLworICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOworICAgICAgICAgICAgdGVtcCAgICs9bmJDaGFyOworICAgICAgICB9CisgICAgICAgIGlmKCEqZm9ybWF0KQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIE00T1NBX2NoclNwYW4oZm9ybWF0LCB3aWR0aE9yUHJlY2lzaW9uQ2hhciwgJm5iQ2hhcik7CisgICAgICAgIGlmKG5iQ2hhcikKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkodGVtcCxmb3JtYXQsbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSB3aWR0aCBjaGFyYWN0ZXJzICovCisgICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7CisgICAgICAgICAgICB0ZW1wICAgKz1uYkNoYXI7CisgICAgICAgIH0KKyAgICAgICAgaWYoISpmb3JtYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKCpmb3JtYXQ9PScuJykKKyAgICAgICAgeworICAgICAgICAgICAgKnRlbXArKyA9ICpmb3JtYXQrKzsgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIGRvdCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIGlmKCEqZm9ybWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNNE9TQV9jaHJTcGFuKGZvcm1hdCwgd2lkdGhPclByZWNpc2lvbkNoYXIsICZuYkNoYXIpOworICAgICAgICAgICAgaWYobmJDaGFyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00T1NBX2Nock5Db3B5KHRlbXAsZm9ybWF0LG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgd2lkdGggY2hhcmFjdGVycyAqLworICAgICAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKKyAgICAgICAgICAgICAgICB0ZW1wICAgKz1uYkNoYXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighKmZvcm1hdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihNNE9TQV9jaHJMZW5ndGgoZm9ybWF0KT49MikKKyAgICAgICAgeworCisgICAgICAgICAgICBNNE9TQV9jaHJOQ29tcGFyZShmb3JtYXQsIChNNE9TQV9DaGFyKikibGwiLDIsICZpUmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChpUmVzdWx0ICE9IDApCisgICAgICAgICAgICB7CisjaWZkZWYgTTRPU0FfNjRCSVRTX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICp0ZW1wKysgPSAnSSc7IC8qICVJNjQgKi8KKyAgICAgICAgICAgICAgICAqdGVtcCsrID0gJzYnOworICAgICAgICAgICAgICAgICp0ZW1wKysgPSAnNCc7CisjZWxzZQorICAgICAgICAgICAgICAgICp0ZW1wKysgPSAnbCc7IC8qICVsICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAibGwiIHByZWZpeCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00T1NBX2Nock5Db21wYXJlKGZvcm1hdCwgKE00T1NBX0NoYXIqKSJ0bSIsMiwgJmlSZXN1bHQpOworICAgICAgICAgICAgICAgIGlmIChpUmVzdWx0ICE9IDApCisgICAgICAgICAgICAgICAgeworI2lmZGVmIE00T1NBXzY0QklUU19TVVBQT1JURUQKKyAgICAgICAgICAgICAgICAqdGVtcCsrID0gJ0knOyAvKiAlSTY0ICovCisgICAgICAgICAgICAgICAgKnRlbXArKyA9ICc2JzsKKyAgICAgICAgICAgICAgICAqdGVtcCsrID0gJzQnOworI2Vsc2UKKyAgICAgICAgICAgICAgICAqdGVtcCsrID0gJ2wnOyAvKiAlbCAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgInRtIiBwcmVmaXggKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNvbXBhcmUoZm9ybWF0LCAoTTRPU0FfQ2hhciopImFhIiwyLCAmaVJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpUmVzdWx0ICE9IDApIC8qIOAgdm9pciBzaSBjZSBuJ2VzdCBwYXMgIT0gMCAqLworICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgTTRPU0FfNjRCSVRTX1NVUFBPUlRFRAorI2lmZGVmIE00T1NBX0ZJTEVfUE9TXzY0X0JJVFNfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcCsrID0gJ0knOyAvKiAlSTY0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcCsrID0gJzYnOworICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXArKyA9ICc0JzsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcCsrID0gJ2wnOworI2VuZGlmCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXArKyA9ICdsJzsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImFhIiBwcmVmaXggKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE00T1NBX2NoclNwYW4oZm9ybWF0LCBvdGhlclByZWZpeENoYXIsICZuYkNoYXIpOworCisgICAgICAgIGlmKG5iQ2hhcikKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkodGVtcCxmb3JtYXQsbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSBvdGhlciBQcmVmaXggKi8KKyAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKKyAgICAgICAgICAgIHRlbXAgICArPW5iQ2hhcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCEqZm9ybWF0KQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIE00T1NBX2NoclNwYW4oZm9ybWF0LCBjb252ZXJzaW9uQ2hhciwgJm5iQ2hhcik7CisgICAgICAgIGlmKG5iQ2hhcikKKyAgICAgICAgeworICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkodGVtcCxmb3JtYXQsbmJDaGFyKTsKKyAgICAgICAgICAgIGZvcm1hdCArPSBuYkNoYXI7CisgICAgICAgICAgICB0ZW1wICAgKz0gbmJDaGFyOworICAgICAgICB9CisKKyAgICAgICAgaWYoISpmb3JtYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICB9CisKKyAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKHN0ck91dCxzdHJPdXRNYXhMZW4sbmV3Rm9ybWF0LG1hcmtlcik7CisKKyAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiluZXdGb3JtYXQpOworCisgICBpZiAoTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVyA9PSBlcnIpCisgICB7CisgICAgICAgcmV0dXJuIE00RVJSX1NUUl9PVkVSRkxPVzsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9UaHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMDliODJjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKQEAgLTAsMCArMSw5NTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWQuYworICogQGluZ3JvdXAgICAgICBPU0FMCisgKiBAYnJpZWYgICAgICAgIEltcGxlbWVudHMgYW5kIG1hbmlwdWxhdGUgdGhyZWFkcworICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aHJlYWRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKKyNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKKyNpbmNsdWRlICJNNE9TQV9UaHJlYWQuaCIKKyNpbmNsdWRlICJNNE9TQV9UaHJlYWRfcHJpdi5oIgorI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCisjaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCisjaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKKworCit2b2lkKiBNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvKHZvaWQgKmNvbnRleHQpCit7CisgICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7CisgICBNNE9TQV9Cb29sIGF1dG9fa2lsbCA9IE00T1NBX0ZBTFNFOworCisgICAgLyoKKyAgICAgICBNNE9TQV9Wb2lkKiB1c2VyRGF0YTsKKyAgICAqLworCisgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEb1x0XHRMUFZPSUQgMHgleCIsIGNvbnRleHQpOworCisgICAgLyoKKyAgICAgICB1c2VyRGF0YSA9IHRocmVhZENvbnRleHQtPnVzZXJEYXRhOworICAgICovCisKKyAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOworCisgICAvKmlmKHRocmVhZENvbnRleHQtPnN0YXJ0Q2FsbEJhY2sgIT0gTTRPU0FfTlVMTCkKKyAgIHsKKyAgICAgIHRocmVhZENvbnRleHQtPnN0YXJ0Q2FsbEJhY2sodGhyZWFkQ29udGV4dCwgdXNlckRhdGEpOworICAgfSovCisKKyAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFJ1bm5pbmc7CisKKyAgIE00T1NBX3NlbWFwaG9yZVBvc3QodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKTsKKworICAgd2hpbGUodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCisgICB7CisgICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKKworICAgICAgaWYoKHRocmVhZENvbnRleHQtPmZ1bmModGhyZWFkQ29udGV4dC0+cGFyYW0pKSAhPSBNNE5PX0VSUk9SKQorICAgICAgeworICAgICAgICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7CisKKyAgICAgICAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlID09IE00T1NBX2tUaHJlYWRSdW5uaW5nKQorICAgICAgICAgeworCisgICAgICAgICAgICAvL1BSIDIzNTQgLSBBQ08gOiBTdXBwcmVzcyBzdG9wcGluZyBzdGF0ZSBhbmQgZG9uJ3QKKyAgICAgICAgICAgIC8vICAgICAgICAgdW5sb2NrIG11dGV4IGJlZm9yZSBjbG9zaW5nIHRoZSB0aHJlYWQKKyAgICAgICAgICAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKKyAgICAgICAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisKKyAgICAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOworICAgICAgfQorCisgICAgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKKyAgIH0KKworCisgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCk7CisKKworICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7CisKKworICAgcmV0dXJuIDA7Cit9CisKKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyB0aHJlYWQuIEFmdGVyIHRoaXMgY2FsbCB0aGUgdGhyZWFkIGlzCisgKiAgICAgICAgICAgICBpZGVudGlmaWVkIGJ5IGl0cyAiY29udGV4dCIuIFRoZSB0aHJlYWQgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYnkKKyAqICAgICAgICAgICAgIHRoZSAiZnVuYyIgcGFyYW1ldGVyLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgJiBhbGxvY2F0ZXMgYSB1bmlxdWUKKyAqICAgICAgICAgICAgIGNvbnRleHQuIEl0J3MgdGhlIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMKKyAqICAgICAgICAgICAgIGNvbnRleHQuIEl0IG11c3QgYmUgZnJlZWQgYnkgdGhlIE00T1NBX3RocmVhZFN5bmNDbG9zZSBmdW5jdGlvbi4KKyAqICAgICAgICAgICAgIFRoZSBjb250ZXh0IHBhcmFtZXRlciB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIHRocmVhZAorICogICAgICAgICAgICAgZnVuY3Rpb25zIHRvIGFsbG93IHJldHJpZXZpbmcgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvcGVuZWQKKyAqICAgICAgICAgICAgIHRocmVhZC4KKyAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgdGhyZWFkLCBidXQgdGhlIHRocmVhZCBpcyBub3QgcnVubmluZy4KKyAqIEBub3RlICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBjcmVhdGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCB0aHJlYWQKKyAqIEBwYXJhbSAgICAgIGZ1bmM6KElOKSAiZG9JdCIgZnVuY3Rpb24gcG9pbnRlciB0byBydW4KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQorICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY09wZW4oTTRPU0FfQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWREb0l0IGZ1bmMpCit7CisgICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gTTRPU0FfTlVMTDsKKyAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdCIKKyAgICAgICAgICAgICAgICAgICJNNE9TQV9UaHJlYWREb0l0IDB4JXgiLCBjb250ZXh0LCBmdW5jKTsKKworICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOworCisgICBNNE9TQV9ERUJVR19JRjIoZnVuYyA9PSBNNE9TQV9OVUxMLAorICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOworCisgICAqY29udGV4dCA9IE00T1NBX05VTEw7CisKKyAgIHRocmVhZENvbnRleHQgPQorICAgICAgKE00T1NBX1RocmVhZENvbnRleHQqKU00T1NBX21hbGxvYyhzaXplb2YoTTRPU0FfVGhyZWFkQ29udGV4dCksCisgICAgICBNNE9TQV9USFJFQUQsIChNNE9TQV9DaGFyKikiTTRPU0FfdGhyZWFkU3luY09wZW46IHRocmVhZCBjb250ZXh0Iik7CisKKyAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKKyAgIHsKKyAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfdGhyZWFkU3luY09wZW4iKTsKKworICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgfQorCisgICB0aHJlYWRDb250ZXh0LT5mdW5jID0gZnVuYzsKKyAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IDY0ICogMTAyNDsKKyAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOworICAgdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQgPSAwOworICAgdGhyZWFkQ29udGV4dC0+Y29yZUlEID0gTTRPU0FfVEhSRUFEOworLyoKKyAgIHRocmVhZENvbnRleHQtPnVzZXJEYXRhID0gTTRPU0FfTlVMTDsKKyAgIHRocmVhZENvbnRleHQtPnN0b3BDYWxsQmFjayA9IE00T1NBX05VTEw7CisgICB0aHJlYWRDb250ZXh0LT5zdGFydENhbGxCYWNrID0gTTRPU0FfTlVMTDsKKyovCisgICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7CisgICB0aHJlYWRDb250ZXh0LT5wcmlvcml0eSA9IE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eSA7CisKKyAgIGVycl9jb2RlID0gTTRPU0FfbXV0ZXhPcGVuKCYodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCkpOworCisgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQorICAgeworICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jT3BlbjogTTRPU0FfbXV0ZXhPcGVuIik7CisKKyAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgIH0KKworICAgZXJyX2NvZGUgPSBNNE9TQV9zZW1hcGhvcmVPcGVuKCYodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKSwgMCk7CisKKyAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCisgICB7CisgICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNPcGVuOiBNNE9TQV9zZW1hcGhvcmVPcGVuIik7CisKKyAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgIH0KKworICAgKmNvbnRleHQgPSB0aHJlYWRDb250ZXh0OworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHJ1bnMgYSBzcGVjaWZpZWQgdGhyZWFkLiBUaGUgInBhcmFtIiBwYXJhbWV0ZXIKKyAqICAgICAgICAgICAgIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc2V0IGEgc3BlY2lmaWMgcGFyYW1ldGVyIHRvIHRoZQorICogICAgICAgICAgICAgY3JlYXRlZCB0aHJlYWQuIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBhcyB0aGUgc2Vjb25kIG9uZSBvZgorICogICAgICAgICAgICAgdGhlICJNNE9TQV9UaHJlYWREb0l0IiBmdW5jdGlvbi4KKyAqIEBub3RlICAgICAgIFRoaXMgbWV0aG9kIGlzIGEgYmxvY2tpbmcgdXAgdG8gdGhlIHRocmVhZCBpcyBydW5uaW5nLgorICogICAgICAgICAgICAgQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgorICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRTdGFydGluZy4KKyAqICAgICAgICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBydW5uaW5nLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZFJ1bm5pbmcuCisgKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LiBJZiB0aGUgInRocmVhZFN0YXJ0ZWQiIG9wdGlvbklECisgKiAgICAgICAgICAgICBpcyBub3QgTlVMTCwgdGhlIHRocmVhZCB3aWxsIGNhbGwgaXQgYmVmb3JlIHJ1bm5pbmcgdGhlIGRvSXQKKyAqICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAqIEBwYXJhbSAgICAgIHBhcmFtOihJTikgQXBwbGljYXRpb24gZGF0YSB0aHJlYWQgcGFyYW1ldGVyCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKKyAqIEByZXR1cm4gICAgIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRDogdGhlIHRocmVhZCBkaWQgbm90IHN0YXJ0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTdGFydChNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBhcmFtKQoreworICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9ICAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKKyAgIHB0aHJlYWRfYXR0cl90ICAgICBhdHRyaWJ1dGUgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgIGludCAgICAgICAgICAgICAgICBtaW4gICAgICAgPSAwOworICAgaW50ICAgICAgICAgICAgICAgIG1heCAgICAgICA9IDA7CisgICBpbnQgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0gMDsKKyAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZCAgICAgPSB7IDAgfTsKKworICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNTdGFydFx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1ZvaWQqICIKKyAgICAgICAgICAgICAgICAgICIweCV4IiwgY29udGV4dCwgcGFyYW0pOworCisgICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAorICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOworCisgICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOworCisgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKKworICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKKyAgIHsKKyAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOworCisgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOworCisgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7CisgICB9CisKKyAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFN0YXJ0aW5nOworCisgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKKyAgIHRocmVhZENvbnRleHQtPnBhcmFtID0gcGFyYW07CisKKyAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfaW5pdCggJmF0dHJpYnV0ZSApICkKKyAgIHsKKyAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICZhdHRyaWJ1dGUsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEICkgKQorICAgICAgeworICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICZhdHRyaWJ1dGUsIChzaXplX3QpdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplICkgKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSggJmF0dHJpYnV0ZSwgU0NIRURfT1RIRVIgKSApCisgICAgICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgICAgIG1pbiA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4oIFNDSEVEX09USEVSICk7CisgICAgICAgICAgICAgICAgbWF4ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heCggU0NIRURfT1RIRVIgKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCh0aHJlYWRDb250ZXh0LT5wcmlvcml0eSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTG93ZXN0UHJpb3JpdHk6CisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gbWluOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRMb3dQcmlvcml0eToKKyAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBtaW4gKyAoIG1heCAtIG1pbiApIC8gNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHk6CisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gbWluICsgKCBtYXggLSBtaW4gKSAvIDI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZEhpZ2hQcmlvcml0eToKKyAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBtYXggLSAoIG1heCAtIG1pbiApIC8gNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkSGlnaGVzdFByaW9yaXR5OgorICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IG1heDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBUZW50YXRpdmUgcGF0Y2hlcyB0byBoYW5kbGUgcHJpb3JpdGllcyBpbiBhIGJldHRlciB3YXkgOiAqLworICAgICAgICAgICAgICAgIC8qIFVzZSBBbmRyb2lkJ3MgcHJlZGVmaW5lZCBwcmlvcml0aWVzIChyYW5nZSArMTkuLi0yMCkKKyAgICAgICAgICAgICAgICAgKnJhdGhlciB0aGFuIExpbnV4IG9uZXMgKDAuLjk5KSovCisKKyAgICAgICAgICAgICAgICAvKiBHZXQgbWluIGFuZCBtYXggcHJpb3JpdGllcyAqLworICAgICAgICAgICAgICAgIG1pbiA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4oIFNDSEVEX0ZJRk8gKTsKKyAgICAgICAgICAgICAgICBtYXggPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KCBTQ0hFRF9GSUZPICk7CisKKyAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfdGhyZWFkU3luY1N0YXJ0IE1BWD0lZCBNSU49JWQiLCBtYXgsIG1pbik7CisKKyAgICAgICAgICAgICAgICAvKiB0ZW50YXRpdmUgbW9kaWZpY2F0aW9uIG9mIHRoZSBwcmlvcml0aWVzICovCisgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBwcmlvcml0eSBiYXNlZCBvbiBkZWZhdWx0IGFuZHJvaWQgcHJpb3JpdGllcyAqLworICAgICAgICAgICAgICAgIC8qIFRoaXMgcHJvYmFibHkgcmVxdWlyZXMgc29tZSBtb3JlIHR1bmluZywKKyAgICAgICAgICAgICAgICAgKiBvdXRjb21lIG9mIHRoaXMgcHJpb3JpdHkgc2V0dGluZ3MgYXJlIG5vdCB5ZXQgc2F0aXNmYWN0b3J5ICovCisgICAgICAgICAgICAgICAgLyogSW1wbGVtZW50aW5nIHRocmVhZCBoYW5kbGluZyBiYXNlZCBvbiBBbmRyb2lkJ3MgdGhyZWFkIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgICogaGVscGVycyBtaWdodCBicmluZyBzb21lIGltcHJvdmVtZW50IChzZWUgdGhyZWFkcy5oKSAqLworICAgICAgICAgICAgICAgIHN3aXRjaCh0aHJlYWRDb250ZXh0LT5wcmlvcml0eSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTG93ZXN0UHJpb3JpdHk6CisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9OT1JNQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZExvd1ByaW9yaXR5OgorICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfRElTUExBWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHk6CisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfRElTUExBWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkSGlnaFByaW9yaXR5OgorICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfQVVESU87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZEhpZ2hlc3RQcmlvcml0eToKKyAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgc2NoZWQuc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsKKworICAgICAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSggJmF0dHJpYnV0ZSwgJnNjaGVkICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfY3JlYXRlKCAmdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRocmVhZENvbnRleHQgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTTRPU0FfRkFMU0UgPT0gTTRPU0FfRVJSX0lTX0VSUk9SKCBNNE9TQV9zZW1hcGhvcmVXYWl0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUiApICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koICZhdHRyaWJ1dGUgKTsKKyAgIH0KKworICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7CisKKyAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKKworICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7CisKKyAgIE00T1NBX0RFQlVHKE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRCwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOworCisgICByZXR1cm4gTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVEOworfQorCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHN0b3BzIGEgc3BlY2lmaWVkIHRocmVhZC4KKyAqIEBub3RlICAgICAgIFRoaXMgY2FsbCBpcyBhIGJsb2NraW5nIG9uZSB1cCB0byB0aGUgIk00T1NBX1RocmVhZERvSXQiCisgKiAgICAgICAgICAgICBmdW5jdGlvbiBoYXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICBCZWZvcmUgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkUnVubmluZy4KKyAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkU3RvcHBpbmcuCisgKiAgICAgICAgICAgICBPbmNlIHRoZSB0aHJlYWQgaXMgc3RvcHBlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRPcGVuZWQuCisgKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIG9uY2UgdGhlIHRocmVhZCBoYXMgYmVlbiBzdG9wcGVkLiBJZiB0aGUKKyAqICAgICAgICAgICAgICJ0aHJlYWRTdG9wcGVkIiBvcHRpb25JRCBpcyBub3QgTlVMTCwgdGhlIHRocmVhZCB3aWxsIGNhbGwgaXQKKyAqICAgICAgICAgICAgIGJlZm9yZSBkeWluZy4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKKyAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93CisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0b3AoTTRPU0FfQ29udGV4dCBjb250ZXh0KQoreworICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OworCisgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU3luY1N0b3BcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7CisKKyAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCisgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1N0b3AiKTsKKworICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCisgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOworCisgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKKworICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCisgICB7CisgICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKKworICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOworCisgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7CisgICB9CisKKyAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFN0b3BwaW5nOworCisgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKKworICAgTTRPU0Ffc2VtYXBob3JlV2FpdCh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3AsIE00T1NBX1dBSVRfRk9SRVZFUik7CisKKyAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOworCisgICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7CisKKyAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgdGhyZWFkIChpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0KS4gQWZ0ZXIKKyAqICAgICAgICAgICAgIHRoaXMgY2FsbCB0aGUgdGhyZWFkIGFuZCBpdHMgY29udGV4dCBhcmUgbm8gbW9yZSB1c2VhYmxlLiBUaGlzCisgKiAgICAgICAgICAgICBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMgdGhyZWFkLgorICogQG5vdGUgICAgICAgQmVmb3JlIHRoZSBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KKyAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkQ2xvc2VkLgorICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQoreworICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OworICAgTTRPU0FfRVJSIGVycl9jb2RlOworCisgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU3luY0Nsb3NlXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOworCisgICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAorICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOworCisgICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOworCisgICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZENsb3NlZCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOworCisgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKKworICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKKyAgIHsKKyAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOworCisgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOworCisgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7CisgICB9CisKKyAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZENsb3NlZDsKKworICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7CisKKyAgIGVycl9jb2RlID0gTTRPU0FfbXV0ZXhDbG9zZSh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKKworICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKKyAgIHsKKyAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlOiBNNE9TQV9tdXRleENsb3NlIik7CisKKyAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgIH0KKworICAgZXJyX2NvZGUgPSBNNE9TQV9zZW1hcGhvcmVDbG9zZSh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApOworCisgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQorICAgeworICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2U6IE00T1NBX3NlbWFwaG9yZUNsb3NlIik7CisKKyAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgIH0KKworICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBNNE9TQV9OVUxMKQorICAgeworICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXRocmVhZENvbnRleHQtPm5hbWUpOworICAgfQorCisgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpdGhyZWFkQ29udGV4dCk7CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIHRocmVhZCB0byByZXR1cm4gaXRzIHN0YXRlLgorICogQG5vdGUgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgdGhlIHN0YXRlCisgKiAgICAgICAgICAgICBmaWVsZC4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAqIEBwYXJhbSAgICAgIHN0YXRlOihPVVQpIFRocmVhZCBzdGF0ZQorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkU3RhdGUqIHN0YXRlKQoreworICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OworCisgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX1RocmVhZFN0YXRlKiAweCV4IiwgY29udGV4dCwgc3RhdGUpOworCisgICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAorICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSIpOworCisgICBNNE9TQV9ERUJVR19JRjIoc3RhdGUgPT0gTTRPU0FfTlVMTCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUiKTsKKworICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCisgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUiKTsKKworICAgKnN0YXRlID0gdGhyZWFkQ29udGV4dC0+c3RhdGU7CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwIGR1cmluZyAidGltZVNsZWVwIgorICogICAgICAgICAgICAgbWlsbGlzZWNvbmRzLgorICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBjb250ZXh0LgorICogQHBhcmFtICAgICAgdGltZTooSU4pIFRpbWUgdG8gc2xlZXAgaW4gbWlsbGlzZWNvbmRzCisgKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV90aHJlYWRTbGVlcChNNE9TQV9VSW50MzIgdGltZSkKK3sKKyAgIHN0cnVjdCB0aW1lc3BlYyBycXRwID0geyAwLCAwIH07CisgICBzdHJ1Y3QgdGltZXNwZWMgcm10cCA9IHsgMCwgMCB9OworCisgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU2xlZXBcdFx0TTRPU0FfVUludDMyICVkIiwgdGltZSk7CisKKyAgIHJxdHAudHZfc2VjID0gKHRpbWVfdCl0aW1lLzEwMDA7CisgICBycXRwLnR2X25zZWMgPSAodGltZSUxMDAwKSAqIDEwMDAwMDA7CisgICBuYW5vc2xlZXAoJnJxdHAsICZybXRwKTsKKworICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9CisKKworCisKKyNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBUlRFRCA9PSBNNE9TQV9UUlVFKQorCisvKk00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhcnRlZChNNE9TQV9Db250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQoreworICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0IDsKKworICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNTdGFydGVkXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKKworICAgdGhyZWFkQ29udGV4dC0+c3RhcnRDYWxsQmFjayA9IChNNE9TQV9UaHJlYWRDYWxsQmFjaylvcHRpb25WYWx1ZTsKKworICAgcmV0dXJuIE00Tk9fRVJST1I7Cit9Ki8KKworI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQqLworCisKKworCisjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUT1BQRUQgPT0gTTRPU0FfVFJVRSkKKworLypNNE9TQV9FUlIgTTRPU0FfU2V0VGhyZWFkU3luY1N0b3BwZWQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKK3sKKyAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKKworICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNTdG9wcGVkXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKKworICAgdGhyZWFkQ29udGV4dC0+c3RvcENhbGxCYWNrID0gKE00T1NBX1RocmVhZENhbGxCYWNrKW9wdGlvblZhbHVlOworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30qLworCisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RPUFBFRCovCisKKworCisjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCisKK000T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCit7CisgICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7CisgICBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsIHByaW9yaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKShvcHRpb25WYWx1ZSk7CisKKyAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHlcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0FfRGF0YU9wdGlvbiAweCV4IiwgY29udGV4dCwgb3B0aW9uVmFsdWUpOworCisgICBpZigoTTRPU0FfVUludDMyKW9wdGlvblZhbHVlPk00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSkKKyAgIHsKKyAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICB9CisKKyAgIHRocmVhZENvbnRleHQtPnByaW9yaXR5ID0gcHJpb3JpdHk7CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLworCisKKworCisjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKKworTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNOYW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCit7CisgICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7CisgICBNNE9TQV9DaGFyKiBuYW1lID0gKE00T1NBX0NoYXIqKW9wdGlvblZhbHVlOworICAgTTRPU0FfVUludDMyIG5hbWVTaXplIDsKKworICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNOYW1lXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKKworICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBOVUxMKQorICAgeworICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXRocmVhZENvbnRleHQtPm5hbWUpOworICAgICAgdGhyZWFkQ29udGV4dC0+bmFtZSA9IE00T1NBX05VTEw7CisgICB9CisKKyAgIGlmKG9wdGlvblZhbHVlICE9IE00T1NBX05VTEwpCisgICB7CisgICAgICBuYW1lU2l6ZSA9IE00T1NBX2Nockxlbmd0aChuYW1lKSsxOworCisgICAgICB0aHJlYWRDb250ZXh0LT5uYW1lID0KKyAgICAgICAgIChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2MobmFtZVNpemUsIE00T1NBX1RIUkVBRCwKKyAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfU2V0VGhyZWFkU3luY05hbWU6IHRocmVhZCBuYW1lIik7CisKKyAgICAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKKyAgICAgIH0KKworICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCl0aHJlYWRDb250ZXh0LT5uYW1lLCAoTTRPU0FfTWVtQWRkcjgpbmFtZSwKKyAgICAgICAgICAgICAgICAgICBuYW1lU2l6ZSk7CisgICB9CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfQorCisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCisKKworI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFID09IE00T1NBX1RSVUUpCisKK000T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhY2tTaXplKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKK3sKKyAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKKworICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemVcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0FfRGF0YU9wdGlvbiAweCV4IiwgY29udGV4dCwgb3B0aW9uVmFsdWUpOworCisgICB0aHJlYWRDb250ZXh0LT5zdGFja1NpemUgPSAoTTRPU0FfVUludDMyKW9wdGlvblZhbHVlOworCisgICByZXR1cm4gTTROT19FUlJPUjsKK30KKworI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUqLworCisKKworI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEgPT0gTTRPU0FfVFJVRSkKKworLypNNE9TQV9FUlIgTTRPU0FfU2V0VGhyZWFkU3luY1VzZXJEYXRhKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQoreworICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OworCisgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1VzZXJEYXRhXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgorICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKKworICAgdGhyZWFkQ29udGV4dC0+dXNlckRhdGEgPSAoTTRPU0FfVm9pZCopb3B0aW9uVmFsdWU7CisKKyAgIHJldHVybiBNNE5PX0VSUk9SOworfSovCisKKyNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEqLworCisKKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBPU0FMLVRocmVhZCBjb21wb25lbnQgdG8gc2V0IHRoZSB2YWx1ZQorICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgorICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBvZiBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCisgKiAgICAgICAgICAgICAidmFsdWUiIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbAorICogICAgICAgICAgICAgdmFyaWFibGUuCisgKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAorICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCisgKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KKyAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCisgKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAorICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cKKyAqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCisgKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK000T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEIG9wdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKK3sKKyAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKKyAgIE00T1NBX0VSUiBlcnJfY29kZTsKKworICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb25cdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0FfT3B0aW9uSUQgJWRcdE00T1NBX0RhdGFPcHRpb24gMHgleCIsCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOworCisgICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAorICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKKworICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCisgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOworCisgICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKKworICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9USFJFQUQpLAorICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7CisKKyAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9SRUFEX09OTFksICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7CisKKworICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7CisKKyAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCisgICB7CisgICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKKworICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7CisKKyAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKKyAgIH0KKworICAgc3dpdGNoKG9wdGlvbklEKQorICAgeworI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFSVEVEID09IE00T1NBX1RSVUUpCisgICAgICAvKmNhc2UgTTRPU0FfVGhyZWFkU3RhcnRlZDoKKyAgICAgIHsKKyAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfU2V0VGhyZWFkU3luY1N0YXJ0ZWQoY29udGV4dCwgb3B0aW9uVmFsdWUpOworCisgICAgICAgICBicmVhazsKKyAgICAgIH0qLworI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQqLworCisjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUT1BQRUQgPT0gTTRPU0FfVFJVRSkKKyAgICAgIC8qY2FzZSBNNE9TQV9UaHJlYWRTdG9wcGVkOgorICAgICAgeworICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jU3RvcHBlZChjb250ZXh0LCBvcHRpb25WYWx1ZSk7CisKKyAgICAgICAgIGJyZWFrOworICAgICAgfSovCisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RPUFBFRCovCisKKyNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfVVNFUl9EQVRBID09IE00T1NBX1RSVUUpCisgICAgICAvKmNhc2UgTTRPU0FfVGhyZWFkVXNlckRhdGE6CisgICAgICB7CisgICAgICAgICBlcnJfY29kZSA9IE00T1NBX1NldFRocmVhZFN5bmNVc2VyRGF0YShjb250ZXh0LCBvcHRpb25WYWx1ZSk7CisKKyAgICAgICAgIGJyZWFrOworICAgICAgfSovCisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfVVNFUl9EQVRBKi8KKworI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQorICAgICAgY2FzZSBNNE9TQV9UaHJlYWRQcmlvcml0eToKKyAgICAgIHsKKyAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfU2V0VGhyZWFkU3luY1ByaW9yaXR5KGNvbnRleHQsIG9wdGlvblZhbHVlKTsKKworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLworCisjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKKyAgICAgIGNhc2UgTTRPU0FfVGhyZWFkTmFtZToKKyAgICAgIHsKKyAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfU2V0VGhyZWFkU3luY05hbWUoY29udGV4dCwgb3B0aW9uVmFsdWUpOworCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KKworI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFID09IE00T1NBX1RSVUUpCisgICAgICBjYXNlIE00T1NBX1RocmVhZFN0YWNrU2l6ZToKKyAgICAgIHsKKyAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfU2V0VGhyZWFkU3luY1N0YWNrU2l6ZShjb250ZXh0LCBvcHRpb25WYWx1ZSk7CisKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUqLworCisgICAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOworCisgICAgICAgICBlcnJfY29kZSA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKKyAgICAgIH0KKyAgIH0KKworICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7CisKKyAgIHJldHVybiBlcnJfY29kZTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgT1NBTC1UaHJlYWQgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkCisgKiAgICAgICAgICAgICB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgorICogQG5vdGUgICAgICAgIm9wdGlvblZhbHVlIiBtdXN0IGJlIGNhc3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHJlbGF0ZWQgdG8gdGhlCisgKiAgICAgICAgICAgICBvcHRpb25JRC4KKyAqIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlLWFsbG9jYXRpbmcgdGhlICJ2YWx1ZSIKKyAqICAgICAgICAgICAgIGZpZWxkLCB0aGUgY29yZSBPU0FMLVRocmVhZCBjb21wb25lbnQgbXVzdCBwZXJmb3JtIGEgY29weSBvZiBpdHMKKyAqICAgICAgICAgICAgIGludGVybmFsIHZhbHVlIHRvIHRoZSB2YWx1ZSBmaWVsZC4KKyAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAqIEBwYXJhbSAgICAgIG9wdGlvbklEOihJTikgSUQgb2YgdGhlIG9wdGlvbgorICogQHBhcmFtICAgICAgb3B0aW9uVmFsdWU6KE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbgorICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKKyAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCisgKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX1dSSVRFX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUKKyAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgb3B0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBvcHRpb25WYWx1ZSkKK3sKKyAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKKworICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb25cdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCisgICAgICAgICAgICAgICAgICAiTTRPU0FfT3B0aW9uSUQgJWRcdE00T1NBX0RhdGFPcHRpb24qIDB4JXgiLAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgb3B0aW9uSUQsIG9wdGlvblZhbHVlKTsKKworICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7CisKKyAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSBNNE9TQV9OVUxMLAorICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKKworICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvblZhbHVlID09IE00T1NBX05VTEwsCisgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOworCisgICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKKworICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9USFJFQUQpLAorICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7CisKKyAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1JFQURBQkxFKG9wdGlvbklEKSwKKyAgICAgICAgICAgICAgICAgICBNNEVSUl9XUklURV9PTkxZLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOworCisgICBzd2l0Y2gob3B0aW9uSUQpCisgICB7CisjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQgPT0gTTRPU0FfVFJVRSkKKyAgICAgIC8qY2FzZSBNNE9TQV9UaHJlYWRTdGFydGVkOgorICAgICAgeworICAgICAgICAgTTRPU0FfVGhyZWFkQ2FsbEJhY2sqIHN0YXJ0Q2FsbEJhY2sgPSAoTTRPU0FfVGhyZWFkQ2FsbEJhY2sqKW9wdGlvblZhbHVlOworCisgICAgICAgICAqc3RhcnRDYWxsQmFjayA9IHRocmVhZENvbnRleHQtPnN0YXJ0Q2FsbEJhY2s7CisKKyAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgfSovCisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBUlRFRCovCisKKyNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RPUFBFRCA9PSBNNE9TQV9UUlVFKQorICAgICAgLypjYXNlIE00T1NBX1RocmVhZFN0b3BwZWQ6CisgICAgICB7CisgICAgICAgICBNNE9TQV9UaHJlYWRDYWxsQmFjayogc3RvcENhbGxCYWNrID0gKE00T1NBX1RocmVhZENhbGxCYWNrKilvcHRpb25WYWx1ZTsKKworICAgICAgICAgKnN0b3BDYWxsQmFjayA9IHRocmVhZENvbnRleHQtPnN0b3BDYWxsQmFjazsKKworICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgICB9Ki8KKyNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVE9QUEVEKi8KKworI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEgPT0gTTRPU0FfVFJVRSkKKyAgICAgIC8qY2FzZSBNNE9TQV9UaHJlYWRVc2VyRGF0YToKKyAgICAgIHsKKyAgICAgICAgIE00T1NBX1ZvaWQqKiB1c2VyRGF0YSA9IChNNE9TQV9Wb2lkKiopb3B0aW9uVmFsdWU7CisKKyAgICAgICAgICp1c2VyRGF0YSA9IHRocmVhZENvbnRleHQtPnVzZXJEYXRhOworCisgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgICAgIH0qLworI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1VTRVJfREFUQSovCisKKyNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkgPT0gTTRPU0FfVFJVRSkKKyAgICAgIGNhc2UgTTRPU0FfVGhyZWFkUHJpb3JpdHk6CisgICAgICB7CisgICAgICAgICBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKiBwcmlvcml0eSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCopb3B0aW9uVmFsdWU7CisKKyAgICAgICAgICpwcmlvcml0eSA9IHRocmVhZENvbnRleHQtPnByaW9yaXR5OworCisgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKKyAgICAgIH0KKyNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSovCisKKyNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSA9PSBNNE9TQV9UUlVFKQorICAgICAgY2FzZSBNNE9TQV9UaHJlYWROYW1lOgorICAgICAgeworICAgICAgICAgTTRPU0FfQ2hhcioqIG5hbWUgPSAoTTRPU0FfQ2hhcioqKW9wdGlvblZhbHVlOworCisgICAgICAgICAqbmFtZSA9IHRocmVhZENvbnRleHQtPm5hbWU7CisKKyAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOworICAgICAgfQorI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUqLworCisjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKKyAgICAgIGNhc2UgTTRPU0FfVGhyZWFkU3RhY2tTaXplOgorICAgICAgeworICAgICAgICAgTTRPU0FfVUludDMyKiBzdGFja1NpemUgPSAoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKKworICAgICAgICAgKnN0YWNrU2l6ZSA9IHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZTsKKworICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CisgICAgICB9CisjZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgfQorCisgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7CisKKyAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX0RlYnVnVHJhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX0RlYnVnVHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MWE2YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmaWxlICAgICAgIE00UFNXX0RlYnVnVHJhY2UuYworICogQGJyaWVmICAgICAgRGVmYXVsdCB0cmFjZSBmdW5jdGlvbiBmb3IgZGVidWdnaW5nIG1hY3JvcworICogQG5vdGUgICAgICAgVGhpcyBmaWxlIGdpdmVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbgorICogICAgICAgICAgICAgdXNlZCBpbiB0aGUgZGVidWcgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcywgYmFzZWQgb24gcHJpbnRmLgorICogICAgICAgICAgICAgQXBwbGljYXRpb24gd3JpdGVycyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byBpbXBsZW1lbnQgdGhlaXIKKyAqICAgICAgICAgICAgIG93biAiTTRPU0FfRGVidWdUcmFjZSIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPiAvKmZvciBwcmludGYgKi8KKworI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCisjaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKKworLyojZGVmaW5lIE5PX0ZJTEUgKi8gLyogc3VwcHJlc3NlcyB0aGUgZmlsZSBuYW1lIHByaW50IG91dCAqLworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdm9pZCBNNE9TQV9EZWJ1Z1RyYWNlKE00T1NBX0ludDMyIGxpbmUsIGNoYXIqIGZpbGUsIE00T1NBX0ludDMyIGxldmVsLAorICogICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGNvbmQsIGNoYXIqIG1zZywgTTRPU0FfRVJSIGVycikKKyAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHRyYWNlIGZvciBkZWJ1ZyB0ZXN0cworICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB0byBiZSBjYWxsZWQgaW4gdGhlIGRlYnVnIG1hY3JvcyBvbmx5LgorICogICAgICAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHJpbnRmLgorICogQHBhcmFtICAgIGxpbmUgKElOKTogdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzb3VyY2UgZmlsZQorICogQHBhcmFtICAgIGZpbGUgKElOKTogdGhlIHNvdXJjZSBmaWxlIG5hbWUKKyAqIEBwYXJhbSAgICBsZXZlbCAoSU4pOiB0aGUgZGVidWcgbGV2ZWwKKyAqIEBwYXJhbSAgICBtc2cgKElOKTogdGhlIGVycm9yIG1lc3NhZ2UKKyAqIEBwYXJhbSAgICBlcnIgKElOKTogdGhlIHJldHVybiB2YWx1ZSAoZXJyb3IgY29kZSkKKyAqIEByZXR1cm4gICAgbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIHZvaWQgTTRPU0FfRGVidWdUcmFjZShNNE9TQV9JbnQzMiBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgZXJyKQoreworICAgIE00T1NBX0ludDMyIGk7CisKKyAgICAvKiB0cnkgdG8gImluZGVudCIgdGhlIHJlc3VsdGluZyB0cmFjZXMgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCAqLworICAgIGZvciAoaSA9MCA7IGkgPCBsZXZlbDsgaSArKykKKyAgICB7CisgICAgICAgIHByaW50ZigiICIpOworICAgIH0KKworI2lmZGVmIE5PX0ZJTEUKKyAgICBwcmludGYoIkVycm9yOiAlbGksIG9uICVzOiAlc1xuIixlcnIsY29uZCxtc2cpOworI2Vsc2UgLyogTk9fRklMRSAgICAgKi8KKyAgICBwcmludGYoIkVycm9yOiAlbGksIG9uICVzOiAlcyBMaW5lICVsdSBpbjogJXNcbiIsZXJyLGNvbmQsbXNnLGxpbmUsZmlsZSk7CisjZW5kaWYgLyogTk9fRklMRSAgICAgKi8KKworfQorCitNNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgTTRPU0FfVm9pZCBNNE9TQV9ERUJVR190cmFjZUZ1bmN0aW9uKE00T1NBX1VJbnQzMiBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmdDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiByZXR1cm5lZEVycm9yKQoreworICAgIE00T1NBX0RlYnVnVHJhY2UobGluZSwgZmlsZU5hbWUsIGxldmVsLCBzdHJpbmdDb25kaXRpb24sIG1lc3NhZ2UsIHJldHVybmVkRXJyb3IpOworfQorCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkZDRkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZpbGUgICBNNFBTV19NZW1vcnlJbnRlcmZhY2UuYworICogQGJyaWVmICBNZW1vcnkgSW50ZXJmYWNlCisgKiBAbm90ZSAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBvc2FsIG1lbW9yeSBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCisjaWZuZGVmIE00VlBTX0FEVkFOQ0VEX01FTU9SWV9NQU5BR0VSCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmbiAgICAgICAgIE00T1NBX01lbUFkZHIzMiBNNE9TQV9tYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKKyAqIEBicmllZiAgICAgIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbWVtb3J5IGJsb2NrIChhdCBsZWFzdCAzMiBiaXRzIGFsaWduZWQpCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgc2l6ZSAoSU4pOiBzaXplIG9mIGFsbG9jYXRlZCBibG9jayBpbiBieXRlcworICogQHBhcmFtICAgICAgY29yZUlEIChJTik6IGlkZW50aWZpY2F0aW9uIG9mIHRoZSBjYWxsZXIgY29tcG9uZW50CisgKiBAcGFyYW0gICAgICBzdHJpbmcgKElOKTogZGVzY3JpcHRpb24gb2YgdGhlIGFsbG9jYXRlZCBibG9jayAobnVsbCB0ZXJtaW5hdGVkKQorICogQHJldHVybiAgICAgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrLCBNNE9TQV9OVUxMIGlmIG5vIG1lbW9yeSBhdmFpbGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK000T1NBX01lbUFkZHIzMiBNNE9TQV9tYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKK3sKKyAgICBNNE9TQV9NZW1BZGRyMzIgQWRkcmVzcyA9IE00T1NBX05VTEw7CisKKyAgICAvKioKKyAgICAgKiBJZiBzaXplIGlzIDAsIG1hbGxvYyBvbiBXSU4gT1MgYWxsb2NhdGVzIGEgemVyby1sZW5ndGggaXRlbSBpbgorICAgICAqIHRoZSBoZWFwIGFuZCByZXR1cm5zIGEgdmFsaWQgcG9pbnRlciB0byB0aGF0IGl0ZW0uCisgICAgICogT24gb3RoZXIgcGxhdGZvcm1zLCBtYWxsb2MgY291bGQgcmV0dXJucyBhbiBpbnZhbGlkIHBvaW50ZXIKKyAgICAgKiBTbywgRE9OJ1QgYWxsb2NhdGUgbWVtb3J5IG9mIDAgYnl0ZSAqLworICAgIGlmIChzaXplID09IDApCisgICAgeworICAgICAgICByZXR1cm4gQWRkcmVzczsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSU0ICE9IDApCisgICAgeworICAgICAgICBzaXplID0gc2l6ZSArIDQgLSAoc2l6ZSU0KTsKKyAgICB9CisKKyAgICBBZGRyZXNzID0gKE00T1NBX01lbUFkZHIzMikgbWFsbG9jKHNpemUpOworCisgICAgcmV0dXJuIEFkZHJlc3M7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZm4gICAgICAgICBNNE9TQV9Wb2lkIE00T1NBX2ZyZWUoTTRPU0FfTWVtQWRkcjMyIGFkZHJlc3MpCisgKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIGZyZWUgdGhlIHByb3ZpZGVkIG1lbW9yeSBibG9jaworICogQG5vdGUgICAgICAgQXMgaW4gc3RsaWIuaCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgaWYgYWRkcmVzcyBpcyBOVUxMLgorICogQHBhcmFtICAgICAgYWRkcmVzcyAoSU4pOiBhZGRyZXNzIG9mIHRoZSBibG9jayB0byBmcmVlCisgKiBAcmV0dXJuICAgICBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitNNE9TQV9Wb2lkIE00T1NBX2ZyZWUgKE00T1NBX01lbUFkZHIzMiBhZGRyZXNzKQoreworICAgIGZyZWUoYWRkcmVzcyk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZm4gICAgICAgICBNNE9TQV9Wb2lkIE00T1NBX21lbXNldChNNE9TQV9NZW1BZGRyOCBibG9jaywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdmFsdWUpCisgKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBwcm92aWRlZCBtZW1vcnkgYmxvY2sgd2l0aCB2YWx1ZQorICogQG5vdGUKKyAqIEBwYXJhbSAgICAgIGJsb2NrIChJTik6IGFkZHJlc3Mgb2YgYmxvY2sgdG8gZmlsbAorICogQHBhcmFtICAgICAgc2l6ZSAgKElOKTogc2l6ZSBvZiB0aGUgcHJvdmlkZWQgYmxvY2sKKyAqIEBwYXJhbSAgICAgIHZhbHVlIChJTik6IHZhbHVlIHVzZWQgZm9yIGluaXRpYWxpemF0aW9uCisgKiBAcmV0dXJuICAgICBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitNNE9TQV9Wb2lkIE00T1NBX21lbXNldChNNE9TQV9NZW1BZGRyOCBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdmFsdWUpCit7CisgICAgbWVtc2V0KCh2b2lkKilibG9jaywgdmFsdWUsIHNpemUpOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZuICAgICAgICAgTTRPU0FfVm9pZCBNNE9TQV9tZW1jcHkoTTRPU0FfTWVtQWRkcjggb3V0cHV0QmxvY2ssCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBpbnB1dEJsb2NrLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUpCisgKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIGNvcGllcyAnc2l6ZScgYnl0ZXMgZnJvbSBpbnB1dEJsb2NrIHRvIG91dHB1dEJsb2NrCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgb3V0cHV0QmxvY2sgKElOKTogYWRkcmVzcyBvZiBibG9jayB0byBmaWxsCisgKiBAcGFyYW0gICAgICBpbnB1dEJsb2NrICAoSU4pOiBhZGRyZXNzIG9mIHRoZSBpbnB1dCBibG9jaworICogQHBhcmFtICAgICAgc2l6ZSAoSU4pOiBzaXplIG9mIHRoZSBibG9jayB0byBjb3B5IChpbiBieXRlcykKKyAqIEByZXR1cm4gICAgIG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK000T1NBX1ZvaWQgTTRPU0FfbWVtY3B5KE00T1NBX01lbUFkZHI4IG91dHB1dEJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggaW5wdXRCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKQoreworICAgIG1lbWNweSgodm9pZCopb3V0cHV0QmxvY2ssICh2b2lkKilpbnB1dEJsb2NrLCAgc2l6ZSk7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZuICAgICAgICAgTTRPU0FfTWVtQWRkcjggTTRPU0FfbWVtbW92ZShNNE9TQV9NZW1BZGRyOCBvdXRwdXRCbG9jaywgTTRPU0FfTWVtQWRkcjggaW5wdXRCbG9jaywgTTRPU0FfVUludDMyIHNpemUpCisgKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIG1vdmVzICdzaXplJyBieXRlcyBmcm9tIGlucHV0QmxvY2sgdG8gb3V0cHV0QmxvY2sKKyAqICAgICAgICAgICAgICAgdW5saWtlIE00T1NBX21lbWNweSwgdGhlIHR3byBidWZmZXJzIGNhbiBoYXZlIGFuIG92ZXJsYXAuCisgKiBAbm90ZSAgICAgICBpbmNyZW1lbnQgbWVtY3B5IGJ5dGUgbnVtYmVyIChGcmFu529pcyBWQUxFVFRFKQorICogQHBhcmFtICAgICAgb3V0cHV0QmxvY2sgKElOKTogYWRkcmVzcyBvZiBibG9jayB0byBmaWxsCisgKiBAcGFyYW0gICAgICBpbnB1dEJsb2NrICAoSU4pOiBhZGRyZXNzIG9mIHRoZSBpbnB1dCBibG9jaworICogQHBhcmFtICAgICAgc2l6ZSAoSU4pOiBzaXplIG9mIHRoZSBibG9jayB0byBjb3B5IChpbiBieXRlcykKKyAqIEByZXR1cm4gICAgIGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBibG9jaywgaS5lLiB0aGUgZmlyc3QgcGFyYW1ldGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworTTRPU0FfTWVtQWRkcjggTTRPU0FfbWVtbW92ZShNNE9TQV9NZW1BZGRyOCBvdXRwdXRCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBpbnB1dEJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKQoreworICAgcmV0dXJuIG1lbW1vdmUoKHZvaWQqKW91dHB1dEJsb2NrLCAodm9pZCopaW5wdXRCbG9jaywgIHNpemUpOworfQorCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmbiAgICAgICAgIE00T1NBX0ludDMyIE00T1NBX21lbWNtcChNNE9TQV9NZW1BZGRyOCBhZGRyZXNzMSwgTTRPU0FfTWVtQWRkcjggYWRkcmVzczIsIE00T1NBX1VJbnQzMiBzaXplKQorICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBjb21wYXJlcyB0aGUgZmlyc3QgJ3NpemUnIGJ5dGVzIG9mIGFkZHJlc3MxIGFuZAorICAgICAgICAgICAgICAgJ2FkZHJlc3MyJyBhbmQgcmV0dXJuIGEgdmFsdWUgaW5kaWNhdGluZyB0aGVpciByZWxhdGlvbnNoaXAuCisgKiBAbm90ZQorICogQHBhcmFtICAgICAgYWRkcmVzczEgKElOKTogbWVtb3J5IGFkZHJlc3MgMQorICogQHBhcmFtICAgICAgYWRkcmVzczIgKElOKTogbWVtb3J5IGFkZHJlc3MgMgorICogQHBhcmFtICAgICAgc2l6ZSAoSU4pOiBzaXplIG9mIHRoZSBibG9jayB0byBjb21wYXJlIChpbiBieXRlcykKKyAqIEByZXR1cm4gICAgICsxLCBpZiBmaXJzdCBieXRlcyBvZiBhZHJlc3MxIGFyZSBzbWFsbGVyIHRoYW4gdGhvc2Ugb2YgYWRkcmVzczIKKyAqIEByZXR1cm4gICAgICAwLCBpZiBib3RoIGJsb2NrcyBhcmUgaWRlbnRpY2FsCisgKiBAcmV0dXJuICAgIC0xLCBpZiBmaXJzdCBieXRlcyBvZiBhZGRyZXNzMSBhcmUgYmlnZ2VyIHRoYW4gdGhvc2Ugb2YgYWRkcmVzczIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK000T1NBX0ludDMyIE00T1NBX21lbWNtcChNNE9TQV9NZW1BZGRyOCBhZGRyZXNzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBhZGRyZXNzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSkKK3sKKyAgICBNNE9TQV9JbnQzMiBpMzJfcmVzdWx0ID0gbWVtY21wKGFkZHJlc3MxLCBhZGRyZXNzMiwgc2l6ZSk7CisgICAgaWYgKGkzMl9yZXN1bHQgPiAwKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmIChpMzJfcmVzdWx0IDwgMCkgeworICAgICAgICByZXR1cm4oKE00T1NBX0ludDMyKS0xKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjM5ZDgyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAZmlsZSAgICAgICAgTTRQU1dfVHJhY2UuYworICogQGJyaWVmICAgICAgICBUcmFjZSBmdW5jdGlvbiBmb3IgdHJhY2UgbWFjcm9zCisgKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGdpdmVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb24gdXNlZAorICogICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlIGluc3RydW1lbnRhdGlvbiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+IC8qZm9yIHByaW50ZiAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPiAvKiBBTlNJIEMgbWFjcm9zIGFuZCBkZWZzIGZvciB2YXJpYWJsZSBhcmdzICovCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgorI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCisKKyNkZWZpbmUgTk9fRklMRSAvKiBzdXBwcmVzc2VzIHRoZSBmaWxlIG5hbWUgcHJpbnQgb3V0ICovCisKKyNkZWZpbmUgTUFYX1NUUklOR19TSVpFIDEwMjQKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB2b2lkIE00T1NBX1RyYWNlKE00T1NBX0ludDMyIGxpbmUsIE00T1NBX0NoYXIqIGZpbGUgLE00T1NBX0ludDMyIGxldmVsLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmb3JtYXQsIC4uLikKKyAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHRyYWNlIGZvciBkZWJ1ZyB0ZXN0cworICogQG5vdGUgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHByaW50Zi4gRmlyc3QgdGhlIHZhcmlhYmxlcyBhcmUgcmV0cmlldmVkIHVzaW5nCisgKiAgICAgICAgICAgIEFOU0kgQyBkZWZzIGFuZCBtYWNyb3Mgd2hpY2ggZW5hYmxlIHRvIGFjY2VzcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCisgKiAgICAgICAgICAgIFRoZW4gdGhlIHByaW50ZiBpcyBkb25lICh3aXRoIHNvbWUgb3JuZW1lbnRhbCBhZGRzKS4KKyAqIEBwYXJhbSAgICBsZXZlbCAoSU4pOiB0aGUgZGVidWcgbGV2ZWwKKyAqIEBwYXJhbSAgICBmb3JtYXQgKElOKTogdGhlICJwcmludGYiIGZvcm1hdGVkIHN0cmluZworICogQHBhcmFtICAgIC4uLiAoSU4pOiBhcyBtYW55IHBhcmFtZXRlcnMgYXMgcmVxdWlyZWQgLi4uCisgKiBAcmV0dXJuICAgIG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK000T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSB2b2lkIE00T1NBX1RyYWNlKE00T1NBX0ludDMyIGxpbmUsIE00T1NBX0NoYXIqIGZpbGUgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9DaGFyKiBmb3JtYXQsIC4uLikKK3sKKyAgICBNNE9TQV9DaGFyIG1lc3NhZ2VbTUFYX1NUUklOR19TSVpFXTsKKyAgICBNNE9TQV9JbnQzMiBpOworICAgIHZhX2xpc3QgbWFya2VyOyAvKiBwb2ludGVyIHRvIGxpc3Qgb2YgYXJndW1lbnRzICovCisKKyAgICAvKiBnZXQgdGhlIHZhciBhcmd1bWVudHMgaW50byB0aGUgc3RyaW5nIG1lc3NhZ2UgdG8gYmUgYWJsZSB0byBwcmludCAqLworICAgIHZhX3N0YXJ0KG1hcmtlcixmb3JtYXQpOyAvKiBzZXQgcHRyIHRvIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uICovCisgICAgdnNwcmludGYoKGNoYXIgKiltZXNzYWdlLCAoY29uc3QgY2hhciAqKWZvcm1hdCxtYXJrZXIgKTsgIC8qIGZvcm1hdHMgYW5kIHdyaXRlcyB0aGUgZGF0YSBpbnRvIG1lc3NhZ2UgKi8KKyAgICB2YV9lbmQobWFya2VyKTsgLyogcmVzZXQgcG9pbnRlciB0byBOVUxMICovCisKKyAgICAvKiBkbyB0aGUgYWN0dWFsIHByaW50ICovCisjaWZkZWYgTk9fRklMRQorICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIkxpZmVWaWJlc1RyYWNlIiwgIiVzIiwgKGNoYXIqKW1lc3NhZ2UpOworI2Vsc2UgLyogTk9fRklMRSAgICAgKi8KKyAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJMaWZlVmliZXNUcmFjZSIsICIlcyIsICIlcyBhdCAlbHUgaW4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltZXNzYWdlLCBsaW5lLCBmaWxlKTsKKyNlbmRpZiAvKiBOT19GSUxFICAgICAqLworCit9CisKK000T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSBNNE9TQV9Wb2lkIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oTTRPU0FfVUludDMyIGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db3JlSUQgY29yZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZ01zZywgLi4uKQoreworICAgIE00T1NBX0NoYXIgbWVzc2FnZVtNQVhfU1RSSU5HX1NJWkVdOworICAgIE00T1NBX0ludDMyIGk7CisgICAgdmFfbGlzdCBtYXJrZXI7IC8qIHBvaW50ZXIgdG8gbGlzdCBvZiBhcmd1bWVudHMgKi8KKworICAgIC8qIGdldCB0aGUgdmFyIGFyZ3VtZW50cyBpbnRvIHRoZSBzdHJpbmcgbWVzc2FnZSB0byBiZSBhYmxlIHRvIHByaW50ICovCisgICAgdmFfc3RhcnQobWFya2VyLHN0cmluZ01zZyk7IC8qIHNldCBwdHIgdG8gZmlyc3QgYXJndW1lbnQgaW4gdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gKi8KKyAgICB2c3ByaW50ZigoY2hhciAqKW1lc3NhZ2UsIChjb25zdCBjaGFyICopc3RyaW5nTXNnLG1hcmtlciApOyAgLyogZm9ybWF0cyBhbmQgd3JpdGVzIHRoZSBkYXRhIGludG8gbWVzc2FnZSAqLworICAgIHZhX2VuZChtYXJrZXIpOyAvKiByZXNldCBwb2ludGVyIHRvIE5VTEwgKi8KKworICAgIC8qIGRvIHRoZSBhY3R1YWwgcHJpbnQgKi8KKyNpZmRlZiBOT19GSUxFCisgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTGlmZVZpYmVzVHJhY2UiLCAiJXMiLCAoY2hhciopbWVzc2FnZSk7CisjZWxzZSAvKiBOT19GSUxFICAgICAqLworICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIkxpZmVWaWJlc1RyYWNlIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWVzc2FnZSwgbGluZSwgKGNoYXIqKWZpbGUpOworI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCisKK30KKwo=