ZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQURYTDM0NV9JMkMuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQURYTDM0NV9JMkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTVlMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BRFhMMzQ1X0kyQy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiSTJDLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQURYTDM0NSBBY2NlbGVyb21ldGVyIG9uIEkyQy4KKyAqCisgKiBUaGlzIGNsYXNzIGFsbG93cyBhY2Nlc3MgdG8gYSBBbmFsb2cgRGV2aWNlcyBBRFhMMzQ1IDMtYXhpcyBhY2NlbGVyb21ldGVyIG9uCisgKiBhbiBJMkMgYnVzLgorICogVGhpcyBjbGFzcyBhc3N1bWVzIHRoZSBkZWZhdWx0IChub3QgYWx0ZXJuYXRlKSBzZW5zb3IgYWRkcmVzcyBvZiAweDFEICg3LWJpdAorICogYWRkcmVzcykuCisgKi8KK2NsYXNzIEFEWEwzNDVfSTJDIDogcHVibGljIEFjY2VsZXJvbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJMkMsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0FkZHJlc3MgPSAweDFEOworICBzdGF0aWMgY29uc3QgdWludDhfdCBrUG93ZXJDdGxSZWdpc3RlciA9IDB4MkQ7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhRm9ybWF0UmVnaXN0ZXIgPSAweDMxOworICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YVJlZ2lzdGVyID0gMHgzMjsKKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0dzUGVyTFNCID0gMC4wMDM5MDYyNTsKKyAgZW51bSBQb3dlckN0bEZpZWxkcyB7CisgICAga1Bvd2VyQ3RsX0xpbmsgPSAweDIwLAorICAgIGtQb3dlckN0bF9BdXRvU2xlZXAgPSAweDEwLAorICAgIGtQb3dlckN0bF9NZWFzdXJlID0gMHgwOCwKKyAgICBrUG93ZXJDdGxfU2xlZXAgPSAweDA0CisgIH07CisgIGVudW0gRGF0YUZvcm1hdEZpZWxkcyB7CisgICAga0RhdGFGb3JtYXRfU2VsZlRlc3QgPSAweDgwLAorICAgIGtEYXRhRm9ybWF0X1NQSSA9IDB4NDAsCisgICAga0RhdGFGb3JtYXRfSW50SW52ZXJ0ID0gMHgyMCwKKyAgICBrRGF0YUZvcm1hdF9GdWxsUmVzID0gMHgwOCwKKyAgICBrRGF0YUZvcm1hdF9KdXN0aWZ5ID0gMHgwNAorICB9OworCisgcHVibGljOgorICBlbnVtIEF4ZXMgeyBrQXhpc19YID0gMHgwMCwga0F4aXNfWSA9IDB4MDIsIGtBeGlzX1ogPSAweDA0IH07CisgIHN0cnVjdCBBbGxBeGVzIHsKKyAgICBkb3VibGUgWEF4aXM7CisgICAgZG91YmxlIFlBeGlzOworICAgIGRvdWJsZSBaQXhpczsKKyAgfTsKKworIHB1YmxpYzoKKyAgZXhwbGljaXQgQURYTDM0NV9JMkMoUG9ydCBwb3J0LCBSYW5nZSByYW5nZSA9IGtSYW5nZV8yRyk7CisgIHZpcnR1YWwgfkFEWEwzNDVfSTJDKCkgPSBkZWZhdWx0OworCisgIEFEWEwzNDVfSTJDKGNvbnN0IEFEWEwzNDVfSTJDJikgPSBkZWxldGU7CisgIEFEWEwzNDVfSTJDJiBvcGVyYXRvcj0oY29uc3QgQURYTDM0NV9JMkMmKSA9IGRlbGV0ZTsKKworICAvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQorICB2aXJ0dWFsIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpIG92ZXJyaWRlOworICB2aXJ0dWFsIGRvdWJsZSBHZXRYKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZG91YmxlIEdldFkoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0WigpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgZG91YmxlIEdldEFjY2VsZXJhdGlvbihBeGVzIGF4aXMpOworICB2aXJ0dWFsIEFsbEF4ZXMgR2V0QWNjZWxlcmF0aW9ucygpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3VidGFibGUpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgVXBkYXRlVGFibGUoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlIHt9CisgIHZpcnR1YWwgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZSB7fQorCisgcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FEWEwzNDVfU1BJLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FEWEwzNDVfU1BJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxMDEzMwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQURYTDM0NV9TUEkuaApAQCAtMCwwICsxLDgyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJTUEkuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCitjbGFzcyBEaWdpdGFsSW5wdXQ7CitjbGFzcyBEaWdpdGFsT3V0cHV0OworCisvKioKKyAqIEFEWEwzNDUgQWNjZWxlcm9tZXRlciBvbiBTUEkuCisgKgorICogVGhpcyBjbGFzcyBhbGxvd3MgYWNjZXNzIHRvIGFuIEFuYWxvZyBEZXZpY2VzIEFEWEwzNDUgMy1heGlzIGFjY2VsZXJvbWV0ZXIKKyAqIHZpYSBTUEkuCisgKiBUaGlzIGNsYXNzIGFzc3VtZXMgdGhlIHNlbnNvciBpcyB3aXJlZCBpbiA0LXdpcmUgU1BJIG1vZGUuCisgKi8KK2NsYXNzIEFEWEwzNDVfU1BJIDogcHVibGljIEFjY2VsZXJvbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBTUEksCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Bvd2VyQ3RsUmVnaXN0ZXIgPSAweDJEOworICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YUZvcm1hdFJlZ2lzdGVyID0gMHgzMTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFSZWdpc3RlciA9IDB4MzI7CisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtHc1BlckxTQiA9IDAuMDAzOTA2MjU7CisgIGVudW0gU1BJQWRkcmVzc0ZpZWxkcyB7IGtBZGRyZXNzX1JlYWQgPSAweDgwLCBrQWRkcmVzc19NdWx0aUJ5dGUgPSAweDQwIH07CisgIGVudW0gUG93ZXJDdGxGaWVsZHMgeworICAgIGtQb3dlckN0bF9MaW5rID0gMHgyMCwKKyAgICBrUG93ZXJDdGxfQXV0b1NsZWVwID0gMHgxMCwKKyAgICBrUG93ZXJDdGxfTWVhc3VyZSA9IDB4MDgsCisgICAga1Bvd2VyQ3RsX1NsZWVwID0gMHgwNAorICB9OworICBlbnVtIERhdGFGb3JtYXRGaWVsZHMgeworICAgIGtEYXRhRm9ybWF0X1NlbGZUZXN0ID0gMHg4MCwKKyAgICBrRGF0YUZvcm1hdF9TUEkgPSAweDQwLAorICAgIGtEYXRhRm9ybWF0X0ludEludmVydCA9IDB4MjAsCisgICAga0RhdGFGb3JtYXRfRnVsbFJlcyA9IDB4MDgsCisgICAga0RhdGFGb3JtYXRfSnVzdGlmeSA9IDB4MDQKKyAgfTsKKworIHB1YmxpYzoKKyAgZW51bSBBeGVzIHsga0F4aXNfWCA9IDB4MDAsIGtBeGlzX1kgPSAweDAyLCBrQXhpc19aID0gMHgwNCB9OworICBzdHJ1Y3QgQWxsQXhlcyB7CisgICAgZG91YmxlIFhBeGlzOworICAgIGRvdWJsZSBZQXhpczsKKyAgICBkb3VibGUgWkF4aXM7CisgIH07CisKKyBwdWJsaWM6CisgIEFEWEwzNDVfU1BJKFNQSTo6UG9ydCBwb3J0LCBSYW5nZSByYW5nZSA9IGtSYW5nZV8yRyk7CisgIHZpcnR1YWwgfkFEWEwzNDVfU1BJKCkgPSBkZWZhdWx0OworCisgIEFEWEwzNDVfU1BJKGNvbnN0IEFEWEwzNDVfU1BJJikgPSBkZWxldGU7CisgIEFEWEwzNDVfU1BJJiBvcGVyYXRvcj0oY29uc3QgQURYTDM0NV9TUEkmKSA9IGRlbGV0ZTsKKworICAvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQorICB2aXJ0dWFsIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpIG92ZXJyaWRlOworICB2aXJ0dWFsIGRvdWJsZSBHZXRYKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZG91YmxlIEdldFkoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0WigpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgZG91YmxlIEdldEFjY2VsZXJhdGlvbihBeGVzIGF4aXMpOworICB2aXJ0dWFsIEFsbEF4ZXMgR2V0QWNjZWxlcmF0aW9ucygpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3VidGFibGUpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgVXBkYXRlVGFibGUoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlIHt9CisgIHZpcnR1YWwgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZSB7fQorCisgcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FEWEwzNjIuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQURYTDM2Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNDc2ODYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FEWEwzNjIuaApAQCAtMCwwICsxLDYyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJTUEkuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCitjbGFzcyBEaWdpdGFsSW5wdXQ7CitjbGFzcyBEaWdpdGFsT3V0cHV0OworCisvKioKKyAqIEFEWEwzNjIgU1BJIEFjY2VsZXJvbWV0ZXIuCisgKgorICogVGhpcyBjbGFzcyBhbGxvd3MgYWNjZXNzIHRvIGFuIEFuYWxvZyBEZXZpY2VzIEFEWEwzNjIgMy1heGlzIGFjY2VsZXJvbWV0ZXIuCisgKi8KK2NsYXNzIEFEWEwzNjIgOiBwdWJsaWMgQWNjZWxlcm9tZXRlciwgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSB7CisgcHVibGljOgorICBlbnVtIEF4ZXMgeyBrQXhpc19YID0gMHgwMCwga0F4aXNfWSA9IDB4MDIsIGtBeGlzX1ogPSAweDA0IH07CisgIHN0cnVjdCBBbGxBeGVzIHsKKyAgICBkb3VibGUgWEF4aXM7CisgICAgZG91YmxlIFlBeGlzOworICAgIGRvdWJsZSBaQXhpczsKKyAgfTsKKworIHB1YmxpYzoKKyAgQURYTDM2MihSYW5nZSByYW5nZSA9IGtSYW5nZV8yRyk7CisgIEFEWEwzNjIoU1BJOjpQb3J0IHBvcnQsIFJhbmdlIHJhbmdlID0ga1JhbmdlXzJHKTsKKyAgdmlydHVhbCB+QURYTDM2MigpID0gZGVmYXVsdDsKKworICBBRFhMMzYyKGNvbnN0IEFEWEwzNjImKSA9IGRlbGV0ZTsKKyAgQURYTDM2MiYgb3BlcmF0b3I9KGNvbnN0IEFEWEwzNjImKSA9IGRlbGV0ZTsKKworICAvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQorICB2aXJ0dWFsIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpIG92ZXJyaWRlOworICB2aXJ0dWFsIGRvdWJsZSBHZXRYKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZG91YmxlIEdldFkoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0WigpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgZG91YmxlIEdldEFjY2VsZXJhdGlvbihBeGVzIGF4aXMpOworICB2aXJ0dWFsIEFsbEF4ZXMgR2V0QWNjZWxlcmF0aW9ucygpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3VidGFibGUpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgVXBkYXRlVGFibGUoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlIHt9CisgIHZpcnR1YWwgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZSB7fQorCisgcHJpdmF0ZToKKyAgU1BJIG1fc3BpOworICBkb3VibGUgbV9nc1BlckxTQiA9IDAuMDAxOworCisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fdGFibGU7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BRFhSUzQ1MF9HeXJvLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FEWFJTNDUwX0d5cm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE3YTU5Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BRFhSUzQ1MF9HeXJvLmgKQEAgLTAsMCArMSw0NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KKy8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJHeXJvQmFzZS5oIgorI2luY2x1ZGUgIk5vdGlmaWVyLmgiCisjaW5jbHVkZSAiU1BJLmgiCisjaW5jbHVkZSAiSEFML2NwcC9wcmlvcml0eV9tdXRleC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIFVzZSBhIHJhdGUgZ3lybyB0byByZXR1cm4gdGhlIHJvYm90cyBoZWFkaW5nIHJlbGF0aXZlIHRvIGEgc3RhcnRpbmcgcG9zaXRpb24uCisgKiBUaGUgR3lybyBjbGFzcyB0cmFja3MgdGhlIHJvYm90cyBoZWFkaW5nIGJhc2VkIG9uIHRoZSBzdGFydGluZyBwb3NpdGlvbi4gQXMKKyAqIHRoZSByb2JvdCByb3RhdGVzIHRoZSBuZXcgaGVhZGluZyBpcyBjb21wdXRlZCBieSBpbnRlZ3JhdGluZyB0aGUgcmF0ZSBvZgorICogcm90YXRpb24gcmV0dXJuZWQgYnkgdGhlIHNlbnNvci4gV2hlbiB0aGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkLCBpdCBkb2VzIGEKKyAqIHNob3J0IGNhbGlicmF0aW9uIHJvdXRpbmUgd2hlcmUgaXQgc2FtcGxlcyB0aGUgZ3lybyB3aGlsZSBhdCByZXN0IHRvCisgKiBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgb2Zmc2V0LiBUaGlzIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIHNhbXBsZSB0bworICogZGV0ZXJtaW5lIHRoZSBoZWFkaW5nLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgZm9yIHRoZSBkaWdpdGFsIEFEWFJTNDUwIGd5cm8gc2Vuc29yIHRoYXQgY29ubmVjdHMgdmlhIFNQSS4KKyAqLworY2xhc3MgQURYUlM0NTBfR3lybyA6IHB1YmxpYyBHeXJvQmFzZSB7CisgcHVibGljOgorICBBRFhSUzQ1MF9HeXJvKCk7CisgIGV4cGxpY2l0IEFEWFJTNDUwX0d5cm8oU1BJOjpQb3J0IHBvcnQpOworICB2aXJ0dWFsIH5BRFhSUzQ1MF9HeXJvKCkgPSBkZWZhdWx0OworCisgIGZsb2F0IEdldEFuZ2xlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGRvdWJsZSBHZXRSYXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKKyAgdm9pZCBDYWxpYnJhdGUoKSBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIFNQSSBtX3NwaTsKKworICB1aW50MTZfdCBSZWFkUmVnaXN0ZXIodWludDhfdCByZWcpOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQW5hbG9nQWNjZWxlcm9tZXRlci5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BbmFsb2dBY2NlbGVyb21ldGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2ZDZkZAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQW5hbG9nQWNjZWxlcm9tZXRlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworLyoqCisgKiBIYW5kbGUgb3BlcmF0aW9uIG9mIGFuIGFuYWxvZyBhY2NlbGVyb21ldGVyLgorICogVGhlIGFjY2VsZXJvbWV0ZXIgcmVhZHMgYWNjZWxlcmF0aW9uIGRpcmVjdGx5IHRocm91Z2ggdGhlIHNlbnNvci4gTWFueQorICogc2Vuc29ycyBoYXZlCisgKiBtdWx0aXBsZSBheGlzIGFuZCBjYW4gYmUgdHJlYXRlZCBhcyBtdWx0aXBsZSBkZXZpY2VzLiBFYWNoIGlzIGNhbGlicmF0ZWQgYnkKKyAqIGZpbmRpbmcKKyAqIHRoZSBjZW50ZXIgdmFsdWUgb3ZlciBhIHBlcmlvZCBvZiB0aW1lLgorICovCitjbGFzcyBBbmFsb2dBY2NlbGVyb21ldGVyIDogcHVibGljIFNlbnNvckJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBJRFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEFuYWxvZ0FjY2VsZXJvbWV0ZXIoaW50MzJfdCBjaGFubmVsKTsKKyAgZXhwbGljaXQgQW5hbG9nQWNjZWxlcm9tZXRlcihBbmFsb2dJbnB1dCAqY2hhbm5lbCk7CisgIGV4cGxpY2l0IEFuYWxvZ0FjY2VsZXJvbWV0ZXIoc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ0lucHV0PiBjaGFubmVsKTsKKyAgdmlydHVhbCB+QW5hbG9nQWNjZWxlcm9tZXRlcigpID0gZGVmYXVsdDsKKworICBmbG9hdCBHZXRBY2NlbGVyYXRpb24oKSBjb25zdDsKKyAgdm9pZCBTZXRTZW5zaXRpdml0eShmbG9hdCBzZW5zaXRpdml0eSk7CisgIHZvaWQgU2V0WmVybyhmbG9hdCB6ZXJvKTsKKyAgZG91YmxlIFBJREdldCgpIG92ZXJyaWRlOworCisgIHZvaWQgVXBkYXRlVGFibGUoKSBvdmVycmlkZTsKKyAgdm9pZCBTdGFydExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIEdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgb3ZlcnJpZGU7CisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICB2b2lkIEluaXRBY2NlbGVyb21ldGVyKCk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ0lucHV0PiBtX2FuYWxvZ0lucHV0OworICBmbG9hdCBtX3ZvbHRzUGVyRyA9IDEuMDsKKyAgZmxvYXQgbV96ZXJvR1ZvbHRhZ2UgPSAyLjU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FuYWxvZ0d5cm8uaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQW5hbG9nR3lyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTBjY2IKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FuYWxvZ0d5cm8uaApAQCAtMCwwICsxLDY1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkd5cm9CYXNlLmgiCisKK2NsYXNzIEFuYWxvZ0lucHV0OworCisvKioKKyAqIFVzZSBhIHJhdGUgZ3lybyB0byByZXR1cm4gdGhlIHJvYm90cyBoZWFkaW5nIHJlbGF0aXZlIHRvIGEgc3RhcnRpbmcgcG9zaXRpb24uCisgKiBUaGUgR3lybyBjbGFzcyB0cmFja3MgdGhlIHJvYm90cyBoZWFkaW5nIGJhc2VkIG9uIHRoZSBzdGFydGluZyBwb3NpdGlvbi4gQXMKKyAqIHRoZSByb2JvdAorICogcm90YXRlcyB0aGUgbmV3IGhlYWRpbmcgaXMgY29tcHV0ZWQgYnkgaW50ZWdyYXRpbmcgdGhlIHJhdGUgb2Ygcm90YXRpb24KKyAqIHJldHVybmVkCisgKiBieSB0aGUgc2Vuc29yLiBXaGVuIHRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQsIGl0IGRvZXMgYSBzaG9ydCBjYWxpYnJhdGlvbgorICogcm91dGluZQorICogd2hlcmUgaXQgc2FtcGxlcyB0aGUgZ3lybyB3aGlsZSBhdCByZXN0IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBvZmZzZXQuIFRoaXMKKyAqIGlzCisgKiBzdWJ0cmFjdGVkIGZyb20gZWFjaCBzYW1wbGUgdG8gZGV0ZXJtaW5lIHRoZSBoZWFkaW5nLiBUaGlzIGd5cm8gY2xhc3MgbXVzdCBiZQorICogdXNlZAorICogd2l0aCBhIGNoYW5uZWwgdGhhdCBpcyBhc3NpZ25lZCBvbmUgb2YgdGhlIEFuYWxvZyBhY2N1bXVsYXRvcnMgZnJvbSB0aGUgRlBHQS4KKyAqIFNlZQorICogQW5hbG9nSW5wdXQgZm9yIHRoZSBjdXJyZW50IGFjY3VtdWxhdG9yIGFzc2lnbm1lbnRzLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgZm9yIGd5cm8gc2Vuc29ycyB0aGF0IGNvbm5lY3QgdG8gYW4gYW5hbG9nIGlucHV0LgorICovCitjbGFzcyBBbmFsb2dHeXJvIDogcHVibGljIEd5cm9CYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrT3ZlcnNhbXBsZUJpdHMgPSAxMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBdmVyYWdlQml0cyA9IDA7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga1NhbXBsZXNQZXJTZWNvbmQgPSA1MC4wOworICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtDYWxpYnJhdGlvblNhbXBsZVRpbWUgPSA1LjA7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRWb2x0c1BlckRlZ3JlZVBlclNlY29uZCA9IDAuMDA3OworCisgIGV4cGxpY2l0IEFuYWxvZ0d5cm8oaW50MzJfdCBjaGFubmVsKTsKKyAgZXhwbGljaXQgQW5hbG9nR3lybyhBbmFsb2dJbnB1dCAqY2hhbm5lbCk7CisgIGV4cGxpY2l0IEFuYWxvZ0d5cm8oc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ0lucHV0PiBjaGFubmVsKTsKKyAgQW5hbG9nR3lybyhpbnQzMl90IGNoYW5uZWwsIHVpbnQzMl90IGNlbnRlciwgZmxvYXQgb2Zmc2V0KTsKKyAgQW5hbG9nR3lybyhzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nSW5wdXQ+IGNoYW5uZWwsIHVpbnQzMl90IGNlbnRlciwgZmxvYXQgb2Zmc2V0KTsKKyAgdmlydHVhbCB+QW5hbG9nR3lybygpID0gZGVmYXVsdDsKKworICBmbG9hdCBHZXRBbmdsZSgpIGNvbnN0IG92ZXJyaWRlOworICBkb3VibGUgR2V0UmF0ZSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHVpbnQzMl90IEdldENlbnRlcigpIGNvbnN0OworICB2aXJ0dWFsIGZsb2F0IEdldE9mZnNldCgpIGNvbnN0OworICB2b2lkIFNldFNlbnNpdGl2aXR5KGZsb2F0IHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKTsKKyAgdm9pZCBTZXREZWFkYmFuZChmbG9hdCB2b2x0cyk7CisgIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEluaXRHeXJvKCk7CisgIHZvaWQgQ2FsaWJyYXRlKCkgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dJbnB1dD4gbV9hbmFsb2c7CisKKyBwcml2YXRlOgorICBmbG9hdCBtX3ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kOworICBmbG9hdCBtX29mZnNldDsKKyAgdWludDMyX3QgbV9jZW50ZXI7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BbmFsb2dJbnB1dC5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BbmFsb2dJbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2QxZjIKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FuYWxvZ0lucHV0LmgKQEAgLTAsMCArMSw4NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJQSURTb3VyY2UuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIEFuYWxvZyBpbnB1dCBjbGFzcy4KKyAqCisgKiBDb25uZWN0ZWQgdG8gZWFjaCBhbmFsb2cgY2hhbm5lbCBpcyBhbiBhdmVyYWdpbmcgYW5kIG92ZXJzYW1wbGluZyBlbmdpbmUuCisgKiBUaGlzIGVuZ2luZSBhY2N1bXVsYXRlcworICogdGhlIHNwZWNpZmllZCAoIGJ5IFNldEF2ZXJhZ2VCaXRzKCkgYW5kIFNldE92ZXJzYW1wbGVCaXRzKCkgKSBudW1iZXIgb2YKKyAqIHNhbXBsZXMgYmVmb3JlIHJldHVybmluZyBhIG5ldworICogdmFsdWUuICBUaGlzIGlzIG5vdCBhIHNsaWRpbmcgd2luZG93IGF2ZXJhZ2UuICBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4KKyAqIHRoZSBvdmVyc2FtcGxlZCBzYW1wbGVzIGFuZAorICogdGhlIGF2ZXJhZ2VkIHNhbXBsZXMgaXMgdGhhdCB0aGUgb3ZlcnNhbXBsZWQgc2FtcGxlcyBhcmUgc2ltcGx5IGFjY3VtdWxhdGVkCisgKiBlZmZlY3RpdmVseSBpbmNyZWFzaW5nIHRoZQorICogcmVzb2x1dGlvbiwgd2hpbGUgdGhlIGF2ZXJhZ2VkIHNhbXBsZXMgYXJlIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgKiB0byByZXRhaW4gdGhlIHJlc29sdXRpb24sCisgKiBidXQgZ2V0IG1vcmUgc3RhYmxlIHZhbHVlcy4KKyAqLworY2xhc3MgQW5hbG9nSW5wdXQgOiBwdWJsaWMgU2Vuc29yQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFBJRFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgdWludDhfdCBrQWNjdW11bGF0b3JNb2R1bGVOdW1iZXIgPSAxOworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHMgPSAyOworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0FjY3VtdWxhdG9yQ2hhbm5lbHNba0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHNdOworCisgIGV4cGxpY2l0IEFuYWxvZ0lucHV0KHVpbnQzMl90IGNoYW5uZWwpOworICB2aXJ0dWFsIH5BbmFsb2dJbnB1dCgpOworCisgIGludDE2X3QgR2V0VmFsdWUoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRBdmVyYWdlVmFsdWUoKSBjb25zdDsKKworICBmbG9hdCBHZXRWb2x0YWdlKCkgY29uc3Q7CisgIGZsb2F0IEdldEF2ZXJhZ2VWb2x0YWdlKCkgY29uc3Q7CisKKyAgdWludDMyX3QgR2V0Q2hhbm5lbCgpIGNvbnN0OworCisgIHZvaWQgU2V0QXZlcmFnZUJpdHModWludDMyX3QgYml0cyk7CisgIHVpbnQzMl90IEdldEF2ZXJhZ2VCaXRzKCkgY29uc3Q7CisgIHZvaWQgU2V0T3ZlcnNhbXBsZUJpdHModWludDMyX3QgYml0cyk7CisgIHVpbnQzMl90IEdldE92ZXJzYW1wbGVCaXRzKCkgY29uc3Q7CisKKyAgdWludDMyX3QgR2V0TFNCV2VpZ2h0KCkgY29uc3Q7CisgIGludDMyX3QgR2V0T2Zmc2V0KCkgY29uc3Q7CisKKyAgYm9vbCBJc0FjY3VtdWxhdG9yQ2hhbm5lbCgpIGNvbnN0OworICB2b2lkIEluaXRBY2N1bXVsYXRvcigpOworICB2b2lkIFNldEFjY3VtdWxhdG9ySW5pdGlhbFZhbHVlKGludDY0X3QgdmFsdWUpOworICB2b2lkIFJlc2V0QWNjdW11bGF0b3IoKTsKKyAgdm9pZCBTZXRBY2N1bXVsYXRvckNlbnRlcihpbnQzMl90IGNlbnRlcik7CisgIHZvaWQgU2V0QWNjdW11bGF0b3JEZWFkYmFuZChpbnQzMl90IGRlYWRiYW5kKTsKKyAgaW50NjRfdCBHZXRBY2N1bXVsYXRvclZhbHVlKCkgY29uc3Q7CisgIHVpbnQzMl90IEdldEFjY3VtdWxhdG9yQ291bnQoKSBjb25zdDsKKyAgdm9pZCBHZXRBY2N1bXVsYXRvck91dHB1dChpbnQ2NF90ICZ2YWx1ZSwgdWludDMyX3QgJmNvdW50KSBjb25zdDsKKworICBzdGF0aWMgdm9pZCBTZXRTYW1wbGVSYXRlKGZsb2F0IHNhbXBsZXNQZXJTZWNvbmQpOworICBzdGF0aWMgZmxvYXQgR2V0U2FtcGxlUmF0ZSgpOworCisgIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKKworICB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgdWludDMyX3QgbV9jaGFubmVsOworICAvL1RPRE86IEFkanVzdCBIQUwgdG8gYXZvaWQgdXNlIG9mIHJhdyBwb2ludGVycy4KKyAgdm9pZCAqbV9wb3J0OworICBpbnQ2NF90IG1fYWNjdW11bGF0b3JPZmZzZXQ7CisKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FuYWxvZ091dHB1dC5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BbmFsb2dPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzBiNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BbmFsb2dPdXRwdXQuaApAQCAtMCwwICsxLDM5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLworLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKKy8qKgorICogTVhQIGFuYWxvZyBvdXRwdXQgY2xhc3MuCisgKi8KK2NsYXNzIEFuYWxvZ091dHB1dCA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEFuYWxvZ091dHB1dCh1aW50MzJfdCBjaGFubmVsKTsKKyAgdmlydHVhbCB+QW5hbG9nT3V0cHV0KCk7CisKKyAgdm9pZCBTZXRWb2x0YWdlKGZsb2F0IHZvbHRhZ2UpOworICBmbG9hdCBHZXRWb2x0YWdlKCkgY29uc3Q7CisKKyAgdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworICB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSBvdmVycmlkZTsKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgdWludDMyX3QgbV9jaGFubmVsOworICB2b2lkICptX3BvcnQ7CisKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FuYWxvZ1BvdGVudGlvbWV0ZXIuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQW5hbG9nUG90ZW50aW9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2IxMmEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FuYWxvZ1BvdGVudGlvbWV0ZXIuaApAQCAtMCwwICsxLDg1IEBACisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENsYXNzIGZvciByZWFkaW5nIGFuYWxvZyBwb3RlbnRpb21ldGVycy4gQW5hbG9nIHBvdGVudGlvbWV0ZXJzIHJlYWQKKyAqIGluIGFuIGFuYWxvZyB2b2x0YWdlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwb3NpdGlvbi4gVGhlIHBvc2l0aW9uIGlzCisgKiBpbiB3aGljaGV2ZXIgdW5pdHMgeW91IGNob29zZSwgYnkgd2F5IG9mIHRoZSBzY2FsaW5nIGFuZCBvZmZzZXQKKyAqIGNvbnN0YW50cyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICoKKyAqIEBhdXRob3IgQWxleCBIZW5uaW5nCisgKiBAYXV0aG9yIENvbGJ5IFNrZWdncyAocmFpbCB2b2x0YWdlKQorICovCitjbGFzcyBBbmFsb2dQb3RlbnRpb21ldGVyIDogcHVibGljIFBvdGVudGlvbWV0ZXIsIHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUgeworIHB1YmxpYzoKKyAgLyoqCisgICAqIEFuYWxvZ1BvdGVudGlvbWV0ZXIgY29uc3RydWN0b3IuCisgICAqCisgICAqIFVzZSB0aGUgZnVsbFJhbmdlIGFuZCBvZmZzZXQgdmFsdWVzIHNvIHRoYXQgdGhlIG91dHB1dCBwcm9kdWNlcworICAgKiBtZWFuaW5nZnVsIHZhbHVlcy4gSS5FOiB5b3UgaGF2ZSBhIDI3MCBkZWdyZWUgcG90ZW50aW9tZXRlciBhbmQKKyAgICogeW91IHdhbnQgdGhlIG91dHB1dCB0byBiZSBkZWdyZWVzIHdpdGggdGhlIGhhbGZ3YXkgcG9pbnQgYXMgMAorICAgKiBkZWdyZWVzLiBUaGUgZnVsbFJhbmdlIHZhbHVlIGlzIDI3MC4wKGRlZ3JlZXMpIGFuZCB0aGUgb2Zmc2V0IGlzCisgICAqIC0xMzUuMCBzaW5jZSB0aGUgaGFsZndheSBwb2ludCBhZnRlciBzY2FsaW5nIGlzIDEzNSBkZWdyZWVzLgorICAgKgorICAgKiBUaGlzIHdpbGwgY2FsY3VsYXRlIHRoZSByZXN1bHQgZnJvbSB0aGUgZnVsbFJhbmdlIHRpbWVzIHRoZQorICAgKiBmcmFjdGlvbiBvZiB0aGUgc3VwcGx5IHZvbHRhZ2UsIHBsdXMgdGhlIG9mZnNldC4KKyAgICoKKyAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGFuYWxvZyBjaGFubmVsIHRoaXMgcG90ZW50aW9tZXRlciBpcyBwbHVnZ2VkIGludG8uCisgICAqIEBwYXJhbSBmdWxsUmFuZ2UgVGhlIHNjYWxpbmcgdG8gbXVsdGlwbHkgdGhlIHZvbHRhZ2UgYnkgdG8gZ2V0IGEgbWVhbmluZ2Z1bAorICAgKiB1bml0LgorICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgdG8gYWRkIHRvIHRoZSBzY2FsZWQgdmFsdWUgZm9yIGNvbnRyb2xsaW5nIHRoZQorICAgKiB6ZXJvIHZhbHVlCisgICAqLworICBleHBsaWNpdCBBbmFsb2dQb3RlbnRpb21ldGVyKGludCBjaGFubmVsLCBkb3VibGUgZnVsbFJhbmdlID0gMS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXQgPSAwLjApOworCisgIGV4cGxpY2l0IEFuYWxvZ1BvdGVudGlvbWV0ZXIoQW5hbG9nSW5wdXQgKmlucHV0LCBkb3VibGUgZnVsbFJhbmdlID0gMS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXQgPSAwLjApOworCisgIGV4cGxpY2l0IEFuYWxvZ1BvdGVudGlvbWV0ZXIoc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ0lucHV0PiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZnVsbFJhbmdlID0gMS4wLCBkb3VibGUgb2Zmc2V0ID0gMC4wKTsKKworICB2aXJ0dWFsIH5BbmFsb2dQb3RlbnRpb21ldGVyKCkgPSBkZWZhdWx0OworCisgIC8qKgorICAgKiBHZXQgdGhlIGN1cnJlbnQgcmVhZGluZyBvZiB0aGUgcG90ZW50aW9tZXIuCisgICAqCisgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHBvdGVudGlvbWV0ZXIuCisgICAqLworICB2aXJ0dWFsIGRvdWJsZSBHZXQoKSBjb25zdCBvdmVycmlkZTsKKworICAvKioKKyAgICogSW1wbGVtZW50IHRoZSBQSURTb3VyY2UgaW50ZXJmYWNlLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJlYWRpbmcuCisgICAqLworICB2aXJ0dWFsIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKKworICAvKgorICAgKiBMaXZlIFdpbmRvdyBjb2RlLCBvbmx5IGRvZXMgYW55dGhpbmcgaWYgbGl2ZSB3aW5kb3cgaXMgYWN0aXZhdGVkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJ0YWJsZSkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLyoqCisgICAqIEFuYWxvZ1BvdGVudGlvbWV0ZXJzIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCB3aGVuIGVudGVyaW5nIHRoZQorICAgKiBMaXZlV2luZG93LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZSB7fQorCisgIC8qKgorICAgKiBBbmFsb2dQb3RlbnRpb21ldGVycyBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgd2hlbiBleGl0aW5nIHRoZQorICAgKiBMaXZlV2luZG93LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlIHt9CisKKyBwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nSW5wdXQ+IG1fYW5hbG9nX2lucHV0OworICBkb3VibGUgbV9mdWxsUmFuZ2UsIG1fb2Zmc2V0OworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQW5hbG9nVHJpZ2dlci5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkZDIwMgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQW5hbG9nVHJpZ2dlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlck91dHB1dC5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKworY2xhc3MgQW5hbG9nSW5wdXQ7CisKK2NsYXNzIEFuYWxvZ1RyaWdnZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBBbmFsb2dUcmlnZ2VyT3V0cHV0OworCisgcHVibGljOgorICBleHBsaWNpdCBBbmFsb2dUcmlnZ2VyKGludDMyX3QgY2hhbm5lbCk7CisgIGV4cGxpY2l0IEFuYWxvZ1RyaWdnZXIoQW5hbG9nSW5wdXQgKmNoYW5uZWwpOworICB2aXJ0dWFsIH5BbmFsb2dUcmlnZ2VyKCk7CisKKyAgdm9pZCBTZXRMaW1pdHNWb2x0YWdlKGZsb2F0IGxvd2VyLCBmbG9hdCB1cHBlcik7CisgIHZvaWQgU2V0TGltaXRzUmF3KGludDMyX3QgbG93ZXIsIGludDMyX3QgdXBwZXIpOworICB2b2lkIFNldEF2ZXJhZ2VkKGJvb2wgdXNlQXZlcmFnZWRWYWx1ZSk7CisgIHZvaWQgU2V0RmlsdGVyZWQoYm9vbCB1c2VGaWx0ZXJlZFZhbHVlKTsKKyAgdWludDMyX3QgR2V0SW5kZXgoKSBjb25zdDsKKyAgYm9vbCBHZXRJbldpbmRvdygpOworICBib29sIEdldFRyaWdnZXJTdGF0ZSgpOworICBzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nVHJpZ2dlck91dHB1dD4gQ3JlYXRlT3V0cHV0KEFuYWxvZ1RyaWdnZXJUeXBlIHR5cGUpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdWludDhfdCBtX2luZGV4OworICB2b2lkICptX3RyaWdnZXI7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyT3V0cHV0LmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0FuYWxvZ1RyaWdnZXJPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FkM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyT3V0cHV0LmgKQEAgLTAsMCArMSw3NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEaWdpdGFsU291cmNlLmgiCisKK2NsYXNzIEFuYWxvZ1RyaWdnZXI7CisKKy8qKgorICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgc3BlY2lmaWMgb3V0cHV0IGZyb20gYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IG91dHB1dCB2YWx1ZSBhbmQgYWxzbyBhcyBhCisgKiBEaWdpdGFsU291cmNlCisgKiB0byBwcm92aWRlIHJvdXRpbmcgb2YgYW4gb3V0cHV0IHRvIGRpZ2l0YWwgc3Vic3lzdGVtcyBvbiB0aGUgRlBHQSBzdWNoIGFzCisgKiBDb3VudGVyLCBFbmNvZGVyLCBhbmQgSW50ZXJydXB0LgorICoKKyAqIFRoZSBUcmlnZ2VyU3RhdGUgb3V0cHV0IGluZGljYXRlcyB0aGUgcHJpbWFyeSBvdXRwdXQgdmFsdWUgb2YgdGhlIHRyaWdnZXIuCisgKiBJZiB0aGUgYW5hbG9nCisgKiBzaWduYWwgaXMgbGVzcyB0aGFuIHRoZSBsb3dlciBsaW1pdCwgdGhlIG91dHB1dCBpcyBmYWxzZS4gIElmIHRoZSBhbmFsb2cKKyAqIHZhbHVlIGlzIGdyZWF0ZXIKKyAqIHRoYW4gdGhlIHVwcGVyIGxpbWl0LCB0aGVuIHRoZSBvdXRwdXQgaXMgdHJ1ZS4gIElmIHRoZSBhbmFsb2cgdmFsdWUgaXMgaW4KKyAqIGJldHdlZW4sIHRoZW4KKyAqIHRoZSB0cmlnZ2VyIG91dHB1dCBzdGF0ZSBtYWludGFpbnMgaXRzIG1vc3QgcmVjZW50IHZhbHVlLgorICoKKyAqIFRoZSBJbldpbmRvdyBvdXRwdXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBhbmFsb2cgc2lnbmFsIGlzIGluc2lkZSB0aGUKKyAqIHJhbmdlIGRlZmluZWQKKyAqIGJ5IHRoZSBsaW1pdHMuCisgKgorICogVGhlIFJpc2luZ1B1bHNlIGFuZCBGYWxsaW5nUHVsc2Ugb3V0cHV0cyBkZXRlY3QgYW4gaW5zdGFudGFuZW91cyB0cmFuc2l0aW9uCisgKiBmcm9tIGFib3ZlIHRoZQorICogdXBwZXIgbGltaXQgdG8gYmVsb3cgdGhlIGxvd2VyIGxpbWl0LCBhbmQgdmlzZSB2ZXJzYS4gIFRoZXNlIHB1bHNlcyByZXByZXNlbnQKKyAqIGEgcm9sbG92ZXIKKyAqIGNvbmRpdGlvbiBvZiBhIHNlbnNvciBhbmQgY2FuIGJlIHJvdXRlZCB0byBhbiB1cCAvIGRvd24gY291dGVyIG9yIHRvCisgKiBpbnRlcnJ1cHRzLiAgQmVjYXVzZQorICogdGhlIG91dHB1dHMgZ2VuZXJhdGUgYSBwdWxzZSwgdGhleSBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseS4gIFRvIGhlbHAgZW5zdXJlCisgKiB0aGF0IGEgcm9sbG92ZXIKKyAqIGNvbmRpdGlvbiBpcyBub3QgbWlzc2VkLCB0aGVyZSBpcyBhbiBhdmVyYWdlIHJlamVjdGlvbiBmaWx0ZXIgYXZhaWxhYmxlIHRoYXQKKyAqIG9wZXJhdGVzIG9uIHRoZQorICogdXBwZXIgOCBiaXRzIG9mIGEgMTIgYml0IG51bWJlciBhbmQgc2VsZWN0cyB0aGUgbmVhcmVzdCBvdXRseWVyIG9mIDMgc2FtcGxlcy4KKyAqIFRoaXMgd2lsbCByZWplY3QKKyAqIGEgc2FtcGxlIHRoYXQgaXMgKGR1ZSB0byBhdmVyYWdpbmcgb3Igc2FtcGxpbmcpIGVycmFudGx5IGJldHdlZW4gdGhlIHR3bworICogbGltaXRzLiAgVGhpcyBmaWx0ZXIKKyAqIHdpbGwgZmFpbCBpZiBtb3JlIHRoYW4gb25lIHNhbXBsZSBpbiBhIHJvdyBpcyBlcnJhbnRseSBpbiBiZXR3ZWVuIHRoZSB0d28KKyAqIGxpbWl0cy4gIFlvdSBtYXkgc2VlCisgKiB0aGlzIHByb2JsZW0gaWYgYXR0ZW1wdGluZyB0byB1c2UgdGhpcyBmZWF0dXJlIHdpdGggYSBtZWNoYW5pY2FsIHJvbGxvdmVyCisgKiBzZW5zb3IsIHN1Y2ggYXMgYQorICogMzYwIGRlZ3JlZSBuby1zdG9wIHBvdGVudGlvbWV0ZXIgd2l0aG91dCBzaWduYWwgY29uZGl0aW9uaW5nLCBiZWNhdXNlIHRoZQorICogcm9sbG92ZXIgdHJhbnNpdGlvbgorICogaXMgbm90IHNoYXJwIC8gY2xlYW4gZW5vdWdoLiAgVXNpbmcgdGhlIGF2ZXJhZ2luZyBlbmdpbmUgbWF5IGhlbHAgd2l0aCB0aGlzLAorICogYnV0IHJvdGF0aW9uYWwgc3BlZWRzIG9mCisgKiB0aGUgc2Vuc29yIHdpbGwgdGhlbiBiZSBsaW1pdGVkLgorICovCitjbGFzcyBBbmFsb2dUcmlnZ2VyT3V0cHV0IDogcHVibGljIERpZ2l0YWxTb3VyY2UgeworICBmcmllbmQgY2xhc3MgQW5hbG9nVHJpZ2dlcjsKKworIHB1YmxpYzoKKyAgdmlydHVhbCB+QW5hbG9nVHJpZ2dlck91dHB1dCgpOworICBib29sIEdldCgpIGNvbnN0OworCisgIC8vIERpZ2l0YWxTb3VyY2UgaW50ZXJmYWNlCisgIHZpcnR1YWwgdWludDMyX3QgR2V0Q2hhbm5lbEZvclJvdXRpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB1aW50MzJfdCBHZXRNb2R1bGVGb3JSb3V0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBBbmFsb2dUcmlnZ2VyT3V0cHV0KGNvbnN0IEFuYWxvZ1RyaWdnZXIgJnRyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIG91dHB1dFR5cGUpOworCisgcHJpdmF0ZToKKyAgLy8gVXNlcyByZWZlcmVuY2UgcmF0aGVyIHRoYW4gc21hcnQgcG9pbnRlciBiZWNhdXNlIGEgdXNlciBjYW4gbm90IGNvbnN0cnVjdAorICAvLyBhbiBBbmFsb2dUcmlnZ2VyT3V0cHV0IHRoZW1zZWx2ZXMgYW5kIGJlY2F1c2UgdGhlIEFuYWxvZ1RyaWdnZXJPdXRwdXQKKyAgLy8gc2hvdWxkIGFsd2F5cyBiZSBpbiBzY29wZSBhdCB0aGUgc2FtZSB0aW1lIGFzIGFuIEFuYWxvZ1RyaWdnZXIuCisgIGNvbnN0IEFuYWxvZ1RyaWdnZXIgJm1fdHJpZ2dlcjsKKyAgQW5hbG9nVHJpZ2dlclR5cGUgbV9vdXRwdXRUeXBlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmI1ZjhlCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9CdWlsdEluQWNjZWxlcm9tZXRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJpbnRlcmZhY2VzL0FjY2VsZXJvbWV0ZXIuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworLyoqCisgKiBCdWlsdC1pbiBhY2NlbGVyb21ldGVyLgorICoKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGFjY2VzcyB0byB0aGUgUm9ib1JJTydzIGludGVybmFsIGFjY2VsZXJvbWV0ZXIuCisgKi8KK2NsYXNzIEJ1aWx0SW5BY2NlbGVyb21ldGVyIDogcHVibGljIEFjY2VsZXJvbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTZW5zb3JCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlIHsKKyBwdWJsaWM6CisgIEJ1aWx0SW5BY2NlbGVyb21ldGVyKFJhbmdlIHJhbmdlID0ga1JhbmdlXzhHKTsKKyAgdmlydHVhbCB+QnVpbHRJbkFjY2VsZXJvbWV0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8gQWNjZWxlcm9tZXRlciBpbnRlcmZhY2UKKyAgdmlydHVhbCB2b2lkIFNldFJhbmdlKFJhbmdlIHJhbmdlKSBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0WCgpIG92ZXJyaWRlOworICB2aXJ0dWFsIGRvdWJsZSBHZXRZKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZG91YmxlIEdldFooKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YnRhYmxlKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZSB7fQorICB2aXJ0dWFsIHZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGUge30KKworIHByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fdGFibGU7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9DQU4vY2FuX3Byb3RvLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NBTi9jYW5fcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjczN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9DQU4vY2FuX3Byb3RvLmgKQEAgLTAsMCArMSw0MTUgQEAKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBjYW5fcHJvdG8uaCAtIERlZmluaXRpb25zIGZvciB0aGUgQ0FOIHByb3RvY29sIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKKy8vICAgICAgICAgICAgICAgQkRDIG1vdG9yIGNvbnRyb2xsZXIuCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA4IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUSSBJbmZvcm1hdGlvbiAtIFNlbGVjdGl2ZSBEaXNjbG9zdXJlCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjaWZuZGVmIF9fQ0FOX1BST1RPX0hfXworI2RlZmluZSBfX0NBTl9QUk9UT19IX18KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBtYXNrcyBvZiB0aGUgZmllbGRzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIG1lc3NhZ2UgaWRlbnRpZmllci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9NU0dJRF9GVUxMX00gMHgxZmZmZmZmZgorI2RlZmluZSBDQU5fTVNHSURfREVWTk9fTSAweDAwMDAwMDNmCisjZGVmaW5lIENBTl9NU0dJRF9BUElfTSAweDAwMDBmZmMwCisjZGVmaW5lIENBTl9NU0dJRF9NRlJfTSAweDAwZmYwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9NIDB4MWYwMDAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX0RFVk5PX1MgMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX1MgNgorI2RlZmluZSBDQU5fTVNHSURfTUZSX1MgMTYKKyNkZWZpbmUgQ0FOX01TR0lEX0RUWVBFX1MgMjQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBSZXNlcnZlZCBkZXZpY2UgbnVtYmVyIHZhbHVlcyBpbiB0aGUgTWVzc2FnZSBJZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9NU0dJRF9ERVZOT19CQ0FTVCAweDAwMDAwMDAwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgUmVzZXJ2ZWQgc3lzdGVtIGNvbnRyb2wgQVBJIG51bWJlcnMgaW4gdGhlIE1lc3NhZ2UgSWQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDQU5fTVNHSURfQVBJX1NZU0hBTFQgMHgwMDAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX1NZU1JTVCAweDAwMDAwMDQwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfREVWQVNTSUdOIDB4MDAwMDAwODAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9ERVZRVUVSWSAweDAwMDAwMGMwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfSEVBUlRCRUFUIDB4MDAwMDAxNDAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9TWU5DIDB4MDAwMDAxODAKKyNkZWZpbmUgQ0FOX01TR0lEX0FQSV9VUERBVEUgMHgwMDAwMDFjMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX0ZJUk1WRVIgMHgwMDAwMDIwMAorI2RlZmluZSBDQU5fTVNHSURfQVBJX0VOVU1FUkFURSAweDAwMDAwMjQwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfU1lTUkVTVU1FIDB4MDAwMDAyODAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSAzMiBiaXQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ0FOX01TR0lEX0FQSV9TVEFUVVMgcmVxdWVzdC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9TVEFUVVNfQ09ERV9NIDB4MDAwMGZmZmYKKyNkZWZpbmUgQ0FOX1NUQVRVU19NRkdfTSAweDAwZmYwMDAwCisjZGVmaW5lIENBTl9TVEFUVVNfRFRZUEVfTSAweDFmMDAwMDAwCisjZGVmaW5lIENBTl9TVEFUVVNfQ09ERV9TIDAKKyNkZWZpbmUgQ0FOX1NUQVRVU19NRkdfUyAxNgorI2RlZmluZSBDQU5fU1RBVFVTX0RUWVBFX1MgMjQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBSZXNlcnZlZCBtYW51ZmFjdHVyZXIgaWRlbnRpZmllcnMgaW4gdGhlIE1lc3NhZ2UgSWQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDQU5fTVNHSURfTUZSX05JIDB4MDAwMTAwMDAKKyNkZWZpbmUgQ0FOX01TR0lEX01GUl9MTSAweDAwMDIwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9NRlJfREVLQSAweDAwMDMwMDAwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgUmVzZXJ2ZWQgZGV2aWNlIHR5cGUgaWRlbnRpZmllcnMgaW4gdGhlIE1lc3NhZ2UgSWQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfQkNBU1QgMHgwMDAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfUk9CT1QgMHgwMTAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfTU9UT1IgMHgwMjAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfUkVMQVkgMHgwMzAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfR1lSTyAweDA0MDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9BQ0NFTCAweDA1MDAwMDAwCisjZGVmaW5lIENBTl9NU0dJRF9EVFlQRV9VU09OSUMgMHgwNjAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfR0VBUlQgMHgwNzAwMDAwMAorI2RlZmluZSBDQU5fTVNHSURfRFRZUEVfVVBEQVRFIDB4MWYwMDAwMDAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIExNIE1vdG9yIENvbnRyb2wgQVBJIENsYXNzZXMgQVBJIENsYXNzIGFuZCBJRCBtYXNrcy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9NU0dJRF9BUElfQ0xBU1NfTSAweDAwMDBmYzAwCisjZGVmaW5lIENBTl9NU0dJRF9BUElfSURfTSAweDAwMDAwM2MwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBMTSBNb3RvciBDb250cm9sIEFQSSBDbGFzc2VzIGluIHRoZSBNZXNzYWdlIElkIGZvciBub24tYnJvYWRjYXN0LgorLy8gVGhlc2UgYXJlIHRoZSB1cHBlciA2IGJpdHMgb2YgdGhlIEFQSSBmaWVsZCwgdGhlIGxvd2VyIDQgYml0cyBkZXRlcm1pbmUKKy8vIHRoZSBBUElJZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENBTl9BUElfTUNfVk9MVEFHRSAweDAwMDAwMDAwCisjZGVmaW5lIENBTl9BUElfTUNfU1BEIDB4MDAwMDA0MDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19WQ09NUCAweDAwMDAwODAwCisjZGVmaW5lIENBTl9BUElfTUNfUE9TIDB4MDAwMDBjMDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19JQ1RSTCAweDAwMDAxMDAwCisjZGVmaW5lIENBTl9BUElfTUNfU1RBVFVTIDB4MDAwMDE0MDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19QU1RBVCAweDAwMDAxODAwCisjZGVmaW5lIENBTl9BUElfTUNfQ0ZHIDB4MDAwMDFjMDAKKyNkZWZpbmUgQ0FOX0FQSV9NQ19BQ0sgMHgwMDAwMjAwMAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBDb250cm9sIFZvbHRhZ2UgQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1ZPTFQgXAorICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8IENBTl9BUElfTUNfVk9MVEFHRSkKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfRU4gKExNX0FQSV9WT0xUIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfRElTIChMTV9BUElfVk9MVCB8ICgxIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WT0xUX1NFVCAoTE1fQVBJX1ZPTFQgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVk9MVF9TRVRfUkFNUCAoTE1fQVBJX1ZPTFQgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBCRUdJTiAjIyMjIworI2RlZmluZSBMTV9BUElfVk9MVF9UX0VOIChMTV9BUElfVk9MVCB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WT0xUX1RfU0VUIChMTV9BUElfVk9MVCB8ICg1IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WT0xUX1RfU0VUX05PX0FDSyAoTE1fQVBJX1ZPTFQgfCAoNyA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBFTkQgIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1ZPTFRfU0VUX05PX0FDSyAoTE1fQVBJX1ZPTFQgfCAoOCA8PCBDQU5fTVNHSURfQVBJX1MpKQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBDb250cm9sIEFQSSBkZWZpbml0aW9ucyBmb3IgTE1fQVBJX1ZPTFRfU0VUX1JBTVAuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfVk9MVF9SQU1QX0RJUyAwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIENvbnRyb2wgQVBJIGRlZmluaXRpb25zIGZvciBDQU5fTVNHSURfQVBJX1NZTkMuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfU1lOQ19QRU5EX05PVyAwCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIFNwZWVkIENvbnRyb2wgQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX1NQRCAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8IENBTl9BUElfTUNfU1BEKQorI2RlZmluZSBMTV9BUElfU1BEX0VOIChMTV9BUElfU1BEIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NQRF9ESVMgKExNX0FQSV9TUEQgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1BEX1NFVCAoTE1fQVBJX1NQRCB8ICgyIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfUEMgKExNX0FQSV9TUEQgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1BEX0lDIChMTV9BUElfU1BEIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NQRF9EQyAoTE1fQVBJX1NQRCB8ICg1IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfUkVGIChMTV9BUElfU1BEIHwgKDYgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgQkVHSU4gIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1NQRF9UX0VOIChMTV9BUElfU1BEIHwgKDcgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NQRF9UX1NFVCAoTE1fQVBJX1NQRCB8ICg4IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TUERfVF9TRVRfTk9fQUNLIChMTV9BUElfU1BEIHwgKDEwIDw8IENBTl9NU0dJRF9BUElfUykpCisvLyMjIyMjIEZJUlNUIEVORCAjIyMjIworI2RlZmluZSBMTV9BUElfU1BEX1NFVF9OT19BQ0sgKExNX0FQSV9TUEQgfCAoMTEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ29udHJvbCBWb2x0YWdlIENvbXBlbnNhdGlvbiBDb250cm9sIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9WQ09NUCBcCisgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX01PVE9SIHwgQ0FOX0FQSV9NQ19WQ09NUCkKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX0VOIChMTV9BUElfVkNPTVAgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVkNPTVBfRElTIChMTV9BUElfVkNPTVAgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVkNPTVBfU0VUIChMTV9BUElfVkNPTVAgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVkNPTVBfSU5fUkFNUCAoTE1fQVBJX1ZDT01QIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX0NPTVBfUkFNUCAoTE1fQVBJX1ZDT01QIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgQkVHSU4gIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX1RfRU4gKExNX0FQSV9WQ09NUCB8ICg1IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9WQ09NUF9UX1NFVCAoTE1fQVBJX1ZDT01QIHwgKDYgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1ZDT01QX1RfU0VUX05PX0FDSyAoTE1fQVBJX1ZDT01QIHwgKDggPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgRU5EICMjIyMjCisjZGVmaW5lIExNX0FQSV9WQ09NUF9TRVRfTk9fQUNLIChMTV9BUElfVkNPTVAgfCAoOSA8PCBDQU5fTVNHSURfQVBJX1MpKQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIFN0ZWxsYXJpcyBNb3RvciBDbGFzcyBQb3NpdGlvbiBDb250cm9sIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9QT1MgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfTU9UT1IgfCBDQU5fQVBJX01DX1BPUykKKyNkZWZpbmUgTE1fQVBJX1BPU19FTiAoTE1fQVBJX1BPUyB8ICgwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QT1NfRElTIChMTV9BUElfUE9TIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BPU19TRVQgKExNX0FQSV9QT1MgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUE9TX1BDIChMTV9BUElfUE9TIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BPU19JQyAoTE1fQVBJX1BPUyB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QT1NfREMgKExNX0FQSV9QT1MgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUE9TX1JFRiAoTE1fQVBJX1BPUyB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisvLyMjIyMjIEZJUlNUIEJFR0lOICMjIyMjCisjZGVmaW5lIExNX0FQSV9QT1NfVF9FTiAoTE1fQVBJX1BPUyB8ICg3IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QT1NfVF9TRVQgKExNX0FQSV9QT1MgfCAoOCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUE9TX1RfU0VUX05PX0FDSyAoTE1fQVBJX1BPUyB8ICgxMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBFTkQgIyMjIyMKKyNkZWZpbmUgTE1fQVBJX1BPU19TRVRfTk9fQUNLIChMTV9BUElfUE9TIHwgKDExIDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIEN1cnJlbnQgQ29udHJvbCBBUEkgZGVmaW5pdGlvbnMuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9BUElfSUNUUkwgXAorICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8IENBTl9BUElfTUNfSUNUUkwpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9FTiAoTE1fQVBJX0lDVFJMIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX0RJUyAoTE1fQVBJX0lDVFJMIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX1NFVCAoTE1fQVBJX0lDVFJMIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX1BDIChMTV9BUElfSUNUUkwgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfSUNUUkxfSUMgKExNX0FQSV9JQ1RSTCB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9EQyAoTE1fQVBJX0lDVFJMIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgQkVHSU4gIyMjIyMKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX1RfRU4gKExNX0FQSV9JQ1RSTCB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9UX1NFVCAoTE1fQVBJX0lDVFJMIHwgKDcgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0lDVFJMX1RfU0VUX05PX0FDSyAoTE1fQVBJX0lDVFJMIHwgKDkgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKy8vIyMjIyMgRklSU1QgRU5EICMjIyMjCisjZGVmaW5lIExNX0FQSV9JQ1RSTF9TRVRfTk9fQUNLIChMTV9BUElfSUNUUkwgfCAoMTAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgRmlybXdhcmUgVXBkYXRlIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9VUEQgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfVVBEQVRFKQorI2RlZmluZSBMTV9BUElfVVBEX1BJTkcgKExNX0FQSV9VUEQgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVVBEX0RPV05MT0FEIChMTV9BUElfVVBEIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1VQRF9TRU5EX0RBVEEgKExNX0FQSV9VUEQgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVVBEX1JFU0VUIChMTV9BUElfVVBEIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1VQRF9BQ0sgKExNX0FQSV9VUEQgfCAoNCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfSFdWRVIgKExNX0FQSV9VUEQgfCAoNSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVVBEX1JFUVVFU1QgKExNX0FQSV9VUEQgfCAoNiA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBCRUdJTiAjIyMjIworI2RlZmluZSBMTV9BUElfVU5UUlVTVF9FTiAoTE1fQVBJX1VQRCB8ICgxMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfVFJVU1RfRU4gKExNX0FQSV9VUEQgfCAoMTIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1RSVVNUX0hFQVJUQkVBVCAoTE1fQVBJX1VQRCB8ICgxMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorLy8jIyMjIyBGSVJTVCBFTkQgIyMjIyMKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgU3RhdHVzIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9TVEFUVVMgXAorICAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8IENBTl9BUElfTUNfU1RBVFVTKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1ZPTFRPVVQgKExNX0FQSV9TVEFUVVMgfCAoMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1ZPTFRCVVMgKExNX0FQSV9TVEFUVVMgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX0NVUlJFTlQgKExNX0FQSV9TVEFUVVMgfCAoMiA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1RFTVAgKExNX0FQSV9TVEFUVVMgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1BPUyAoTE1fQVBJX1NUQVRVUyB8ICg0IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfU1BEIChMTV9BUElfU1RBVFVTIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19MSU1JVCAoTE1fQVBJX1NUQVRVUyB8ICg2IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfRkFVTFQgKExNX0FQSV9TVEFUVVMgfCAoNyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1BPV0VSIChMTV9BUElfU1RBVFVTIHwgKDggPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1NUQVRVU19DTU9ERSAoTE1fQVBJX1NUQVRVUyB8ICg5IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfVk9VVCAoTE1fQVBJX1NUQVRVUyB8ICgxMCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfU1RBVFVTX1NUS1lfRkxUIChMTV9BUElfU1RBVFVTIHwgKDExIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9TVEFUVVNfRkxUX0NPVU5UIChMTV9BUElfU1RBVFVTIHwgKDEyIDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGVzZSBkZWZpbml0aW9ucyBhcmUgdXNlZCB3aXRoIHRoZSBieXRlIHRoYXQgaXMgcmV0dXJuZWQgZnJvbQorLy8gdGhlIHN0YXR1cyByZXF1ZXN0IGZvciBMTV9BUElfU1RBVFVTX0xJTUlULgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX0ZXRCAweDAxCisjZGVmaW5lIExNX1NUQVRVU19MSU1JVF9SRVYgMHgwMgorI2RlZmluZSBMTV9TVEFUVVNfTElNSVRfU0ZXRCAweDA0CisjZGVmaW5lIExNX1NUQVRVU19MSU1JVF9TUkVWIDB4MDgKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX1NUS1lfRldEIDB4MTAKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX1NUS1lfUkVWIDB4MjAKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTUlUX1NUS1lfU0ZXRCAweDQwCisjZGVmaW5lIExNX1NUQVRVU19MSU1JVF9TVEtZX1NSRVYgMHg4MAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gTE0gTW90b3IgQ29udHJvbCBzdGF0dXMgY29kZXMgcmV0dXJuZWQgZHVlIHRvIHRoZSBDQU5fU1RBVFVTX0NPREVfTSBmaWVsZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX1NUQVRVU19GQVVMVF9JTElNSVQgMHgwMQorI2RlZmluZSBMTV9TVEFUVVNfRkFVTFRfVExJTUlUIDB4MDIKKyNkZWZpbmUgTE1fU1RBVFVTX0ZBVUxUX1ZMSU1JVCAweDA0CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIE1vdG9yIENsYXNzIENvbmZpZ3VyYXRpb24gQVBJIGRlZmluaXRpb25zLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fQVBJX0NGRyAoQ0FOX01TR0lEX01GUl9MTSB8IENBTl9NU0dJRF9EVFlQRV9NT1RPUiB8IENBTl9BUElfTUNfQ0ZHKQorI2RlZmluZSBMTV9BUElfQ0ZHX05VTV9CUlVTSEVTIChMTV9BUElfQ0ZHIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0NGR19FTkNfTElORVMgKExNX0FQSV9DRkcgfCAoMSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfQ0ZHX1BPVF9UVVJOUyAoTE1fQVBJX0NGRyB8ICgyIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9DRkdfQlJBS0VfQ09BU1QgKExNX0FQSV9DRkcgfCAoMyA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfQ0ZHX0xJTUlUX01PREUgKExNX0FQSV9DRkcgfCAoNCA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfQ0ZHX0xJTUlUX0ZXRCAoTE1fQVBJX0NGRyB8ICg1IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9DRkdfTElNSVRfUkVWIChMTV9BUElfQ0ZHIHwgKDYgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX0NGR19NQVhfVk9VVCAoTE1fQVBJX0NGRyB8ICg3IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9DRkdfRkFVTFRfVElNRSAoTE1fQVBJX0NGRyB8ICg4IDw8IENBTl9NU0dJRF9BUElfUykpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgU3RlbGxhcmlzIEFDSyBBUEkgZGVmaW5pdGlvbi4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9BQ0sgKENBTl9NU0dJRF9NRlJfTE0gfCBDQU5fTVNHSURfRFRZUEVfTU9UT1IgfCBDQU5fQVBJX01DX0FDSykKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSA4IGJpdCB2YWx1ZXMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgYSBjYWxsIHRvIExNX0FQSV9TVEFUVVNfSFdWRVIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9IV1ZFUl9VTktOT1dOIDB4MDAKKyNkZWZpbmUgTE1fSFdWRVJfSkFHXzFfMCAweDAxCisjZGVmaW5lIExNX0hXVkVSX0pBR18yXzAgMHgwMgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIDggYml0IHZhbHVlcyB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSBhIGNhbGwgdG8gTE1fQVBJX1NUQVRVU19DTU9ERS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX1NUQVRVU19DTU9ERV9WT0xUIDB4MDAKKyNkZWZpbmUgTE1fU1RBVFVTX0NNT0RFX0NVUlJFTlQgMHgwMQorI2RlZmluZSBMTV9TVEFUVVNfQ01PREVfU1BFRUQgMHgwMgorI2RlZmluZSBMTV9TVEFUVVNfQ01PREVfUE9TIDB4MDMKKyNkZWZpbmUgTE1fU1RBVFVTX0NNT0RFX1ZDT01QIDB4MDQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSB2YWx1ZXMgdGhhdCBjYW4gc3BlY2lmaWVkIGFzIHRoZSBwb3NpdGlvbiBvciBzcGVlZCByZWZlcmVuY2UuICBOb3QgYWxsCisvLyB2YWx1ZXMgYXJlIHZhbGlkIGZvciBlYWNoIHJlZmVyZW5jZTsgaWYgYW4gaW52YWxpZCByZWZlcmVuY2UgaXMgc2V0LCB0aGVuCisvLyBub25lIHdpbGwgYmUgc2VsZWN0ZWQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBMTV9SRUZfRU5DT0RFUiAweDAwCisjZGVmaW5lIExNX1JFRl9QT1QgMHgwMQorI2RlZmluZSBMTV9SRUZfSU5WX0VOQ09ERVIgMHgwMgorI2RlZmluZSBMTV9SRUZfUVVBRF9FTkNPREVSIDB4MDMKKyNkZWZpbmUgTE1fUkVGX05PTkUgMHhmZgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZsYWdzIHRoYXQgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnRseSBhY3RpdmUgZmF1bHQgc291cmNlcy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0ZBVUxUX0NVUlJFTlQgMHgwMQorI2RlZmluZSBMTV9GQVVMVF9URU1QIDB4MDIKKyNkZWZpbmUgTE1fRkFVTFRfVkJVUyAweDA0CisjZGVmaW5lIExNX0ZBVUxUX0dBVEVfRFJJVkUgMHgwOAorI2RlZmluZSBMTV9GQVVMVF9DT01NIDB4MTAKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBTdGVsbGFyaXMgTW90b3IgQ2xhc3MgUGVyaW9kaWMgU3RhdHVzIEFQSSBkZWZpbml0aW9ucy4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIExNX0FQSV9QU1RBVCBcCisgIChDQU5fTVNHSURfTUZSX0xNIHwgQ0FOX01TR0lEX0RUWVBFX01PVE9SIHwgQ0FOX0FQSV9NQ19QU1RBVCkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX1BFUl9FTl9TMCAoTE1fQVBJX1BTVEFUIHwgKDAgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX1BFUl9FTl9TMSAoTE1fQVBJX1BTVEFUIHwgKDEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX1BFUl9FTl9TMiAoTE1fQVBJX1BTVEFUIHwgKDIgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX1BFUl9FTl9TMyAoTE1fQVBJX1BTVEFUIHwgKDMgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0NGR19TMCAoTE1fQVBJX1BTVEFUIHwgKDQgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0NGR19TMSAoTE1fQVBJX1BTVEFUIHwgKDUgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0NGR19TMiAoTE1fQVBJX1BTVEFUIHwgKDYgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0NGR19TMyAoTE1fQVBJX1BTVEFUIHwgKDcgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKyNkZWZpbmUgTE1fQVBJX1BTVEFUX0RBVEFfUzAgKExNX0FQSV9QU1RBVCB8ICg4IDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9EQVRBX1MxIChMTV9BUElfUFNUQVQgfCAoOSA8PCBDQU5fTVNHSURfQVBJX1MpKQorI2RlZmluZSBMTV9BUElfUFNUQVRfREFUQV9TMiAoTE1fQVBJX1BTVEFUIHwgKDEwIDw8IENBTl9NU0dJRF9BUElfUykpCisjZGVmaW5lIExNX0FQSV9QU1RBVF9EQVRBX1MzIChMTV9BUElfUFNUQVQgfCAoMTEgPDwgQ0FOX01TR0lEX0FQSV9TKSkKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGRhdGEgdGhlIFBlcmlvZGljIFN0YXR1cworLy8gTWVzc2FnZSBieXRlcy4gIEJ5dGVzIG9mIGEgbXVsdGktYnl0ZSBkYXRhIHZhbHVlcyBhcmUgZW5jb2RlZCBhcworLy8gbGl0dGxlLWVuZGlhbiwgdGhlcmVmb3JlIEIwIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTE1fUFNUQVRfRU5EIDAKKyNkZWZpbmUgTE1fUFNUQVRfVk9MVE9VVF9CMCAxCisjZGVmaW5lIExNX1BTVEFUX1ZPTFRPVVRfQjEgMgorI2RlZmluZSBMTV9QU1RBVF9WT0xUQlVTX0IwIDMKKyNkZWZpbmUgTE1fUFNUQVRfVk9MVEJVU19CMSA0CisjZGVmaW5lIExNX1BTVEFUX0NVUlJFTlRfQjAgNQorI2RlZmluZSBMTV9QU1RBVF9DVVJSRU5UX0IxIDYKKyNkZWZpbmUgTE1fUFNUQVRfVEVNUF9CMCA3CisjZGVmaW5lIExNX1BTVEFUX1RFTVBfQjEgOAorI2RlZmluZSBMTV9QU1RBVF9QT1NfQjAgOQorI2RlZmluZSBMTV9QU1RBVF9QT1NfQjEgMTAKKyNkZWZpbmUgTE1fUFNUQVRfUE9TX0IyIDExCisjZGVmaW5lIExNX1BTVEFUX1BPU19CMyAxMgorI2RlZmluZSBMTV9QU1RBVF9TUERfQjAgMTMKKyNkZWZpbmUgTE1fUFNUQVRfU1BEX0IxIDE0CisjZGVmaW5lIExNX1BTVEFUX1NQRF9CMiAxNQorI2RlZmluZSBMTV9QU1RBVF9TUERfQjMgMTYKKyNkZWZpbmUgTE1fUFNUQVRfTElNSVRfTkNMUiAxNworI2RlZmluZSBMTV9QU1RBVF9MSU1JVF9DTFIgMTgKKyNkZWZpbmUgTE1fUFNUQVRfRkFVTFQgMTkKKyNkZWZpbmUgTE1fUFNUQVRfU1RLWV9GTFRfTkNMUiAyMAorI2RlZmluZSBMTV9QU1RBVF9TVEtZX0ZMVF9DTFIgMjEKKyNkZWZpbmUgTE1fUFNUQVRfVk9VVF9CMCAyMgorI2RlZmluZSBMTV9QU1RBVF9WT1VUX0IxIDIzCisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9DVVJSRU5UIDI0CisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9URU1QIDI1CisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9WT0xUQlVTIDI2CisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9HQVRFIDI3CisjZGVmaW5lIExNX1BTVEFUX0ZMVF9DT1VOVF9DT01NIDI4CisjZGVmaW5lIExNX1BTVEFUX0NBTlNUUyAyOQorI2RlZmluZSBMTV9QU1RBVF9DQU5FUlJfQjAgMzAKKyNkZWZpbmUgTE1fUFNUQVRfQ0FORVJSX0IxIDMxCisKKyNlbmRpZiAgLy8gX19DQU5fUFJPVE9fSF9fCmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NBTkphZ3Vhci5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9DQU5KYWd1YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDA1ZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9DQU5KYWd1YXIuaApAQCAtMCwwICsxLDI1MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5LmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorI2luY2x1ZGUgIkNBTlNwZWVkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkhBTC9jcHAvU2VtYXBob3JlLmhwcCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorI2luY2x1ZGUgInRhYmxlcy9JVGFibGVMaXN0ZW5lci5oIgorI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCIKKyNpbmNsdWRlICJDQU4vY2FuX3Byb3RvLmgiCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSAiSEFML2NwcC9wcmlvcml0eV9tdXRleC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8qKgorICogTHVtaW5hcnkgTWljcm8gLyBWZXggUm9ib3RpY3MgSmFndWFyIFNwZWVkIENvbnRyb2wKKyAqLworY2xhc3MgQ0FOSmFndWFyIDogcHVibGljIE1vdG9yU2FmZXR5LAorICAgICAgICAgICAgICAgICAgcHVibGljIENBTlNwZWVkQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgIHB1YmxpYyBFcnJvckJhc2UsCisgICAgICAgICAgICAgICAgICBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlLAorICAgICAgICAgICAgICAgICAgcHVibGljIElUYWJsZUxpc3RlbmVyIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBpbnRlcm5hbCBQSUQgY29udHJvbCBsb29wIGluIHRoZSBKYWd1YXIgcnVucyBhdCAxa0h6LgorICBzdGF0aWMgY29uc3QgaW50MzJfdCBrQ29udHJvbGxlclJhdGUgPSAxMDAwOworICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrQXBwcm94QnVzVm9sdGFnZSA9IDEyLjA7CisKKyAgLy8gQ29udHJvbCBtb2RlIHRhZ3MKKyAgLyoqIFNldHMgYW4gZW5jb2RlciBhcyB0aGUgc3BlZWQgcmVmZXJlbmNlIG9ubHkuIDxicj4gUGFzc2VkIGFzIHRoZSAidGFnIiB3aGVuCisgICAqIHNldHRpbmcgdGhlIGNvbnRyb2wgbW9kZS4qLworICBzdGF0aWMgY29uc3Qgc3RydWN0IEVuY29kZXJTdHJ1Y3QgeworICB9IEVuY29kZXI7CisgIC8qKiBTZXRzIGEgcXVhZHJhdHVyZSBlbmNvZGVyIGFzIHRoZSBwb3NpdGlvbiBhbmQgc3BlZWQgcmVmZXJlbmNlLiA8YnI+IFBhc3NlZAorICAgKiBhcyB0aGUgInRhZyIgd2hlbiBzZXR0aW5nIHRoZSBjb250cm9sIG1vZGUuKi8KKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBRdWFkRW5jb2RlclN0cnVjdCB7CisgIH0gUXVhZEVuY29kZXI7CisgIC8qKiBTZXRzIGEgcG90ZW50aW9tZXRlciBhcyB0aGUgcG9zaXRpb24gcmVmZXJlbmNlIG9ubHkuIDxicj4gUGFzc2VkIGFzIHRoZQorICAgKiAidGFnIiB3aGVuIHNldHRpbmcgdGhlIGNvbnRyb2wgbW9kZS4gKi8KKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBQb3RlbnRpb21ldGVyU3RydWN0IHsKKyAgfSBQb3RlbnRpb21ldGVyOworCisgIGV4cGxpY2l0IENBTkphZ3Vhcih1aW50OF90IGRldmljZU51bWJlcik7CisgIHZpcnR1YWwgfkNBTkphZ3VhcigpOworCisgIHVpbnQ4X3QgZ2V0RGV2aWNlTnVtYmVyKCkgY29uc3Q7CisgIHVpbnQ4X3QgR2V0SGFyZHdhcmVWZXJzaW9uKCkgY29uc3Q7CisKKyAgLy8gUElET3V0cHV0IGludGVyZmFjZQorICB2aXJ0dWFsIHZvaWQgUElEV3JpdGUoZmxvYXQgb3V0cHV0KSBvdmVycmlkZTsKKworICAvLyBDb250cm9sIG1vZGUgbWV0aG9kcworICB2b2lkIEVuYWJsZUNvbnRyb2woZG91YmxlIGVuY29kZXJJbml0aWFsUG9zaXRpb24gPSAwLjApOworICB2b2lkIERpc2FibGVDb250cm9sKCk7CisKKyAgdm9pZCBTZXRQZXJjZW50TW9kZSgpOworICB2b2lkIFNldFBlcmNlbnRNb2RlKEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KTsKKyAgdm9pZCBTZXRQZXJjZW50TW9kZShRdWFkRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYpOworICB2b2lkIFNldFBlcmNlbnRNb2RlKFBvdGVudGlvbWV0ZXJTdHJ1Y3QpOworCisgIHZvaWQgU2V0Q3VycmVudE1vZGUoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisgIHZvaWQgU2V0Q3VycmVudE1vZGUoRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsIGRvdWJsZSBwLCBkb3VibGUgaSwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCk7CisgIHZvaWQgU2V0Q3VycmVudE1vZGUoUXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaSwgZG91YmxlIGQpOworICB2b2lkIFNldEN1cnJlbnRNb2RlKFBvdGVudGlvbWV0ZXJTdHJ1Y3QsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworCisgIHZvaWQgU2V0U3BlZWRNb2RlKEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkKTsKKyAgdm9pZCBTZXRTcGVlZE1vZGUoUXVhZEVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkKTsKKworICB2b2lkIFNldFBvc2l0aW9uTW9kZShRdWFkRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsIGRvdWJsZSBwLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaSwgZG91YmxlIGQpOworICB2b2lkIFNldFBvc2l0aW9uTW9kZShQb3RlbnRpb21ldGVyU3RydWN0LCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKTsKKworICB2b2lkIFNldFZvbHRhZ2VNb2RlKCk7CisgIHZvaWQgU2V0Vm9sdGFnZU1vZGUoRW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYpOworICB2b2lkIFNldFZvbHRhZ2VNb2RlKFF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldik7CisgIHZvaWQgU2V0Vm9sdGFnZU1vZGUoUG90ZW50aW9tZXRlclN0cnVjdCk7CisKKyAgLy8gQ0FOU3BlZWRDb250cm9sbGVyIGludGVyZmFjZQorICB2aXJ0dWFsIGZsb2F0IEdldCgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cCA9IDApIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0UChkb3VibGUgcCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBTZXRJKGRvdWJsZSBpKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNldEQoZG91YmxlIGQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpIG92ZXJyaWRlOworICB2aXJ0dWFsIGRvdWJsZSBHZXRQKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZG91YmxlIEdldEkoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0RCgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgSXNNb2RlUElEKENBTlNwZWVkQ29udHJvbGxlcjo6Q29udHJvbE1vZGUgbW9kZSkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0QnVzVm9sdGFnZSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGZsb2F0IEdldE91dHB1dFZvbHRhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRDdXJyZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0VGVtcGVyYXR1cmUoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0UG9zaXRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0U3BlZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBib29sIEdldEZvcndhcmRMaW1pdE9LKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRSZXZlcnNlTGltaXRPSygpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHVpbnQxNl90IEdldEZhdWx0cygpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdGFnZVJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdWludDMyX3QgR2V0RmlybXdhcmVWZXJzaW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBDb25maWdOZXV0cmFsTW9kZShOZXV0cmFsTW9kZSBtb2RlKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldih1aW50MTZfdCBjb2Rlc1BlclJldikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBDb25maWdQb3RlbnRpb21ldGVyVHVybnModWludDE2X3QgdHVybnMpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnU29mdFBvc2l0aW9uTGltaXRzKGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZVNvZnRQb3NpdGlvbkxpbWl0cygpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnTGltaXRNb2RlKExpbWl0TW9kZSBtb2RlKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIENvbmZpZ0ZvcndhcmRMaW1pdChkb3VibGUgZm9yd2FyZExpbWl0UG9zaXRpb24pIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnUmV2ZXJzZUxpbWl0KGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBDb25maWdNYXhPdXRwdXRWb2x0YWdlKGRvdWJsZSB2b2x0YWdlKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIENvbmZpZ0ZhdWx0VGltZShmbG9hdCBmYXVsdFRpbWUpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0Q29udHJvbE1vZGUoQ29udHJvbE1vZGUgbW9kZSk7CisgIHZpcnR1YWwgQ29udHJvbE1vZGUgR2V0Q29udHJvbE1vZGUoKSBjb25zdDsKKworICBzdGF0aWMgdm9pZCBVcGRhdGVTeW5jR3JvdXAodWludDhfdCBzeW5jR3JvdXApOworCisgIHZvaWQgU2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSBvdmVycmlkZTsKKyAgZmxvYXQgR2V0RXhwaXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzQWxpdmUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTW90b3IoKSBvdmVycmlkZTsKKyAgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0RGVzY3JpcHRpb24oc3RkOjpvc3RyaW5nc3RyZWFtJiBkZXNjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDhfdCBHZXREZXZpY2VJRCgpIGNvbnN0OworCisgIC8vIFNwZWVkQ29udHJvbGxlciBvdmVycmlkZXMKKyAgdmlydHVhbCB2b2lkIFNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRJbnZlcnRlZCgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICAvLyBDb250cm9sIG1vZGUgaGVscGVycworICB2b2lkIFNldFNwZWVkUmVmZXJlbmNlKHVpbnQ4X3QgcmVmZXJlbmNlKTsKKyAgdWludDhfdCBHZXRTcGVlZFJlZmVyZW5jZSgpIGNvbnN0OworCisgIHZvaWQgU2V0UG9zaXRpb25SZWZlcmVuY2UodWludDhfdCByZWZlcmVuY2UpOworICB1aW50OF90IEdldFBvc2l0aW9uUmVmZXJlbmNlKCkgY29uc3Q7CisKKyAgdWludDhfdCBwYWNrUGVyY2VudGFnZSh1aW50OF90ICpidWZmZXIsIGRvdWJsZSB2YWx1ZSk7CisgIHVpbnQ4X3QgcGFja0ZYUDhfOCh1aW50OF90ICpidWZmZXIsIGRvdWJsZSB2YWx1ZSk7CisgIHVpbnQ4X3QgcGFja0ZYUDE2XzE2KHVpbnQ4X3QgKmJ1ZmZlciwgZG91YmxlIHZhbHVlKTsKKyAgdWludDhfdCBwYWNraW50MTZfdCh1aW50OF90ICpidWZmZXIsIGludDE2X3QgdmFsdWUpOworICB1aW50OF90IHBhY2tpbnQzMl90KHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCB2YWx1ZSk7CisgIGRvdWJsZSB1bnBhY2tQZXJjZW50YWdlKHVpbnQ4X3QgKmJ1ZmZlcikgY29uc3Q7CisgIGRvdWJsZSB1bnBhY2tGWFA4XzgodWludDhfdCAqYnVmZmVyKSBjb25zdDsKKyAgZG91YmxlIHVucGFja0ZYUDE2XzE2KHVpbnQ4X3QgKmJ1ZmZlcikgY29uc3Q7CisgIGludDE2X3QgdW5wYWNraW50MTZfdCh1aW50OF90ICpidWZmZXIpIGNvbnN0OworICBpbnQzMl90IHVucGFja2ludDMyX3QodWludDhfdCAqYnVmZmVyKSBjb25zdDsKKworICB2b2lkIHNlbmRNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwgdWludDhfdCBkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBlcmlvZCA9IENBTl9TRU5EX1BFUklPRF9OT19SRVBFQVQpOworICB2b2lkIHJlcXVlc3RNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBlcmlvZCA9IENBTl9TRU5EX1BFUklPRF9OT19SRVBFQVQpOworICBib29sIGdldE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCB1aW50MzJfdCBtYXNrLCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YVNpemUpIGNvbnN0OworCisgIHZvaWQgc2V0dXBQZXJpb2RpY1N0YXR1cygpOworICB2b2lkIHVwZGF0ZVBlcmlvZGljU3RhdHVzKCkgY29uc3Q7CisKKyAgbXV0YWJsZSBwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggbV9tdXRleDsKKworICB1aW50OF90IG1fZGV2aWNlTnVtYmVyOworICBmbG9hdCBtX3ZhbHVlID0gMC4wZjsKKworICAvLyBQYXJhbWV0ZXJzL2NvbmZpZ3VyYXRpb24KKyAgQ29udHJvbE1vZGUgbV9jb250cm9sTW9kZSA9IGtQZXJjZW50VmJ1czsKKyAgdWludDhfdCBtX3NwZWVkUmVmZXJlbmNlID0gTE1fUkVGX05PTkU7CisgIHVpbnQ4X3QgbV9wb3NpdGlvblJlZmVyZW5jZSA9IExNX1JFRl9OT05FOworICBkb3VibGUgbV9wID0gMC4wOworICBkb3VibGUgbV9pID0gMC4wOworICBkb3VibGUgbV9kID0gMC4wOworICBOZXV0cmFsTW9kZSBtX25ldXRyYWxNb2RlID0ga05ldXRyYWxNb2RlX0p1bXBlcjsKKyAgdWludDE2X3QgbV9lbmNvZGVyQ29kZXNQZXJSZXYgPSAwOworICB1aW50MTZfdCBtX3BvdGVudGlvbWV0ZXJUdXJucyA9IDA7CisgIExpbWl0TW9kZSBtX2xpbWl0TW9kZSA9IGtMaW1pdE1vZGVfU3dpdGNoSW5wdXRzT25seTsKKyAgZG91YmxlIG1fZm9yd2FyZExpbWl0ID0gMC4wOworICBkb3VibGUgbV9yZXZlcnNlTGltaXQgPSAwLjA7CisgIGRvdWJsZSBtX21heE91dHB1dFZvbHRhZ2UgPSAzMC4wOworICBkb3VibGUgbV92b2x0YWdlUmFtcFJhdGUgPSAwLjA7CisgIGZsb2F0IG1fZmF1bHRUaW1lID0gMC4wZjsKKworICAvLyBXaGljaCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCBzaW5jZSB0aGV5IHdlcmUgbGFzdCBzZXQ/CisgIGJvb2wgbV9jb250cm9sTW9kZVZlcmlmaWVkID0gZmFsc2U7IC8vIE5lZWRzIHRvIGJlIHZlcmlmaWVkIGJlY2F1c2UgaXQncyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yCisgIGJvb2wgbV9zcGVlZFJlZlZlcmlmaWVkID0gdHJ1ZTsKKyAgYm9vbCBtX3Bvc1JlZlZlcmlmaWVkID0gdHJ1ZTsKKyAgYm9vbCBtX3BWZXJpZmllZCA9IHRydWU7CisgIGJvb2wgbV9pVmVyaWZpZWQgPSB0cnVlOworICBib29sIG1fZFZlcmlmaWVkID0gdHJ1ZTsKKyAgYm9vbCBtX25ldXRyYWxNb2RlVmVyaWZpZWQgPSB0cnVlOworICBib29sIG1fZW5jb2RlckNvZGVzUGVyUmV2VmVyaWZpZWQgPSB0cnVlOworICBib29sIG1fcG90ZW50aW9tZXRlclR1cm5zVmVyaWZpZWQgPSB0cnVlOworICBib29sIG1fZm9yd2FyZExpbWl0VmVyaWZpZWQgPSB0cnVlOworICBib29sIG1fcmV2ZXJzZUxpbWl0VmVyaWZpZWQgPSB0cnVlOworICBib29sIG1fbGltaXRNb2RlVmVyaWZpZWQgPSB0cnVlOworICBib29sIG1fbWF4T3V0cHV0Vm9sdGFnZVZlcmlmaWVkID0gdHJ1ZTsKKyAgYm9vbCBtX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkID0gdHJ1ZTsKKyAgYm9vbCBtX2ZhdWx0VGltZVZlcmlmaWVkID0gdHJ1ZTsKKworICAvLyBTdGF0dXMgZGF0YQorICBtdXRhYmxlIGZsb2F0IG1fYnVzVm9sdGFnZSA9IDAuMGY7CisgIG11dGFibGUgZmxvYXQgbV9vdXRwdXRWb2x0YWdlID0gMC4wZjsKKyAgbXV0YWJsZSBmbG9hdCBtX291dHB1dEN1cnJlbnQgPSAwLjBmOworICBtdXRhYmxlIGZsb2F0IG1fdGVtcGVyYXR1cmUgPSAwLjBmOworICBtdXRhYmxlIGRvdWJsZSBtX3Bvc2l0aW9uID0gMC4wOworICBtdXRhYmxlIGRvdWJsZSBtX3NwZWVkID0gMC4wOworICBtdXRhYmxlIHVpbnQ4X3QgbV9saW1pdHMgPSAweDAwOworICBtdXRhYmxlIHVpbnQxNl90IG1fZmF1bHRzID0gMHgwMDAwOworICB1aW50MzJfdCBtX2Zpcm13YXJlVmVyc2lvbiA9IDA7CisgIHVpbnQ4X3QgbV9oYXJkd2FyZVZlcnNpb24gPSAwOworCisgIC8vIFdoaWNoIHBlcmlvZGljIHN0YXR1cyBtZXNzYWdlcyBoYXZlIHdlIHJlY2VpdmVkIGF0IGxlYXN0IG9uY2U/CisgIG11dGFibGUgc3RkOjphdG9taWM8Ym9vbD4gbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2Uwe2ZhbHNlfTsKKyAgbXV0YWJsZSBzdGQ6OmF0b21pYzxib29sPiBtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTF7ZmFsc2V9OworICBtdXRhYmxlIHN0ZDo6YXRvbWljPGJvb2w+IG1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMntmYWxzZX07CisKKyAgYm9vbCBtX2NvbnRyb2xFbmFibGVkID0gZmFsc2U7CisKKyAgdm9pZCB2ZXJpZnkoKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TW90b3JTYWZldHlIZWxwZXI+IG1fc2FmZXR5SGVscGVyOworCisgIHZvaWQgVmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwgYm9vbCBpc05ldykgb3ZlcnJpZGU7CisgIHZvaWQgVXBkYXRlVGFibGUoKSBvdmVycmlkZTsKKyAgdm9pZCBTdGFydExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIEdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgb3ZlcnJpZGU7CisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKKworIHByaXZhdGU6CisgIHZvaWQgSW5pdENBTkphZ3VhcigpOworICBib29sIG1faXNJbnZlcnRlZCA9IGZhbHNlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQ0FOU3BlZWRDb250cm9sbGVyLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NBTlNwZWVkQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWQzNzkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NBTlNwZWVkQ29udHJvbGxlci5oCkBAIC0wLDAgKzEsMTExIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisKKy8qKgorICogSW50ZXJmYWNlIGZvciAic21hcnQiIENBTi1iYXNlZCBzcGVlZCBjb250cm9sbGVycy4KKyAqIEBzZWUgQ0FOSmFndWFyCisgKiBAc2VlIENBTlRhbG9uCisgKi8KK2NsYXNzIENBTlNwZWVkQ29udHJvbGxlciA6IHB1YmxpYyBTcGVlZENvbnRyb2xsZXIgeworIHB1YmxpYzoKKyAgZW51bSBDb250cm9sTW9kZSB7CisgICAga1BlcmNlbnRWYnVzID0gMCwKKyAgICBrQ3VycmVudCA9IDEsCisgICAga1NwZWVkID0gMiwKKyAgICBrUG9zaXRpb24gPSAzLAorICAgIGtWb2x0YWdlID0gNCwKKyAgICBrRm9sbG93ZXIgPSA1ICAvLyBOb3Qgc3VwcG9ydGVkIGluIEphZ3Vhci4KKyAgfTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBDb250cm9sTW9kZSBlbnVtCisgIHN0ZDo6c3RyaW5nIEdldE1vZGVOYW1lKENvbnRyb2xNb2RlIG1vZGUpIHsKKyAgICBzd2l0Y2gobW9kZSkgeworICAgICAgY2FzZSBrUGVyY2VudFZidXM6IHJldHVybiAiUGVyY2VudFZidXMiOworICAgICAgY2FzZSBrQ3VycmVudDogcmV0dXJuICJDdXJyZW50IjsKKyAgICAgIGNhc2Uga1NwZWVkOiByZXR1cm4gIlNwZWVkIjsKKyAgICAgIGNhc2Uga1Bvc2l0aW9uOiByZXR1cm4gIlBvc2l0aW9uIjsKKyAgICAgIGNhc2Uga1ZvbHRhZ2U6IHJldHVybiAiVm9sdGFnZSI7CisgICAgICBjYXNlIGtGb2xsb3dlcjogcmV0dXJuICJGb2xsb3dlciI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gIlt1bmtub3duIGNvbnRyb2wgbW9kZV0iOworICAgIH0KKyAgfQorCisgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIENvbnRyb2xNb2RlIGVudW0KKyAgdmlydHVhbCBib29sIElzTW9kZVBJRChDb250cm9sTW9kZSBtb2RlKSBjb25zdCA9IDA7CisKKyAgZW51bSBGYXVsdHMgeworICAgIGtDdXJyZW50RmF1bHQgPSAxLAorICAgIGtUZW1wZXJhdHVyZUZhdWx0ID0gMiwKKyAgICBrQnVzVm9sdGFnZUZhdWx0ID0gNCwKKyAgICBrR2F0ZURyaXZlckZhdWx0ID0gOCwKKyAgICAvKiBTUlggZXh0ZW5zaW9ucyAqLworICAgIGtGd2RMaW1pdFN3aXRjaCA9IDB4MTAsCisgICAga1JldkxpbWl0U3dpdGNoID0gMHgyMCwKKyAgICBrRndkU29mdExpbWl0ID0gMHg0MCwKKyAgICBrUmV2U29mdExpbWl0ID0gMHg4MCwKKyAgfTsKKworICBlbnVtIExpbWl0cyB7IGtGb3J3YXJkTGltaXQgPSAxLCBrUmV2ZXJzZUxpbWl0ID0gMiB9OworCisgIGVudW0gTmV1dHJhbE1vZGUgeworICAgIC8qKiBVc2UgdGhlIE5ldXRyYWxNb2RlIHRoYXQgaXMgc2V0IGJ5IHRoZSBqdW1wZXIgd2lyZSBvbiB0aGUgQ0FOIGRldmljZSAqLworICAgIGtOZXV0cmFsTW9kZV9KdW1wZXIgPSAwLAorICAgIC8qKiBTdG9wIHRoZSBtb3RvcidzIHJvdGF0aW9uIGJ5IGFwcGx5aW5nIGEgZm9yY2UuICovCisgICAga05ldXRyYWxNb2RlX0JyYWtlID0gMSwKKyAgICAvKiogRG8gbm90IGF0dGVtcHQgdG8gc3RvcCB0aGUgbW90b3IuIEluc3RlYWQgYWxsb3cgaXQgdG8gY29hc3QgdG8gYSBzdG9wCisgICAgICAgd2l0aG91dCBhcHBseWluZyByZXNpc3RhbmNlLiAqLworICAgIGtOZXV0cmFsTW9kZV9Db2FzdCA9IDIKKyAgfTsKKworICBlbnVtIExpbWl0TW9kZSB7CisgICAgLyoqIE9ubHkgdXNlIHN3aXRjaGVzIGZvciBsaW1pdHMgKi8KKyAgICBrTGltaXRNb2RlX1N3aXRjaElucHV0c09ubHkgPSAwLAorICAgIC8qKiBVc2UgYm90aCBzd2l0Y2hlcyBhbmQgc29mdCBsaW1pdHMgKi8KKyAgICBrTGltaXRNb2RlX1NvZnRQb3NpdGlvbkxpbWl0cyA9IDEsCisgICAgLyogU1JYIGV4dGVuc2lvbnMgKi8KKyAgICAvKiogRGlzYWJsZSBzd2l0Y2hlcyBhbmQgZGlzYWJsZSBzb2Z0IGxpbWl0cyAqLworICAgIGtMaW1pdE1vZGVfU3J4RGlzYWJsZVN3aXRjaElucHV0cyA9IDIsCisgIH07CisKKyAgdmlydHVhbCBmbG9hdCBHZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCkgPSAwOworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFAoZG91YmxlIHApID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEkoZG91YmxlIGkpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEQoZG91YmxlIGQpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldFAoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldEkoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldEQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZmxvYXQgR2V0QnVzVm9sdGFnZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRWb2x0YWdlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGZsb2F0IEdldE91dHB1dEN1cnJlbnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZmxvYXQgR2V0VGVtcGVyYXR1cmUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldFBvc2l0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGRvdWJsZSBHZXRTcGVlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIEdldEZvcndhcmRMaW1pdE9LKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgR2V0UmV2ZXJzZUxpbWl0T0soKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDE2X3QgR2V0RmF1bHRzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdGFnZVJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IEdldEZpcm13YXJlVmVyc2lvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIENvbmZpZ05ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG1vZGUpID0gMDsKKyAgdmlydHVhbCB2b2lkIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldih1aW50MTZfdCBjb2Rlc1BlclJldikgPSAwOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKHVpbnQxNl90IHR1cm5zKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBDb25maWdTb2Z0UG9zaXRpb25MaW1pdHMoZG91YmxlIGZvcndhcmRMaW1pdFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgPSAwOworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZVNvZnRQb3NpdGlvbkxpbWl0cygpID0gMDsKKyAgdmlydHVhbCB2b2lkIENvbmZpZ0xpbWl0TW9kZShMaW1pdE1vZGUgbW9kZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnRm9yd2FyZExpbWl0KGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbikgPSAwOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnUmV2ZXJzZUxpbWl0KGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgPSAwOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnTWF4T3V0cHV0Vm9sdGFnZShkb3VibGUgdm9sdGFnZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnRmF1bHRUaW1lKGZsb2F0IGZhdWx0VGltZSkgPSAwOworICAvLyBIb2xkIG9mZiBvbiBpbnRlcmZhY2UgdW50aWwgd2UgZmlndXJlIG91dCBDb250cm9sTW9kZSBlbnVtcy4KKyAgLy8JdmlydHVhbCB2b2lkIFNldENvbnRyb2xNb2RlKENvbnRyb2xNb2RlIG1vZGUpID0gMDsKKyAgLy8JdmlydHVhbCBDb250cm9sTW9kZSBHZXRDb250cm9sTW9kZSgpIGNvbnN0ID0gMDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NBTlRhbG9uLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NBTlRhbG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlYmJlMgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQ0FOVGFsb24uaApAQCAtMCwwICsxLDMxNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJDQU5TcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKyNpbmNsdWRlICJQSURTb3VyY2UuaCIKKyNpbmNsdWRlICJQSURJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJIQUwvQ2FuVGFsb25TUlguaCIKKyNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisjaW5jbHVkZSAidGFibGVzL0lUYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENUUkUgVGFsb24gU1JYIFNwZWVkIENvbnRyb2xsZXIgd2l0aCBDQU4gQ29udHJvbAorICovCitjbGFzcyBDQU5UYWxvbiA6IHB1YmxpYyBNb3RvclNhZmV0eSwKKyAgICAgICAgICAgICAgICAgcHVibGljIENBTlNwZWVkQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgcHVibGljIEVycm9yQmFzZSwKKyAgICAgICAgICAgICAgICAgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSwKKyAgICAgICAgICAgICAgICAgcHVibGljIElUYWJsZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICBwdWJsaWMgUElEU291cmNlLAorICAgICAgICAgICAgICAgICBwdWJsaWMgUElESW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIGVudW0gRmVlZGJhY2tEZXZpY2UgeworICAgIFF1YWRFbmNvZGVyID0gMCwKKyAgICBBbmFsb2dQb3QgPSAyLAorICAgIEFuYWxvZ0VuY29kZXIgPSAzLAorICAgIEVuY1Jpc2luZyA9IDQsCisgICAgRW5jRmFsbGluZyA9IDUsCisgICAgQ3RyZU1hZ0VuY29kZXJfUmVsYXRpdmUgPSA2LCAvLyE8IENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIE1hZ25ldGljIEVuY29kZXIgaW4gQWJzb2x1dGUvUHVsc2VXaWR0aCBNb2RlCisgICAgQ3RyZU1hZ0VuY29kZXJfQWJzb2x1dGUgPSA3LCAvLyE8IENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIE1hZ25ldGljIEVuY29kZXIgaW4gUmVsYXRpdmUvUXVhZHJhdHVyZSBNb2RlCisgICAgUHVsc2VXaWR0aCA9IDgsCisgIH07CisgIC8qKgorICAgKiBEZXBlbmRpbmcgb24gdGhlIHNlbnNvciB0eXBlLCBUYWxvbiBjYW4gZGV0ZXJtaW5lIGlmIHNlbnNvciBpcyBwbHVnZ2VkIGluIG90IG5vdC4KKyAgICovCisgIGVudW0gRmVlZGJhY2tEZXZpY2VTdGF0dXMgeworCUZlZWRiYWNrU3RhdHVzVW5rbm93biA9IDAsIAkJLy8hPCBTZW5zb3Igc3RhdHVzIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiAgTm90IGFsbCBzZW5zb3JzIGNhbiBkbyB0aGlzLgorCUZlZWRiYWNrU3RhdHVzUHJlc2VudCA9IDEsIAkJLy8hPCBTZW5zb3IgaXMgcHJlc2VudCBhbmQgd29ya2luZyBva2F5LgorCUZlZWRiYWNrU3RhdHVzTm90UHJlc2VudCA9IDIsIAkvLyE8IFNlbnNvciBpcyBub3QgcHJlc2VudCwgbm90IHBsdWdnZWQgaW4sIG5vdCBwb3dlcmVkLCBldGMuLi4KKyAgfTsKKyAgZW51bSBTdGF0dXNGcmFtZVJhdGUgeworICAgIFN0YXR1c0ZyYW1lUmF0ZUdlbmVyYWwgPSAwLAorICAgIFN0YXR1c0ZyYW1lUmF0ZUZlZWRiYWNrID0gMSwKKyAgICBTdGF0dXNGcmFtZVJhdGVRdWFkRW5jb2RlciA9IDIsCisgICAgU3RhdHVzRnJhbWVSYXRlQW5hbG9nVGVtcFZiYXQgPSAzLAorICAgIFN0YXR1c0ZyYW1lUmF0ZVB1bHNlV2lkdGhNZWFzID0gNCwKKyAgfTsKKyAgZXhwbGljaXQgQ0FOVGFsb24oaW50IGRldmljZU51bWJlcik7CisgIGV4cGxpY2l0IENBTlRhbG9uKGludCBkZXZpY2VOdW1iZXIsIGludCBjb250cm9sUGVyaW9kTXMpOworICBERUZBVUxUX01PVkVfQ09OU1RSVUNUT1IoQ0FOVGFsb24pOworICB2aXJ0dWFsIH5DQU5UYWxvbigpOworCisgIC8vIFBJRE91dHB1dCBpbnRlcmZhY2UKKyAgdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCkgb3ZlcnJpZGU7CisKKyAgLy8gUElEU291cmNlIGludGVyZmFjZQorICB2aXJ0dWFsIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKKworICAvLyBNb3RvclNhZmV0eSBpbnRlcmZhY2UKKyAgdmlydHVhbCB2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0RXhwaXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgSXNBbGl2ZSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU3RvcE1vdG9yKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEdldERlc2NyaXB0aW9uKHN0ZDo6b3N0cmluZ3N0cmVhbSYgZGVzYykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gQ0FOU3BlZWRDb250cm9sbGVyIGludGVyZmFjZQorICB2aXJ0dWFsIGZsb2F0IEdldCgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cCA9IDApIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNldFNldHBvaW50KGZsb2F0IHZhbHVlKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIERpc2FibGUoKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEVuYWJsZUNvbnRyb2woKTsKKyAgdmlydHVhbCB2b2lkIEVuYWJsZSgpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0UChkb3VibGUgcCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBTZXRJKGRvdWJsZSBpKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNldEQoZG91YmxlIGQpIG92ZXJyaWRlOworICB2b2lkIFNldEYoZG91YmxlIGYpOworICB2b2lkIFNldEl6b25lKHVuc2lnbmVkIGl6KTsKKyAgdmlydHVhbCB2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZik7CisgIHZpcnR1YWwgZG91YmxlIEdldFAoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0SSgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGRvdWJsZSBHZXREKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZG91YmxlIEdldEYoKSBjb25zdDsKKyAgdmlydHVhbCBib29sIElzTW9kZVBJRChDQU5TcGVlZENvbnRyb2xsZXI6OkNvbnRyb2xNb2RlIG1vZGUpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGZsb2F0IEdldEJ1c1ZvbHRhZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBmbG9hdCBHZXRPdXRwdXRWb2x0YWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0T3V0cHV0Q3VycmVudCgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGZsb2F0IEdldFRlbXBlcmF0dXJlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0UG9zaXRpb24oZG91YmxlIHBvcyk7CisgIHZpcnR1YWwgZG91YmxlIEdldFBvc2l0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZG91YmxlIEdldFNwZWVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgaW50IEdldENsb3NlZExvb3BFcnJvcigpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0QWxsb3dhYmxlQ2xvc2VkTG9vcEVycih1aW50MzJfdCBhbGxvd2FibGVDbG9zZUxvb3BFcnJvcik7CisgIHZpcnR1YWwgaW50IEdldEFuYWxvZ0luKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTZXRBbmFsb2dQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24pOworICB2aXJ0dWFsIGludCBHZXRBbmFsb2dJblJhdygpIGNvbnN0OworICB2aXJ0dWFsIGludCBHZXRBbmFsb2dJblZlbCgpIGNvbnN0OworICB2aXJ0dWFsIGludCBHZXRFbmNQb3NpdGlvbigpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0RW5jUG9zaXRpb24oaW50KTsKKyAgdmlydHVhbCBpbnQgR2V0RW5jVmVsKCkgY29uc3Q7CisgIGludCBHZXRQaW5TdGF0ZVF1YWRBKCkgY29uc3Q7CisgIGludCBHZXRQaW5TdGF0ZVF1YWRCKCkgY29uc3Q7CisgIGludCBHZXRQaW5TdGF0ZVF1YWRJZHgoKSBjb25zdDsKKyAgaW50IElzRndkTGltaXRTd2l0Y2hDbG9zZWQoKSBjb25zdDsKKyAgaW50IElzUmV2TGltaXRTd2l0Y2hDbG9zZWQoKSBjb25zdDsKKyAgaW50IEdldE51bWJlck9mUXVhZElkeFJpc2VzKCkgY29uc3Q7CisgIHZvaWQgU2V0TnVtYmVyT2ZRdWFkSWR4UmlzZXMoaW50IHJpc2VzKTsKKyAgdmlydHVhbCBpbnQgR2V0UHVsc2VXaWR0aFBvc2l0aW9uKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTZXRQdWxzZVdpZHRoUG9zaXRpb24oaW50IG5ld3Bvcyk7CisgIHZpcnR1YWwgaW50IEdldFB1bHNlV2lkdGhWZWxvY2l0eSgpIGNvbnN0OworICB2aXJ0dWFsIGludCBHZXRQdWxzZVdpZHRoUmlzZVRvRmFsbFVzKCkgY29uc3Q7CisgIHZpcnR1YWwgaW50IEdldFB1bHNlV2lkdGhSaXNlVG9SaXNlVXMoKSBjb25zdDsKKyAgdmlydHVhbCBGZWVkYmFja0RldmljZVN0YXR1cyBJc1NlbnNvclByZXNlbnQoRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UpY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBHZXRGb3J3YXJkTGltaXRPSygpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgR2V0UmV2ZXJzZUxpbWl0T0soKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB1aW50MTZfdCBHZXRGYXVsdHMoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDE2X3QgR2V0U3RpY2t5RmF1bHRzKCkgY29uc3Q7CisgIHZvaWQgQ2xlYXJTdGlja3lGYXVsdHMoKTsKKyAgdmlydHVhbCB2b2lkIFNldFZvbHRhZ2VSYW1wUmF0ZShkb3VibGUgcmFtcFJhdGUpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdGFnZUNvbXBlbnNhdGlvblJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSk7CisgIHZpcnR1YWwgdWludDMyX3QgR2V0RmlybXdhcmVWZXJzaW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBDb25maWdOZXV0cmFsTW9kZShOZXV0cmFsTW9kZSBtb2RlKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldih1aW50MTZfdCBjb2Rlc1BlclJldikgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBDb25maWdQb3RlbnRpb21ldGVyVHVybnModWludDE2X3QgdHVybnMpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnU29mdFBvc2l0aW9uTGltaXRzKGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZVNvZnRQb3NpdGlvbkxpbWl0cygpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnTGltaXRNb2RlKExpbWl0TW9kZSBtb2RlKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIENvbmZpZ0ZvcndhcmRMaW1pdChkb3VibGUgZm9yd2FyZExpbWl0UG9zaXRpb24pIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnUmV2ZXJzZUxpbWl0KGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgb3ZlcnJpZGU7CisgIC8qKgorICAgKiBDaGFuZ2UgdGhlIGZ3ZCBsaW1pdCBzd2l0Y2ggc2V0dGluZyB0byBub3JtYWxseSBvcGVuIG9yIGNsb3NlZC4KKyAgICogVGFsb24gd2lsbCBkaXNhYmxlIG1vbWVudGFyaWxseSBpZiB0aGUgVGFsb24ncyBjdXJyZW50IHNldHRpbmcKKyAgICogaXMgZGlzc2ltaWxhciB0byB0aGUgY2FsbGVyJ3MgcmVxdWVzdGVkIHNldHRpbmcuCisgICAqCisgICAqIFNpbmNlIFRhbG9uIHNhdmVzIHNldHRpbmcgdG8gZmxhc2ggdGhpcyBzaG91bGQgb25seSBhZmZlY3QKKyAgICogYSBnaXZlbiBUYWxvbiBpbml0aWFsbHkgZHVyaW5nIHJvYm90IGluc3RhbGwuCisgICAqCisgICAqIEBwYXJhbSBub3JtYWxseU9wZW4gdHJ1ZSBmb3Igbm9ybWFsbHkgb3Blbi4gIGZhbHNlIGZvciBub3JtYWxseSBjbG9zZWQuCisgICAqLworICB2b2lkIENvbmZpZ0Z3ZExpbWl0U3dpdGNoTm9ybWFsbHlPcGVuKGJvb2wgbm9ybWFsbHlPcGVuKTsKKyAgLyoqCisgICAqIENoYW5nZSB0aGUgcmV2IGxpbWl0IHN3aXRjaCBzZXR0aW5nIHRvIG5vcm1hbGx5IG9wZW4gb3IgY2xvc2VkLgorICAgKiBUYWxvbiB3aWxsIGRpc2FibGUgbW9tZW50YXJpbGx5IGlmIHRoZSBUYWxvbidzIGN1cnJlbnQgc2V0dGluZworICAgKiBpcyBkaXNzaW1pbGFyIHRvIHRoZSBjYWxsZXIncyByZXF1ZXN0ZWQgc2V0dGluZy4KKyAgICoKKyAgICogU2luY2UgVGFsb24gc2F2ZXMgc2V0dGluZyB0byBmbGFzaCB0aGlzIHNob3VsZCBvbmx5IGFmZmVjdAorICAgKiBhIGdpdmVuIFRhbG9uIGluaXRpYWxseSBkdXJpbmcgcm9ib3QgaW5zdGFsbC4KKyAgICoKKyAgICogQHBhcmFtIG5vcm1hbGx5T3BlbiB0cnVlIGZvciBub3JtYWxseSBvcGVuLiAgZmFsc2UgZm9yIG5vcm1hbGx5IGNsb3NlZC4KKyAgICovCisgIHZvaWQgQ29uZmlnUmV2TGltaXRTd2l0Y2hOb3JtYWxseU9wZW4oYm9vbCBub3JtYWxseU9wZW4pOworICB2aXJ0dWFsIHZvaWQgQ29uZmlnTWF4T3V0cHV0Vm9sdGFnZShkb3VibGUgdm9sdGFnZSkgb3ZlcnJpZGU7CisgIHZvaWQgQ29uZmlnUGVha091dHB1dFZvbHRhZ2UoZG91YmxlIGZvcndhcmRWb2x0YWdlLGRvdWJsZSByZXZlcnNlVm9sdGFnZSk7CisgIHZvaWQgQ29uZmlnTm9taW5hbE91dHB1dFZvbHRhZ2UoZG91YmxlIGZvcndhcmRWb2x0YWdlLGRvdWJsZSByZXZlcnNlVm9sdGFnZSk7CisgIC8qKgorICAgKiBFbmFibGVzIFRhbG9uIFNSWCB0byBhdXRvbWF0aWNhbGx5IHplcm8gdGhlIFNlbnNvciBQb3NpdGlvbiB3aGVuZXZlciBhbgorICAgKiBlZGdlIGlzIGRldGVjdGVkIG9uIHRoZSBpbmRleCBzaWduYWwuCisgICAqIEBwYXJhbSBlbmFibGUgCQlib29sZWFuIGlucHV0LCBwYXNzIHRydWUgdG8gZW5hYmxlIGZlYXR1cmUgb3IgZmFsc2UgdG8gZGlzYWJsZS4KKyAgICogQHBhcmFtIHJpc2luZ0VkZ2UgCWJvb2xlYW4gaW5wdXQsIHBhc3MgdHJ1ZSB0byBjbGVhciB0aGUgcG9zaXRpb24gb24gcmlzaW5nIGVkZ2UsCisgICAqCQkJCQlwYXNzIGZhbHNlIHRvIGNsZWFyIHRoZSBwb3NpdGlvbiBvbiBmYWxsaW5nIGVkZ2UuCisgICAqLworICB2b2lkIEVuYWJsZVplcm9TZW5zb3JQb3NpdGlvbk9uSW5kZXgoYm9vbCBlbmFibGUsIGJvb2wgcmlzaW5nRWRnZSk7CisgIHZvaWQgQ29uZmlnU2V0UGFyYW1ldGVyKHVpbnQzMl90IHBhcmFtRW51bSwgZG91YmxlIHZhbHVlKTsKKyAgYm9vbCBHZXRQYXJhbWV0ZXIodWludDMyX3QgcGFyYW1FbnVtLCBkb3VibGUgJiBkdmFsdWUpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBDb25maWdGYXVsdFRpbWUoZmxvYXQgZmF1bHRUaW1lKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNldENvbnRyb2xNb2RlKENvbnRyb2xNb2RlIG1vZGUpOworICB2b2lkIFNldEZlZWRiYWNrRGV2aWNlKEZlZWRiYWNrRGV2aWNlIGRldmljZSk7CisgIHZvaWQgU2V0U3RhdHVzRnJhbWVSYXRlTXMoU3RhdHVzRnJhbWVSYXRlIHN0YXRlRnJhbWUsIGludCBwZXJpb2RNcyk7CisgIHZpcnR1YWwgQ29udHJvbE1vZGUgR2V0Q29udHJvbE1vZGUoKSBjb25zdDsKKyAgdm9pZCBTZXRTZW5zb3JEaXJlY3Rpb24oYm9vbCByZXZlcnNlU2Vuc29yKTsKKyAgdm9pZCBTZXRDbG9zZWRMb29wT3V0cHV0RGlyZWN0aW9uKGJvb2wgcmV2ZXJzZU91dHB1dCk7CisgIHZvaWQgU2V0Q2xvc2VMb29wUmFtcFJhdGUoZG91YmxlIHJhbXBSYXRlKTsKKyAgdm9pZCBTZWxlY3RQcm9maWxlU2xvdChpbnQgc2xvdElkeCk7CisgIGludCBHZXRJem9uZSgpIGNvbnN0OworICBpbnQgR2V0SWFjY3VtKCkgY29uc3Q7CisgIHZvaWQgQ2xlYXJJYWNjdW0oKTsKKyAgaW50IEdldEJyYWtlRW5hYmxlRHVyaW5nTmV1dHJhbCgpIGNvbnN0OworCisgIGJvb2wgSXNDb250cm9sRW5hYmxlZCgpIGNvbnN0OworICBib29sIElzRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworICBkb3VibGUgR2V0U2V0cG9pbnQoKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBMaXZlV2luZG93IHN0dWZmLgorICB2b2lkIFZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIG92ZXJyaWRlOworICB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIFNwZWVkQ29udHJvbGxlciBvdmVycmlkZXMKKyAgdmlydHVhbCB2b2lkIFNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRJbnZlcnRlZCgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgLy8gVmFsdWVzIGZvciB2YXJpb3VzIG1vZGVzIGFzIGlzIHNlbnQgaW4gdGhlIENBTiBwYWNrZXRzIGZvciB0aGUgVGFsb24uCisgIGVudW0gVGFsb25Db250cm9sTW9kZSB7CisgICAga1Rocm90dGxlID0gMCwKKyAgICBrRm9sbG93ZXJNb2RlID0gNSwKKyAgICBrVm9sdGFnZU1vZGUgPSA0LAorICAgIGtQb3NpdGlvbk1vZGUgPSAxLAorICAgIGtTcGVlZE1vZGUgPSAyLAorICAgIGtDdXJyZW50TW9kZSA9IDMsCisgICAga0Rpc2FibGVkID0gMTUKKyAgfTsKKworICBpbnQgbV9kZXZpY2VOdW1iZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDYW5UYWxvblNSWD4gbV9pbXBsOworICBzdGQ6OnVuaXF1ZV9wdHI8TW90b3JTYWZldHlIZWxwZXI+IG1fc2FmZXR5SGVscGVyOworICBpbnQgbV9wcm9maWxlID0gMDsgIC8vIFByb2ZpbGUgZnJvbSBDQU5UYWxvbiB0byB1c2UuIFNldCB0byB6ZXJvIHVudGlsIHdlIGNhbgorICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgdGVzdCB0aGlzLgorCisgIGJvb2wgbV9jb250cm9sRW5hYmxlZCA9IHRydWU7CisgIENvbnRyb2xNb2RlIG1fY29udHJvbE1vZGUgPSBrUGVyY2VudFZidXM7CisgIFRhbG9uQ29udHJvbE1vZGUgbV9zZW5kTW9kZTsKKworICBkb3VibGUgbV9zZXRQb2ludCA9IDA7CisgIC8qKgorICAgKiBFbmNvZGVyIENQUiwgY291bnRzIHBlciByb3RhdGlvbnMsIGFsc28gY2FsbGVkIGNvZGVzIHBlciByZXZvbHVpb24uCisgICAqIERlZmF1bHQgdmFsdWUgb2YgemVybyBtZWFucyB0aGUgQVBJIGJlaGF2ZXMgYXMgaXQgZGlkIGR1cmluZyB0aGUgMjAxNSBzZWFzb24sIGVhY2ggcG9zaXRpb24KKyAgICogdW5pdCBpcyBhIHNpbmdsZSBwdWxzZSBhbmQgdGhlcmUgYXJlIGZvdXIgcHVsc2VzIHBlciBjb3VudCAoNFgpLgorICAgKiBDYWxsZXIgY2FuIHVzZSBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYgdG8gc2V0IHRoZSBxdWFkcmF0dXJlIGVuY29kZXIgQ1BSLgorICAgKi8KKyAgdWludDMyX3QgbV9jb2Rlc1BlclJldiA9IDA7CisgIC8qKgorICAgKiBOdW1iZXIgb2YgdHVybnMgcGVyIHJvdGF0aW9uLiAgRm9yIGV4YW1wbGUsIGEgMTAtdHVybiBwb3Qgc3BpbnMgdGVuIGZ1bGwgcm90YXRpb25zIGZyb20KKyAgICogYSB3aXBlciB2b2x0YWdlIG9mIHplcm8gdG8gMy4zIHZvbHRzLiAgVGhlcmVmb3JlIGtub3dpbmcgdGhlCisgICAqIG51bWJlciBvZiB0dXJucyBhIGZ1bGwgdm9sdGFnZSBzd2VlcCByZXByZXNlbnRzIGlzIG5lY2Vzc2FyeSBmb3IgY2FsY3VsYXRpbmcgcm90YXRpb25zCisgICAqIGFuZCB2ZWxvY2l0eS4KKyAgICogQSBkZWZhdWx0IHZhbHVlIG9mIHplcm8gbWVhbnMgdGhlIEFQSSBiZWhhdmVzIGFzIGl0IGRpZCBkdXJpbmcgdGhlIDIwMTUgc2Vhc29uLCB0aGVyZSBhcmUgMTAyNAorICAgKiBwb3NpdGlvbiB1bml0cyBmcm9tIHplcm8gdG8gMy4zVi4KKyAgICovCisgIHVpbnQzMl90IG1fbnVtUG90VHVybnMgPSAwOworICAvKioKKyAgICogQWx0aG91Z2ggdGhlIFRhbG9uIGhhbmRsZXMgZmVlZGJhY2sgc2VsZWN0aW9uLCBjYWNoaW5nIHRoZSBmZWVkYmFjayBzZWxlY3Rpb24gaXMgaGVscGZ1bCBhdCB0aGUgQVBJIGxldmVsCisgICAqIGZvciBzY2FsaW5nIGludG8gcm90YXRpb25zIGFuZCBSUE0uCisgICAqLworICBGZWVkYmFja0RldmljZSBtX2ZlZWRiYWNrRGV2aWNlID0gUXVhZEVuY29kZXI7CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrRGVsYXlGb3JTb2xpY2l0ZWRTaWduYWxzVXMgPSA0MDAwOworICAvKioKKyAgICogQHBhcmFtIGRldlRvTG9va3VwIEZlZWRiYWNrRGV2aWNlIHRvIGxvb2t1cCB0aGUgc2NhbGFyIGZvci4gIEJlY2F1c2UgVGFsb24KKyAgICogCQkJCWFsbG93cyBtdWx0aXBsZSBzZW5zb3JzIHRvIGJlIGF0dGFjaGVkIHNpbXVsdGFuZW91c2x5LCBjYWxsZXIgbXVzdAorICAgKgkJCQlzcGVjaWZ5IHdoaWNoIHNlbnNvciB0byBsb29rdXAuCisgICAqIEByZXR1cm4gCQlUaGUgbnVtYmVyIG9mIG5hdGl2ZSBUYWxvbiB1bml0cyBwZXIgcm90YXRpb24gb2YgdGhlIHNlbGVjdGVkIHNlbnNvci4KKyAgICoJCQkJWmVybyBpZiB0aGUgbmVjZXNzYXJ5IHNlbnNvciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgorICAgKiBAc2VlIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldgorICAgKiBAc2VlIENvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucworICAgKi8KKyAgZG91YmxlIEdldE5hdGl2ZVVuaXRzUGVyUm90YXRpb25TY2FsYXIoRmVlZGJhY2tEZXZpY2UgZGV2VG9Mb29rdXApY29uc3Q7CisgIC8qKgorICAgKiBGaXh1cCB0aGUgc2VuZE1vZGUgc28gU2V0KCkgc2VyaWFsaXplcyB0aGUgY29ycmVjdCBkZW1hbmQgdmFsdWUuCisgICAqIEFsc28gZmlsbHMgdGhlIG1vZGVTZWxlY2V0IGluIHRoZSBjb250cm9sIGZyYW1lIHRvIGRpc2FibGVkLgorICAgKiBAcGFyYW0gbW9kZSBDb250cm9sIG1vZGUgdG8gdWx0aW1hdGVseSBlbnRlciBvbmNlIHVzZXIgY2FsbHMgU2V0KCkuCisgICAqIEBzZWUgU2V0KCkKKyAgICovCisgIHZvaWQgQXBwbHlDb250cm9sTW9kZShDQU5TcGVlZENvbnRyb2xsZXI6OkNvbnRyb2xNb2RlIG1vZGUpOworICAvKioKKyAgICogQHBhcmFtIGZ1bGxSb3RhdGlvbnMgCWRvdWJsZSBwcmVjaXNpb24gdmFsdWUgcmVwcmVzZW50aW5nIG51bWJlciBvZiByb3RhdGlvbnMgb2Ygc2VsZWN0ZWQgZmVlZGJhY2sgc2Vuc29yLgorICAgKgkJCQkJCQlJZiB1c2VyIGhhcyBuZXZlciBjYWxsZWQgdGhlIGNvbmZpZyByb3V0aW5lIGZvciB0aGUgc2VsZWN0ZWQgc2Vuc29yLCB0aGVuIHRoZSBjYWxsZXIKKyAgICoJCQkJCQkJaXMgbGlrZWx5IHBhc3Npbmcgcm90YXRpb25zIGluIGVuZ2luZWVyaW5nIHVuaXRzIGFscmVhZHksIGluIHdoaWNoIGNhc2UgaXQgaXMgcmV0dXJuZWQKKyAgICoJCQkJCQkJYXMgaXMuCisgICAqCQkJCQkJCUBzZWUgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zCisgICAqCQkJCQkJCUBzZWUgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2CisgICAqIEByZXR1cm4gZnVsbFJvdGF0aW9ucyBpbiBuYXRpdmUgZW5naW5lZXJpbmcgdW5pdHMgb2YgdGhlIFRhbG9uIFNSWCBmaXJtd2FyZS4KKyAgICovCisgIGludDMyX3QgU2NhbGVSb3RhdGlvbnNUb05hdGl2ZVVuaXRzKEZlZWRiYWNrRGV2aWNlIGRldlRvTG9va3VwLCBkb3VibGUgZnVsbFJvdGF0aW9ucykgY29uc3Q7CisgIC8qKgorICAgKiBAcGFyYW0gcnBtIAlkb3VibGUgcHJlY2lzaW9uIHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2Ygcm90YXRpb25zIHBlciBtaW51dGUgb2Ygc2VsZWN0ZWQgZmVlZGJhY2sgc2Vuc29yLgorICAgKgkJCQkJCQlJZiB1c2VyIGhhcyBuZXZlciBjYWxsZWQgdGhlIGNvbmZpZyByb3V0aW5lIGZvciB0aGUgc2VsZWN0ZWQgc2Vuc29yLCB0aGVuIHRoZSBjYWxsZXIKKyAgICoJCQkJCQkJaXMgbGlrZWx5IHBhc3Npbmcgcm90YXRpb25zIGluIGVuZ2luZWVyaW5nIHVuaXRzIGFscmVhZHksIGluIHdoaWNoIGNhc2UgaXQgaXMgcmV0dXJuZWQKKyAgICoJCQkJCQkJYXMgaXMuCisgICAqCQkJCQkJCUBzZWUgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zCisgICAqCQkJCQkJCUBzZWUgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2CisgICAqIEByZXR1cm4gc2Vuc29yIHZlbG9jaXR5IGluIG5hdGl2ZSBlbmdpbmVlcmluZyB1bml0cyBvZiB0aGUgVGFsb24gU1JYIGZpcm13YXJlLgorICAgKi8KKyAgaW50MzJfdCBTY2FsZVZlbG9jaXR5VG9OYXRpdmVVbml0cyhGZWVkYmFja0RldmljZSBkZXZUb0xvb2t1cCwgZG91YmxlIHJwbSkgY29uc3Q7CisgIC8qKgorICAgKiBAcGFyYW0gbmF0aXZlUG9zIAlpbnRlZ3JhbCBwb3NpdGlvbiBvZiB0aGUgZmVlZGJhY2sgc2Vuc29yIGluIG5hdGl2ZSBUYWxvbiBTUlggdW5pdHMuCisgICAqCQkJCQkJCUlmIHVzZXIgaGFzIG5ldmVyIGNhbGxlZCB0aGUgY29uZmlnIHJvdXRpbmUgZm9yIHRoZSBzZWxlY3RlZCBzZW5zb3IsIHRoZW4gdGhlIHJldHVybgorICAgKgkJCQkJCQl3aWxsIGJlIGluIFRBTE9OIFNSWCB1bml0cyBhcyB3ZWxsIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBpbiB0aGUgMjAxNSBzZWFzb24uCisgICAqCQkJCQkJCUBzZWUgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zCisgICAqCQkJCQkJCUBzZWUgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2CisgICAqIEByZXR1cm4gZG91YmxlIHByZWNpc2lvbiBudW1iZXIgb2Ygcm90YXRpb25zLCB1bmxlc3MgY29uZmlnIHdhcyBuZXZlciBwZXJmb3JtZWQuCisgICAqLworICBkb3VibGUgU2NhbGVOYXRpdmVVbml0c1RvUm90YXRpb25zKEZlZWRiYWNrRGV2aWNlIGRldlRvTG9va3VwLCBpbnQzMl90IG5hdGl2ZVBvcykgY29uc3Q7CisgIC8qKgorICAgKiBAcGFyYW0gbmF0aXZlVmVsIAlpbnRlZ3JhbCB2ZWxvY2l0eSBvZiB0aGUgZmVlZGJhY2sgc2Vuc29yIGluIG5hdGl2ZSBUYWxvbiBTUlggdW5pdHMuCisgICAqCQkJCQkJCUlmIHVzZXIgaGFzIG5ldmVyIGNhbGxlZCB0aGUgY29uZmlnIHJvdXRpbmUgZm9yIHRoZSBzZWxlY3RlZCBzZW5zb3IsIHRoZW4gdGhlIHJldHVybgorICAgKgkJCQkJCQl3aWxsIGJlIGluIFRBTE9OIFNSWCB1bml0cyBhcyB3ZWxsIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBpbiB0aGUgMjAxNSBzZWFzb24uCisgICAqCQkJCQkJCUBzZWUgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zCisgICAqCQkJCQkJCUBzZWUgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2CisgICAqIEByZXR1cm4gZG91YmxlIHByZWNpc2lvbiBvZiBzZW5zb3IgdmVsb2NpdHkgaW4gUlBNLCB1bmxlc3MgY29uZmlnIHdhcyBuZXZlciBwZXJmb3JtZWQuCisgICAqLworICBkb3VibGUgU2NhbGVOYXRpdmVVbml0c1RvUnBtKEZlZWRiYWNrRGV2aWNlIGRldlRvTG9va3VwLCBpbnQzMl90IG5hdGl2ZVZlbCkgY29uc3Q7CisKKyAgLy8gTGl2ZVdpbmRvdyBzdHVmZi4KKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKKyAgYm9vbCBtX2lzSW52ZXJ0ZWQ7CisKKyAgSGFzQmVlbk1vdmVkIG1faGFzQmVlbk1vdmVkOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQ2FtZXJhU2VydmVyLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NhbWVyYVNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWNlOTkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NhbWVyYVNlcnZlci5oCkBAIC0wLDAgKzEsODIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCisvKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiVVNCQ2FtZXJhLmgiCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAibml2aXNpb24uaCIKKyNpbmNsdWRlICJOSUlNQVFkeC5oIgorCisjaW5jbHVkZSAiSEFML2NwcC9wcmlvcml0eV9tdXRleC5oIgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgQ2FtZXJhU2VydmVyIDogcHVibGljIEVycm9yQmFzZSB7CisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBrUG9ydCA9IDExODA7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTWFnaWNOdW1iZXJbXSA9IHsweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrU2l6ZTY0MHg0ODAgPSAwOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtTaXplMzIweDI0MCA9IDE7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1NpemUxNjB4MTIwID0gMjsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtIYXJkd2FyZUNvbXByZXNzaW9uID0gLTE7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heEltYWdlU2l6ZSA9IDIwMDAwMDsKKworIHByb3RlY3RlZDoKKyAgQ2FtZXJhU2VydmVyKCk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFVTQkNhbWVyYT4gbV9jYW1lcmE7CisgIHN0ZDo6dGhyZWFkIG1fc2VydmVyVGhyZWFkOworICBzdGQ6OnRocmVhZCBtX2NhcHR1cmVUaHJlYWQ7CisgIHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleCBtX2ltYWdlTXV0ZXg7CisgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSBtX25ld0ltYWdlVmFyaWFibGU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3QqPiBtX2RhdGFQb29sOworICB1bnNpZ25lZCBpbnQgbV9xdWFsaXR5OworICBib29sIG1fYXV0b0NhcHR1cmVTdGFydGVkOworICBib29sIG1faHdDbGllbnQ7CisgIHN0ZDo6dHVwbGU8dWludDhfdCosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBib29sPiBtX2ltYWdlRGF0YTsKKworICB2b2lkIFNlcnZlKCk7CisgIHZvaWQgQXV0b0NhcHR1cmUoKTsKKyAgdm9pZCBTZXRJbWFnZURhdGEodWludDhfdCogZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBzdGFydCA9IDAsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaW1hcURhdGEgPSBmYWxzZSk7CisgIHZvaWQgRnJlZUltYWdlRGF0YSgKKyAgICAgIHN0ZDo6dHVwbGU8dWludDhfdCosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBib29sPiBpbWFnZURhdGEpOworCisgIHN0cnVjdCBSZXF1ZXN0IHsKKyAgICB1aW50MzJfdCBmcHM7CisgICAgaW50MzJfdCBjb21wcmVzc2lvbjsKKyAgICB1aW50MzJfdCBzaXplOworICB9OworCisgcHVibGljOgorICBzdGF0aWMgQ2FtZXJhU2VydmVyKiBHZXRJbnN0YW5jZSgpOworICB2b2lkIFNldEltYWdlKEltYWdlIGNvbnN0KiBpbWFnZSk7CisKKyAgdm9pZCBTdGFydEF1dG9tYXRpY0NhcHR1cmUoCisgICAgICBjaGFyIGNvbnN0KiBjYW1lcmFOYW1lID0gVVNCQ2FtZXJhOjprRGVmYXVsdENhbWVyYU5hbWUpOworCisgIC8qKgorICAgKiBTdGFydCBhdXRvbWF0aWNhbGx5IGNhcHR1cmluZyBpbWFnZXMgdG8gc2VuZCB0byB0aGUgZGFzaGJvYXJkLgorICAgKgorICAgKiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdG8ganVzdCBzZWUgYSBjYW1lcmEgZmVlZCBvbiB0aGUKKyAgICogZGFzaGJvYXJkIHdpdGhvdXQgZG9pbmcgYW55IHZpc2lvbiBwcm9jZXNzaW5nIG9uIHRoZSByb2JvUklPLgorICAgKiB7QGxpbmsgI1NldEltYWdlfSBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGlzIGlzIGNhbGxlZC4KKyAgICoKKyAgICogQHBhcmFtIGNhbWVyYSBUaGUgY2FtZXJhIGludGVyZmFjZSAoZWcuIFVTQkNhbWVyYSkKKyAgICovCisgIHZvaWQgU3RhcnRBdXRvbWF0aWNDYXB0dXJlKHN0ZDo6c2hhcmVkX3B0cjxVU0JDYW1lcmE+IGNhbWVyYSk7CisKKyAgYm9vbCBJc0F1dG9DYXB0dXJlU3RhcnRlZCgpOworCisgIHZvaWQgU2V0UXVhbGl0eSh1bnNpZ25lZCBpbnQgcXVhbGl0eSk7CisgIHVuc2lnbmVkIGludCBHZXRRdWFsaXR5KCk7CisKKyAgdm9pZCBTZXRTaXplKHVuc2lnbmVkIGludCBzaXplKTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NvbXByZXNzb3IuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQ29tcHJlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OTYyYzMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NvbXByZXNzb3IuaApAQCAtMCwwICsxLDY1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBDb21wcmVzc29yX0hfCisjZGVmaW5lIENvbXByZXNzb3JfSF8KKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJ0YWJsZXMvSVRhYmxlTGlzdGVuZXIuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIFBDTSBjb21wcmVzc29yCisgKi8KK2NsYXNzIENvbXByZXNzb3IgOiBwdWJsaWMgU2Vuc29yQmFzZSwKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlLAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVGFibGVMaXN0ZW5lciB7CisgcHVibGljOgorICAvLyBEZWZhdWx0IFBDTSBJRCBpcyAwCisgIGV4cGxpY2l0IENvbXByZXNzb3IodWludDhfdCBwY21JRCA9IEdldERlZmF1bHRTb2xlbm9pZE1vZHVsZSgpKTsKKyAgdmlydHVhbCB+Q29tcHJlc3NvcigpID0gZGVmYXVsdDsKKworICB2b2lkIFN0YXJ0KCk7CisgIHZvaWQgU3RvcCgpOworICBib29sIEVuYWJsZWQoKSBjb25zdDsKKworICBib29sIEdldFByZXNzdXJlU3dpdGNoVmFsdWUoKSBjb25zdDsKKworICBmbG9hdCBHZXRDb21wcmVzc29yQ3VycmVudCgpIGNvbnN0OworCisgIHZvaWQgU2V0Q2xvc2VkTG9vcENvbnRyb2woYm9vbCBvbik7CisgIGJvb2wgR2V0Q2xvc2VkTG9vcENvbnRyb2woKSBjb25zdDsKKworICBib29sIEdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KCkgY29uc3Q7CisgIGJvb2wgR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoKSBjb25zdDsKKyAgYm9vbCBHZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KCkgY29uc3Q7CisgIGJvb2wgR2V0Q29tcHJlc3NvclNob3J0ZWRGYXVsdCgpIGNvbnN0OworICBib29sIEdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCgpIGNvbnN0OworICBib29sIEdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCgpIGNvbnN0OworICB2b2lkIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCk7CisKKyAgdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworICB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSBvdmVycmlkZTsKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBWYWx1ZUNoYW5nZWQoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCAqbV9wY21fcG9pbnRlcjsKKworIHByaXZhdGU6CisgIHZvaWQgU2V0Q29tcHJlc3Nvcihib29sIG9uKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKKworI2VuZGlmIC8qIENvbXByZXNzb3JfSF8gKi8KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQ29udHJvbGxlclBvd2VyLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NvbnRyb2xsZXJQb3dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODRlNjAKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NvbnRyb2xsZXJQb3dlci5oCkBAIC0wLDAgKzEsMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0NPTlRST0xMRVJfUE9XRVJfSF9fCisjZGVmaW5lIF9fQ09OVFJPTExFUl9QT1dFUl9IX18KKworY2xhc3MgQ29udHJvbGxlclBvd2VyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBkb3VibGUgR2V0SW5wdXRWb2x0YWdlKCk7CisgIHN0YXRpYyBkb3VibGUgR2V0SW5wdXRDdXJyZW50KCk7CisgIHN0YXRpYyBkb3VibGUgR2V0Vm9sdGFnZTNWMygpOworICBzdGF0aWMgZG91YmxlIEdldEN1cnJlbnQzVjMoKTsKKyAgc3RhdGljIGJvb2wgR2V0RW5hYmxlZDNWMygpOworICBzdGF0aWMgaW50IEdldEZhdWx0Q291bnQzVjMoKTsKKyAgc3RhdGljIGRvdWJsZSBHZXRWb2x0YWdlNVYoKTsKKyAgc3RhdGljIGRvdWJsZSBHZXRDdXJyZW50NVYoKTsKKyAgc3RhdGljIGJvb2wgR2V0RW5hYmxlZDVWKCk7CisgIHN0YXRpYyBpbnQgR2V0RmF1bHRDb3VudDVWKCk7CisgIHN0YXRpYyBkb3VibGUgR2V0Vm9sdGFnZTZWKCk7CisgIHN0YXRpYyBkb3VibGUgR2V0Q3VycmVudDZWKCk7CisgIHN0YXRpYyBib29sIEdldEVuYWJsZWQ2VigpOworICBzdGF0aWMgaW50IEdldEZhdWx0Q291bnQ2VigpOworfTsKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQ291bnRlci5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9Db3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2NmRlOAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQ291bnRlci5oCkBAIC0wLDAgKzEsMTA3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXJPdXRwdXQuaCIKKyNpbmNsdWRlICJDb3VudGVyQmFzZS5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCitjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworCisvKioKKyAqIENsYXNzIGZvciBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRpY2tzIG9uIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogVGhpcyBpcyBhIGdlbmVyYWwgcHVycG9zZSBjbGFzcyBmb3IgY291bnRpbmcgcmVwZXRpdGl2ZSBldmVudHMuIEl0IGNhbiByZXR1cm4KKyAqIHRoZSBudW1iZXIKKyAqIG9mIGNvdW50cywgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgY3ljbGUsIGFuZCBkZXRlY3Qgd2hlbiB0aGUgc2lnbmFsCisgKiBiZWluZyBjb3VudGVkCisgKiBoYXMgc3RvcHBlZCBieSBzdXBwbHlpbmcgYSBtYXhpbXVtIGN5Y2xlIHRpbWUuCisgKgorICogQWxsIGNvdW50ZXJzIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgY291bnRpbmcgLSBSZXNldCgpIHRoZW0gaWYgeW91IG5lZWQgdGhlbQorICogdG8gYmUgemVyb2VkIGJlZm9yZSB1c2UuCisgKi8KK2NsYXNzIENvdW50ZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSwKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ291bnRlckJhc2UsCisgICAgICAgICAgICAgICAgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDb3VudGVyKE1vZGUgbW9kZSA9IGtUd29QdWxzZSk7CisgIGV4cGxpY2l0IENvdW50ZXIoaW50MzJfdCBjaGFubmVsKTsKKyAgZXhwbGljaXQgQ291bnRlcihEaWdpdGFsU291cmNlICpzb3VyY2UpOworICBleHBsaWNpdCBDb3VudGVyKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBzb3VyY2UpOworICBERVBSRUNBVEVEKCJVc2UgcGFzcy1ieS1yZWZlcmVuY2UgaW5zdGVhZC4iKQorICBleHBsaWNpdCBDb3VudGVyKEFuYWxvZ1RyaWdnZXIgKnRyaWdnZXIpOworICBleHBsaWNpdCBDb3VudGVyKGNvbnN0IEFuYWxvZ1RyaWdnZXIgJnRyaWdnZXIpOworICBDb3VudGVyKEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUsIERpZ2l0YWxTb3VyY2UgKnVwU291cmNlLAorICAgICAgICAgIERpZ2l0YWxTb3VyY2UgKmRvd25Tb3VyY2UsIGJvb2wgaW52ZXJ0ZWQpOworICBDb3VudGVyKEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUsIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiB1cFNvdXJjZSwKKyAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gZG93blNvdXJjZSwgYm9vbCBpbnZlcnRlZCk7CisgIHZpcnR1YWwgfkNvdW50ZXIoKTsKKworICB2b2lkIFNldFVwU291cmNlKGludDMyX3QgY2hhbm5lbCk7CisgIHZvaWQgU2V0VXBTb3VyY2UoQW5hbG9nVHJpZ2dlciAqYW5hbG9nVHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpOworICB2b2lkIFNldFVwU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyPiBhbmFsb2dUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKTsKKyAgdm9pZCBTZXRVcFNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UpOworICB2b2lkIFNldFVwU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBzb3VyY2UpOworICB2b2lkIFNldFVwU291cmNlKERpZ2l0YWxTb3VyY2UgJnNvdXJjZSk7CisgIHZvaWQgU2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSk7CisgIHZvaWQgQ2xlYXJVcFNvdXJjZSgpOworCisgIHZvaWQgU2V0RG93blNvdXJjZShpbnQzMl90IGNoYW5uZWwpOworICB2b2lkIFNldERvd25Tb3VyY2UoQW5hbG9nVHJpZ2dlciAqYW5hbG9nVHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKTsKKyAgdm9pZCBTZXREb3duU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyPiBhbmFsb2dUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpOworICB2b2lkIFNldERvd25Tb3VyY2UoRGlnaXRhbFNvdXJjZSAqc291cmNlKTsKKyAgdm9pZCBTZXREb3duU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBzb3VyY2UpOworICB2b2lkIFNldERvd25Tb3VyY2UoRGlnaXRhbFNvdXJjZSAmc291cmNlKTsKKyAgdm9pZCBTZXREb3duU291cmNlRWRnZShib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UpOworICB2b2lkIENsZWFyRG93blNvdXJjZSgpOworCisgIHZvaWQgU2V0VXBEb3duQ291bnRlck1vZGUoKTsKKyAgdm9pZCBTZXRFeHRlcm5hbERpcmVjdGlvbk1vZGUoKTsKKyAgdm9pZCBTZXRTZW1pUGVyaW9kTW9kZShib29sIGhpZ2hTZW1pUGVyaW9kKTsKKyAgdm9pZCBTZXRQdWxzZUxlbmd0aE1vZGUoZmxvYXQgdGhyZXNob2xkKTsKKworICB2b2lkIFNldFJldmVyc2VEaXJlY3Rpb24oYm9vbCByZXZlcnNlRGlyZWN0aW9uKTsKKworICAvLyBDb3VudGVyQmFzZSBpbnRlcmZhY2UKKyAgaW50MzJfdCBHZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBSZXNldCgpIG92ZXJyaWRlOworICBkb3VibGUgR2V0UGVyaW9kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpIG92ZXJyaWRlOworICB2b2lkIFNldFVwZGF0ZVdoZW5FbXB0eShib29sIGVuYWJsZWQpOworICBib29sIEdldFN0b3BwZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBHZXREaXJlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIFNldFNhbXBsZXNUb0F2ZXJhZ2UoaW50IHNhbXBsZXNUb0F2ZXJhZ2UpOworICBpbnQgR2V0U2FtcGxlc1RvQXZlcmFnZSgpIGNvbnN0OworICB1aW50MzJfdCBHZXRGUEdBSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisKKyAgdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworICB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICAvLyBNYWtlcyB0aGUgY291bnRlciBjb3VudCB1cC4KKyAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+IG1fdXBTb3VyY2U7CisgIC8vIE1ha2VzIHRoZSBjb3VudGVyIGNvdW50IGRvd24uCisgIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBtX2Rvd25Tb3VyY2U7CisgIC8vIFRoZSBGUEdBIGNvdW50ZXIgb2JqZWN0CisgIHZvaWQgKm1fY291bnRlciA9IG51bGxwdHI7ICAgICAgICAgICAgICAvLy88IFRoZSBGUEdBIGNvdW50ZXIgb2JqZWN0LgorIHByaXZhdGU6CisgIHVpbnQzMl90IG1faW5kZXggPSAwOyAgICAgICAgICAgIC8vLzwgVGhlIGluZGV4IG9mIHRoaXMgY291bnRlci4KKworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworICBmcmllbmQgY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NvdW50ZXJCYXNlLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0NvdW50ZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4OTZhOAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvQ291bnRlckJhc2UuaApAQCAtMCwwICsxLDMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKioKKyAqIEludGVyZmFjZSBmb3IgY291bnRpbmcgdGhlIG51bWJlciBvZiB0aWNrcyBvbiBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KKyAqIEVuY29kZXJzLCBHZWFyIHRvb3RoIHNlbnNvcnMsIGFuZCBjb3VudGVycyBzaG91bGQgYWxsIHN1YmNsYXNzIHRoaXMgc28gaXQgY2FuCisgKiBiZSB1c2VkIHRvIGJ1aWxkIG1vcmUgYWR2YW5jZWQgY2xhc3NlcyBmb3IgY29udHJvbCBhbmQgZHJpdmluZy4KKyAqCisgKiBBbGwgY291bnRlcnMgd2lsbCBpbW1lZGlhdGVseSBzdGFydCBjb3VudGluZyAtIFJlc2V0KCkgdGhlbSBpZiB5b3UgbmVlZCB0aGVtCisgKiB0byBiZSB6ZXJvZWQgYmVmb3JlIHVzZS4KKyAqLworY2xhc3MgQ291bnRlckJhc2UgeworIHB1YmxpYzoKKyAgZW51bSBFbmNvZGluZ1R5cGUgeyBrMVgsIGsyWCwgazRYIH07CisKKyAgdmlydHVhbCB+Q291bnRlckJhc2UoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgaW50MzJfdCBHZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKKyAgdmlydHVhbCBkb3VibGUgR2V0UGVyaW9kKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpID0gMDsKKyAgdmlydHVhbCBib29sIEdldFN0b3BwZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBHZXREaXJlY3Rpb24oKSBjb25zdCA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9EaWdpdGFsR2xpdGNoRmlsdGVyLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0RpZ2l0YWxHbGl0Y2hGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY5ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9EaWdpdGFsR2xpdGNoRmlsdGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFycmF5PgorCisjaW5jbHVkZSAiSEFML2NwcC9wcmlvcml0eV9tdXRleC5oIgorI2luY2x1ZGUgIkRpZ2l0YWxTb3VyY2UuaCIKKworY2xhc3MgRW5jb2RlcjsKK2NsYXNzIENvdW50ZXI7CisKKy8qKgorICogQ2xhc3MgdG8gZW5hYmxlIGdsaXRjaCBmaWx0ZXJpbmcgb24gYSBzZXQgb2YgZGlnaXRhbCBpbnB1dHMuCisgKiBUaGlzIGNsYXNzIHdpbGwgbWFuYWdlIGFkZGluZyBhbmQgcmVtb3ZpbmcgZGlnaXRhbCBpbnB1dHMgZnJvbSBhIEZQR0EgZ2xpdGNoCisgKiBmaWx0ZXIuIFRoZSBmaWx0ZXIgbGV0cyB0aGUgdXNlciBjb25maWd1cmUgdGhlIHRpbWUgdGhhdCBhbiBpbnB1dCBtdXN0IHJlbWFpbgorICogaGlnaCBvciBsb3cgYmVmb3JlIGl0IGlzIGNsYXNzaWZpZWQgYXMgaGlnaCBvciBsb3cuCisgKi8KK2NsYXNzIERpZ2l0YWxHbGl0Y2hGaWx0ZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSB7CisgcHVibGljOgorICBEaWdpdGFsR2xpdGNoRmlsdGVyKCk7CisgIH5EaWdpdGFsR2xpdGNoRmlsdGVyKCk7CisKKyAgdm9pZCBBZGQoRGlnaXRhbFNvdXJjZSAqaW5wdXQpOworICB2b2lkIEFkZChFbmNvZGVyICppbnB1dCk7CisgIHZvaWQgQWRkKENvdW50ZXIgKmlucHV0KTsKKworICB2b2lkIFJlbW92ZShEaWdpdGFsU291cmNlICppbnB1dCk7CisgIHZvaWQgUmVtb3ZlKEVuY29kZXIgKmlucHV0KTsKKyAgdm9pZCBSZW1vdmUoQ291bnRlciAqaW5wdXQpOworCisgIHZvaWQgU2V0UGVyaW9kQ3ljbGVzKHVpbnQzMl90IGZwZ2FfY3ljbGVzKTsKKyAgdm9pZCBTZXRQZXJpb2ROYW5vU2Vjb25kcyh1aW50NjRfdCBuYW5vc2Vjb25kcyk7CisKKyAgdWludDMyX3QgR2V0UGVyaW9kQ3ljbGVzKCk7CisgIHVpbnQ2NF90IEdldFBlcmlvZE5hbm9TZWNvbmRzKCk7CisKKyBwcml2YXRlOgorICAvLyBTZXRzIHRoZSBmaWx0ZXIgZm9yIHRoZSBpbnB1dCB0byBiZSB0aGUgcmVxdWVzdGVkIGluZGV4LiAgQSB2YWx1ZSBvZiAwCisgIC8vIGRpc2FibGVzIHRoZSBmaWx0ZXIsIGFuZCB0aGUgZmlsdGVyIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAzLAorICAvLyBpbmNsdXNpdmUuCisgIHZvaWQgRG9BZGQoRGlnaXRhbFNvdXJjZSAqaW5wdXQsIGludCByZXF1ZXN0ZWRfaW5kZXgpOworCisgIGludCBtX2NoYW5uZWxJbmRleCA9IC0xOworICBzdGF0aWMgcHJpb3JpdHlfbXV0ZXggbV9tdXRleDsKKyAgc3RhdGljIDo6c3RkOjphcnJheTxib29sLCAzPiBtX2ZpbHRlckFsbG9jYXRlZDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0RpZ2l0YWxJbnB1dC5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9EaWdpdGFsSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNmY2M1Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9EaWdpdGFsSW5wdXQuaApAQCAtMCwwICsxLDUxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkRpZ2l0YWxTb3VyY2UuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK2NsYXNzIERpZ2l0YWxHbGl0Y2hGaWx0ZXI7CisKKy8qKgorICogQ2xhc3MgdG8gcmVhZCBhIGRpZ2l0YWwgaW5wdXQuCisgKiBUaGlzIGNsYXNzIHdpbGwgcmVhZCBkaWdpdGFsIGlucHV0cyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9uIHRoZQorICogY2hhbm5lbC4gT3RoZXIgZGV2aWNlcworICogc3VjaCBhcyBlbmNvZGVycywgZ2VhciB0b290aCBzZW5zb3JzLCBldGMuIHRoYXQgYXJlIGltcGxlbWVudGVkIGVsc2V3aGVyZQorICogd2lsbCBhdXRvbWF0aWNhbGx5CisgKiBhbGxvY2F0ZSBkaWdpdGFsIGlucHV0cyBhbmQgb3V0cHV0cyBhcyByZXF1aXJlZC4gVGhpcyBjbGFzcyBpcyBvbmx5IGZvcgorICogZGV2aWNlcyBsaWtlIHN3aXRjaGVzCisgKiBldGMuIHRoYXQgYXJlbid0IGltcGxlbWVudGVkIGFueXdoZXJlIGVsc2UuCisgKi8KK2NsYXNzIERpZ2l0YWxJbnB1dCA6IHB1YmxpYyBEaWdpdGFsU291cmNlLCBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERpZ2l0YWxJbnB1dCh1aW50MzJfdCBjaGFubmVsKTsKKyAgdmlydHVhbCB+RGlnaXRhbElucHV0KCk7CisgIGJvb2wgR2V0KCkgY29uc3Q7CisgIHVpbnQzMl90IEdldENoYW5uZWwoKSBjb25zdDsKKworICAvLyBEaWdpdGFsIFNvdXJjZSBJbnRlcmZhY2UKKyAgdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpIGNvbnN0OworICB2aXJ0dWFsIHVpbnQzMl90IEdldE1vZHVsZUZvclJvdXRpbmcoKSBjb25zdDsKKyAgdmlydHVhbCBib29sIEdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCkgY29uc3Q7CisKKyAgdm9pZCBVcGRhdGVUYWJsZSgpOworICB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKTsKKyAgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKTsKKyAgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Q7CisgIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHVpbnQzMl90IG1fY2hhbm5lbDsKKworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworICBmcmllbmQgY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0RpZ2l0YWxPdXRwdXQuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvRGlnaXRhbE91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2N2ZiODAKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0RpZ2l0YWxPdXRwdXQuaApAQCAtMCwwICsxLDU1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkRpZ2l0YWxTb3VyY2UuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorI2luY2x1ZGUgInRhYmxlcy9JVGFibGVMaXN0ZW5lci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENsYXNzIHRvIHdyaXRlIHRvIGRpZ2l0YWwgb3V0cHV0cy4KKyAqIFdyaXRlIHZhbHVlcyB0byB0aGUgZGlnaXRhbCBvdXRwdXQgY2hhbm5lbHMuIE90aGVyIGRldmljZXMgaW1wbGVtZW50ZWQKKyAqIGVsc2V3aGVyZSB3aWxsIGFsbG9jYXRlCisgKiBjaGFubmVscyBhdXRvbWF0aWNhbGx5IHNvIGZvciB0aG9zZSBkZXZpY2VzIGl0IHNob3VsZG4ndCBiZSBkb25lIGhlcmUuCisgKi8KK2NsYXNzIERpZ2l0YWxPdXRwdXQgOiBwdWJsaWMgRGlnaXRhbFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVRhYmxlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEaWdpdGFsT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpOworICB2aXJ0dWFsIH5EaWdpdGFsT3V0cHV0KCk7CisgIHZvaWQgU2V0KHVpbnQzMl90IHZhbHVlKTsKKyAgdWludDMyX3QgR2V0Q2hhbm5lbCgpIGNvbnN0OworICB2b2lkIFB1bHNlKGZsb2F0IGxlbmd0aCk7CisgIGJvb2wgSXNQdWxzaW5nKCkgY29uc3Q7CisgIHZvaWQgU2V0UFdNUmF0ZShmbG9hdCByYXRlKTsKKyAgdm9pZCBFbmFibGVQV00oZmxvYXQgaW5pdGlhbER1dHlDeWNsZSk7CisgIHZvaWQgRGlzYWJsZVBXTSgpOworICB2b2lkIFVwZGF0ZUR1dHlDeWNsZShmbG9hdCBkdXR5Q3ljbGUpOworCisgIC8vIERpZ2l0YWwgU291cmNlIEludGVyZmFjZQorICB2aXJ0dWFsIHVpbnQzMl90IEdldENoYW5uZWxGb3JSb3V0aW5nKCkgY29uc3Q7CisgIHZpcnR1YWwgdWludDMyX3QgR2V0TW9kdWxlRm9yUm91dGluZygpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgR2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgVmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KTsKKyAgdm9pZCBVcGRhdGVUYWJsZSgpOworICB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKTsKKyAgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKTsKKyAgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Q7CisgIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHVpbnQzMl90IG1fY2hhbm5lbDsKKyAgdm9pZCAqbV9wd21HZW5lcmF0b3I7CisKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0RpZ2l0YWxTb3VyY2UuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvRGlnaXRhbFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTY3MTUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0RpZ2l0YWxTb3VyY2UuaApAQCAtMCwwICsxLDI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkludGVycnVwdGFibGVTZW5zb3JCYXNlLmgiCisKKy8qKgorICogRGlnaXRhbFNvdXJjZSBJbnRlcmZhY2UuCisgKiBUaGUgRGlnaXRhbFNvdXJjZSByZXByZXNlbnRzIGFsbCB0aGUgcG9zc2libGUgaW5wdXRzIGZvciBhIGNvdW50ZXIgb3IgYQorICogcXVhZHJhdHVyZSBlbmNvZGVyLiBUaGUgc291cmNlIG1heSBiZQorICogZWl0aGVyIGEgZGlnaXRhbCBpbnB1dCBvciBhbiBhbmFsb2cgaW5wdXQuIElmIHRoZSBjYWxsZXIganVzdCBwcm92aWRlcyBhCisgKiBjaGFubmVsLCB0aGVuIGEgZGlnaXRhbCBpbnB1dCB3aWxsIGJlCisgKiBjb25zdHJ1Y3RlZCBhbmQgZnJlZWQgd2hlbiBmaW5pc2hlZCBmb3IgdGhlIHNvdXJjZS4gVGhlIHNvdXJjZSBjYW4gZWl0aGVyIGJlCisgKiBhIGRpZ2l0YWwgaW5wdXQgb3IgYW5hbG9nIHRyaWdnZXIKKyAqIGJ1dCBub3QgYm90aC4KKyAqLworY2xhc3MgRGlnaXRhbFNvdXJjZSA6IHB1YmxpYyBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5EaWdpdGFsU291cmNlKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIHVpbnQzMl90IEdldENoYW5uZWxGb3JSb3V0aW5nKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IEdldE1vZHVsZUZvclJvdXRpbmcoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpIGNvbnN0ID0gMDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0RvdWJsZVNvbGVub2lkLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0RvdWJsZVNvbGVub2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyMDM5NwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvRG91YmxlU29sZW5vaWQuaApAQCAtMCwwICsxLDUzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNvbGVub2lkQmFzZS5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisjaW5jbHVkZSAidGFibGVzL0lUYWJsZUxpc3RlbmVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogRG91YmxlU29sZW5vaWQgY2xhc3MgZm9yIHJ1bm5pbmcgMiBjaGFubmVscyBvZiBoaWdoIHZvbHRhZ2UgRGlnaXRhbCBPdXRwdXQKKyAqIChQQ00pLgorICoKKyAqIFRoZSBEb3VibGVTb2xlbm9pZCBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcG5ldW1hdGljcyBzb2xlbm9pZHMgdGhhdAorICogaGF2ZSB0d28gcG9zaXRpb25zIGNvbnRyb2xsZWQgYnkgdHdvIHNlcGFyYXRlIGNoYW5uZWxzLgorICovCitjbGFzcyBEb3VibGVTb2xlbm9pZCA6IHB1YmxpYyBTb2xlbm9pZEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVGFibGVMaXN0ZW5lciB7CisgcHVibGljOgorICBlbnVtIFZhbHVlIHsga09mZiwga0ZvcndhcmQsIGtSZXZlcnNlIH07CisKKyAgZXhwbGljaXQgRG91YmxlU29sZW5vaWQodWludDMyX3QgZm9yd2FyZENoYW5uZWwsIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKTsKKyAgRG91YmxlU29sZW5vaWQodWludDhfdCBtb2R1bGVOdW1iZXIsIHVpbnQzMl90IGZvcndhcmRDaGFubmVsLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXZlcnNlQ2hhbm5lbCk7CisgIHZpcnR1YWwgfkRvdWJsZVNvbGVub2lkKCk7CisgIHZpcnR1YWwgdm9pZCBTZXQoVmFsdWUgdmFsdWUpOworICB2aXJ0dWFsIFZhbHVlIEdldCgpIGNvbnN0OworICBib29sIElzRndkU29sZW5vaWRCbGFja0xpc3RlZCgpIGNvbnN0OworICBib29sIElzUmV2U29sZW5vaWRCbGFja0xpc3RlZCgpIGNvbnN0OworCisgIHZvaWQgVmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwgYm9vbCBpc05ldyk7CisgIHZvaWQgVXBkYXRlVGFibGUoKTsKKyAgdm9pZCBTdGFydExpdmVXaW5kb3dNb2RlKCk7CisgIHZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCk7CisgIHN0ZDo6c3RyaW5nIEdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0OworICB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBtX2ZvcndhcmRDaGFubmVsOyAgLy8vPCBUaGUgZm9yd2FyZCBjaGFubmVsIG9uIHRoZSBtb2R1bGUgdG8gY29udHJvbC4KKyAgdWludDMyX3QgbV9yZXZlcnNlQ2hhbm5lbDsgIC8vLzwgVGhlIHJldmVyc2UgY2hhbm5lbCBvbiB0aGUgbW9kdWxlIHRvIGNvbnRyb2wuCisgIHVpbnQ4X3QgbV9mb3J3YXJkTWFzazsgICAgICAvLy88IFRoZSBtYXNrIGZvciB0aGUgZm9yd2FyZCBjaGFubmVsLgorICB1aW50OF90IG1fcmV2ZXJzZU1hc2s7ICAgICAgLy8vPCBUaGUgbWFzayBmb3IgdGhlIHJldmVyc2UgY2hhbm5lbC4KKworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvRHJpdmVyU3RhdGlvbi5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9Ecml2ZXJTdGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlZTA5NQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvRHJpdmVyU3RhdGlvbi5oCkBAIC0wLDAgKzEsMTE2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlJvYm90U3RhdGUuaCIKKyNpbmNsdWRlICJUYXNrLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiSEFML2NwcC9TZW1hcGhvcmUuaHBwIgorI2luY2x1ZGUgIkhBTC9jcHAvcHJpb3JpdHlfbXV0ZXguaCIKKyNpbmNsdWRlICJIQUwvY3BwL3ByaW9yaXR5X2NvbmRpdGlvbl92YXJpYWJsZS5oIgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxhdG9taWM+CisKK3N0cnVjdCBIQUxDb250cm9sV29yZDsKK2NsYXNzIEFuYWxvZ0lucHV0OworCisvKioKKyAqIFByb3ZpZGUgYWNjZXNzIHRvIHRoZSBuZXR3b3JrIGNvbW11bmljYXRpb24gZGF0YSB0byAvIGZyb20gdGhlIERyaXZlcgorICogU3RhdGlvbi4KKyAqLworY2xhc3MgRHJpdmVyU3RhdGlvbiA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUm9ib3RTdGF0ZUludGVyZmFjZSB7CisgcHVibGljOgorICBlbnVtIEFsbGlhbmNlIHsga1JlZCwga0JsdWUsIGtJbnZhbGlkIH07CisKKyAgdmlydHVhbCB+RHJpdmVyU3RhdGlvbigpOworICBzdGF0aWMgRHJpdmVyU3RhdGlvbiAmR2V0SW5zdGFuY2UoKTsKKyAgc3RhdGljIHZvaWQgUmVwb3J0RXJyb3Ioc3RkOjpzdHJpbmcgZXJyb3IpOworCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSm95c3RpY2tQb3J0cyA9IDY7CisKKyAgZmxvYXQgR2V0U3RpY2tBeGlzKHVpbnQzMl90IHN0aWNrLCB1aW50MzJfdCBheGlzKTsKKyAgaW50IEdldFN0aWNrUE9WKHVpbnQzMl90IHN0aWNrLCB1aW50MzJfdCBwb3YpOworICB1aW50MzJfdCBHZXRTdGlja0J1dHRvbnModWludDMyX3Qgc3RpY2spIGNvbnN0OworICBib29sIEdldFN0aWNrQnV0dG9uKHVpbnQzMl90IHN0aWNrLCB1aW50OF90IGJ1dHRvbik7CisKKyAgaW50IEdldFN0aWNrQXhpc0NvdW50KHVpbnQzMl90IHN0aWNrKSBjb25zdDsKKyAgaW50IEdldFN0aWNrUE9WQ291bnQodWludDMyX3Qgc3RpY2spIGNvbnN0OworICBpbnQgR2V0U3RpY2tCdXR0b25Db3VudCh1aW50MzJfdCBzdGljaykgY29uc3Q7CisKKyAgYm9vbCBHZXRKb3lzdGlja0lzWGJveCh1aW50MzJfdCBzdGljaykgY29uc3Q7CisgIGludCBHZXRKb3lzdGlja1R5cGUodWludDMyX3Qgc3RpY2spIGNvbnN0OworICBzdGQ6OnN0cmluZyBHZXRKb3lzdGlja05hbWUodWludDMyX3Qgc3RpY2spIGNvbnN0OworICBpbnQgR2V0Sm95c3RpY2tBeGlzVHlwZSh1aW50MzJfdCBzdGljaywgdWludDhfdCBheGlzKSBjb25zdDsKKworICBib29sIElzRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzRGlzYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBJc0F1dG9ub21vdXMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBJc09wZXJhdG9yQ29udHJvbCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzVGVzdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzRFNBdHRhY2hlZCgpIGNvbnN0OworICBib29sIElzTmV3Q29udHJvbERhdGEoKSBjb25zdDsKKyAgYm9vbCBJc0ZNU0F0dGFjaGVkKCkgY29uc3Q7CisgIGJvb2wgSXNTeXNBY3RpdmUoKSBjb25zdDsKKyAgYm9vbCBJc1N5c0Jyb3duZWRPdXQoKSBjb25zdDsKKworICBBbGxpYW5jZSBHZXRBbGxpYW5jZSgpIGNvbnN0OworICB1aW50MzJfdCBHZXRMb2NhdGlvbigpIGNvbnN0OworICB2b2lkIFdhaXRGb3JEYXRhKCk7CisgIGRvdWJsZSBHZXRNYXRjaFRpbWUoKSBjb25zdDsKKyAgZmxvYXQgR2V0QmF0dGVyeVZvbHRhZ2UoKSBjb25zdDsKKworICAvKiogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUKKyAgICogZXhlY3V0aW5nCisgICAqICAgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgb25seQorICAgKiBAcGFyYW0gZW50ZXJpbmcgSWYgdHJ1ZSwgc3RhcnRpbmcgZGlzYWJsZWQgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgZGlzYWJsZWQKKyAgICogY29kZSAqLworICB2b2lkIEluRGlzYWJsZWQoYm9vbCBlbnRlcmluZykgeyBtX3VzZXJJbkRpc2FibGVkID0gZW50ZXJpbmc7IH0KKyAgLyoqIE9ubHkgdG8gYmUgdXNlZCB0byB0ZWxsIHRoZSBEcml2ZXIgU3RhdGlvbiB3aGF0IGNvZGUgeW91IGNsYWltIHRvIGJlCisgICAqIGV4ZWN1dGluZworICAgKiAgIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkKKyAgICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIGF1dG9ub21vdXMgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcKKyAgICogYXV0b25vbW91cyBjb2RlICovCisgIHZvaWQgSW5BdXRvbm9tb3VzKGJvb2wgZW50ZXJpbmcpIHsgbV91c2VySW5BdXRvbm9tb3VzID0gZW50ZXJpbmc7IH0KKyAgLyoqIE9ubHkgdG8gYmUgdXNlZCB0byB0ZWxsIHRoZSBEcml2ZXIgU3RhdGlvbiB3aGF0IGNvZGUgeW91IGNsYWltIHRvIGJlCisgICAqIGV4ZWN1dGluZworICAgKiAgIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkKKyAgICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIHRlbGVvcCBjb2RlOyBpZiBmYWxzZSwgbGVhdmluZyB0ZWxlb3AKKyAgICogY29kZSAqLworICB2b2lkIEluT3BlcmF0b3JDb250cm9sKGJvb2wgZW50ZXJpbmcpIHsgbV91c2VySW5UZWxlb3AgPSBlbnRlcmluZzsgfQorICAvKiogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUKKyAgICogZXhlY3V0aW5nCisgICAqICAgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgb25seQorICAgKiBAcGFyYW0gZW50ZXJpbmcgSWYgdHJ1ZSwgc3RhcnRpbmcgdGVzdCBjb2RlOyBpZiBmYWxzZSwgbGVhdmluZyB0ZXN0IGNvZGUgKi8KKyAgdm9pZCBJblRlc3QoYm9vbCBlbnRlcmluZykgeyBtX3VzZXJJblRlc3QgPSBlbnRlcmluZzsgfQorCisgcHJvdGVjdGVkOgorICBEcml2ZXJTdGF0aW9uKCk7CisKKyAgdm9pZCBHZXREYXRhKCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgRHJpdmVyU3RhdGlvbiAqbV9pbnN0YW5jZTsKKyAgdm9pZCBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKHN0ZDo6c3RyaW5nIG1lc3NhZ2UpOworICB2b2lkIFJ1bigpOworCisgIEhBTEpveXN0aWNrQXhlcyBtX2pveXN0aWNrQXhlc1trSm95c3RpY2tQb3J0c107CisgIEhBTEpveXN0aWNrUE9WcyBtX2pveXN0aWNrUE9Wc1trSm95c3RpY2tQb3J0c107CisgIEhBTEpveXN0aWNrQnV0dG9ucyBtX2pveXN0aWNrQnV0dG9uc1trSm95c3RpY2tQb3J0c107CisgIEhBTEpveXN0aWNrRGVzY3JpcHRvciBtX2pveXN0aWNrRGVzY3JpcHRvcltrSm95c3RpY2tQb3J0c107CisgIFRhc2sgbV90YXNrOworICBzdGQ6OmF0b21pYzxib29sPiBtX2lzUnVubmluZ3tmYWxzZX07CisgIG11dGFibGUgU2VtYXBob3JlIG1fbmV3Q29udHJvbERhdGF7U2VtYXBob3JlOjprRW1wdHl9OworICBtdXRhYmxlIHByaW9yaXR5X2NvbmRpdGlvbl92YXJpYWJsZSBtX3BhY2tldERhdGFBdmFpbGFibGVDb25kOworICBwcmlvcml0eV9tdXRleCBtX3BhY2tldERhdGFBdmFpbGFibGVNdXRleDsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IG1fd2FpdEZvckRhdGFDb25kOworICBwcmlvcml0eV9tdXRleCBtX3dhaXRGb3JEYXRhTXV0ZXg7CisgIGJvb2wgbV91c2VySW5EaXNhYmxlZCA9IGZhbHNlOworICBib29sIG1fdXNlckluQXV0b25vbW91cyA9IGZhbHNlOworICBib29sIG1fdXNlckluVGVsZW9wID0gZmFsc2U7CisgIGJvb2wgbV91c2VySW5UZXN0ID0gZmFsc2U7CisgIGRvdWJsZSBtX25leHRNZXNzYWdlVGltZSA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9FbmNvZGVyLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJmYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9FbmNvZGVyLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiQ291bnRlckJhc2UuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiQ291bnRlci5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK2NsYXNzIERpZ2l0YWxTb3VyY2U7CitjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOworCisvKioKKyAqIENsYXNzIHRvIHJlYWQgcXVhZCBlbmNvZGVycy4KKyAqIFF1YWRyYXR1cmUgZW5jb2RlcnMgYXJlIGRldmljZXMgdGhhdCBjb3VudCBzaGFmdCByb3RhdGlvbiBhbmQgY2FuIHNlbnNlCisgKiBkaXJlY3Rpb24uIFRoZSBvdXRwdXQgb2YKKyAqIHRoZSBRdWFkRW5jb2RlciBjbGFzcyBpcyBhbiBpbnRlZ2VyIHRoYXQgY2FuIGNvdW50IGVpdGhlciB1cCBvciBkb3duLCBhbmQgY2FuCisgKiBnbyBuZWdhdGl2ZSBmb3IKKyAqIHJldmVyc2UgZGlyZWN0aW9uIGNvdW50aW5nLiBXaGVuIGNyZWF0aW5nIFF1YWRFbmNvZGVycywgYSBkaXJlY3Rpb24gaXMKKyAqIHN1cHBsaWVkIHRoYXQgY2hhbmdlcyB0aGUKKyAqIHNlbnNlIG9mIHRoZSBvdXRwdXQgdG8gbWFrZSBjb2RlIG1vcmUgcmVhZGFibGUgaWYgdGhlIGVuY29kZXIgaXMgbW91bnRlZCBzdWNoCisgKiB0aGF0IGZvcndhcmQgbW92ZW1lbnQKKyAqIGdlbmVyYXRlcyBuZWdhdGl2ZSB2YWx1ZXMuIFF1YWRyYXR1cmUgZW5jb2RlcnMgaGF2ZSB0d28gZGlnaXRhbCBvdXRwdXRzLCBhbiBBCisgKiBDaGFubmVsIGFuZCBhIEIgQ2hhbm5lbAorICogdGhhdCBhcmUgb3V0IG9mIHBoYXNlIHdpdGggZWFjaCBvdGhlciB0byBhbGxvdyB0aGUgRlBHQSB0byBkbyBkaXJlY3Rpb24KKyAqIHNlbnNpbmcuCisgKgorICogQWxsIGVuY29kZXJzIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgY291bnRpbmcgLSBSZXNldCgpIHRoZW0gaWYgeW91IG5lZWQgdGhlbQorICogdG8gYmUgemVyb2VkIGJlZm9yZSB1c2UuCisgKi8KK2NsYXNzIEVuY29kZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSwKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ291bnRlckJhc2UsCisgICAgICAgICAgICAgICAgcHVibGljIFBJRFNvdXJjZSwKKyAgICAgICAgICAgICAgICBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlIHsKKyBwdWJsaWM6CisgIGVudW0gSW5kZXhpbmdUeXBlIHsKKyAgICBrUmVzZXRXaGlsZUhpZ2gsCisgICAga1Jlc2V0V2hpbGVMb3csCisgICAga1Jlc2V0T25GYWxsaW5nRWRnZSwKKyAgICBrUmVzZXRPblJpc2luZ0VkZ2UKKyAgfTsKKworICBFbmNvZGVyKHVpbnQzMl90IGFDaGFubmVsLCB1aW50MzJfdCBiQ2hhbm5lbCwgYm9vbCByZXZlcnNlRGlyZWN0aW9uID0gZmFsc2UsCisgICAgICAgICAgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSA9IGs0WCk7CisgIEVuY29kZXIoc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+IGFTb3VyY2UsCisgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+IGJTb3VyY2UsCisgICAgICAgICAgYm9vbCByZXZlcnNlRGlyZWN0aW9uID0gZmFsc2UsIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUgPSBrNFgpOworICBFbmNvZGVyKERpZ2l0YWxTb3VyY2UgKmFTb3VyY2UsIERpZ2l0YWxTb3VyY2UgKmJTb3VyY2UsCisgICAgICAgICAgYm9vbCByZXZlcnNlRGlyZWN0aW9uID0gZmFsc2UsIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUgPSBrNFgpOworICBFbmNvZGVyKERpZ2l0YWxTb3VyY2UgJmFTb3VyY2UsIERpZ2l0YWxTb3VyY2UgJmJTb3VyY2UsCisgICAgICAgICAgYm9vbCByZXZlcnNlRGlyZWN0aW9uID0gZmFsc2UsIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUgPSBrNFgpOworICB2aXJ0dWFsIH5FbmNvZGVyKCk7CisKKyAgLy8gQ291bnRlckJhc2UgaW50ZXJmYWNlCisgIGludDMyX3QgR2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0UmF3KCkgY29uc3Q7CisgIGludDMyX3QgR2V0RW5jb2RpbmdTY2FsZSgpIGNvbnN0OworICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7CisgIGRvdWJsZSBHZXRQZXJpb2QoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgb3ZlcnJpZGU7CisgIGJvb2wgR2V0U3RvcHBlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIEdldERpcmVjdGlvbigpIGNvbnN0IG92ZXJyaWRlOworCisgIGRvdWJsZSBHZXREaXN0YW5jZSgpIGNvbnN0OworICBkb3VibGUgR2V0UmF0ZSgpIGNvbnN0OworICB2b2lkIFNldE1pblJhdGUoZG91YmxlIG1pblJhdGUpOworICB2b2lkIFNldERpc3RhbmNlUGVyUHVsc2UoZG91YmxlIGRpc3RhbmNlUGVyUHVsc2UpOworICB2b2lkIFNldFJldmVyc2VEaXJlY3Rpb24oYm9vbCByZXZlcnNlRGlyZWN0aW9uKTsKKyAgdm9pZCBTZXRTYW1wbGVzVG9BdmVyYWdlKGludCBzYW1wbGVzVG9BdmVyYWdlKTsKKyAgaW50IEdldFNhbXBsZXNUb0F2ZXJhZ2UoKSBjb25zdDsKKyAgZG91YmxlIFBJREdldCgpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0SW5kZXhTb3VyY2UodWludDMyX3QgY2hhbm5lbCwgSW5kZXhpbmdUeXBlIHR5cGUgPSBrUmVzZXRPblJpc2luZ0VkZ2UpOworICBERVBSRUNBVEVEKCJVc2UgcGFzcy1ieS1yZWZlcmVuY2UgaW5zdGVhZC4iKQorICB2b2lkIFNldEluZGV4U291cmNlKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICBJbmRleGluZ1R5cGUgdHlwZSA9IGtSZXNldE9uUmlzaW5nRWRnZSk7CisgIHZvaWQgU2V0SW5kZXhTb3VyY2UoY29uc3QgRGlnaXRhbFNvdXJjZSAmc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgIEluZGV4aW5nVHlwZSB0eXBlID0ga1Jlc2V0T25SaXNpbmdFZGdlKTsKKworICB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIGludDMyX3QgR2V0RlBHQUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBJbml0RW5jb2Rlcihib29sIF9yZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKTsKKyAgZG91YmxlIERlY29kaW5nU2NhbGVGYWN0b3IoKSBjb25zdDsKKworICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gbV9hU291cmNlOyAvLyB0aGUgQSBwaGFzZSBvZiB0aGUgcXVhZCBlbmNvZGVyCisgIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBtX2JTb3VyY2U7IC8vIHRoZSBCIHBoYXNlIG9mIHRoZSBxdWFkIGVuY29kZXIKKyAgdm9pZCAqbV9lbmNvZGVyID0gbnVsbHB0cjsKKyAgaW50MzJfdCBtX2luZGV4ID0gMDsgICAgICAgICAgICAgLy8gVGhlIGVuY29kZXIncyBGUEdBIGluZGV4LgorICBkb3VibGUgbV9kaXN0YW5jZVBlclB1bHNlID0gMS4wOyAvLyBkaXN0YW5jZSBvZiB0cmF2ZWwgZm9yIGVhY2ggZW5jb2RlciB0aWNrCisgIHN0ZDo6dW5pcXVlX3B0cjxDb3VudGVyPiBtX2NvdW50ZXIgPQorICAgICAgbnVsbHB0cjsgICAgICAgICAgICAgICAgICAgICAvLyBDb3VudGVyIG9iamVjdCBmb3IgMXggYW5kIDJ4IGVuY29kaW5nCisgIEVuY29kaW5nVHlwZSBtX2VuY29kaW5nVHlwZTsgICAgIC8vIEVuY29kaW5nIHR5cGUKKyAgaW50MzJfdCBtX2VuY29kaW5nU2NhbGU7ICAgICAgICAgLy8gMXgsIDJ4LCBvciA0eCwgcGVyIHRoZSBlbmNvZGluZ1R5cGUKKworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworICBmcmllbmQgY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0dlYXJUb290aC5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9HZWFyVG9vdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg5ZjljCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9HZWFyVG9vdGguaApAQCAtMCwwICsxLDMyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQWxpYXMgZm9yIGNvdW50ZXIgY2xhc3MuCisgKiBJbXBsZW1lbnQgdGhlIGdlYXIgdG9vdGggc2Vuc29yIHN1cHBsaWVkIGJ5IEZJUlNULiBDdXJyZW50bHkgdGhlcmUgaXMgbm8KKyAqIHJldmVyc2Ugc2Vuc2luZyBvbgorICogdGhlIGdlYXIgdG9vdGggc2Vuc29yLCBidXQgaW4gZnV0dXJlIHZlcnNpb25zIHdlIG1pZ2h0IGltcGxlbWVudCB0aGUKKyAqIG5lY2Vzc2FyeSB0aW1pbmcgaW4gdGhlCisgKiBGUEdBIHRvIHNlbnNlIGRpcmVjdGlvbi4KKyAqLworY2xhc3MgR2VhclRvb3RoIDogcHVibGljIENvdW50ZXIgeworIHB1YmxpYzoKKyAgLy8vIDU1IHVTZWMgZm9yIHRocmVzaG9sZAorICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrR2VhclRvb3RoVGhyZXNob2xkID0gNTVlLTY7CisgIEdlYXJUb290aCh1aW50MzJfdCBjaGFubmVsLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSA9IGZhbHNlKTsKKyAgR2VhclRvb3RoKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSwgYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUgPSBmYWxzZSk7CisgIEdlYXJUb290aChzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gc291cmNlLAorICAgICAgICAgICAgYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUgPSBmYWxzZSk7CisgIHZpcnR1YWwgfkdlYXJUb290aCgpID0gZGVmYXVsdDsKKyAgdm9pZCBFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvR3lyb0Jhc2UuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvR3lyb0Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ0NGFhCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9HeXJvQmFzZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorI2luY2x1ZGUgImludGVyZmFjZXMvR3lyby5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogR3lyb0Jhc2UgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBHeXJvIGltcGxlbWVudGF0aW9ucyBzdWNoIGFzCisgKiBBbmFsb2dHeXJvLgorICovCitjbGFzcyBHeXJvQmFzZSA6IHB1YmxpYyBHeXJvLCBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIFBJRFNvdXJjZSwgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5HeXJvQmFzZSgpID0gZGVmYXVsdDsKKworICAvLyBQSURTb3VyY2UgaW50ZXJmYWNlCisgIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKKworICB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0kyQy5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9JMkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTA0MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9JMkMuaApAQCAtMCwwICsxLDQyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKworLyoqCisgKiBJMkMgYnVzIGludGVyZmFjZSBjbGFzcy4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vuc29yIChhbmQgb3RoZXIgSTJDIGRldmljZSkgZHJpdmVycy4KKyAqIEl0IHByb2JhYmx5IHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4KKyAqCisgKi8KK2NsYXNzIEkyQyA6IFNlbnNvckJhc2UgeworIHB1YmxpYzoKKyAgZW51bSBQb3J0IHsga09uYm9hcmQsIGtNWFAgfTsKKworICBJMkMoUG9ydCBwb3J0LCB1aW50OF90IGRldmljZUFkZHJlc3MpOworICB2aXJ0dWFsIH5JMkMoKTsKKworICBJMkMoY29uc3QgSTJDJikgPSBkZWxldGU7CisgIEkyQyYgb3BlcmF0b3I9KGNvbnN0IEkyQyYpID0gZGVsZXRlOworCisgIGJvb2wgVHJhbnNhY3Rpb24odWludDhfdCAqZGF0YVRvU2VuZCwgdWludDhfdCBzZW5kU2l6ZSwgdWludDhfdCAqZGF0YVJlY2VpdmVkLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVjZWl2ZVNpemUpOworICBib29sIEFkZHJlc3NPbmx5KCk7CisgIGJvb2wgV3JpdGUodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgZGF0YSk7CisgIGJvb2wgV3JpdGVCdWxrKHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgY291bnQpOworICBib29sIFJlYWQodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgY291bnQsIHVpbnQ4X3QgKmRhdGEpOworICBib29sIFJlYWRPbmx5KHVpbnQ4X3QgY291bnQsIHVpbnQ4X3QgKmJ1ZmZlcik7CisgIHZvaWQgQnJvYWRjYXN0KHVpbnQ4X3QgcmVnaXN0ZXJBZGRyZXNzLCB1aW50OF90IGRhdGEpOworICBib29sIFZlcmlmeVNlbnNvcih1aW50OF90IHJlZ2lzdGVyQWRkcmVzcywgdWludDhfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZXhwZWN0ZWQpOworCisgcHJpdmF0ZToKKyAgUG9ydCBtX3BvcnQ7CisgIHVpbnQ4X3QgbV9kZXZpY2VBZGRyZXNzOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYTIwZAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5oCkBAIC0wLDAgKzEsOCBAQAorCisjaW5jbHVkZSAiSExVc2FnZVJlcG9ydGluZy5oIgorCitjbGFzcyBIYXJkd2FyZUhMUmVwb3J0aW5nIDogcHVibGljIEhMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFJlcG9ydFNjaGVkdWxlcigpOworICB2aXJ0dWFsIHZvaWQgUmVwb3J0U21hcnREYXNoYm9hcmQoKTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3YWUyZgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuaApAQCAtMCwwICsxLDUyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCitjbGFzcyBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSA6IHB1YmxpYyBTZW5zb3JCYXNlIHsKKyBwdWJsaWM6CisgIGVudW0gV2FpdFJlc3VsdCB7CisgICAga1RpbWVvdXQgPSAweDAsCisgICAga1Jpc2luZ0VkZ2UgPSAweDEsCisgICAga0ZhbGxpbmdFZGdlID0gMHgxMDAsCisgICAga0JvdGggPSAweDEwMSwKKyAgfTsKKworICBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpOworICB2aXJ0dWFsIH5JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB1aW50MzJfdCBHZXRDaGFubmVsRm9yUm91dGluZygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBHZXRNb2R1bGVGb3JSb3V0aW5nKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgR2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZXF1ZXN0SW50ZXJydXB0cygKKyAgICAgIEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLAorICAgICAgdm9pZCAqcGFyYW0pOyAgICAgICAgICAgICAgICAgIC8vLzwgQXN5bmNocm9udXMgaGFuZGxlciB2ZXJzaW9uLgorICB2aXJ0dWFsIHZvaWQgUmVxdWVzdEludGVycnVwdHMoKTsgIC8vLzwgU3luY2hyb251cyBXYWl0IHZlcnNpb24uCisgIHZpcnR1YWwgdm9pZAorICBDYW5jZWxJbnRlcnJ1cHRzKCk7ICAvLy88IEZyZWUgdXAgdGhlIHVuZGVybHlpbmcgY2hpcG9iamVjdCBmdW5jdGlvbnMuCisgIHZpcnR1YWwgV2FpdFJlc3VsdCBXYWl0Rm9ySW50ZXJydXB0KAorICAgICAgZmxvYXQgdGltZW91dCwgYm9vbCBpZ25vcmVQcmV2aW91cyA9IHRydWUpOyAgLy8vPCBTeW5jaHJvbnVzIHZlcnNpb24uCisgIHZpcnR1YWwgdm9pZAorICBFbmFibGVJbnRlcnJ1cHRzKCk7ICAvLy88IEVuYWJsZSBpbnRlcnJ1cHRzIC0gYWZ0ZXIgZmluaXNoaW5nIHNldHVwLgorICB2aXJ0dWFsIHZvaWQgRGlzYWJsZUludGVycnVwdHMoKTsgICAgICAgLy8vPCBEaXNhYmxlLCBidXQgZG9uJ3QgZGVhbGxvY2F0ZS4KKyAgdmlydHVhbCBkb3VibGUgUmVhZFJpc2luZ1RpbWVzdGFtcCgpOyAgIC8vLzwgUmV0dXJuIHRoZSB0aW1lc3RhbXAgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vcmlzaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkLgorICB2aXJ0dWFsIGRvdWJsZSBSZWFkRmFsbGluZ1RpbWVzdGFtcCgpOyAgLy8vPCBSZXR1cm4gdGhlIHRpbWVzdGFtcCBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy9mYWxsaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkLgorICB2aXJ0dWFsIHZvaWQgU2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgKm1faW50ZXJydXB0ID0gbnVsbHB0cjsKKyAgdWludDMyX3QgbV9pbnRlcnJ1cHRJbmRleCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKKyAgdm9pZCBBbGxvY2F0ZUludGVycnVwdHMoYm9vbCB3YXRjaGVyKTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFJlc291cmNlPiBtX2ludGVycnVwdHM7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9JdGVyYXRpdmVSb2JvdC5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9JdGVyYXRpdmVSb2JvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZWE0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0l0ZXJhdGl2ZVJvYm90LmgKQEAgLTAsMCArMSw4MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlJvYm90QmFzZS5oIgorCisvKioKKyAqIEl0ZXJhdGl2ZVJvYm90IGltcGxlbWVudHMgYSBzcGVjaWZpYyB0eXBlIG9mIFJvYm90IFByb2dyYW0gZnJhbWV3b3JrLAorICogZXh0ZW5kaW5nIHRoZSBSb2JvdEJhc2UgY2xhc3MuCisgKgorICogVGhlIEl0ZXJhdGl2ZVJvYm90IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgYSB1c2VyIGNyZWF0aW5nIGEKKyAqIHJvYm90IHByb2dyYW0uCisgKgorICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBpbXBsZW1lbnQgdGhlICJvbGQgc3R5bGUiIGRlZmF1bHQgY29kZSwgYnkKKyAqIHByb3ZpZGluZworICogdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2hpY2ggYXJlIGNhbGxlZCBieSB0aGUgbWFpbiBsb29wLAorICogU3RhcnRDb21wZXRpdGlvbigpLCBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZXM6CisgKgorICogUm9ib3RJbml0KCkgLS0gcHJvdmlkZSBmb3IgaW5pdGlhbGl6YXRpb24gYXQgcm9ib3QgcG93ZXItb24KKyAqCisgKiBJbml0KCkgZnVuY3Rpb25zIC0tIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaXMgY2FsbGVkIG9uY2Ugd2hlbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgbW9kZSBpcyBlbnRlcmVkOgorICogIC0gRGlzYWJsZWRJbml0KCkgICAtLSBjYWxsZWQgb25seSB3aGVuIGZpcnN0IGRpc2FibGVkCisgKiAgLSBBdXRvbm9tb3VzSW5pdCgpIC0tIGNhbGxlZCBlYWNoIGFuZCBldmVyeSB0aW1lIGF1dG9ub21vdXMgaXMgZW50ZXJlZCBmcm9tCisgKiBhbm90aGVyIG1vZGUKKyAqICAtIFRlbGVvcEluaXQoKSAgICAgLS0gY2FsbGVkIGVhY2ggYW5kIGV2ZXJ5IHRpbWUgdGVsZW9wIGlzIGVudGVyZWQgZnJvbQorICogYW5vdGhlciBtb2RlCisgKiAgLSBUZXN0SW5pdCgpICAgICAgIC0tIGNhbGxlZCBlYWNoIGFuZCBldmVyeSB0aW1lIHRlc3QgaXMgZW50ZXJlZCBmcm9tCisgKiBhbm90aGVyIG1vZGUKKyAqCisgKiBQZXJpb2RpYygpIGZ1bmN0aW9ucyAtLSBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBjYWxsZWQgaXRlcmF0aXZlbHkgYXQgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBwZXJpb2RpYyByYXRlIChha2EgdGhlICJzbG93IGxvb3AiKS4gIFRoZQorICogZGVmYXVsdCBwZXJpb2Qgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpdGVyYXRpdmUgcm9ib3QgaXMgc3luY2VkIHRvIHRoZSBkcml2ZXIgc3RhdGlvbgorICogY29udHJvbCBwYWNrZXRzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgZ2l2aW5nIGEgcGVyaW9kaWMgZnJlcXVlbmN5IG9mIGFib3V0IDUwSHogKDUwIHRpbWVzCisgKiBwZXIgc2Vjb25kKS4KKyAqICAgLSBEaXNhYmxlZFBlcmlvZGljKCkKKyAqICAgLSBBdXRvbm9tb3VzUGVyaW9kaWMoKQorICogICAtIFRlbGVvcFBlcmlvZGljKCkKKyAqICAgLSBUZXN0UGVyaW9kaWMoKQorICoKKyAqLworCitjbGFzcyBJdGVyYXRpdmVSb2JvdCA6IHB1YmxpYyBSb2JvdEJhc2UgeworIHB1YmxpYzoKKyAgLyoKKyAgICogVGhlIGRlZmF1bHQgcGVyaW9kIGZvciB0aGUgcGVyaW9kaWMgZnVuY3Rpb24gY2FsbHMgKHNlY29uZHMpCisgICAqIFNldHRpbmcgdGhlIHBlcmlvZCB0byAwLjAgd2lsbCBjYXVzZSB0aGUgcGVyaW9kaWMgZnVuY3Rpb25zIHRvIGZvbGxvdworICAgKiB0aGUgRHJpdmVyIFN0YXRpb24gcGFja2V0IHJhdGUgb2YgYWJvdXQgNTBIei4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtEZWZhdWx0UGVyaW9kID0gMC4wOworCisgIHZpcnR1YWwgdm9pZCBTdGFydENvbXBldGl0aW9uKCk7CisKKyAgdmlydHVhbCB2b2lkIFJvYm90SW5pdCgpOworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZWRJbml0KCk7CisgIHZpcnR1YWwgdm9pZCBBdXRvbm9tb3VzSW5pdCgpOworICB2aXJ0dWFsIHZvaWQgVGVsZW9wSW5pdCgpOworICB2aXJ0dWFsIHZvaWQgVGVzdEluaXQoKTsKKworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZWRQZXJpb2RpYygpOworICB2aXJ0dWFsIHZvaWQgQXV0b25vbW91c1BlcmlvZGljKCk7CisgIHZpcnR1YWwgdm9pZCBUZWxlb3BQZXJpb2RpYygpOworICB2aXJ0dWFsIHZvaWQgVGVzdFBlcmlvZGljKCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfkl0ZXJhdGl2ZVJvYm90KCkgPSBkZWZhdWx0OworICBJdGVyYXRpdmVSb2JvdCgpID0gZGVmYXVsdDsKKworIHByaXZhdGU6CisgIGJvb2wgbV9kaXNhYmxlZEluaXRpYWxpemVkID0gZmFsc2U7CisgIGJvb2wgbV9hdXRvbm9tb3VzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgYm9vbCBtX3RlbGVvcEluaXRpYWxpemVkID0gZmFsc2U7CisgIGJvb2wgbV90ZXN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL0phZ3Vhci5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9KYWd1YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWIwMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9KYWd1YXIuaApAQCAtMCwwICsxLDMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBMdW1pbmFyeSBNaWNybyAvIFZleCBSb2JvdGljcyBKYWd1YXIgU3BlZWQgQ29udHJvbGxlciB3aXRoIFBXTSBjb250cm9sCisgKi8KK2NsYXNzIEphZ3VhciA6IHB1YmxpYyBTYWZlUFdNLCBwdWJsaWMgU3BlZWRDb250cm9sbGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEphZ3Vhcih1aW50MzJfdCBjaGFubmVsKTsKKyAgdmlydHVhbCB+SmFndWFyKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHZhbHVlLCB1aW50OF90IHN5bmNHcm91cCA9IDApIG92ZXJyaWRlOworICB2aXJ0dWFsIGZsb2F0IEdldCgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSBvdmVycmlkZTsKKyAgdmlydHVhbCBib29sIEdldEludmVydGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBib29sIG1faXNJbnZlcnRlZCA9IGZhbHNlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvSm95c3RpY2suaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvSm95c3RpY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGVhMjkyCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9Kb3lzdGljay5oCkBAIC0wLDAgKzEsMTE4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSk9ZU1RJQ0tfSF8KKyNkZWZpbmUgSk9ZU1RJQ0tfSF8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJHZW5lcmljSElELmgiCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisKK2NsYXNzIERyaXZlclN0YXRpb247CisKKy8qKgorICogSGFuZGxlIGlucHV0IGZyb20gc3RhbmRhcmQgSm95c3RpY2tzIGNvbm5lY3RlZCB0byB0aGUgRHJpdmVyIFN0YXRpb24uCisgKiBUaGlzIGNsYXNzIGhhbmRsZXMgc3RhbmRhcmQgaW5wdXQgdGhhdCBjb21lcyBmcm9tIHRoZSBEcml2ZXIgU3RhdGlvbi4gRWFjaAorICogdGltZSBhIHZhbHVlIGlzIHJlcXVlc3RlZAorICogdGhlIG1vc3QgcmVjZW50IHZhbHVlIGlzIHJldHVybmVkLiBUaGVyZSBpcyBhIHNpbmdsZSBjbGFzcyBpbnN0YW5jZSBmb3IgZWFjaAorICogam95c3RpY2sgYW5kIHRoZSBtYXBwaW5nCisgKiBvZiBwb3J0cyB0byBoYXJkd2FyZSBidXR0b25zIGRlcGVuZHMgb24gdGhlIGNvZGUgaW4gdGhlIGRyaXZlciBzdGF0aW9uLgorICovCitjbGFzcyBKb3lzdGljayA6IHB1YmxpYyBHZW5lcmljSElELCBwdWJsaWMgRXJyb3JCYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFhBeGlzID0gMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0WUF4aXMgPSAxOworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0RlZmF1bHRaQXhpcyA9IDI7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFR3aXN0QXhpcyA9IDI7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFRocm90dGxlQXhpcyA9IDM7CisgIHR5cGVkZWYgZW51bSB7CisgICAga1hBeGlzLAorICAgIGtZQXhpcywKKyAgICBrWkF4aXMsCisgICAga1R3aXN0QXhpcywKKyAgICBrVGhyb3R0bGVBeGlzLAorICAgIGtOdW1BeGlzVHlwZXMKKyAgfSBBeGlzVHlwZTsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0VHJpZ2dlckJ1dHRvbiA9IDE7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFRvcEJ1dHRvbiA9IDI7CisgIHR5cGVkZWYgZW51bSB7IGtUcmlnZ2VyQnV0dG9uLCBrVG9wQnV0dG9uLCBrTnVtQnV0dG9uVHlwZXMgfSBCdXR0b25UeXBlOworICB0eXBlZGVmIGVudW0geyBrTGVmdFJ1bWJsZSwga1JpZ2h0UnVtYmxlIH0gUnVtYmxlVHlwZTsKKyAgdHlwZWRlZiBlbnVtIHsKKyAgICBrVW5rbm93biA9IC0xLAorICAgIGtYSW5wdXRVbmtub3duID0gMCwKKyAgICBrWElucHV0R2FtZXBhZCA9IDEsCisgICAga1hJbnB1dFdoZWVsID0gMiwKKyAgICBrWElucHV0QXJjYWRlU3RpY2sgPSAzLAorICAgIGtYSW5wdXRGbGlnaHRTdGljayA9IDQsCisgICAga1hJbnB1dERhbmNlUGFkID0gNSwKKyAgICBrWElucHV0R3VpdGFyID0gNiwKKyAgICBrWElucHV0R3VpdGFyMiA9IDcsCisgICAga1hJbnB1dERydW1LaXQgPSA4LAorICAgIGtYSW5wdXRHdWl0YXIzID0gMTEsCisgICAga1hJbnB1dEFyY2FkZVBhZCA9IDE5LAorICAgIGtISURKb3lzdGljayA9IDIwLAorICAgIGtISURHYW1lcGFkID0gMjEsCisgICAga0hJRERyaXZpbmcgPSAyMiwKKyAgICBrSElERmxpZ2h0ID0gMjMsCisgICAga0hJRDFzdFBlcnNvbiA9IDI0CisgIH0gSElEVHlwZTsKKyAgZXhwbGljaXQgSm95c3RpY2sodWludDMyX3QgcG9ydCk7CisgIEpveXN0aWNrKHVpbnQzMl90IHBvcnQsIHVpbnQzMl90IG51bUF4aXNUeXBlcywgdWludDMyX3QgbnVtQnV0dG9uVHlwZXMpOworICB2aXJ0dWFsIH5Kb3lzdGljaygpID0gZGVmYXVsdDsKKworICBKb3lzdGljayhjb25zdCBKb3lzdGljayYpID0gZGVsZXRlOworICBKb3lzdGljayYgb3BlcmF0b3I9KGNvbnN0IEpveXN0aWNrJikgPSBkZWxldGU7CisKKyAgdWludDMyX3QgR2V0QXhpc0NoYW5uZWwoQXhpc1R5cGUgYXhpcykgY29uc3Q7CisgIHZvaWQgU2V0QXhpc0NoYW5uZWwoQXhpc1R5cGUgYXhpcywgdWludDMyX3QgY2hhbm5lbCk7CisKKyAgdmlydHVhbCBmbG9hdCBHZXRYKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0WShKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGZsb2F0IEdldFooKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBmbG9hdCBHZXRUd2lzdCgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGZsb2F0IEdldFRocm90dGxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0QXhpcyhBeGlzVHlwZSBheGlzKSBjb25zdDsKKyAgZmxvYXQgR2V0UmF3QXhpcyh1aW50MzJfdCBheGlzKSBjb25zdCBvdmVycmlkZTsKKworICB2aXJ0dWFsIGJvb2wgR2V0VHJpZ2dlcihKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgR2V0VG9wKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRCdW1wZXIoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBib29sIEdldFJhd0J1dHRvbih1aW50MzJfdCBidXR0b24pIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGludCBHZXRQT1YodWludDMyX3QgcG92ID0gMCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgR2V0QnV0dG9uKEJ1dHRvblR5cGUgYnV0dG9uKSBjb25zdDsKKyAgc3RhdGljIEpveXN0aWNrICpHZXRTdGlja0ZvclBvcnQodWludDMyX3QgcG9ydCk7CisKKyAgdmlydHVhbCBmbG9hdCBHZXRNYWduaXR1ZGUoKSBjb25zdDsKKyAgdmlydHVhbCBmbG9hdCBHZXREaXJlY3Rpb25SYWRpYW5zKCkgY29uc3Q7CisgIHZpcnR1YWwgZmxvYXQgR2V0RGlyZWN0aW9uRGVncmVlcygpIGNvbnN0OworCisgIGJvb2wgR2V0SXNYYm94KCkgY29uc3Q7CisgIEpveXN0aWNrOjpISURUeXBlIEdldFR5cGUoKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgR2V0TmFtZSgpIGNvbnN0OworICBpbnQgR2V0QXhpc1R5cGUodWludDhfdCBheGlzKSBjb25zdDsKKworICBpbnQgR2V0QXhpc0NvdW50KCkgY29uc3Q7CisgIGludCBHZXRCdXR0b25Db3VudCgpIGNvbnN0OworICBpbnQgR2V0UE9WQ291bnQoKSBjb25zdDsKKworICB2b2lkIFNldFJ1bWJsZShSdW1ibGVUeXBlIHR5cGUsIGZsb2F0IHZhbHVlKTsKKyAgdm9pZCBTZXRPdXRwdXQodWludDhfdCBvdXRwdXROdW1iZXIsIGJvb2wgdmFsdWUpOworICB2b2lkIFNldE91dHB1dHModWludDMyX3QgdmFsdWUpOworCisgcHJpdmF0ZToKKyAgRHJpdmVyU3RhdGlvbiAmbV9kczsKKyAgdWludDMyX3QgbV9wb3J0OworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbV9heGVzOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbV9idXR0b25zOworICB1aW50MzJfdCBtX291dHB1dHMgPSAwOworICB1aW50MTZfdCBtX2xlZnRSdW1ibGUgPSAwOworICB1aW50MTZfdCBtX3JpZ2h0UnVtYmxlID0gMDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9Nb3RvclNhZmV0eS5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9Nb3RvclNhZmV0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NjNhZTcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL01vdG9yU2FmZXR5LmgKQEAgLTAsMCArMSwyMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNkZWZpbmUgREVGQVVMVF9TQUZFVFlfRVhQSVJBVElPTiAwLjEKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKK2NsYXNzIE1vdG9yU2FmZXR5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRFeHBpcmF0aW9uKGZsb2F0IHRpbWVvdXQpID0gMDsKKyAgdmlydHVhbCBmbG9hdCBHZXRFeHBpcmF0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgSXNBbGl2ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFN0b3BNb3RvcigpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZXREZXNjcmlwdGlvbihzdGQ6Om9zdHJpbmdzdHJlYW0mIGRlc2MpIGNvbnN0ID0gMDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL01vdG9yU2FmZXR5SGVscGVyLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL01vdG9yU2FmZXR5SGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlNzY1OAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTW90b3JTYWZldHlIZWxwZXIuaApAQCAtMCwwICsxLDQwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIkhBTC9jcHAvcHJpb3JpdHlfbXV0ZXguaCIKKworI2luY2x1ZGUgPHNldD4KKworY2xhc3MgTW90b3JTYWZldHk7CisKK2NsYXNzIE1vdG9yU2FmZXR5SGVscGVyIDogcHVibGljIEVycm9yQmFzZSB7CisgcHVibGljOgorICBNb3RvclNhZmV0eUhlbHBlcihNb3RvclNhZmV0eSAqc2FmZU9iamVjdCk7CisgIH5Nb3RvclNhZmV0eUhlbHBlcigpOworICB2b2lkIEZlZWQoKTsKKyAgdm9pZCBTZXRFeHBpcmF0aW9uKGZsb2F0IGV4cGlyYXRpb25UaW1lKTsKKyAgZmxvYXQgR2V0RXhwaXJhdGlvbigpIGNvbnN0OworICBib29sIElzQWxpdmUoKSBjb25zdDsKKyAgdm9pZCBDaGVjaygpOworICB2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKyAgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdDsKKyAgc3RhdGljIHZvaWQgQ2hlY2tNb3RvcnMoKTsKKworIHByaXZhdGU6CisgIGRvdWJsZSBtX2V4cGlyYXRpb247ICAvLyB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGlzIG9iamVjdAorICBib29sIG1fZW5hYmxlZDsgICAgICAgLy8gdHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5hYmxlZCBmb3IgdGhpcyBtb3RvcgorICBkb3VibGUgbV9zdG9wVGltZTsgICAgLy8gdGhlIEZQR0EgY2xvY2sgdmFsdWUgd2hlbiB0aGlzIG1vdG9yIGhhcyBleHBpcmVkCisgIG11dGFibGUgcHJpb3JpdHlfcmVjdXJzaXZlX211dGV4CisgICAgICBtX3N5bmNNdXRleDsgICAgICAgICAgICAvLyBwcm90ZWN0IGFjY2Vzc2VzIHRvIHRoZSBzdGF0ZSBmb3IgdGhpcyBvYmplY3QKKyAgTW90b3JTYWZldHkgKm1fc2FmZU9iamVjdDsgIC8vIHRoZSBvYmplY3QgdGhhdCBpcyB1c2luZyB0aGUgaGVscGVyCisgIC8vIExpc3Qgb2YgYWxsIGV4aXN0aW5nIE1vdG9yU2FmZXR5SGVscGVyIG9iamVjdHMuCisgIHN0YXRpYyBzdGQ6OnNldDxNb3RvclNhZmV0eUhlbHBlcio+IG1faGVscGVyTGlzdDsKKyAgc3RhdGljIHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleAorICAgICAgbV9saXN0TXV0ZXg7ICAvLyBwcm90ZWN0IGFjY2Vzc2VzIHRvIHRoZSBsaXN0IG9mIGhlbHBlcnMKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL05JSU1BUWR4LmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL05JSU1BUWR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiZTdmNgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTklJTUFRZHguaApAQCAtMCwwICsxLDk1MCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAgVGl0bGUJICA6IE5JSU1BUWR4LmgKKy8vICBDcmVhdGVkCSAgOiAxNDAzNjg1ODM0IHNlY29uZHMgYWZ0ZXIgMS8xLzE5NzAgMTI6MDA6MDAgVVRDCisvLyAgQ29weXJpZ2h0IDogqSBDb3B5cmlnaHQgMjAwNiwgTmF0aW9uYWwgSW5zdHJ1bWVudHMgQ29ycG9yYXRpb24sIEFsbCByaWdodHMKKy8vICByZXNlcnZlZAorLy8gCVB1cnBvc2UJICA6IEluY2x1ZGUgZmlsZSBmb3IgTkktSU1BUWR4IGxpYnJhcnkgc3VwcG9ydC4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmbmRlZiBfX19uaWltYXFkeF9oX19fCisjZGVmaW5lIF9fX25paW1hcWR4X2hfX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQobmlpbWFxZHhfdHlwZXMpCisjZGVmaW5lIG5paW1hcWR4X3R5cGVzCisKKyNpZmRlZiBfQ1ZJXworI3ByYWdtYSBFbmFibGVMaWJyYXJ5UnVudGltZUNoZWNraW5nCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBUeXBlZGVmcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZm5kZWYgX05JX3VJbnQ4X0RFRklORURfCisjZGVmaW5lIF9OSV91SW50OF9ERUZJTkVEXwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVJbnQ4OworI2VuZGlmCisKKyNpZm5kZWYgX05JX3VJbnQxNl9ERUZJTkVEXworI2RlZmluZSBfTklfdUludDE2X0RFRklORURfCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCB1SW50MTY7CisjZW5kaWYKKworI2lmbmRlZiBfTklfdUludDMyX0RFRklORURfCisjZGVmaW5lIF9OSV91SW50MzJfREVGSU5FRF8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVJbnQzMjsKKyNlbGlmIF9fR05VQ19fCisjaWYgX194ODZfNjRfXwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdUludDMyOworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1SW50MzI7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX05JX3VJbnQ2NF9ERUZJTkVEXworI2RlZmluZSBfTklfdUludDY0X0RFRklORURfCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgX0NWSV8gPj0gNzAwCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdUludDY0OworI2VsaWYgX19HTlVDX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVJbnQ2NDsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX05JX0ludDhfREVGSU5FRF8KKyNkZWZpbmUgX05JX0ludDhfREVGSU5FRF8KK3R5cGVkZWYgY2hhciBJbnQ4OworI2VuZGlmCisKKyNpZm5kZWYgX05JX0ludDE2X0RFRklORURfCisjZGVmaW5lIF9OSV9JbnQxNl9ERUZJTkVEXwordHlwZWRlZiBzaG9ydCBpbnQgSW50MTY7CisjZW5kaWYKKworI2lmbmRlZiBfTklfSW50MzJfREVGSU5FRF8KKyNkZWZpbmUgX05JX0ludDMyX0RFRklORURfCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKK3R5cGVkZWYgbG9uZyBJbnQzMjsKKyNlbGlmIF9fR05VQ19fCisjaWYgX194ODZfNjRfXwordHlwZWRlZiBpbnQgSW50MzI7CisjZWxzZQordHlwZWRlZiBsb25nIEludDMyOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9OSV9JbnQ2NF9ERUZJTkVEXworI2RlZmluZSBfTklfSW50NjRfREVGSU5FRF8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBfQ1ZJXyA+PSA3MDAKK3R5cGVkZWYgX19pbnQ2NCBJbnQ2NDsKKyNlbGlmIF9fR05VQ19fCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQgSW50NjQ7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9OSV9mbG9hdDMyX0RFRklORURfCisjZGVmaW5lIF9OSV9mbG9hdDMyX0RFRklORURfCit0eXBlZGVmIGZsb2F0IGZsb2F0MzI7CisjZW5kaWYKKworI2lmbmRlZiBfTklfZmxvYXQ2NF9ERUZJTkVEXworI2RlZmluZSBfTklfZmxvYXQ2NF9ERUZJTkVEXwordHlwZWRlZiBkb3VibGUgZmxvYXQ2NDsKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAoMUwpCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAoMEwpCisjZW5kaWYKKworI2lmbmRlZiBfTklfR1VJREhORExfREVGSU5FRAordHlwZWRlZiB1SW50MzIgR1VJSE5ETDsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX0NWSV8pKQorI2lmbmRlZiBfTklfRlVOQ19ERUZJTkVECisjZGVmaW5lIE5JX0ZVTkMgX19zdGRjYWxsCisjZW5kaWYKKworI2lmbmRlZiBfTklfRlVOQ0NfREVGSU5FRAorI2RlZmluZSBOSV9GVU5DQyBfX2NkZWNsCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjaWZuZGVmIF9OSV9GVU5DX0RFRklORUQKKyNkZWZpbmUgTklfRlVOQworI2VuZGlmCisKKyNpZm5kZWYgX05JX0ZVTkNDX0RFRklORUQKKyNkZWZpbmUgTklfRlVOQ0MKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX05JX2Jvb2wzMl9ERUZJTkVEXworI2RlZmluZSBfTklfYm9vbDMyX0RFRklORURfCit0eXBlZGVmIHVJbnQzMiBib29sMzI7CisjZW5kaWYKKworI2lmbmRlZiBfTklfSU1BUWR4U2Vzc2lvbl9ERUZJTkVEXworI2RlZmluZSBfTklfSU1BUWR4U2Vzc2lvbl9ERUZJTkVEXwordHlwZWRlZiB1SW50MzIgSU1BUWR4U2Vzc2lvbjsKKyNlbmRpZgorCisjZGVmaW5lIElNQVFEWF9NQVhfQVBJX1NUUklOR19MRU5HVEggNTEyCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRm9yd2FyZCBEZWNsYXJlIERhdGEgU3RydWN0dXJlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgc3RydWN0IEltYWdlX3N0cnVjdCBJbWFnZTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBFcnJvciBDb2RlcyBFbnVtZXJhdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgZW51bSBJTUFRZHhFcnJvcl9lbnVtIHsKKyAgSU1BUWR4RXJyb3JTdWNjZXNzID0gMHgwLCAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MKKyAgSU1BUWR4RXJyb3JTeXN0ZW1NZW1vcnlGdWxsID0gMHhCRkY2OTAwMCwgIC8vIE5vdCBlbm91Z2ggbWVtb3J5CisgIElNQVFkeEVycm9ySW50ZXJuYWwsICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCBlcnJvcgorICBJTUFRZHhFcnJvckludmFsaWRQYXJhbWV0ZXIsICAgICAgICAgICAgICAgLy8gSW52YWxpZCBwYXJhbWV0ZXIKKyAgSU1BUWR4RXJyb3JJbnZhbGlkUG9pbnRlciwgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgcG9pbnRlcgorICBJTUFRZHhFcnJvckludmFsaWRJbnRlcmZhY2UsICAgICAgICAgICAgICAgLy8gSW52YWxpZCBjYW1lcmEgc2Vzc2lvbgorICBJTUFRZHhFcnJvckludmFsaWRSZWdpc3RyeUtleSwgICAgICAgICAgICAgLy8gSW52YWxpZCByZWdpc3RyeSBrZXkKKyAgSU1BUWR4RXJyb3JJbnZhbGlkQWRkcmVzcywgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYWRkcmVzcworICBJTUFRZHhFcnJvckludmFsaWREZXZpY2VUeXBlLCAgICAgICAgICAgICAgLy8gSW52YWxpZCBkZXZpY2UgdHlwZQorICBJTUFRZHhFcnJvck5vdEltcGxlbWVudGVkLCAgICAgICAgICAgICAgICAgLy8gTm90IGltcGxlbWVudGVkCisgIElNQVFkeEVycm9yQ2FtZXJhTm90Rm91bmQsICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgbm90IGZvdW5kCisgIElNQVFkeEVycm9yQ2FtZXJhSW5Vc2UsICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgaXMgYWxyZWFkeSBpbiB1c2UuCisgIElNQVFkeEVycm9yQ2FtZXJhTm90SW5pdGlhbGl6ZWQsICAgICAgICAgICAvLyBDYW1lcmEgaXMgbm90IGluaXRpYWxpemVkLgorICBJTUFRZHhFcnJvckNhbWVyYVJlbW92ZWQsICAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIGhhcyBiZWVuIHJlbW92ZWQuCisgIElNQVFkeEVycm9yQ2FtZXJhUnVubmluZywgICAgICAgICAgICAgICAgICAvLyBBY3F1aXNpdGlvbiBpbiBwcm9ncmVzcy4KKyAgSU1BUWR4RXJyb3JDYW1lcmFOb3RSdW5uaW5nLCAgICAgICAgICAgICAgIC8vIE5vIGFjcXVpc2l0aW9uIGluIHByb2dyZXNzLgorICBJTUFRZHhFcnJvckF0dHJpYnV0ZU5vdFN1cHBvcnRlZCwgIC8vIEF0dHJpYnV0ZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEuCisgIElNQVFkeEVycm9yQXR0cmlidXRlTm90U2V0dGFibGUsICAgLy8gVW5hYmxlIHRvIHNldCBhdHRyaWJ1dGUuCisgIElNQVFkeEVycm9yQXR0cmlidXRlTm90UmVhZGFibGUsICAgLy8gVW5hYmxlIHRvIGdldCBhdHRyaWJ1dGUuCisgIElNQVFkeEVycm9yQXR0cmlidXRlT3V0T2ZSYW5nZSwgICAgLy8gQXR0cmlidXRlIHZhbHVlIGlzIG91dCBvZiByYW5nZS4KKyAgSU1BUWR4RXJyb3JCdWZmZXJOb3RBdmFpbGFibGUsICAgICAvLyBSZXF1ZXN0ZWQgYnVmZmVyIGlzIHVuYXZhaWxhYmxlLgorICBJTUFRZHhFcnJvckJ1ZmZlckxpc3RFbXB0eSwgIC8vIEJ1ZmZlciBsaXN0IGlzIGVtcHR5LiBBZGQgb25lIG9yIG1vcmUgYnVmZmVycy4KKyAgSU1BUWR4RXJyb3JCdWZmZXJMaXN0TG9ja2VkLCAgICAgLy8gQnVmZmVyIGxpc3QgaXMgYWxyZWFkeSBsb2NrZWQuIFJlY29uZmlndXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcXVpc2l0aW9uIGFuZCB0cnkgYWdhaW4uCisgIElNQVFkeEVycm9yQnVmZmVyTGlzdE5vdExvY2tlZCwgIC8vIE5vIGJ1ZmZlciBsaXN0LiBSZWNvbmZpZ3VyZSBhY3F1aXNpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdHJ5IGFnYWluLgorICBJTUFRZHhFcnJvclJlc291cmNlc0FsbG9jYXRlZCwgICAvLyBUcmFuc2ZlciBlbmdpbmUgcmVzb3VyY2VzIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkLiBSZWNvbmZpZ3VyZSBhY3F1aXNpdGlvbiBhbmQgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFnYWluLgorICBJTUFRZHhFcnJvclJlc291cmNlc1VuYXZhaWxhYmxlLCAgLy8gSW5zdWZmaWNpZW50IHRyYW5zZmVyIGVuZ2luZSByZXNvdXJjZXMuCisgIElNQVFkeEVycm9yQXN5bmNXcml0ZSwgIC8vIFVuYWJsZSB0byBwZXJmb3JtIGFzeWNocm9ub3VzIHJlZ2lzdGVyIHdyaXRlLgorICBJTUFRZHhFcnJvckFzeW5jUmVhZCwgICAvLyBVbmFibGUgdG8gcGVyZm9ybSBhc3ljaHJvbm91cyByZWdpc3RlciByZWFkLgorICBJTUFRZHhFcnJvclRpbWVvdXQsICAgICAvLyBUaW1lb3V0LgorICBJTUFRZHhFcnJvckJ1c1Jlc2V0LCAgICAvLyBCdXMgcmVzZXQgb2NjdXJyZWQgZHVyaW5nIGEgdHJhbnNhY3Rpb24uCisgIElNQVFkeEVycm9ySW52YWxpZFhNTCwgIC8vIFVuYWJsZSB0byBsb2FkIGNhbWVyYSdzIFhNTCBmaWxlLgorICBJTUFRZHhFcnJvckZpbGVBY2Nlc3MsICAvLyBVbmFibGUgdG8gcmVhZC93cml0ZSB0byBmaWxlLgorICBJTUFRZHhFcnJvckludmFsaWRDYW1lcmFVUkxTdHJpbmcsICAvLyBDYW1lcmEgaGFzIG1hbGZvcm1lZCBVUkwgc3RyaW5nLgorICBJTUFRZHhFcnJvckludmFsaWRDYW1lcmFGaWxlLCAgICAgICAvLyBJbnZhbGlkIGNhbWVyYSBmaWxlLgorICBJTUFRZHhFcnJvckdlbklDYW1FcnJvciwgICAgICAgICAgICAvLyBVbmtub3duIEdlbmljYW0gZXJyb3IuCisgIElNQVFkeEVycm9yRm9ybWF0N1BhcmFtZXRlcnMsICAgICAgIC8vIEZvciBmb3JtYXQgNzogVGhlIGNvbWJpbmF0aW9uIG9mIHNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgcG9zaXRpb24sIGltYWdlIHNpemUsIGFuZCBjb2xvciBjb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGluY29ycmVjdC4KKyAgSU1BUWR4RXJyb3JJbnZhbGlkQXR0cmlidXRlVHlwZSwgIC8vIFRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGFzc2VkIHZhcmlhYmxlIHR5cGUuCisgIElNQVFkeEVycm9yRExMTm90Rm91bmQsICAgICAgICAgICAvLyBUaGUgRExMIGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAgSU1BUWR4RXJyb3JGdW5jdGlvbk5vdEZvdW5kLCAgICAgIC8vIFRoZSBmdW5jdGlvbiBjb3VsZCBub3QgYmUgZm91bmQuCisgIElNQVFkeEVycm9yTGljZW5zZU5vdEFjdGl2YXRlZCwgICAvLyBMaWNlbnNlIG5vdCBhY3RpdmF0ZWQuCisgIElNQVFkeEVycm9yQ2FtZXJhTm90Q29uZmlndXJlZEZvckxpc3RlbmVyLCAgLy8gVGhlIGNhbWVyYSBpcyBub3QgY29uZmlndXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3Blcmx5IHRvIHN1cHBvcnQgYSBsaXN0ZW5lci4KKyAgSU1BUWR4RXJyb3JDYW1lcmFNdWx0aWNhc3ROb3RBdmFpbGFibGUsICAvLyBVbmFibGUgdG8gY29uZmlndXJlIHRoZSBzeXN0ZW0gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGljYXN0IHN1cHBvcnQuCisgIElNQVFkeEVycm9yQnVmZmVySGFzTG9zdFBhY2tldHMsICAvLyBUaGUgcmVxdWVzdGVkIGJ1ZmZlciBoYXMgbG9zdCBwYWNrZXRzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgcmVxdWVzdGVkIGFuIGVycm9yIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZWQuCisgIElNQVFkeEVycm9yR2lHRVZpc2lvbkVycm9yLCAgICAgICAvLyBVbmtub3duIEdpR0UgVmlzaW9uIGVycm9yLgorICBJTUFRZHhFcnJvck5ldHdvcmtFcnJvciwgICAgICAgICAgLy8gVW5rbm93biBuZXR3b3JrIGVycm9yLgorICBJTUFRZHhFcnJvckNhbWVyYVVucmVhY2hhYmxlLCAgICAgLy8gVW5hYmxlIHRvIGNvbm5lY3QgdG8gdGhlIGNhbWVyYS4KKyAgSU1BUWR4RXJyb3JIaWdoUGVyZm9ybWFuY2VOb3RTdXBwb3J0ZWQsICAvLyBIaWdoIHBlcmZvcm1hbmNlIGFjcXVpc2l0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV0d29yayBpbnRlcmZhY2UuIENvbm5lY3QgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FtZXJhIHRvIGEgbmV0d29yayBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nIHRoZSBoaWdoIHBlcmZvcm1hbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJpdmVyLgorICBJTUFRZHhFcnJvckludGVyZmFjZU5vdFJlbmFtZWQsICAgIC8vIFVuYWJsZSB0byByZW5hbWUgaW50ZXJmYWNlLiBJbnZhbGlkIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIG5hbWUgc3BlY2lmaWVkLgorICBJTUFRZHhFcnJvck5vU3VwcG9ydGVkVmlkZW9Nb2RlcywgIC8vIFRoZSBjYW1lcmEgZG9lcyBub3QgaGF2ZSBhbnkgdmlkZW8gbW9kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBhcmUgc3VwcG9ydGVkLgorICBJTUFRZHhFcnJvclNvZnR3YXJlVHJpZ2dlck92ZXJydW4sICAvLyBTb2Z0d2FyZSB0cmlnZ2VyIG92ZXJydW4uCisgIElNQVFkeEVycm9yVGVzdFBhY2tldE5vdFJlY2VpdmVkLCAgLy8gVGhlIHN5c3RlbSBkaWQgbm90IHJlY2VpdmUgYSB0ZXN0IHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGNhbWVyYS4gVGhlIHBhY2tldCBzaXplIG1heSBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbyBsYXJnZSBmb3IgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGEgZmlyZXdhbGwgbWF5IGJlIGVuYWJsZWQuCisgIElNQVFkeEVycm9yQ29ycnVwdGVkSW1hZ2VSZWNlaXZlZCwgIC8vIFRoZSBjYW1lcmEgcmV0dXJuZWQgYSBjb3JydXB0ZWQgaW1hZ2UuCisgIElNQVFkeEVycm9yQ2FtZXJhQ29uZmlndXJhdGlvbkhhc0NoYW5nZWQsICAvLyBUaGUgY2FtZXJhIGRpZCBub3QgcmV0dXJuIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZSBvZiB0aGUgY29ycmVjdCB0eXBlIGl0IHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJlZCBmb3IgcHJldmlvdXNseS4KKyAgSU1BUWR4RXJyb3JDYW1lcmFJbnZhbGlkQXV0aGVudGljYXRpb24sICAgIC8vIFRoZSBjYW1lcmEgaXMgY29uZmlndXJlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc3dvcmQgYXV0aGVudGljYXRpb24gYW5kIGVpdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHdlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgY29uZmlndXJlZCBvciB0aGV5IGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY29ycmVjdC4KKyAgSU1BUWR4RXJyb3JVbmtub3duSFRUUEVycm9yLCAgLy8gVGhlIGNhbWVyYSByZXR1cm5lZCBhbiB1bmtub3duIEhUVFAgZXJyb3IuCisgIElNQVFkeEVycm9yS2VybmVsRHJpdmVyVW5hdmFpbGFibGUsICAvLyBVbmFibGUgdG8gYXR0YWNoIHRvIHRoZSBrZXJuZWwgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJpdmVyLgorICBJTUFRZHhFcnJvclBpeGVsRm9ybWF0RGVjb2RlclVuYXZhaWxhYmxlLCAgLy8gTm8gZGVjb2RlciBhdmFpbGFibGUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCBwaXhlbCBmb3JtYXQuCisgIElNQVFkeEVycm9yRmlybXdhcmVVcGRhdGVOZWVkZWQsICAvLyBUaGUgYWNxdWlzaXRpb24gaGFyZHdhcmUgbmVlZHMgYSBmaXJtd2FyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KKyAgSU1BUWR4RXJyb3JGaXJtd2FyZVVwZGF0ZVJlYm9vdE5lZWRlZCwgIC8vIFRoZSBmaXJtd2FyZSBvbiB0aGUgYWNxdWlzaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcmR3YXJlIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3lzdGVtIG11c3QgYmUgcmVib290ZWQgYmVmb3JlIHVzZS4KKyAgSU1BUWR4RXJyb3JMaWdodGluZ0N1cnJlbnRPdXRPZlJhbmdlLCAgLy8gVGhlIHJlcXVlc3RlZCBjdXJyZW50IGxldmVsIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpZ2h0aW5nIGNvbnRyb2xsZXIgaXMgbm90IHBvc3NpYmxlLgorICBJTUFRZHhFcnJvclVTQjNWaXNpb25FcnJvciwgICAgICAgICAgICAvLyBVbmtub3duIFVTQjMgVmlzaW9uIGVycm9yLgorICBJTUFRZHhFcnJvckludmFsaWRVM1ZVU0JEZXNjcmlwdG9yLCAgICAvLyBUaGUgY2FtZXJhIGhhcyBhIFVTQiBkZXNjcmlwdG9yIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIFVTQjMgVmlzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljYXRpb24uCisgIElNQVFkeEVycm9yVTNWSW52YWxpZENvbnRyb2xJbnRlcmZhY2UsICAvLyBUaGUgVVNCMyBWaXNpb24gY29udHJvbCBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBpbXBsZW1lbnRlZCBvciBpcyBpbnZhbGlkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbWVyYS4KKyAgSU1BUWR4RXJyb3JVM1ZDb250cm9sSW50ZXJmYWNlRXJyb3IsICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBmcm9tIHRoZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIG9mIHRoZSBVU0IzIFZpc2lvbiBjYW1lcmEuCisgIElNQVFkeEVycm9yVTNWSW52YWxpZEV2ZW50SW50ZXJmYWNlLCAgLy8gVGhlIFVTQjMgVmlzaW9uIGV2ZW50IGludGVyZmFjZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBvciBpcyBpbnZhbGlkIG9uIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW1lcmEuCisgIElNQVFkeEVycm9yVTNWRXZlbnRJbnRlcmZhY2VFcnJvciwgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIGZyb20gdGhlIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIG9mIHRoZSBVU0IzIFZpc2lvbiBjYW1lcmEuCisgIElNQVFkeEVycm9yVTNWSW52YWxpZFN0cmVhbUludGVyZmFjZSwgIC8vIFRoZSBVU0IzIFZpc2lvbiBzdHJlYW0gaW50ZXJmYWNlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBvciBpcyBpbnZhbGlkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2FtZXJhLgorICBJTUFRZHhFcnJvclUzVlN0cmVhbUludGVyZmFjZUVycm9yLCAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZnJvbSB0aGUgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBvZiB0aGUgVVNCMyBWaXNpb24gY2FtZXJhLgorICBJTUFRZHhFcnJvclUzVlVuc3VwcG9ydGVkQ29ubmVjdGlvblNwZWVkLCAgLy8gVGhlIFVTQiBjb25uZWN0aW9uIHNwZWVkIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEuICBDaGVjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGUgY2FtZXJhIGlzIHBsdWdnZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludG8gYSBVU0IgMi4wIHBvcnQgaW5zdGVhZCBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVU0IgMy4wIHBvcnQuICBJZiBzbywgdmVyaWZ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBjYW1lcmEgc3VwcG9ydHMgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGNhc2UuCisgIElNQVFkeEVycm9yVTNWSW5zdWZmaWNpZW50UG93ZXIsICAvLyBUaGUgVVNCMyBWaXNpb24gY2FtZXJhIHJlcXVpcmVzIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgdGhhbiBjYW4gYmUgc3VwcGxpZWQgYnkgdGhlIFVTQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9ydCBpbiB1c2UuCisgIElNQVFkeEVycm9yVTNWSW52YWxpZE1heEN1cnJlbnQsICAvLyBUaGUgVTNWX01heGltdW1DdXJyZW50VVNCMjBfbUEgcmVnaXN0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGNvbm5lY3RlZCBVU0IzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWaXNpb24gY2FtZXJhLgorICBJTUFRZHhFcnJvckJ1ZmZlckluY29tcGxldGVEYXRhLCAgLy8gVGhlIHJlcXVlc3RlZCBidWZmZXIgaGFzIGluY29tcGxldGUgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSB1c2VyIHJlcXVlc3RlZCBhbiBlcnJvciB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGVkLgorICBJTUFRZHhFcnJvckNhbWVyYUFjcXVpc2l0aW9uQ29uZmlnRmFpbGVkLCAgLy8gVGhlIGNhbWVyYSByZXR1cm5lZCBhbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRpbmcgdGhlIGFjcXVpc2l0aW9uLgorICBJTUFRZHhFcnJvckNhbWVyYUNsb3NlUGVuZGluZywgIC8vIFRoZSBjYW1lcmEgc3RpbGwgaGFzIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2lsbCBiZSBjbG9zZWQgd2hlbiB0aGVzZSBvcGVyYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGUuCisgIElNQVFkeEVycm9yU29mdHdhcmVGYXVsdCwgICAgICAgLy8gQW4gdW5leHBlY3RlZCBzb2Z0d2FyZSBlcnJvciBvY2N1cnJlZC4KKyAgSU1BUWR4RXJyb3JDYW1lcmFQcm9wZXJ0eUludmFsaWQsICAvLyBUaGUgdmFsdWUgZm9yIGFuIGludmFsaWQgY2FtZXJhIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHJlcXVlc3RlZC4KKyAgSU1BUWR4RXJyb3JKdW1ib0ZyYW1lc05vdEVuYWJsZWQsICAvLyBKdW1ibyBmcmFtZXMgYXJlIG5vdCBlbmFibGVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvc3QuICBNYXhpbXVtIHBhY2tldCBzaXplIGlzIDE1MDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlcy4KKyAgSU1BUWR4RXJyb3JCYXllclBpeGVsRm9ybWF0Tm90U2VsZWN0ZWQsICAvLyBUaGlzIG9wZXJhdGlvbiByZXF1aXJlcyB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbWVyYSBoYXMgYSBCYXllciBwaXhlbCBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZC4KKyAgSU1BUWR4RXJyb3JHdWFyZCA9IDB4RkZGRkZGRkYsCit9IElNQVFkeEVycm9yOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJ1cyBUeXBlIEVudW1lcmF0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBlbnVtIElNQVFkeEJ1c1R5cGVfZW51bSB7CisgIElNQVFkeEJ1c1R5cGVGaXJlV2lyZSA9IDB4MzEzMzM5MzQsCisgIElNQVFkeEJ1c1R5cGVFdGhlcm5ldCA9IDB4Njk3MDc2MzQsCisgIElNQVFkeEJ1c1R5cGVTaW11bGF0b3IgPSAweDIwNzM2OTZELAorICBJTUFRZHhCdXNUeXBlRGlyZWN0U2hvdyA9IDB4NjQ3MzY4NzcsCisgIElNQVFkeEJ1c1R5cGVJUCA9IDB4NDk1MDYzNkQsCisgIElNQVFkeEJ1c1R5cGVTbWFydENhbTIgPSAweDUzNDM2MTMyLAorICBJTUFRZHhCdXNUeXBlVVNCM1Zpc2lvbiA9IDB4NTU1MzQyMzMsCisgIElNQVFkeEJ1c1R5cGVVVkMgPSAweDU1NTY0MzIwLAorICBJTUFRZHhCdXNUeXBlR3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhCdXNUeXBlOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENhbWVyYSBDb250cm9sIE1vZGUgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4Q2FtZXJhQ29udHJvbE1vZGVfZW51bSB7CisgIElNQVFkeENhbWVyYUNvbnRyb2xNb2RlQ29udHJvbGxlciwKKyAgSU1BUWR4Q2FtZXJhQ29udHJvbE1vZGVMaXN0ZW5lciwKKyAgSU1BUWR4Q2FtZXJhQ29udHJvbE1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsCit9IElNQVFkeENhbWVyYUNvbnRyb2xNb2RlOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJ1ZmZlciBOdW1iZXIgTW9kZSBFbnVtZXJhdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgZW51bSBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlX2VudW0geworICBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlTmV4dCwKKyAgSU1BUWR4QnVmZmVyTnVtYmVyTW9kZUxhc3QsCisgIElNQVFkeEJ1ZmZlck51bWJlck1vZGVCdWZmZXJOdW1iZXIsCisgIElNQVFkeEJ1ZmZlck51bWJlck1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsCit9IElNQVFkeEJ1ZmZlck51bWJlck1vZGU7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgUGx1ZyBuIFBsYXkgRXZlbnQgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4UG5wRXZlbnRfZW51bSB7CisgIElNQVFkeFBucEV2ZW50Q2FtZXJhQXR0YWNoZWQsCisgIElNQVFkeFBucEV2ZW50Q2FtZXJhRGV0YWNoZWQsCisgIElNQVFkeFBucEV2ZW50QnVzUmVzZXQsCisgIElNQVFkeFBucEV2ZW50R3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhQbnBFdmVudDsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBCYXllciBQYXR0ZXJuIEVudW1lcmF0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBlbnVtIElNQVFkeEJheWVyUGF0dGVybl9lbnVtIHsKKyAgSU1BUWR4QmF5ZXJQYXR0ZXJuTm9uZSwKKyAgSU1BUWR4QmF5ZXJQYXR0ZXJuR0IsCisgIElNQVFkeEJheWVyUGF0dGVybkdSLAorICBJTUFRZHhCYXllclBhdHRlcm5CRywKKyAgSU1BUWR4QmF5ZXJQYXR0ZXJuUkcsCisgIElNQVFkeEJheWVyUGF0dGVybkhhcmR3YXJlLAorICBJTUFRZHhCYXllclBhdHRlcm5HdWFyZCA9IDB4RkZGRkZGRkYsCit9IElNQVFkeEJheWVyUGF0dGVybjsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBCYXllciBEZWNvZGUgQWxnb3JpdGhtIEVudW1lcmF0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBlbnVtIElNQVFkeEJheWVyQWxnb3JpdGhtX2VudW0geworICBJTUFRZHhCYXllckFsZ29yaXRobUJpbGluZWFyLAorICBJTUFRZHhCYXllckFsZ29yaXRobVZORywKKyAgSU1BUWR4QmF5ZXJBbGdvcml0aG1HdWFyZCA9IDB4RkZGRkZGRkYsCit9IElNQVFkeEJheWVyQWxnb3JpdGhtOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE91dHB1dCBJbWFnZSBUeXBlcyAtLSBWYWx1ZXMgbWF0Y2ggVmlzaW9uIERldmVsb3BtZW50IE1vZHVsZSBpbWFnZSB0eXBlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgZW51bSBJTUFRZHhPdXRwdXRJbWFnZVR5cGVfZW51bSB7CisgIElNQVFkeE91dHB1dEltYWdlVHlwZVU4ID0gMCwKKyAgSU1BUWR4T3V0cHV0SW1hZ2VUeXBlSTE2ID0gMSwKKyAgSU1BUWR4T3V0cHV0SW1hZ2VUeXBlVTE2ID0gNywKKyAgSU1BUWR4T3V0cHV0SW1hZ2VUeXBlUkdCMzIgPSA0LAorICBJTUFRZHhPdXRwdXRJbWFnZVR5cGVSR0I2NCA9IDYsCisgIElNQVFkeE91dHB1dEltYWdlVHlwZUF1dG8gPSAweDdGRkZGRkZGLAorICBJTUFRZHhPdXRwdXRJbWFnZVR5cGVHdWFyZCA9IDB4RkZGRkZGRkYsCit9IElNQVFkeE91dHB1dEltYWdlVHlwZTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDb250cm9sbGVyIERlc3RpbmF0aW9uIE1vZGUgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4RGVzdGluYXRpb25Nb2RlX2VudW0geworICBJTUFRZHhEZXN0aW5hdGlvbk1vZGVVbmljYXN0LAorICBJTUFRZHhEZXN0aW5hdGlvbk1vZGVCcm9hZGNhc3QsCisgIElNQVFkeERlc3RpbmF0aW9uTW9kZU11bHRpY2FzdCwKKyAgSU1BUWR4RGVzdGluYXRpb25Nb2RlR3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhEZXN0aW5hdGlvbk1vZGU7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgIEF0dHJpYnV0ZSBUeXBlIEVudW1lcmF0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBlbnVtIElNQVFkeEF0dHJpYnV0ZVR5cGVfZW51bSB7CisgIElNQVFkeEF0dHJpYnV0ZVR5cGVVMzIsCisgIElNQVFkeEF0dHJpYnV0ZVR5cGVJNjQsCisgIElNQVFkeEF0dHJpYnV0ZVR5cGVGNjQsCisgIElNQVFkeEF0dHJpYnV0ZVR5cGVTdHJpbmcsCisgIElNQVFkeEF0dHJpYnV0ZVR5cGVFbnVtLAorICBJTUFRZHhBdHRyaWJ1dGVUeXBlQm9vbCwKKyAgSU1BUWR4QXR0cmlidXRlVHlwZUNvbW1hbmQsCisgIElNQVFkeEF0dHJpYnV0ZVR5cGVCbG9iLAorICBJTUFRZHhBdHRyaWJ1dGVUeXBlR3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhBdHRyaWJ1dGVUeXBlOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFZhbHVlIFR5cGUgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4VmFsdWVUeXBlX2VudW0geworICBJTUFRZHhWYWx1ZVR5cGVVMzIsCisgIElNQVFkeFZhbHVlVHlwZUk2NCwKKyAgSU1BUWR4VmFsdWVUeXBlRjY0LAorICBJTUFRZHhWYWx1ZVR5cGVTdHJpbmcsCisgIElNQVFkeFZhbHVlVHlwZUVudW1JdGVtLAorICBJTUFRZHhWYWx1ZVR5cGVCb29sLAorICBJTUFRZHhWYWx1ZVR5cGVEaXNwb3NhYmxlU3RyaW5nLAorICBJTUFRZHhWYWx1ZVR5cGVHdWFyZCA9IDB4RkZGRkZGRkYsCit9IElNQVFkeFZhbHVlVHlwZTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbnRlcmZhY2UgRmlsZSBGbGFncyBFbnVtZXJhdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgZW51bSBJTUFRZHhJbnRlcmZhY2VGaWxlRmxhZ3NfZW51bSB7CisgIElNQVFkeEludGVyZmFjZUZpbGVGbGFnc0Nvbm5lY3RlZCA9IDB4MSwKKyAgSU1BUWR4SW50ZXJmYWNlRmlsZUZsYWdzRGlydHkgPSAweDIsCisgIElNQVFkeEludGVyZmFjZUZpbGVGbGFnc0d1YXJkID0gMHhGRkZGRkZGRiwKK30gSU1BUWR4SW50ZXJmYWNlRmlsZUZsYWdzOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE92ZXJ3cml0ZSBNb2RlIEVudW1lcmF0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBlbnVtIElNQVFkeE92ZXJ3cml0ZU1vZGVfZW51bSB7CisgIElNQVFkeE92ZXJ3cml0ZU1vZGVHZXRPbGRlc3QgPSAweDAsCisgIElNQVFkeE92ZXJ3cml0ZU1vZGVGYWlsID0gMHgyLAorICBJTUFRZHhPdmVyd3JpdGVNb2RlR2V0TmV3ZXN0ID0gMHgzLAorICBJTUFRZHhPdmVyd3JpdGVNb2RlR3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhPdmVyd3JpdGVNb2RlOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEluY29tcGxldGUgQnVmZmVyIE1vZGUgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4SW5jb21wbGV0ZUJ1ZmZlck1vZGVfZW51bSB7CisgIElNQVFkeEluY29tcGxldGVCdWZmZXJNb2RlSWdub3JlLAorICBJTUFRZHhJbmNvbXBsZXRlQnVmZmVyTW9kZUZhaWwsCisgIElNQVFkeEluY29tcGxldGVCdWZmZXJNb2RlR3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhJbmNvbXBsZXRlQnVmZmVyTW9kZTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBMb3N0IFBhY2tldCBNb2RlIEVudW1lcmF0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBlbnVtIElNQVFkeExvc3RQYWNrZXRNb2RlX2VudW0geworICBJTUFRZHhMb3N0UGFja2V0TW9kZUlnbm9yZSwKKyAgSU1BUWR4TG9zdFBhY2tldE1vZGVGYWlsLAorICBJTUFRZHhMb3N0UGFja2V0TW9kZUd1YXJkID0gMHhGRkZGRkZGRiwKK30gSU1BUWR4TG9zdFBhY2tldE1vZGU7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQXR0cmlidXRlIFZpc2liaWxpdHkgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4QXR0cmlidXRlVmlzaWJpbGl0eV9lbnVtIHsKKyAgSU1BUWR4QXR0cmlidXRlVmlzaWJpbGl0eVNpbXBsZSA9IDB4MDAwMDEwMDAsCisgIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHlJbnRlcm1lZGlhdGUgPSAweDAwMDAyMDAwLAorICBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5QWR2YW5jZWQgPSAweDAwMDA0MDAwLAorICBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5R3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhBdHRyaWJ1dGVWaXNpYmlsaXR5OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFN0cmVhbSBDaGFubmVsIE1vZGUgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4U3RyZWFtQ2hhbm5lbE1vZGVfZW51bSB7CisgIElNQVFkeFN0cmVhbUNoYW5uZWxNb2RlQXV0b21hdGljLAorICBJTUFRZHhTdHJlYW1DaGFubmVsTW9kZU1hbnVhbCwKKyAgSU1BUWR4U3RyZWFtQ2hhbm5lbE1vZGVHdWFyZCA9IDB4RkZGRkZGRkYsCit9IElNQVFkeFN0cmVhbUNoYW5uZWxNb2RlOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFBpeGVsIFNpZ25lZG5lc3MgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4UGl4ZWxTaWduZWRuZXNzX2VudW0geworICBJTUFRZHhQaXhlbFNpZ25lZG5lc3NVbnNpZ25lZCwKKyAgSU1BUWR4UGl4ZWxTaWduZWRuZXNzU2lnbmVkLAorICBJTUFRZHhQaXhlbFNpZ25lZG5lc3NIYXJkd2FyZSwKKyAgSU1BUWR4UGl4ZWxTaWduZWRuZXNzR3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhQaXhlbFNpZ25lZG5lc3M7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgVVNCIENvbm5lY3Rpb24gU3BlZWQgRW51bWVyYXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gSU1BUWR4VVNCQ29ubmVjdGlvblNwZWVkX2VudW0geworICBJTUFRZHhVU0JDb25uZWN0aW9uU3BlZWRMb3cgPSAxLAorICBJTUFRZHhVU0JDb25uZWN0aW9uU3BlZWRGdWxsID0gMiwKKyAgSU1BUWR4VVNCQ29ubmVjdGlvblNwZWVkSGlnaCA9IDQsCisgIElNQVFkeFVTQkNvbm5lY3Rpb25TcGVlZFN1cGVyID0gOCwKKyAgSU1BUWR4VVNCQ29ubmVjdGlvblNwZWVkR3VhcmQgPSAweEZGRkZGRkZGLAorfSBJTUFRZHhVU0JDb25uZWN0aW9uU3BlZWQ7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ1ZJIFN0cnVjdHVyZXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjcHJhZ21hIHBhY2socHVzaCwgNCkKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDYW1lcmEgSW5mb3JtYXRpb24gU3RydWN0dXJlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBzdHJ1Y3QgSU1BUWR4Q2FtZXJhSW5mb3JtYXRpb25fc3RydWN0IHsKKyAgdUludDMyIFR5cGU7CisgIHVJbnQzMiBWZXJzaW9uOworICB1SW50MzIgRmxhZ3M7CisgIHVJbnQzMiBTZXJpYWxOdW1iZXJIaTsKKyAgdUludDMyIFNlcmlhbE51bWJlckxvOworICBJTUFRZHhCdXNUeXBlIEJ1c1R5cGU7CisgIGNoYXIgSW50ZXJmYWNlTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsKKyAgY2hhciBWZW5kb3JOYW1lW0lNQVFEWF9NQVhfQVBJX1NUUklOR19MRU5HVEhdOworICBjaGFyIE1vZGVsTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsKKyAgY2hhciBDYW1lcmFGaWxlTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsKKyAgY2hhciBDYW1lcmFBdHRyaWJ1dGVVUkxbSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSF07Cit9IElNQVFkeENhbWVyYUluZm9ybWF0aW9uOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENhbWVyYSBGaWxlIFN0cnVjdHVyZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgc3RydWN0IElNQVFkeENhbWVyYUZpbGVfc3RydWN0IHsKKyAgdUludDMyIFR5cGU7CisgIHVJbnQzMiBWZXJzaW9uOworICBjaGFyIEZpbGVOYW1lW0lNQVFEWF9NQVhfQVBJX1NUUklOR19MRU5HVEhdOworfSBJTUFRZHhDYW1lcmFGaWxlOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEF0dHJpYnV0ZSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIHN0cnVjdCBJTUFRZHhBdHRyaWJ1dGVJbmZvcm1hdGlvbl9zdHJ1Y3QgeworICBJTUFRZHhBdHRyaWJ1dGVUeXBlIFR5cGU7CisgIGJvb2wzMiBSZWFkYWJsZTsKKyAgYm9vbDMyIFdyaXRhYmxlOworICBjaGFyIE5hbWVbSU1BUURYX01BWF9BUElfU1RSSU5HX0xFTkdUSF07Cit9IElNQVFkeEF0dHJpYnV0ZUluZm9ybWF0aW9uOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEVudW1lcmF0aW9uIEl0ZW0gU3RydWN0dXJlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordHlwZWRlZiBzdHJ1Y3QgSU1BUWR4RW51bUl0ZW1fc3RydWN0IHsKKyAgdUludDMyIFZhbHVlOworICB1SW50MzIgUmVzZXJ2ZWQ7CisgIGNoYXIgTmFtZVtJTUFRRFhfTUFYX0FQSV9TVFJJTkdfTEVOR1RIXTsKK30gSU1BUWR4RW51bUl0ZW07CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ2FtZXJhIEluZm9ybWF0aW9uIFN0cnVjdHVyZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgSU1BUWR4RW51bUl0ZW0gSU1BUWR4VmlkZW9Nb2RlOworCisjcHJhZ21hIHBhY2socG9wKQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENhbGxiYWNrcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgdUludDMyKE5JX0ZVTkMqIEZyYW1lRG9uZUV2ZW50Q2FsbGJhY2tQdHIpKElNQVFkeFNlc3Npb24gaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50MzIgYnVmZmVyTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbGJhY2tEYXRhKTsKK3R5cGVkZWYgdUludDMyKE5JX0ZVTkMqIFBucEV2ZW50Q2FsbGJhY2tQdHIpKElNQVFkeFNlc3Npb24gaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRZHhQbnBFdmVudCBwbnBFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxiYWNrRGF0YSk7Cit0eXBlZGVmIHZvaWQoTklfRlVOQyogQXR0cmlidXRlVXBkYXRlZEV2ZW50Q2FsbGJhY2tQdHIpKElNQVFkeFNlc3Npb24gaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxiYWNrRGF0YSk7CisKKyNlbmRpZiAgLy8gbmlpbWFxZHhfdHlwZXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQXR0cmlidXRlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQmFzZUFkZHJlc3MgXAorICAiQ2FtZXJhSW5mb3JtYXRpb246OkJhc2VBZGRyZXNzIiAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW1lcmEgcmVnaXN0ZXJzLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVCdXNUeXBlIFwKKyAgIkNhbWVyYUluZm9ybWF0aW9uOjpCdXNUeXBlIiAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBidXMgdHlwZSBvZiB0aGUgY2FtZXJhLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVNb2RlbE5hbWUgXAorICAiQ2FtZXJhSW5mb3JtYXRpb246Ok1vZGVsTmFtZSIgIC8vIFJlYWQgb25seS4gUmV0dXJucyB0aGUgbW9kZWwgbmFtZS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU2VyaWFsTnVtYmVySGlnaCBcCisgICJDYW1lcmFJbmZvcm1hdGlvbjo6U2VyaWFsTnVtYmVySGlnaCIgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgdXBwZXIgMzItYml0cyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2FtZXJhIDY0LWJpdCBzZXJpYWwgbnVtYmVyLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVTZXJpYWxOdW1iZXJMb3cgXAorICAiQ2FtZXJhSW5mb3JtYXRpb246OlNlcmlhbE51bWJlckxvdyIgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbG93ZXIgMzItYml0cyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjYW1lcmEgNjQtYml0IHNlcmlhbCBudW1iZXIuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVZlbmRvck5hbWUgXAorICAiQ2FtZXJhSW5mb3JtYXRpb246OlZlbmRvck5hbWUiICAvLyBSZWFkIG9ubHkuIFJldHVybnMgdGhlIHZlbmRvciBuYW1lLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVIb3N0SVBBZGRyZXNzIFwKKyAgIkNhbWVyYUluZm9ybWF0aW9uOjpIb3N0SVBBZGRyZXNzIiAgLy8gUmVhZCBvbmx5LiBSZXR1cm5zIHRoZSBob3N0IGFkYXB0ZXIgSVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkcmVzcy4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlSVBBZGRyZXNzIFwKKyAgIkNhbWVyYUluZm9ybWF0aW9uOjpJUEFkZHJlc3MiICAvLyBSZWFkIG9ubHkuIFJldHVybnMgdGhlIElQIGFkZHJlc3MuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVByaW1hcnlVUkxTdHJpbmcgXAorICAiQ2FtZXJhSW5mb3JtYXRpb246OlByaW1hcnlVUkxTdHJpbmciICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGNhbWVyYSdzIHByaW1hcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVVJMIHN0cmluZy4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU2Vjb25kYXJ5VVJMU3RyaW5nIFwKKyAgIkNhbWVyYUluZm9ybWF0aW9uOjpTZWNvbmRhcnlVUkxTdHJpbmciICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGNhbWVyYSdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Vjb25kYXJ5IFVSTCBzdHJpbmcuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUFjcUluUHJvZ3Jlc3MgXAorICAiU3RhdHVzSW5mb3JtYXRpb246OkFjcUluUHJvZ3Jlc3MiICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFjcXVpc2l0aW9uLiBUUlVFIGlmIGFjcXVpcmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIEZBTFNFLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVMYXN0QnVmZmVyQ291bnQgXAorICAiU3RhdHVzSW5mb3JtYXRpb246Okxhc3RCdWZmZXJDb3VudCIgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgYnVmZmVycy4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTGFzdEJ1ZmZlck51bWJlciBcCisgICJTdGF0dXNJbmZvcm1hdGlvbjo6TGFzdEJ1ZmZlck51bWJlciIgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbGFzdCBjdW11bGF0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBudW1iZXIgdHJhbnNmZXJyZWQuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUxvc3RCdWZmZXJDb3VudCBcCisgICJTdGF0dXNJbmZvcm1hdGlvbjo6TG9zdEJ1ZmZlckNvdW50IiAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBudW1iZXIgb2YgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgZHVyaW5nIGFuIGFjcXVpc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Vzc2lvbi4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTG9zdFBhY2tldENvdW50IFwKKyAgIlN0YXR1c0luZm9ybWF0aW9uOjpMb3N0UGFja2V0Q291bnQiICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIG51bWJlciBvZiBsb3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFja2V0cyBkdXJpbmcgYW4gYWNxdWlzaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZXF1ZXN0ZWRSZXNlbmRQYWNrZXRzIFwKKyAgIlN0YXR1c0luZm9ybWF0aW9uOjpSZXF1ZXN0ZWRSZXNlbmRQYWNrZXRDb3VudCIgIC8vIFJlYWQgb25seS4gR2V0cyB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBwYWNrZXRzIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZW50IGR1cmluZyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNxdWlzaXRpb24gc2Vzc2lvbi4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUmVjZWl2ZWRSZXNlbmRQYWNrZXRzIFwKKyAgIlN0YXR1c0luZm9ybWF0aW9uOjpSZWNlaXZlZFJlc2VuZFBhY2tldHMiICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhY2tldHMgdGhhdCB3ZXJlIHJlcXVlc3RlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHJlc2VudCBkdXJpbmcgYW4gYWNxdWlzaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIGFuZCB3ZXJlIGNvbXBsZXRlZC4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlSGFuZGxlZEV2ZW50Q291bnQgXAorICAiU3RhdHVzSW5mb3JtYXRpb246OkhhbmRsZWRFdmVudENvdW50IiAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZWQgZXZlbnRzIGR1cmluZyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNxdWlzaXRpb24gc2Vzc2lvbi4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTG9zdEV2ZW50Q291bnQgXAorICAiU3RhdHVzSW5mb3JtYXRpb246Okxvc3RFdmVudENvdW50IiAgLy8gUmVhZCBvbmx5LiBHZXRzIHRoZSBudW1iZXIgb2YgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIGR1cmluZyBhbiBhY3F1aXNpdGlvbiBzZXNzaW9uLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVCYXllckdhaW5CIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QmF5ZXI6OkdhaW5CIiAgLy8gU2V0cy9nZXRzIHRoZSB3aGl0ZSBiYWxhbmNlIGdhaW4gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgQmF5ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbi4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQmF5ZXJHYWluRyBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkJheWVyOjpHYWluRyIgIC8vIFNldHMvZ2V0cyB0aGUgd2hpdGUgYmFsYW5jZSBnYWluIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBCYXllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVCYXllckdhaW5SIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QmF5ZXI6OkdhaW5SIiAgLy8gU2V0cy9nZXRzIHRoZSB3aGl0ZSBiYWxhbmNlIGdhaW4gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBCYXllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVCYXllclBhdHRlcm4gXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpCYXllcjo6UGF0dGVybiIgIC8vIFNldHMvZ2V0cyB0aGUgQmF5ZXIgcGF0dGVybiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU3RyZWFtQ2hhbm5lbE1vZGUgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpDb250cm9sbGVyOjpTdHJlYW1DaGFubmVsTW9kZSIgIC8vIEdldHMvc2V0cyB0aGUgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhbGxvY2F0aW5nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJlV2lyZSBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVEZXNpcmVkU3RyZWFtQ2hhbm5lbCBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkNvbnRyb2xsZXI6OkRlc2lyZWRTdHJlYW1DaGFubmVsIiAgLy8gR2V0cy9zZXRzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gbWFudWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlRnJhbWVJbnRlcnZhbCBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkZyYW1lSW50ZXJ2YWwiICAvLyBSZWFkIG9ubHkuIEdldHMgdGhlIGR1cmF0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxsaXNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUlnbm9yZUZpcnN0RnJhbWUgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpJZ25vcmVGaXJzdEZyYW1lIiAgLy8gR2V0cy9zZXRzIHRoZSB2aWRlbyBkZWxheSBvZiBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lIGJldHdlZW4gc3RhcnRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW1lcmEgYW5kIHJlY2VpdmluZyB0aGUgdmlkZW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZlZWQuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU9mZnNldFggXAorICAiT2Zmc2V0WCIgIC8vIEdldHMvc2V0cyB0aGUgbGVmdCBvZmZzZXQgb2YgdGhlIGltYWdlLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVPZmZzZXRZIFwKKyAgIk9mZnNldFkiICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0cy9zZXRzIHRoZSB0b3Agb2Zmc2V0IG9mIHRoZSBpbWFnZS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlV2lkdGggIldpZHRoIiAgLy8gR2V0cy9zZXRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUhlaWdodCAiSGVpZ2h0IiAgLy8gR2V0cy9zZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVQaXhlbEZvcm1hdCBcCisgICJQaXhlbEZvcm1hdCIgIC8vIEdldHMvc2V0cyB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSBzb3VyY2Ugc2Vuc29yLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVQYWNrZXRTaXplIFwKKyAgIlBhY2tldFNpemUiICAvLyBHZXRzL3NldHMgdGhlIHBhY2tldCBzaXplIGluIGJ5dGVzLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVQYXlsb2FkU2l6ZSBcCisgICJQYXlsb2FkU2l6ZSIgIC8vIEdldHMvc2V0cyB0aGUgZnJhbWUgc2l6ZSBpbiBieXRlcy4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU3BlZWQgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpTcGVlZCIgIC8vIEdldHMvc2V0cyB0aGUgdHJhbnNmZXIgc3BlZWQgaW4gTWJwcyBmb3IgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmVXaXJlIHBhY2tldC4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU2hpZnRQaXhlbEJpdHMgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpTaGlmdFBpeGVsQml0cyIgIC8vIEdldHMvc2V0cyB0aGUgYWxpZ25tZW50IG9mIDE2LWJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbWVyYXMuIERvd25zaGlmdCB0aGUgcGl4ZWwgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjYW1lcmEgcmV0dXJucyBtb3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmlmaWNhbnQgYml0LWFsaWduZWQgZGF0YS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlU3dhcFBpeGVsQnl0ZXMgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpTd2FwUGl4ZWxCeXRlcyIgIC8vIEdldHMvc2V0cyB0aGUgZW5kaWFubmVzcyBvZiAxNi1iaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW1lcmFzLiBTd2FwIHRoZSBwaXhlbCBieXRlcyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjYW1lcmEgcmV0dXJucyBsaXR0bGUgZW5kaWFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlT3ZlcndyaXRlTW9kZSBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6Ok92ZXJ3cml0ZU1vZGUiICAvLyBHZXRzL3NldHMgdGhlIG92ZXJ3cml0ZSBtb2RlLCB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgYWNxdWlzaXRpb24gd2hlbiBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgdHJhbnNmZXIgY2Fubm90IGJlIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIGFuIG92ZXJ3cml0dGVuIGludGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVRpbWVvdXQgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpUaW1lb3V0IiAgLy8gR2V0cy9zZXRzIHRoZSB0aW1lb3V0IHZhbHVlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxsaXNlY29uZHMsIHVzZWQgdG8gYWJvcnQgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcXVpc2l0aW9uIHdoZW4gdGhlIGltYWdlIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgZGVsYXkuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVZpZGVvTW9kZSBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OlZpZGVvTW9kZSIgIC8vIEdldHMvc2V0cyB0aGUgdmlkZW8gbW9kZSBmb3IgYSBjYW1lcmEuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUJpdHNQZXJQaXhlbCBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkJpdHNQZXJQaXhlbCIgIC8vIEdldHMvc2V0cyB0aGUgYWN0dWFsIGJpdHMgcGVyIHBpeGVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgMTYtYml0IGNvbXBvbmVudHMsIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwcmVzZW50cyB0aGUgYWN0dWFsIGJpdCBkZXB0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoMTAtLCAxMi0sIDE0LSwgb3IgMTYtYml0KS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUGl4ZWxTaWduZWRuZXNzIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6UGl4ZWxTaWduZWRuZXNzIiAgLy8gR2V0cy9zZXRzIHRoZSBzaWduZWRuZXNzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbC4gRm9yIDE2LWJpdCBjb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWRuZXNzIChTaWduZWQsIG9yIFVuc2lnbmVkKS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlUmVzZXJ2ZUR1YWxQYWNrZXRzIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6UmVzZXJ2ZUR1YWxQYWNrZXRzIiAgLy8gR2V0cy9zZXRzIGlmIGR1YWwgcGFja2V0cyB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHJlc2VydmVkIGZvciBhIHZlcnkgbGFyZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZVdpcmUgcGFja2V0LgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZWNlaXZlVGltZXN0YW1wTW9kZSBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OlJlY2VpdmVUaW1lc3RhbXBNb2RlIiAgLy8gR2V0cy9zZXRzIHRoZSBtb2RlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVzdGFtcGluZyBpbWFnZXMgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgZHJpdmVyLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVBY3R1YWxQZWFrQmFuZHdpZHRoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6QmFuZHdpZHRoQ29udHJvbDo6IiBcCisgICJBY3R1YWxQZWFrQmFuZHdpZHRoIiAgLy8gUmVhZCBvbmx5LiBSZXR1cm5zIHRoZSBhY3R1YWwgbWF4aW11bSBwZWFrIGJhbmR3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjYW1lcmEgd2lsbCBiZSBjb25maWd1cmVkIHRvIHVzZS4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlRGVzaXJlZFBlYWtCYW5kd2lkdGggICAgICAgICAgICAgICAgICAgICBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OkJhbmR3aWR0aENvbnRyb2w6OiIgXAorICAiRGVzaXJlZFBlYWtCYW5kd2lkdGgiICAvLyBHZXRzL3NldHMgdGhlIGRlc2lyZWQgbWF4aW11bSBwZWFrIGJhbmR3aWR0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FtZXJhIHNob3VsZCB1c2UuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZURlc3RpbmF0aW9uTW9kZSBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OkNvbnRyb2xsZXI6OkRlc3RpbmF0aW9uTW9kZSIgIC8vIEdldHMvU2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FtZXJhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RydWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVEZXN0aW5hdGlvbk11bHRpY2FzdEFkZHJlc3MgICAgICAgIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6Q29udHJvbGxlcjo6IiBcCisgICJEZXN0aW5hdGlvbk11bHRpY2FzdEFkZHJlc3MiICAvLyBHZXRzL1NldHMgdGhlIG11bHRpY2FzdCBhZGRyZXNzIHRoZSBjYW1lcmEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBzZW5kIGRhdGEgaW4gbXVsdGljYXN0IG1vZGUuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUV2ZW50c0VuYWJsZWQgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpFdmVudFBhcmFtZXRlcnM6OkV2ZW50c0VuYWJsZWQiICAvLyBHZXRzL1NldHMgaWYgZXZlbnRzIHdpbGwgYmUgaGFuZGxlZC4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTWF4T3V0c3RhbmRpbmdFdmVudHMgICAgICAgICAgICAgICAgICAgIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6RXZlbnRQYXJhbWV0ZXJzOjoiIFwKKyAgIk1heE91dHN0YW5kaW5nRXZlbnRzIiAgLy8gR2V0cy9TZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRzdGFuZGluZyBldmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcXVldWUuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVRlc3RQYWNrZXRFbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6VGVzdFBhY2tldFBhcmFtZXRlcnM6OiIgXAorICAiVGVzdFBhY2tldEVuYWJsZWQiICAvLyBHZXRzL1NldHMgd2hldGhlciB0aGUgZHJpdmVyIHdpbGwgdmFsaWRhdGUgdGhlIGltYWdlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbWluZyBzZXR0aW5ncyB1c2luZyB0ZXN0IHBhY2tldHMgcHJpb3IgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNxdWlzaXRpb24KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlVGVzdFBhY2tldFRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpUZXN0UGFja2V0UGFyYW1ldGVyczo6IiBcCisgICJUZXN0UGFja2V0VGltZW91dCIgIC8vIEdldHMvU2V0cyB0aGUgdGltZW91dCBmb3IgdmFsaWRhdGluZyB0ZXN0IHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlcHRpb24gKGlmIGVuYWJsZWQpCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU1heFRlc3RQYWNrZXRSZXRyaWVzICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6VGVzdFBhY2tldFBhcmFtZXRlcnM6OiIgXAorICAiTWF4VGVzdFBhY2tldFJldHJpZXMiICAvLyBHZXRzL1NldHMgdGhlIG51bWJlciBvZiByZXRyaWVzIGZvciB2YWxpZGF0aW5nIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFja2V0IHJlY2VwdGlvbiAoaWYgZW5hYmxlZCkKKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlQ2h1bmtEYXRhRGVjb2RpbmdFbmFibGVkIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6Q2h1bmtEYXRhRGVjb2Rpbmc6OkNodW5rRGF0YURlY29kaW5nRW5hYmxlZCIgIC8vIEdldHMvU2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hldGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbQorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVDaHVua0RhdGFEZWNvZGluZ01heEVsZW1lbnRTaXplIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6Q2h1bmtEYXRhRGVjb2Rpbmc6Ok1heGltdW1DaHVua0NvcHlTaXplIiAgLy8gR2V0cy9TZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIG1hZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZUxvc3RQYWNrZXRNb2RlIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6TG9zdFBhY2tldE1vZGUiICAvLyBHZXRzL3NldHMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVoYXZpb3Igd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdHMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciB0aGF0IGhhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc3NpbmcgcGFja2V0cy4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTWVtb3J5V2luZG93U2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6OiIgXAorICAiTWVtb3J5V2luZG93U2l6ZSIgIC8vIEdldHMvc2V0cyB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IHdpbmRvdyBvZiB0aGUgY2FtZXJhCisgICAgICAgICAgICAgICAgICAgICAgLy8gaW4ga2lsb2J5dGVzLiBTaG91bGQgbWF0Y2ggdGhlIGNhbWVyYSdzIGludGVybmFsIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlc2VuZHNFbmFibGVkIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6UmVzZW5kc0VuYWJsZWQiICAvLyBHZXRzL3NldHMgaWYgcmVzZW5kcyB3aWxsIGJlIGlzc3VlZCBmb3IgbWlzc2luZyBwYWNrZXRzLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZXNlbmRUaHJlc2hvbGRQZXJjZW50YWdlICAgICAgICAgICAgICAgIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6IiBcCisgICJSZXNlbmRUaHJlc2hvbGRQZXJjZW50YWdlIiAgLy8gR2V0cy9zZXRzIHRoZSB0aHJlc2hvbGQgb2YgdGhlIHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3Npbmcgd2luZG93IHRoYXQgd2lsbCB0cmlnZ2VyIHBhY2tldHMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSByZXNlbnQuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlc2VuZEJhdGNoaW5nUGVyY2VudGFnZSAgICAgICAgICAgICAgICAgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpSZXNlbmRQYXJhbWV0ZXJzOjoiIFwKKyAgIlJlc2VuZEJhdGNoaW5nUGVyY2VudGFnZSIgIC8vIEdldHMvc2V0cyB0aGUgcGVyY2VudCBvZiB0aGUgcGFja2V0IHJlc2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZXNob2xkIHRoYXQgd2lsbCBiZSBpc3N1ZWQgYXMgb25lIGdyb3VwIHBhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbml0aWFsIHRocmVzaG9sZCBzZW50IGluIGEgc2luZ2xlIHJlcXVlc3QuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZU1heFJlc2VuZHNQZXJQYWNrZXQgICAgICAgICAgICAgICAgICAgICAgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpSZXNlbmRQYXJhbWV0ZXJzOjoiIFwKKyAgIk1heFJlc2VuZHNQZXJQYWNrZXQiICAvLyBHZXRzL3NldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc2VuZCByZXF1ZXN0cyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBpc3N1ZWQgZm9yIGEgbWlzc2luZyBwYWNrZXQuCisjZGVmaW5lIElNQVFkeEF0dHJpYnV0ZVJlc2VuZFJlc3BvbnNlVGltZW91dCAgICAgICAgICAgICAgICAgICAgXAorICAiQWNxdWlzaXRpb25BdHRyaWJ1dGVzOjpBZHZhbmNlZEV0aGVybmV0OjpSZXNlbmRQYXJhbWV0ZXJzOjoiIFwKKyAgIlJlc2VuZFJlc3BvbnNlVGltZW91dCIgIC8vIEdldHMvc2V0cyB0aGUgdGltZSB0byB3YWl0IGZvciBhIHJlc2VuZCByZXF1ZXN0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBzYXRpc2ZpZWQgYmVmb3JlIHNlbmRpbmcgYW5vdGhlci4KKyNkZWZpbmUgSU1BUWR4QXR0cmlidXRlTmV3UGFja2V0VGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJBY3F1aXNpdGlvbkF0dHJpYnV0ZXM6OkFkdmFuY2VkRXRoZXJuZXQ6OlJlc2VuZFBhcmFtZXRlcnM6OiIgXAorICAiTmV3UGFja2V0VGltZW91dCIgIC8vIEdldHMvc2V0cyB0aGUgdGltZSB0byB3YWl0IGZvciBuZXcgcGFja2V0cyB0byBhcnJpdmUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBhIHBhcnRpYWxseSBjb21wbGV0ZWQgaW1hZ2UgYmVmb3JlIGFzc3VtaW5nIHRoZSByZXN0IG9mCisgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGltYWdlIHdhcyBsb3N0LgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVNaXNzaW5nUGFja2V0VGltZW91dCAgICAgICAgICAgICAgICAgICAgIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6IiBcCisgICJNaXNzaW5nUGFja2V0VGltZW91dCIgIC8vIEdldHMvc2V0cyB0aGUgdGltZSB0byB3YWl0IGZvciBhIG1pc3NpbmcgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpc3N1aW5nIGEgcmVzZW5kLgorI2RlZmluZSBJTUFRZHhBdHRyaWJ1dGVSZXNlbmRUaW1lclJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgIFwKKyAgIkFjcXVpc2l0aW9uQXR0cmlidXRlczo6QWR2YW5jZWRFdGhlcm5ldDo6UmVzZW5kUGFyYW1ldGVyczo6IiBcCisgICJSZXNlbmRUaW1lclJlc29sdXRpb24iICAvLyBHZXRzL3NldHMgdGhlIHJlc29sdXRpb24gb2YgdGhlIHBhY2tldCBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gdGhhdCBpcyB1c2VkIGZvciBhbGwgcGFja2V0LXJlbGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXRzLgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4U25hcChJTUFRZHhTZXNzaW9uIGlkLCBJbWFnZSogaW1hZ2UpOworSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhDb25maWd1cmVHcmFiKElNQVFkeFNlc3Npb24gaWQpOworSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhHcmFiKElNQVFkeFNlc3Npb24gaWQsIEltYWdlKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sMzIgd2FpdEZvck5leHRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludDMyKiBhY3R1YWxCdWZmZXJOdW1iZXIpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4U2VxdWVuY2UoSU1BUWR4U2Vzc2lvbiBpZCwgSW1hZ2UqIGltYWdlc1tdLCB1SW50MzIgY291bnQpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4RGlzY292ZXJFdGhlcm5ldENhbWVyYXMoY29uc3QgY2hhciogYWRkcmVzcywgdUludDMyIHRpbWVvdXQpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4RW51bWVyYXRlQ2FtZXJhcyhJTUFRZHhDYW1lcmFJbmZvcm1hdGlvbiBjYW1lcmFJbmZvcm1hdGlvbkFycmF5W10sCisgICAgICAgICAgICAgICAgICAgICAgIHVJbnQzMiogY291bnQsIGJvb2wzMiBjb25uZWN0ZWRPbmx5KTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVzZXRDYW1lcmEoY29uc3QgY2hhciogbmFtZSwgYm9vbDMyIHJlc2V0QWxsKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4T3BlbkNhbWVyYShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFkeENhbWVyYUNvbnRyb2xNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUWR4U2Vzc2lvbiogaWQpOworSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhDbG9zZUNhbWVyYShJTUFRZHhTZXNzaW9uIGlkKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4Q29uZmlndXJlQWNxdWlzaXRpb24oSU1BUWR4U2Vzc2lvbiBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbDMyIGNvbnRpbnVvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQzMiBidWZmZXJDb3VudCk7CitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeFN0YXJ0QWNxdWlzaXRpb24oSU1BUWR4U2Vzc2lvbiBpZCk7CitJTUFRZHhFcnJvciBOSV9GVU5DCitJTUFRZHhHZXRJbWFnZShJTUFRZHhTZXNzaW9uIGlkLCBJbWFnZSogaW1hZ2UsIElNQVFkeEJ1ZmZlck51bWJlck1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgIHVJbnQzMiBkZXNpcmVkQnVmZmVyTnVtYmVyLCB1SW50MzIqIGFjdHVhbEJ1ZmZlck51bWJlcik7CitJTUFRZHhFcnJvciBOSV9GVU5DCitJTUFRZHhHZXRJbWFnZURhdGEoSU1BUWR4U2Vzc2lvbiBpZCwgdm9pZCogYnVmZmVyLCB1SW50MzIgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBJTUFRZHhCdWZmZXJOdW1iZXJNb2RlIG1vZGUsIHVJbnQzMiBkZXNpcmVkQnVmZmVyTnVtYmVyLAorICAgICAgICAgICAgICAgICAgIHVJbnQzMiogYWN0dWFsQnVmZmVyTnVtYmVyKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4U3RvcEFjcXVpc2l0aW9uKElNQVFkeFNlc3Npb24gaWQpOworSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhVbmNvbmZpZ3VyZUFjcXVpc2l0aW9uKElNQVFkeFNlc3Npb24gaWQpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4RW51bWVyYXRlVmlkZW9Nb2RlcyhJTUFRZHhTZXNzaW9uIGlkLCBJTUFRZHhWaWRlb01vZGUgdmlkZW9Nb2RlQXJyYXlbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdUludDMyKiBjb3VudCwgdUludDMyKiBjdXJyZW50TW9kZSk7CitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEVudW1lcmF0ZUF0dHJpYnV0ZXMoCisgICAgSU1BUWR4U2Vzc2lvbiBpZCwgSU1BUWR4QXR0cmlidXRlSW5mb3JtYXRpb24gYXR0cmlidXRlSW5mb3JtYXRpb25BcnJheVtdLAorICAgIHVJbnQzMiogY291bnQsIGNvbnN0IGNoYXIqIHJvb3QpOworSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhHZXRBdHRyaWJ1dGUoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFkeFZhbHVlVHlwZSB0eXBlLCB2b2lkKiB2YWx1ZSk7CitJTUFRZHhFcnJvciBOSV9GVU5DQyBJTUFRZHhTZXRBdHRyaWJ1dGUoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRZHhWYWx1ZVR5cGUgdHlwZSwgLi4uKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMKK0lNQVFkeEdldEF0dHJpYnV0ZU1pbmltdW0oSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUWR4VmFsdWVUeXBlIHR5cGUsIHZvaWQqIHZhbHVlKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMKK0lNQVFkeEdldEF0dHJpYnV0ZU1heGltdW0oSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUWR4VmFsdWVUeXBlIHR5cGUsIHZvaWQqIHZhbHVlKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMKK0lNQVFkeEdldEF0dHJpYnV0ZUluY3JlbWVudChJTUFRZHhTZXNzaW9uIGlkLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFkeFZhbHVlVHlwZSB0eXBlLCB2b2lkKiB2YWx1ZSk7CitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeEdldEF0dHJpYnV0ZVR5cGUoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRZHhBdHRyaWJ1dGVUeXBlKiB0eXBlKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMKK0lNQVFkeElzQXR0cmlidXRlUmVhZGFibGUoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwgYm9vbDMyKiByZWFkYWJsZSk7CitJTUFRZHhFcnJvciBOSV9GVU5DCitJTUFRZHhJc0F0dHJpYnV0ZVdyaXRhYmxlKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wzMiogd3JpdGFibGUpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4RW51bWVyYXRlQXR0cmlidXRlVmFsdWVzKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUWR4RW51bUl0ZW0gbGlzdFtdLCB1SW50MzIqIHNpemUpOworSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhHZXRBdHRyaWJ1dGVUb29sdGlwKElNQVFkeFNlc3Npb24gaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgY2hhciogdG9vbHRpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50MzIgbGVuZ3RoKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4R2V0QXR0cmlidXRlVW5pdHMoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogdW5pdHMsIHVJbnQzMiBsZW5ndGgpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4UmVnaXN0ZXJGcmFtZURvbmVFdmVudChJTUFRZHhTZXNzaW9uIGlkLCB1SW50MzIgYnVmZmVySW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lRG9uZUV2ZW50Q2FsbGJhY2tQdHIgY2FsbGJhY2tGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbGJhY2tEYXRhKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVnaXN0ZXJQbnBFdmVudChJTUFRZHhTZXNzaW9uIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFkeFBucEV2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBucEV2ZW50Q2FsbGJhY2tQdHIgY2FsbGJhY2tGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYWxsYmFja0RhdGEpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4V3JpdGVSZWdpc3RlcihJTUFRZHhTZXNzaW9uIGlkLCB1SW50MzIgb2Zmc2V0LCB1SW50MzIgdmFsdWUpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4UmVhZFJlZ2lzdGVyKElNQVFkeFNlc3Npb24gaWQsIHVJbnQzMiBvZmZzZXQsIHVJbnQzMiogdmFsdWUpOworSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhXcml0ZU1lbW9yeShJTUFRZHhTZXNzaW9uIGlkLCB1SW50MzIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZXMsIHVJbnQzMiBjb3VudCk7CitJTUFRZHhFcnJvciBOSV9GVU5DCitJTUFRZHhSZWFkTWVtb3J5KElNQVFkeFNlc3Npb24gaWQsIHVJbnQzMiBvZmZzZXQsIGNoYXIqIHZhbHVlcywgdUludDMyIGNvdW50KTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMKK0lNQVFkeEdldEVycm9yU3RyaW5nKElNQVFkeEVycm9yIGVycm9yLCBjaGFyKiBtZXNzYWdlLCB1SW50MzIgbWVzc2FnZUxlbmd0aCk7CitJTUFRZHhFcnJvciBOSV9GVU5DCitJTUFRZHhXcml0ZUF0dHJpYnV0ZXMoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogZmlsZW5hbWUpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4UmVhZEF0dHJpYnV0ZXMoSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogZmlsZW5hbWUpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4UmVzZXRFdGhlcm5ldENhbWVyYUFkZHJlc3MoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1Ym5ldCwgY29uc3QgY2hhciogZ2F0ZXdheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQzMiB0aW1lb3V0KTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4RW51bWVyYXRlQXR0cmlidXRlczIoCisgICAgSU1BUWR4U2Vzc2lvbiBpZCwgSU1BUWR4QXR0cmlidXRlSW5mb3JtYXRpb24gYXR0cmlidXRlSW5mb3JtYXRpb25BcnJheVtdLAorICAgIHVJbnQzMiogY291bnQsIGNvbnN0IGNoYXIqIHJvb3QsIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHkgdmlzaWJpbGl0eSk7CitJTUFRZHhFcnJvciBOSV9GVU5DCitJTUFRZHhHZXRBdHRyaWJ1dGVWaXNpYmlsaXR5KElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFkeEF0dHJpYnV0ZVZpc2liaWxpdHkqIHZpc2liaWxpdHkpOworSU1BUWR4RXJyb3IgTklfRlVOQworSU1BUWR4R2V0QXR0cmlidXRlRGVzY3JpcHRpb24oSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGRlc2NyaXB0aW9uLCB1SW50MzIgbGVuZ3RoKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMKK0lNQVFkeEdldEF0dHJpYnV0ZURpc3BsYXlOYW1lKElNQVFkeFNlc3Npb24gaWQsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBkaXNwbGF5TmFtZSwgdUludDMyIGxlbmd0aCk7CitJTUFRZHhFcnJvciBOSV9GVU5DIElNQVFkeERpc3Bvc2Uodm9pZCogYnVmZmVyKTsKK0lNQVFkeEVycm9yIE5JX0ZVTkMgSU1BUWR4UmVnaXN0ZXJBdHRyaWJ1dGVVcGRhdGVkRXZlbnQoCisgICAgSU1BUWR4U2Vzc2lvbiBpZCwgY29uc3QgY2hhciogbmFtZSwKKyAgICBBdHRyaWJ1dGVVcGRhdGVkRXZlbnRDYWxsYmFja1B0ciBjYWxsYmFja0Z1bmN0aW9uLCB2b2lkKiBjYWxsYmFja0RhdGEpOworSU1BUWR4RXJyb3IgTklfRlVOQyBJTUFRZHhFbnVtZXJhdGVBdHRyaWJ1dGVzMygKKyAgICBJTUFRZHhTZXNzaW9uIGlkLCBJTUFRZHhBdHRyaWJ1dGVJbmZvcm1hdGlvbiBhdHRyaWJ1dGVJbmZvcm1hdGlvbkFycmF5W10sCisgICAgdUludDMyKiBjb3VudCwgY29uc3QgY2hhciogcm9vdCwgSU1BUWR4QXR0cmlidXRlVmlzaWJpbGl0eSB2aXNpYmlsaXR5KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBfX19uaWltYXFkeF9oX19fCmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0FJQ2FsaWJyYXRpb24uaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vQUlDYWxpYnJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YThmNzUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0FJQ2FsaWJyYXRpb24uaApAQCAtMCwwICsxLDIwIEBACisKKyNpZm5kZWYgX19BSUNhbGlicmF0aW9uX2hfXworI2RlZmluZSBfX0FJQ2FsaWJyYXRpb25faF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit1aW50MzJfdCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkFJQ2FsaWJyYXRpb25fZ2V0TFNCV2VpZ2h0KAorICAgIGNvbnN0IHVpbnQzMl90IGFpU3lzdGVtSW5kZXgsIGNvbnN0IHVpbnQzMl90IGNoYW5uZWwsIGludDMyX3QgKnN0YXR1cyk7CitpbnQzMl90IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRPZmZzZXQoCisgICAgY29uc3QgdWludDMyX3QgYWlTeXN0ZW1JbmRleCwgY29uc3QgdWludDMyX3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBfX0FJQ2FsaWJyYXRpb25faF9fCmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTkludGVyZmFjZVBsdWdpbi5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc1OTgwCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaApAQCAtMCwwICsxLDEwOSBAQAorLy8gQ0FOSW50ZXJmYWNlUGx1Z2luLmgKKy8vCisvLyAgRGVmaW5lcyB0aGUgQVBJIGZvciBidWlsZGluZyBhIENBTiBJbnRlcmZhY2UgUGx1Z2luIHRvIHN1cHBvcnQKKy8vICAgIFBXTS1jYWJsZS1mcmVlIENBTiBtb3RvciBjb250cm9sIG9uIEZSQyByb2JvdHMuICBUaGlzIGFsbG93cyB5b3UKKy8vICAgIHRvIGNvbm5lY3QgYW55IENBTiBpbnRlcmZhY2UgdG8gdGhlIHNlY3VyZSBKYWd1YXIgQ0FOIGRyaXZlci4KKy8vCisKKyNpZm5kZWYgX19DQU5JbnRlcmZhY2VQbHVnaW5faF9fCisjZGVmaW5lIF9fQ0FOSW50ZXJmYWNlUGx1Z2luX2hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgQ0FOX0lTX0ZSQU1FX1JFTU9URSAweDgwMDAwMDAwCisjZGVmaW5lIENBTl9JU19GUkFNRV8xMUJJVCAweDQwMDAwMDAwCisjZGVmaW5lIENBTl8yOUJJVF9NRVNTQUdFX0lEX01BU0sgMHgxRkZGRkZGRgorI2RlZmluZSBDQU5fMTFCSVRfTUVTU0FHRV9JRF9NQVNLIDB4MDAwMDA3RkYKKworY2xhc3MgQ0FOSW50ZXJmYWNlUGx1Z2luIHsKKyBwdWJsaWM6CisgIENBTkludGVyZmFjZVBsdWdpbigpIHt9CisgIHZpcnR1YWwgfkNBTkludGVyZmFjZVBsdWdpbigpIHt9CisKKyAgLyoqCisgICAqIFRoaXMgZW50cnktcG9pbnQgb2YgdGhlIENBTkludGVyZmFjZVBsdWdpbiBpcyBwYXNzZWQgYSBtZXNzYWdlIHRoYXQgdGhlCisgICAqIGRyaXZlciBuZWVkcyB0byBzZW5kIHRvCisgICAqIGEgZGV2aWNlIG9uIHRoZSBDQU4gYnVzLgorICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSBjb250ZXh0cyBhbmQgbXVzdCB0aGVyZWZvcmUgYmUKKyAgICogcmVlbnRyYW50LgorICAgKgorICAgKiBAcGFyYW0gbWVzc2FnZUlEIFRoZSAyOS1iaXQgQ0FOIG1lc3NhZ2UgSUQgaW4gdGhlIGxzYnMuICBUaGUgbXNiIGNhbgorICAgKiBpbmRpY2F0ZSBhIHJlbW90ZSBmcmFtZS4KKyAgICogQHBhcmFtIGRhdGEgQSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgYmV0d2VlbiAwIGFuZCA4IGJ5dGVzIHRvIHNlbmQKKyAgICogd2l0aCB0aGUgbWVzc2FnZS4gIE1heSBiZSBudWxscHRyIGlmIGRhdGFTaXplIGlzIDAuCisgICAqIEBwYXJhbSBkYXRhU2l6ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQgd2l0aCB0aGUgbWVzc2FnZS4KKyAgICogQHJldHVybiBSZXR1cm4gYW55IGVycm9yIGNvZGUuICBPbiBzdWNjZXNzIHJldHVybiAwLgorICAgKi8KKyAgdmlydHVhbCBpbnQzMl90IHNlbmRNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YVNpemUpID0gMDsKKworICAvKioKKyAgICogVGhpcyBlbnRyeS1wb2ludCBvZiB0aGUgQ0FOSW50ZXJmYWNlUGx1Z2luIGlzIHBhc3NlZCBidWZmZXJzIHdoaWNoIHNob3VsZAorICAgKiBiZSBwb3B1bGF0ZWQgd2l0aAorICAgKiBhbnkgcmVjZWl2ZWQgbWVzc2FnZXMgZnJvbSBkZXZpY2VzIG9uIHRoZSBDQU4gYnVzLgorICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgYnkgYSBzaW5nbGUgdGFzayBpbiB0aGUgSmFndWFyIGRyaXZlciwgc28gaXQKKyAgICogbmVlZCBub3QgYmUgcmVlbnRyYW50LgorICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJsb2NrIGZvciBzb21lIHBlcmlvZCBvZiB0aW1lIHdhaXRpbmcgZm9yIGEKKyAgICogbWVzc2FnZSBmcm9tIHRoZSBDQU4gYnVzLgorICAgKiBJdCBtYXkgdGltZW91dCBwZXJpb2RpY2FsbHkgKHJldHVybmluZyBub24temVybyB0byBpbmRpY2F0ZSBubyBtZXNzYWdlIHdhcworICAgKiBwb3B1bGF0ZWQpIHRvIGFsbG93IGZvcgorICAgKiBzaHV0ZG93biBhbmQgdW5sb2FkaW5nIG9mIHRoZSBwbHVnaW4uCisgICAqCisgICAqIEBwYXJhbSBtZXNzYWdlSUQgQSByZWZlcmVuY2UgdG8gYmUgcG9wdWxhdGVkIHdpdGggYSByZWNlaXZlZCAyOS1iaXQgQ0FOCisgICAqIG1lc3NhZ2UgSUQgaW4gdGhlIGxzYnMuCisgICAqIEBwYXJhbSBkYXRhIEEgcG9pbnRlciB0byBhIGJ1ZmZlciBvZiA4IGJ5dGVzIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGRhdGEKKyAgICogcmVjZWl2ZWQgd2l0aCB0aGUgbWVzc2FnZS4KKyAgICogQHBhcmFtIGRhdGFTaXplIEEgcmVmZXJlbmNlIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBzaXplIG9mIHRoZSBkYXRhCisgICAqIHJlY2VpdmVkICgwIC0gOCBieXRlcykuCisgICAqIEByZXR1cm4gVGhpcyBzaG91bGQgcmV0dXJuIDAgaWYgYSBtZXNzYWdlIHdhcyBwb3B1bGF0ZWQsIG5vbi0wIGlmIG5vCisgICAqIG1lc3NhZ2Ugd2FzIG5vdCBwb3B1bGF0ZWQuCisgICAqLworICB2aXJ0dWFsIGludDMyX3QgcmVjZWl2ZU1lc3NhZ2UodWludDMyX3QgJm1lc3NhZ2VJRCwgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgJmRhdGFTaXplKSA9IDA7CisKKyNpZiBkZWZpbmVkKF9fbGludXgpCisgIC8qKgorICAgKiBUaGlzIGVudHJ5LXBvaW50IG9mIHRoZSBDQU5JbnRlcmZhY2VQbHVnaW4gcmV0dXJucyBzdGF0dXMgb2YgdGhlIENBTiBidXMuCisgICAqCisgICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIGNvbnRleHRzIGFuZCBtdXN0IHRoZXJlZm9yZSBiZQorICAgKiByZWVudHJhbnQuCisgICAqCisgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZGV0YWlsZWQgaGFyZHdhcmUgc3RhdHVzIGlmIGF2YWlsYWJsZSBmb3IKKyAgICogZGlhZ25vc3RpY3Mgb2YgdGhlIENBTiBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSBidXNPZmZDb3VudCBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgc2VuZE1lc3NhZ2UgZmFpbGVkIHdpdGggYQorICAgKiBidXNPZmYgZXJyb3IgaW5kaWNhdGluZyB0aGF0IG1lc3NhZ2VzCisgICAqICBhcmUgbm90IHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCBvbiB0aGUgYnVzLgorICAgKiBAcGFyYW0gdHhGdWxsQ291bnQgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHNlbmRNZXNzYWdlIGZhaWxlZCB3aXRoIGEKKyAgICogdHhGaWZvRnVsbCBlcnJvciBpbmRpY2F0aW5nIHRoYXQgbWVzc2FnZXMKKyAgICogIGFyZSBub3Qgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGJ5IGFueSBDQU4gZGV2aWNlLgorICAgKiBAcGFyYW0gcmVjZWl2ZUVycm9yQ291bnQgVGhlIGNvdW50IG9mIHJlY2VpdmUgZXJyb3JzIGFzIHJlcG9ydGVkIGJ5IHRoZSBDQU4KKyAgICogZHJpdmVyLgorICAgKiBAcGFyYW0gdHJhbnNtaXRFcnJvckNvdW50IFRoZSBjb3VudCBvZiB0cmFuc21pdCBlcnJvcnMgYXMgcmVwb3J0ZWQgYnkgdGhlCisgICAqIENBTiBkcml2ZXIuCisgICAqIEByZXR1cm4gVGhpcyBzaG91bGQgcmV0dXJuIDAgaWYgYWxsIHN0YXR1cyB3YXMgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseSBvciBhbgorICAgKiBlcnJvciBjb2RlIGlmIG5vdC4KKyAgICovCisgIHZpcnR1YWwgaW50MzJfdCBnZXRTdGF0dXModWludDMyX3QgJmJ1c09mZkNvdW50LCB1aW50MzJfdCAmdHhGdWxsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJnJlY2VpdmVFcnJvckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZ0cmFuc21pdEVycm9yQ291bnQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCit9OworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byByZWdpc3RlciBhIENBTkludGVyZmFjZVBsdWdpbiB0byBwcm92aWRlIGFjY2VzcyBhCisgKiBDQU4gYnVzLgorICoKKyAqIEBwYXJhbSBpbnRlcmZhY2UgQSBwb2ludGVyIHRvIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gQ0FOSW50ZXJmYWNlUGx1Z2luCisgKiBhbmQgaW1wbGVtZW50cworICogdGhlIHB1cmUgdmlydHVhbCBpbnRlcmZhY2UuICBJZiBudWxscHRyLCB1bnJlZ2lzdGVyIHRoZSBjdXJyZW50IHBsdWdpbi4KKyAqLwordm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWdpc3RlckludGVyZmFjZSgKKyAgICBDQU5JbnRlcmZhY2VQbHVnaW4gKmludGVyZmFjZSk7CisKKyNlbmRpZiAgLy8gX19DQU5JbnRlcmZhY2VQbHVnaW5faF9fCmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDlhM2YKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaApAQCAtMCwwICsxLDgxIEBACisvLyBDQU5TZXNzaW9uTXV4LmgKKy8vCisvLyAgRGVmaW5lcyB0aGUgQVBJIGZvciBidWlsZGluZyBhIENBTiBJbnRlcmZhY2UgUGx1Z2luIHRvIHN1cHBvcnQKKy8vICAgIFBXTS1jYWJsZS1mcmVlIENBTiBtb3RvciBjb250cm9sIG9uIEZSQyByb2JvdHMuICBUaGlzIGFsbG93cyB5b3UKKy8vICAgIHRvIGNvbm5lY3QgYW55IENBTiBpbnRlcmZhY2UgdG8gdGhlIHNlY3VyZSBKYWd1YXIgQ0FOIGRyaXZlci4KKy8vCisKKyNpZm5kZWYgX19DQU5TZXNzaW9uTXV4X2hfXworI2RlZmluZSBfX0NBTlNlc3Npb25NdXhfaF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBDQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUIDAKKyNkZWZpbmUgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HIC0xCisKKy8qIEZsYWdzIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBtZXNzYWdlSUQgKi8KKyNkZWZpbmUgQ0FOX0lTX0ZSQU1FX1JFTU9URSAweDgwMDAwMDAwCisjZGVmaW5lIENBTl9JU19GUkFNRV8xMUJJVCAweDQwMDAwMDAwCisKKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfSW52YWxpZEJ1ZmZlciAtNDQwODYKKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTWVzc2FnZU5vdEZvdW5kIC00NDA4NworI2RlZmluZSBXQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbiA0NDA4NworI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9Ob3RBbGxvd2VkIC00NDA4OAorI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9Ob3RJbml0aWFsaXplZCAtNDQwODkKKyNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfU2Vzc2lvbk92ZXJydW4gNDQwNTAKKworc3RydWN0IHRDQU5TdHJlYW1NZXNzYWdlIHsKKyAgdWludDMyX3QgbWVzc2FnZUlEOworICB1aW50MzJfdCB0aW1lU3RhbXA7CisgIHVpbnQ4X3QgZGF0YVs4XTsKKyAgdWludDhfdCBkYXRhU2l6ZTsKK307CisKK25hbWVzcGFjZSBuQ0FOU2Vzc2lvbk11eCB7Cit2b2lkIHNlbmRNZXNzYWdlX3dyYXBwZXIodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kTXMsIGludDMyX3QgKnN0YXR1cyk7Cit2b2lkIHJlY2VpdmVNZXNzYWdlX3dyYXBwZXIodWludDMyX3QgKm1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLCB1aW50OF90ICpkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdGltZVN0YW1wLCBpbnQzMl90ICpzdGF0dXMpOwordm9pZCBvcGVuU3RyZWFtU2Vzc2lvbih1aW50MzJfdCAqc2Vzc2lvbkhhbmRsZSwgdWludDMyX3QgbWVzc2FnZUlELAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50MzJfdCBtYXhNZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc3RhdHVzKTsKK3ZvaWQgY2xvc2VTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUpOwordm9pZCByZWFkU3RyZWFtU2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdENBTlN0cmVhbU1lc3NhZ2UgKm1lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCwgdWludDMyX3QgKm1lc3NhZ2VzUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc3RhdHVzKTsKK3ZvaWQgZ2V0Q0FOU3RhdHVzKGZsb2F0ICpwZXJjZW50QnVzVXRpbGl6YXRpb24sIHVpbnQzMl90ICpidXNPZmZDb3VudCwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp0eEZ1bGxDb3VudCwgdWludDMyX3QgKnJlY2VpdmVFcnJvckNvdW50LAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnRyYW5zbWl0RXJyb3JDb3VudCwgaW50MzJfdCAqc3RhdHVzKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwZXJpb2RNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc3RhdHVzKTsKK3ZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVjZWl2ZU1lc3NhZ2UoCisgICAgdWludDMyX3QgKm1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDhfdCAqZGF0YSwKKyAgICB1aW50OF90ICpkYXRhU2l6ZSwgdWludDMyX3QgKnRpbWVTdGFtcCwgaW50MzJfdCAqc3RhdHVzKTsKK3ZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfb3BlblN0cmVhbVNlc3Npb24oCisgICAgdWludDMyX3QgKnNlc3Npb25IYW5kbGUsIHVpbnQzMl90IG1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywKKyAgICB1aW50MzJfdCBtYXhNZXNzYWdlcywgaW50MzJfdCAqc3RhdHVzKTsKK3ZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfY2xvc2VTdHJlYW1TZXNzaW9uKAorICAgIHVpbnQzMl90IHNlc3Npb25IYW5kbGUpOwordm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWFkU3RyZWFtU2Vzc2lvbigKKyAgICB1aW50MzJfdCBzZXNzaW9uSGFuZGxlLCBzdHJ1Y3QgdENBTlN0cmVhbU1lc3NhZ2UgKm1lc3NhZ2VzLAorICAgIHVpbnQzMl90IG1lc3NhZ2VzVG9SZWFkLCB1aW50MzJfdCAqbWVzc2FnZXNSZWFkLCBpbnQzMl90ICpzdGF0dXMpOwordm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9nZXRDQU5TdGF0dXMoCisgICAgZmxvYXQgKnBlcmNlbnRCdXNVdGlsaXphdGlvbiwgdWludDMyX3QgKmJ1c09mZkNvdW50LCB1aW50MzJfdCAqdHhGdWxsQ291bnQsCisgICAgdWludDMyX3QgKnJlY2VpdmVFcnJvckNvdW50LCB1aW50MzJfdCAqdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90ICpzdGF0dXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIF9fQ0FOU2Vzc2lvbk11eF9oX18KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4YzhjYQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCQlOT1RJQ0UKKyAqCisgKiAJVGhlc2UgYXJlIHRoZSBvbmx5IGV4dGVybmFsbHkgZXhwb3NlZCBmdW5jdGlvbnMgdG8gdGhlCisgKiAgIE5ldHdvcmtDb21tdW5pY2F0aW9uIGxpYnJhcnkKKyAqCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEZSQyBTcGVjIGZvciBDb21tIFByb3RvY29sCisgKiBSZXZpc2lvbiA0LjUsIEp1bmUgMzAsIDIwMDgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fRlJDX0NPTU1fSF9fCisjZGVmaW5lIF9fRlJDX0NPTU1fSF9fCisKKyNpZmRlZiBTSU1VTEFUSU9OCisjaW5jbHVkZSA8dnhXb3Jrc19jb21wYXQuaD4KKyNpZmRlZiBVU0VfVEhSSUZUCisjZGVmaW5lIEVYUE9SVF9GVU5DCisjZWxzZQorI2RlZmluZSBFWFBPUlRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19jZGVjbAorI2VuZGlmCisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNkZWZpbmUgRVhQT1JUX0ZVTkMKKyNlbmRpZgorCisjZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTmV0Q29tbU5vdFJlc3BvbmRpbmcgLTQ0MDQ5CisjZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTm9EU0Nvbm5lY3Rpb24gLTQ0MDE4CisKK2VudW0gQWxsaWFuY2VTdGF0aW9uSURfdCB7CisgIGtBbGxpYW5jZVN0YXRpb25JRF9yZWQxLAorICBrQWxsaWFuY2VTdGF0aW9uSURfcmVkMiwKKyAga0FsbGlhbmNlU3RhdGlvbklEX3JlZDMsCisgIGtBbGxpYW5jZVN0YXRpb25JRF9ibHVlMSwKKyAga0FsbGlhbmNlU3RhdGlvbklEX2JsdWUyLAorICBrQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTMsCit9OworCitlbnVtIE1hdGNoVHlwZV90IHsKKyAga01hdGNoVHlwZV9ub25lLAorICBrTWF0Y2hUeXBlX3ByYWN0aWNlLAorICBrTWF0Y2hUeXBlX3F1YWxpZmljYXRpb24sCisgIGtNYXRjaFR5cGVfZWxpbWluYXRpb24sCit9OworCitzdHJ1Y3QgQ29udHJvbFdvcmRfdCB7CisgIHVpbnQzMl90IGVuYWJsZWQgOiAxOworICB1aW50MzJfdCBhdXRvbm9tb3VzIDogMTsKKyAgdWludDMyX3QgdGVzdCA6IDE7CisgIHVpbnQzMl90IGVTdG9wIDogMTsKKyAgdWludDMyX3QgZm1zQXR0YWNoZWQgOiAxOworICB1aW50MzJfdCBkc0F0dGFjaGVkIDogMTsKKyAgdWludDMyX3QgY29udHJvbF9yZXNlcnZlZCA6IDI2OworfTsKKworc3RydWN0IEpveXN0aWNrQXhlc190IHsKKyAgdWludDE2X3QgY291bnQ7CisgIGludDE2X3QgYXhlc1sxXTsKK307CisKK3N0cnVjdCBKb3lzdGlja1BPVl90IHsKKyAgdWludDE2X3QgY291bnQ7CisgIGludDE2X3QgcG92c1sxXTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2ludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fUmVzZXJ2ZSh2b2lkICppbnN0YW5jZSk7CisjaWZuZGVmIFNJTVVMQVRJT04KK3ZvaWQgRVhQT1JUX0ZVTkMKK2dldEZQR0FIYXJkd2FyZVZlcnNpb24odWludDE2X3QgKmZwZ2FWZXJzaW9uLCB1aW50MzJfdCAqZnBnYVJldmlzaW9uKTsKKyNlbmRpZgoraW50IEVYUE9SVF9GVU5DIHNldFN0YXR1c0RhdGEoZmxvYXQgYmF0dGVyeSwgdWludDhfdCBkc0RpZ2l0YWxPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVwZGF0ZU51bWJlciwgY29uc3QgY2hhciAqdXNlckRhdGFIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZXJEYXRhSGlnaExlbmd0aCwgY29uc3QgY2hhciAqdXNlckRhdGFMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlckRhdGFMb3dMZW5ndGgsIGludCB3YWl0X21zKTsKK2ludCBFWFBPUlRfRlVOQyBzZXRFcnJvckRhdGEoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgZXJyb3JzTGVuZ3RoLCBpbnQgd2FpdF9tcyk7CisKKyNpZmRlZiBTSU1VTEFUSU9OCit2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0oSEFORExFKTsKKyNlbHNlCit2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0ocHRocmVhZF9jb25kX3QgKik7CisjZW5kaWYKKworLy8gdGhpcyB1aW50MzJfdCBpcyByZWFsbHkgYSBMVlJlZk51bQoraW50IEVYUE9SVF9GVU5DIHNldE5ld0RhdGFPY2N1clJlZih1aW50MzJfdCByZWZudW0pOworCitpbnQgRVhQT1JUX0ZVTkMKK0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRDb250cm9sV29yZChzdHJ1Y3QgQ29udHJvbFdvcmRfdCAqY29udHJvbFdvcmQpOworaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRBbGxpYW5jZVN0YXRpb24oCisgICAgZW51bSBBbGxpYW5jZVN0YXRpb25JRF90ICphbGxpYW5jZVN0YXRpb24pOworaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRNYXRjaFRpbWUoZmxvYXQgKm1hdGNoVGltZSk7CitpbnQgRVhQT1JUX0ZVTkMKK0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRKb3lzdGlja0F4ZXModWludDhfdCBqb3lzdGlja051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEpveXN0aWNrQXhlc190ICpheGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heEF4ZXMpOworaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRKb3lzdGlja0J1dHRvbnModWludDhfdCBqb3lzdGlja051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpidXR0b25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqY291bnQpOworaW50IEVYUE9SVF9GVU5DCitGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tQT1ZzKHVpbnQ4X3Qgam95c3RpY2tOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBKb3lzdGlja1BPVl90ICpwb3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heFBPVnMpOworaW50IEVYUE9SVF9GVU5DCitGUkNfTmV0d29ya0NvbW11bmljYXRpb25fc2V0Sm95c3RpY2tPdXRwdXRzKHVpbnQ4X3Qgam95c3RpY2tOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhpZE91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlZnRSdW1ibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJpZ2h0UnVtYmxlKTsKK2ludCBFWFBPUlRfRlVOQworRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrRGVzYyh1aW50OF90IGpveXN0aWNrTnVtLCB1aW50OF90ICppc1hCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnR5cGUsIGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmF4aXNDb3VudCwgdWludDhfdCAqYXhpc1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidXR0b25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcG92Q291bnQpOworCit2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRWZXJzaW9uU3RyaW5nKGNoYXIgKnZlcnNpb24pOworaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1TdGFydGluZyh2b2lkKTsKK3ZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKHZvaWQpOwordm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cyh2b2lkKTsKK3ZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCh2b2lkKTsKK3ZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVRlc3Qodm9pZCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExMTc0OQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oCkBAIC0wLDAgKzEsNTcgQEAKKworI2lmbmRlZiBfX0xvYWRPdXRfaF9fCisjZGVmaW5lIF9fTG9hZE91dF9oX18KKworI2lmZGVmIFNJTVVMQVRJT04KKyNpbmNsdWRlIDx2eFdvcmtzX2NvbXBhdC5oPgorI2RlZmluZSBFWFBPUlRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19jZGVjbAorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNkZWZpbmUgRVhQT1JUX0ZVTkMKKyNlbmRpZgorCisjZGVmaW5lIGtNYXhNb2R1bGVOdW1iZXIgMgorbmFtZXNwYWNlIG5Mb2FkT3V0IHsKKyNpZiBkZWZpbmVkKFNJTVVMQVRJT04pCit0eXBlZGVmIGVudW0geworICBrTW9kdWxlVHlwZV9Vbmtub3duID0gMHgwMCwKKyAga01vZHVsZVR5cGVfQW5hbG9nID0gMHgwMSwKKyAga01vZHVsZVR5cGVfRGlnaXRhbCA9IDB4MDIsCisgIGtNb2R1bGVUeXBlX1NvbGVub2lkID0gMHgwMywKK30gdE1vZHVsZVR5cGU7Citib29sIEVYUE9SVF9GVU5DCitnZXRNb2R1bGVQcmVzZW5jZSh0TW9kdWxlVHlwZSBtb2R1bGVUeXBlLCB1aW50OF90IG1vZHVsZU51bWJlcik7CisjZW5kaWYKK3R5cGVkZWYgZW51bSB7CisgIGtUYXJnZXRDbGFzc19Vbmtub3duID0gMHgwMCwKKyAga1RhcmdldENsYXNzX0ZSQzEgPSAweDEwLAorICBrVGFyZ2V0Q2xhc3NfRlJDMiA9IDB4MjAsCisgIGtUYXJnZXRDbGFzc19GUkMzID0gMHgzMCwKKyAga1RhcmdldENsYXNzX1JvYm9SSU8gPSAweDQwLAorI2lmIGRlZmluZWQoU0lNVUxBVElPTikKKyAga1RhcmdldENsYXNzX0ZSQzJfQW5hbG9nID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9BbmFsb2csCisgIGtUYXJnZXRDbGFzc19GUkMyX0RpZ2l0YWwgPSBrVGFyZ2V0Q2xhc3NfRlJDMiB8IGtNb2R1bGVUeXBlX0RpZ2l0YWwsCisgIGtUYXJnZXRDbGFzc19GUkMyX1NvbGVub2lkID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9Tb2xlbm9pZCwKKyNlbmRpZgorICBrVGFyZ2V0Q2xhc3NfRmFtaWx5TWFzayA9IDB4RjAsCisgIGtUYXJnZXRDbGFzc19Nb2R1bGVNYXNrID0gMHgwRiwKK30gdFRhcmdldENsYXNzOwordFRhcmdldENsYXNzIEVYUE9SVF9GVU5DIGdldFRhcmdldENsYXNzKCk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoU0lNVUxBVElPTikKK3VpbnQzMl90IEVYUE9SVF9GVU5DCitGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkxvYWRPdXRfZ2V0TW9kdWxlUHJlc2VuY2UodWludDMyX3QgbW9kdWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1vZHVsZU51bWJlcik7CisjZW5kaWYKK3VpbnQzMl90IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uTG9hZE91dF9nZXRUYXJnZXRDbGFzcygpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIF9fTG9hZE91dF9oX18KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vc3ltTW9kdWxlTGluay5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9OZXR3b3JrQ29tbXVuaWNhdGlvbi9zeW1Nb2R1bGVMaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxY2JiNgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vc3ltTW9kdWxlTGluay5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX19TWU1fTU9EVUxFX0xJTktfSF9fCisjZGVmaW5lIF9fU1lNX01PRFVMRV9MSU5LX0hfXworCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIFNUQVRVUyBtb2R1bGVOYW1lRmluZEJ5U3ltYm9sTmFtZSgKKyAgICBjb25zdCBjaGFyKiBzeW1ib2wsIC8qIHN5bWJvbCBuYW1lIHRvIGxvb2sgZm9yICovCisgICAgY2hhciogbW9kdWxlICAgICAgICAvKiB3aGVyZSB0byByZXR1cm4gbW9kdWxlIG5hbWUgKi8KKyAgICApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvUFdNLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1BXTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTIwYzAKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1BXTS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorI2luY2x1ZGUgInRhYmxlcy9JVGFibGVMaXN0ZW5lci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENsYXNzIGltcGxlbWVudHMgdGhlIFBXTSBnZW5lcmF0aW9uIGluIHRoZSBGUEdBLgorICoKKyAqIFRoZSB2YWx1ZXMgc3VwcGxpZWQgYXMgYXJndW1lbnRzIGZvciBQV00gb3V0cHV0cyByYW5nZSBmcm9tIC0xLjAgdG8gMS4wLiBUaGV5CisgKiBhcmUgbWFwcGVkCisgKiB0byB0aGUgaGFyZHdhcmUgZGVwZW5kZW50IHZhbHVlcywgaW4gdGhpcyBjYXNlIDAtMjAwMCBmb3IgdGhlIEZQR0EuCisgKiBDaGFuZ2VzIGFyZSBpbW1lZGlhdGVseSBzZW50IHRvIHRoZSBGUEdBLCBhbmQgdGhlIHVwZGF0ZSBvY2N1cnMgYXQgdGhlIG5leHQKKyAqIEZQR0EgY3ljbGUuIFRoZXJlIGlzIG5vIGRlbGF5LgorICoKKyAqIEFzIG9mIHJldmlzaW9uIDAuMS4xMCBvZiB0aGUgRlBHQSwgdGhlIEZQR0EgaW50ZXJwcmV0cyB0aGUgMC0yMDAwIHZhbHVlcyBhcworICogZm9sbG93czoKKyAqICAgLSAyMDAwID0gbWF4aW11bSBwdWxzZSB3aWR0aAorICogICAtIDE5OTkgdG8gMTAwMSA9IGxpbmVhciBzY2FsaW5nIGZyb20gImZ1bGwgZm9yd2FyZCIgdG8gImNlbnRlciIKKyAqICAgLSAxMDAwID0gY2VudGVyIHZhbHVlCisgKiAgIC0gOTk5IHRvIDIgPSBsaW5lYXIgc2NhbGluZyBmcm9tICJjZW50ZXIiIHRvICJmdWxsIHJldmVyc2UiCisgKiAgIC0gMSA9IG1pbmltdW0gcHVsc2Ugd2lkdGggKGN1cnJlbnRseSAuNW1zKQorICogICAtIDAgPSBkaXNhYmxlZCAoaS5lLiBQV00gb3V0cHV0IGlzIGhlbGQgbG93KQorICovCitjbGFzcyBQV00gOiBwdWJsaWMgU2Vuc29yQmFzZSwKKyAgICAgICAgICAgIHB1YmxpYyBJVGFibGVMaXN0ZW5lciwKKyAgICAgICAgICAgIHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUgeworIHB1YmxpYzoKKyAgZW51bSBQZXJpb2RNdWx0aXBsaWVyIHsKKyAgICBrUGVyaW9kTXVsdGlwbGllcl8xWCA9IDEsCisgICAga1BlcmlvZE11bHRpcGxpZXJfMlggPSAyLAorICAgIGtQZXJpb2RNdWx0aXBsaWVyXzRYID0gNAorICB9OworCisgIGV4cGxpY2l0IFBXTSh1aW50MzJfdCBjaGFubmVsKTsKKyAgdmlydHVhbCB+UFdNKCk7CisgIHZpcnR1YWwgdm9pZCBTZXRSYXcodW5zaWduZWQgc2hvcnQgdmFsdWUpOworICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IEdldFJhdygpIGNvbnN0OworICB2b2lkIFNldFBlcmlvZE11bHRpcGxpZXIoUGVyaW9kTXVsdGlwbGllciBtdWx0KTsKKyAgdm9pZCBTZXRaZXJvTGF0Y2goKTsKKyAgdm9pZCBFbmFibGVEZWFkYmFuZEVsaW1pbmF0aW9uKGJvb2wgZWxpbWluYXRlRGVhZGJhbmQpOworICB2b2lkIFNldEJvdW5kcyhpbnQzMl90IG1heCwgaW50MzJfdCBkZWFkYmFuZE1heCwgaW50MzJfdCBjZW50ZXIsCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGVhZGJhbmRNaW4sIGludDMyX3QgbWluKTsKKyAgdm9pZCBTZXRCb3VuZHMoZG91YmxlIG1heCwgZG91YmxlIGRlYWRiYW5kTWF4LCBkb3VibGUgY2VudGVyLAorICAgICAgICAgICAgICAgICBkb3VibGUgZGVhZGJhbmRNaW4sIGRvdWJsZSBtaW4pOworICB1aW50MzJfdCBHZXRDaGFubmVsKCkgY29uc3QgeyByZXR1cm4gbV9jaGFubmVsOyB9CisKKyBwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBrRGVmYXVsdFB3bVBlcmlvZCBpcyBpbiBtcworICAgKgorICAgKiAtIDIwbXMgcGVyaW9kcyAoNTAgSHopIGFyZSB0aGUgInNhZmVzdCIgc2V0dGluZyBpbiB0aGF0IHRoaXMgd29ya3MgZm9yIGFsbAorICAgKiBkZXZpY2VzCisgICAqIC0gMjBtcyBwZXJpb2RzIHNlZW0gdG8gYmUgZGVzaXJhYmxlIGZvciBWZXggTW90b3JzCisgICAqIC0gMjBtcyBwZXJpb2RzIGFyZSB0aGUgc3BlY2lmaWVkIHBlcmlvZCBmb3IgSFMtMzIySEQgc2Vydm9zLCBidXQgd29yaworICAgKiByZWxpYWJseSBkb3duCisgICAqICAgICAgdG8gMTAuMCBtczsgc3RhcnRpbmcgYXQgYWJvdXQgOC41bXMsIHRoZSBzZXJ2byBzb21ldGltZXMgaHVtcyBhbmQgZ2V0CisgICAqaG90OworICAgKiAgICAgIGJ5IDUuMG1zIHRoZSBodW0gaXMgbmVhcmx5IGNvbnRpbnVvdXMKKyAgICogLSAxMG1zIHBlcmlvZHMgd29yayB3ZWxsIGZvciBWaWN0b3IgODg0CisgICAqIC0gNW1zIHBlcmlvZHMgYWxsb3dzIGhpZ2hlciB1cGRhdGUgcmF0ZXMgZm9yIEx1bWluYXJ5IE1pY3JvIEphZ3VhciBzcGVlZAorICAgKiBjb250cm9sbGVycy4KKyAgICogICAgICBEdWUgdG8gdGhlIHNoaXBwaW5nIGZpcm13YXJlIG9uIHRoZSBKYWd1YXIsIHdlIGNhbid0IHJ1biB0aGUgdXBkYXRlCisgICAqIHBlcmlvZCBsZXNzCisgICAqICAgICAgdGhhbiA1LjA1IG1zLgorICAgKgorICAgKiBrRGVmYXVsdFB3bVBlcmlvZCBpcyB0aGUgMXggcGVyaW9kICg1LjA1IG1zKS4gIEluIGhhcmR3YXJlLCB0aGUgcGVyaW9kCisgICAqIHNjYWxpbmcgaXMgaW1wbGVtZW50ZWQgYXMgYW4KKyAgICogb3V0cHV0IHNxdWVsY2ggdG8gZ2V0IGxvbmdlciBwZXJpb2RzIGZvciBvbGQgZGV2aWNlcy4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRQd21QZXJpb2QgPSA1LjA1OworICAvKioKKyAgICoga0RlZmF1bHRQd21DZW50ZXIgaXMgdGhlIFBXTSByYW5nZSBjZW50ZXIgaW4gbXMKKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRQd21DZW50ZXIgPSAxLjU7CisgIC8qKgorICAgKiBrRGVmYXVsdFBXTVN0ZXBzRG93biBpcyB0aGUgbnVtYmVyIG9mIFBXTSBzdGVwcyBiZWxvdyB0aGUgY2VudGVycG9pbnQKKyAgICovCisgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0UHdtU3RlcHNEb3duID0gMTAwMDsKKyAgc3RhdGljIGNvbnN0IGludDMyX3Qga1B3bURpc2FibGVkID0gMDsKKworICB2aXJ0dWFsIHZvaWQgU2V0UG9zaXRpb24oZmxvYXQgcG9zKTsKKyAgdmlydHVhbCBmbG9hdCBHZXRQb3NpdGlvbigpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0U3BlZWQoZmxvYXQgc3BlZWQpOworICB2aXJ0dWFsIGZsb2F0IEdldFNwZWVkKCkgY29uc3Q7CisKKyAgYm9vbCBtX2VsaW1pbmF0ZURlYWRiYW5kOworICBpbnQzMl90IG1fbWF4UHdtOworICBpbnQzMl90IG1fZGVhZGJhbmRNYXhQd207CisgIGludDMyX3QgbV9jZW50ZXJQd207CisgIGludDMyX3QgbV9kZWFkYmFuZE1pblB3bTsKKyAgaW50MzJfdCBtX21pblB3bTsKKworICB2b2lkIFZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIG92ZXJyaWRlOworICB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fdGFibGU7CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBtX2NoYW5uZWw7CisgIGludDMyX3QgR2V0TWF4UG9zaXRpdmVQd20oKSBjb25zdCB7IHJldHVybiBtX21heFB3bTsgfQorICBpbnQzMl90IEdldE1pblBvc2l0aXZlUHdtKCkgY29uc3QgeworICAgIHJldHVybiBtX2VsaW1pbmF0ZURlYWRiYW5kID8gbV9kZWFkYmFuZE1heFB3bSA6IG1fY2VudGVyUHdtICsgMTsKKyAgfQorICBpbnQzMl90IEdldENlbnRlclB3bSgpIGNvbnN0IHsgcmV0dXJuIG1fY2VudGVyUHdtOyB9CisgIGludDMyX3QgR2V0TWF4TmVnYXRpdmVQd20oKSBjb25zdCB7CisgICAgcmV0dXJuIG1fZWxpbWluYXRlRGVhZGJhbmQgPyBtX2RlYWRiYW5kTWluUHdtIDogbV9jZW50ZXJQd20gLSAxOworICB9CisgIGludDMyX3QgR2V0TWluTmVnYXRpdmVQd20oKSBjb25zdCB7IHJldHVybiBtX21pblB3bTsgfQorICBpbnQzMl90IEdldFBvc2l0aXZlU2NhbGVGYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldE1heFBvc2l0aXZlUHdtKCkgLSBHZXRNaW5Qb3NpdGl2ZVB3bSgpOworICB9ICAvLy88IFRoZSBzY2FsZSBmb3IgcG9zaXRpdmUgc3BlZWRzLgorICBpbnQzMl90IEdldE5lZ2F0aXZlU2NhbGVGYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldE1heE5lZ2F0aXZlUHdtKCkgLSBHZXRNaW5OZWdhdGl2ZVB3bSgpOworICB9ICAvLy88IFRoZSBzY2FsZSBmb3IgbmVnYXRpdmUgc3BlZWRzLgorICBpbnQzMl90IEdldEZ1bGxSYW5nZVNjYWxlRmFjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBHZXRNYXhQb3NpdGl2ZVB3bSgpIC0gR2V0TWluTmVnYXRpdmVQd20oKTsKKyAgfSAgLy8vPCBUaGUgc2NhbGUgZm9yIHBvc2l0aW9ucy4KK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvUG93ZXJEaXN0cmlidXRpb25QYW5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMWJkN2MKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuaApAQCAtMCwwICsxLDQ4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX1dQSUxJQl9QT1dFUl9ESVNUUklCVVRJT05fUEFORUxfSF9fCisjZGVmaW5lIF9fV1BJTElCX1BPV0VSX0RJU1RSSUJVVElPTl9QQU5FTF9IX18KKworI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENsYXNzIGZvciBnZXR0aW5nIHZvbHRhZ2UsIGN1cnJlbnQsIHRlbXBlcmF0dXJlLCBwb3dlciBhbmQgZW5lcmd5IGZyb20gdGhlCisgKiBDQU4gUERQLgorICogQGF1dGhvciBUaG9tYXMgQ2xhcmsKKyAqLworY2xhc3MgUG93ZXJEaXN0cmlidXRpb25QYW5lbCA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlIHsKKyBwdWJsaWM6CisgIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwoKTsKKyAgUG93ZXJEaXN0cmlidXRpb25QYW5lbCh1aW50OF90IG1vZHVsZSk7CisKKyAgZG91YmxlIEdldFZvbHRhZ2UoKSBjb25zdDsKKyAgZG91YmxlIEdldFRlbXBlcmF0dXJlKCkgY29uc3Q7CisgIGRvdWJsZSBHZXRDdXJyZW50KHVpbnQ4X3QgY2hhbm5lbCkgY29uc3Q7CisgIGRvdWJsZSBHZXRUb3RhbEN1cnJlbnQoKSBjb25zdDsKKyAgZG91YmxlIEdldFRvdGFsUG93ZXIoKSBjb25zdDsKKyAgZG91YmxlIEdldFRvdGFsRW5lcmd5KCkgY29uc3Q7CisgIHZvaWQgUmVzZXRUb3RhbEVuZXJneSgpOworICB2b2lkIENsZWFyU3RpY2t5RmF1bHRzKCk7CisKKyAgdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworICB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSBvdmVycmlkZTsKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fdGFibGU7CisgIHVpbnQ4X3QgbV9tb2R1bGU7Cit9OworCisjZW5kaWYgLyogX19XUElMSUJfUE9XRVJfRElTVFJJQlVUSU9OX1BBTkVMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9QcmVmZXJlbmNlcy5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9QcmVmZXJlbmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzNiYzQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1ByZWZlcmVuY2VzLmgKQEAgLTAsMCArMSw3MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJUYXNrLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiSEFML2NwcC9TZW1hcGhvcmUuaHBwIgorI2luY2x1ZGUgInRhYmxlcy9JVGFibGVMaXN0ZW5lci5oIgorI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmgiCisKKy8qKgorICogVGhlIHByZWZlcmVuY2VzIGNsYXNzIHByb3ZpZGVzIGEgcmVsYXRpdmVseSBzaW1wbGUgd2F5IHRvIHNhdmUgaW1wb3J0YW50CisgKiB2YWx1ZXMgdG8KKyAqIHRoZSBSb2JvUklPIHRvIGFjY2VzcyB0aGUgbmV4dCB0aW1lIHRoZSBSb2JvUklPIGlzIGJvb3RlZC4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGxvYWRzIGFuZCBzYXZlcyBmcm9tIGEgZmlsZQorICogaW5zaWRlIHRoZSBSb2JvUklPLiAgVGhlIHVzZXIgY2FuIG5vdCBhY2Nlc3MgdGhlIGZpbGUgZGlyZWN0bHksIGJ1dCBtYXkKKyAqIG1vZGlmeSB2YWx1ZXMgYXQgc3BlY2lmaWMKKyAqIGZpZWxkcyB3aGljaCB3aWxsIHRoZW4gYmUgYXV0b21hdGljYWxseSBwZXJpb2RpY2FsbHkgc2F2ZWQgdG8gdGhlIGZpbGUKKyAqIGJ5IHRoZSBOZXR3b3JrVGFibGUgc2VydmVyLjwvcD4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGlzIHRocmVhZCBzYWZlLjwvcD4KKyAqCisgKiA8cD5UaGlzIHdpbGwgYWxzbyBpbnRlcmFjdCB3aXRoIHtAbGluayBOZXR3b3JrVGFibGV9IGJ5IGNyZWF0aW5nIGEgdGFibGUKKyAqIGNhbGxlZCAiUHJlZmVyZW5jZXMiIHdpdGggYWxsIHRoZSBrZXktdmFsdWUgcGFpcnMuPC9wPgorICovCitjbGFzcyBQcmVmZXJlbmNlcyA6IHB1YmxpYyBFcnJvckJhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIFByZWZlcmVuY2VzICpHZXRJbnN0YW5jZSgpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRLZXlzKCk7CisgIHN0ZDo6c3RyaW5nIEdldFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpTdHJpbmdSZWYgZGVmYXVsdFZhbHVlID0gIiIpOworICBpbnQgR2V0SW50KGxsdm06OlN0cmluZ1JlZiBrZXksIGludCBkZWZhdWx0VmFsdWUgPSAwKTsKKyAgZG91YmxlIEdldERvdWJsZShsbHZtOjpTdHJpbmdSZWYga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlID0gMC4wKTsKKyAgZmxvYXQgR2V0RmxvYXQobGx2bTo6U3RyaW5nUmVmIGtleSwgZmxvYXQgZGVmYXVsdFZhbHVlID0gMC4wKTsKKyAgYm9vbCBHZXRCb29sZWFuKGxsdm06OlN0cmluZ1JlZiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlID0gZmFsc2UpOworICBpbnQ2NF90IEdldExvbmcobGx2bTo6U3RyaW5nUmVmIGtleSwgaW50NjRfdCBkZWZhdWx0VmFsdWUgPSAwKTsKKyAgdm9pZCBQdXRTdHJpbmcobGx2bTo6U3RyaW5nUmVmIGtleSwgbGx2bTo6U3RyaW5nUmVmIHZhbHVlKTsKKyAgdm9pZCBQdXRJbnQobGx2bTo6U3RyaW5nUmVmIGtleSwgaW50IHZhbHVlKTsKKyAgdm9pZCBQdXREb3VibGUobGx2bTo6U3RyaW5nUmVmIGtleSwgZG91YmxlIHZhbHVlKTsKKyAgdm9pZCBQdXRGbG9hdChsbHZtOjpTdHJpbmdSZWYga2V5LCBmbG9hdCB2YWx1ZSk7CisgIHZvaWQgUHV0Qm9vbGVhbihsbHZtOjpTdHJpbmdSZWYga2V5LCBib29sIHZhbHVlKTsKKyAgdm9pZCBQdXRMb25nKGxsdm06OlN0cmluZ1JlZiBrZXksIGludDY0X3QgdmFsdWUpOworICBERVBSRUNBVEVEKAorICAgICAgIlNhdmluZyBpcyBub3cgYXV0b21hdGljYWxseSBwZXJmb3JtZWQgYnkgdGhlIE5ldHdvcmtUYWJsZXMgc2VydmVyLiIpCisgIHZvaWQgU2F2ZSgpOworICBib29sIENvbnRhaW5zS2V5KGxsdm06OlN0cmluZ1JlZiBrZXkpOworICB2b2lkIFJlbW92ZShsbHZtOjpTdHJpbmdSZWYga2V5KTsKKworIHByb3RlY3RlZDoKKyAgUHJlZmVyZW5jZXMoKTsKKyAgdmlydHVhbCB+UHJlZmVyZW5jZXMoKSA9IGRlZmF1bHQ7CisKKyBwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworICBjbGFzcyBMaXN0ZW5lciA6IHB1YmxpYyBJVGFibGVMaXN0ZW5lciB7CisgICBwdWJsaWM6CisgICAgdm9pZCBWYWx1ZUNoYW5nZWQoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIG92ZXJyaWRlOworICAgIHZvaWQgVmFsdWVDaGFuZ2VkRXgoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgb3ZlcnJpZGU7CisgIH07CisgIExpc3RlbmVyIG1fbGlzdGVuZXI7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9SZWxheS5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9SZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODIyMjEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1JlbGF5LmgKQEAgLTAsMCArMSw3MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJ0YWJsZXMvSVRhYmxlTGlzdGVuZXIuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorI2luY2x1ZGUgInRhYmxlcy9JVGFibGUuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworY2xhc3MgTW90b3JTYWZldHlIZWxwZXI7CisKKy8qKgorICogQ2xhc3MgZm9yIFNwaWtlIHN0eWxlIHJlbGF5IG91dHB1dHMuCisgKiBSZWxheXMgYXJlIGludGVuZGVkIHRvIGJlIGNvbm5lY3RlZCB0byBzcGlrZXMgb3Igc2ltaWxhciByZWxheXMuIFRoZSByZWxheQorICogY2hhbm5lbHMgY29udHJvbHMKKyAqIGEgcGFpciBvZiBwaW5zIHRoYXQgYXJlIGVpdGhlciBib3RoIG9mZiwgb25lIG9uLCB0aGUgb3RoZXIgb24sIG9yIGJvdGggb24uCisgKiBUaGlzIHRyYW5zbGF0ZXMgaW50bworICogdHdvIHNwaWtlIG91dHB1dHMgYXQgMHYsIG9uZSBhdCAxMnYgYW5kIG9uZSBhdCAwdiwgb25lIGF0IDB2IGFuZCB0aGUgb3RoZXIgYXQKKyAqIDEydiwgb3IgdHdvCisgKiBzcGlrZSBvdXRwdXRzIGF0IDEyVi4gVGhpcyBhbGxvd3Mgb2ZmLCBmdWxsIGZvcndhcmQsIG9yIGZ1bGwgcmV2ZXJzZSBjb250cm9sCisgKiBvZiBtb3RvcnMgd2l0aG91dAorICogdmFyaWFibGUgc3BlZWQuICBJdCBhbHNvIGFsbG93cyB0aGUgdHdvIGNoYW5uZWxzIChmb3J3YXJkIGFuZCByZXZlcnNlKSB0byBiZQorICogdXNlZCBpbmRlcGVuZGVudGx5CisgKiBmb3Igc29tZXRoaW5nIHRoYXQgZG9lcyBub3QgY2FyZSBhYm91dCB2b2x0YWdlIHBvbGF0aXJ5IChsaWtlIGEgc29sZW5vaWQpLgorICovCitjbGFzcyBSZWxheSA6IHB1YmxpYyBNb3RvclNhZmV0eSwKKyAgICAgICAgICAgICAgcHVibGljIFNlbnNvckJhc2UsCisgICAgICAgICAgICAgIHB1YmxpYyBJVGFibGVMaXN0ZW5lciwKKyAgICAgICAgICAgICAgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSB7CisgcHVibGljOgorICBlbnVtIFZhbHVlIHsga09mZiwga09uLCBrRm9yd2FyZCwga1JldmVyc2UgfTsKKyAgZW51bSBEaXJlY3Rpb24geyBrQm90aERpcmVjdGlvbnMsIGtGb3J3YXJkT25seSwga1JldmVyc2VPbmx5IH07CisKKyAgUmVsYXkodWludDMyX3QgY2hhbm5lbCwgRGlyZWN0aW9uIGRpcmVjdGlvbiA9IGtCb3RoRGlyZWN0aW9ucyk7CisgIHZpcnR1YWwgflJlbGF5KCk7CisKKyAgdm9pZCBTZXQoVmFsdWUgdmFsdWUpOworICBWYWx1ZSBHZXQoKSBjb25zdDsKKyAgdWludDMyX3QgR2V0Q2hhbm5lbCgpIGNvbnN0OworCisgIHZvaWQgU2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSBvdmVycmlkZTsKKyAgZmxvYXQgR2V0RXhwaXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzQWxpdmUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTW90b3IoKSBvdmVycmlkZTsKKyAgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0RGVzY3JpcHRpb24oc3RkOjpvc3RyaW5nc3RyZWFtJiBkZXNjKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIFZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIG92ZXJyaWRlOworICB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fdGFibGU7CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBtX2NoYW5uZWw7CisgIERpcmVjdGlvbiBtX2RpcmVjdGlvbjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TW90b3JTYWZldHlIZWxwZXI+IG1fc2FmZXR5SGVscGVyOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvUm9ib3RCYXNlLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1JvYm90QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmY2QxNDYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1JvYm90QmFzZS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQmFzZS5oIgorI2luY2x1ZGUgIlRhc2suaCIKKworY2xhc3MgRHJpdmVyU3RhdGlvbjsKKworI2RlZmluZSBTVEFSVF9ST0JPVF9DTEFTUyhfQ2xhc3NOYW1lXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUhBTEluaXRpYWxpemUoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjpjZXJyIDw8ICJGQVRBTCBFUlJPUjogSEFMIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZCIgPDwgc3RkOjplbmRsOyBcCisgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9MYW5ndWFnZSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprTGFuZ3VhZ2VfQ1BsdXNQbHVzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfQ2xhc3NOYW1lXyAqcm9ib3QgPSBuZXcgX0NsYXNzTmFtZV8oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJvYm90QmFzZTo6cm9ib3RTZXR1cChyb2JvdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvKioKKyAqIEltcGxlbWVudCBhIFJvYm90IFByb2dyYW0gZnJhbWV3b3JrLgorICogVGhlIFJvYm90QmFzZSBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGEgdXNlciBjcmVhdGluZyBhIHJvYm90CisgKiBwcm9ncmFtLgorICogT3ZlcnJpZGRlbiBBdXRvbm9tb3VzKCkgYW5kIE9wZXJhdG9yQ29udHJvbCgpIG1ldGhvZHMgYXJlIGNhbGxlZCBhdCB0aGUKKyAqIGFwcHJvcHJpYXRlIHRpbWUKKyAqIGFzIHRoZSBtYXRjaCBwcm9jZWVkcy4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBBdXRvbm9tb3VzIGNvZGUKKyAqIHdpbGwgcnVuIHRvCisgKiBjb21wbGV0aW9uIGJlZm9yZSB0aGUgT3BlcmF0b3JDb250cm9sIGNvZGUgY291bGQgc3RhcnQuIEluIHRoZSBmdXR1cmUgdGhlCisgKiBBdXRvbm9tb3VzIGNvZGUKKyAqIG1pZ2h0IGJlIHNwYXduZWQgYXMgYSB0YXNrLCB0aGVuIGtpbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBBdXRvbm9tb3VzIHBlcmlvZC4KKyAqLworY2xhc3MgUm9ib3RCYXNlIHsKKyAgZnJpZW5kIGNsYXNzIFJvYm90RGVsZXRlcjsKKworIHB1YmxpYzoKKyAgc3RhdGljIFJvYm90QmFzZSAmZ2V0SW5zdGFuY2UoKTsKKyAgc3RhdGljIHZvaWQgc2V0SW5zdGFuY2UoUm9ib3RCYXNlICpyb2JvdCk7CisKKyAgYm9vbCBJc0VuYWJsZWQoKSBjb25zdDsKKyAgYm9vbCBJc0Rpc2FibGVkKCkgY29uc3Q7CisgIGJvb2wgSXNBdXRvbm9tb3VzKCkgY29uc3Q7CisgIGJvb2wgSXNPcGVyYXRvckNvbnRyb2woKSBjb25zdDsKKyAgYm9vbCBJc1Rlc3QoKSBjb25zdDsKKyAgYm9vbCBJc05ld0RhdGFBdmFpbGFibGUoKSBjb25zdDsKKyAgc3RhdGljIHZvaWQgc3RhcnRSb2JvdFRhc2soRlVOQ1BUUiBmYWN0b3J5KTsKKyAgc3RhdGljIHZvaWQgcm9ib3RUYXNrKEZVTkNQVFIgZmFjdG9yeSwgVGFzayAqdGFzayk7CisgIHZpcnR1YWwgdm9pZCBTdGFydENvbXBldGl0aW9uKCkgPSAwOworCisgIHN0YXRpYyB2b2lkIHJvYm90U2V0dXAoUm9ib3RCYXNlICpyb2JvdCk7CisKKyBwcm90ZWN0ZWQ6CisgIFJvYm90QmFzZSgpOworICB2aXJ0dWFsIH5Sb2JvdEJhc2UoKTsKKworICBSb2JvdEJhc2UoY29uc3QgUm9ib3RCYXNlJikgPSBkZWxldGU7CisgIFJvYm90QmFzZSYgb3BlcmF0b3I9KGNvbnN0IFJvYm90QmFzZSYpID0gZGVsZXRlOworCisgIFRhc2sgKm1fdGFzayA9IG51bGxwdHI7CisgIERyaXZlclN0YXRpb24gJm1fZHM7CisKKyBwcml2YXRlOgorICBzdGF0aWMgUm9ib3RCYXNlICptX2luc3RhbmNlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvUm9ib3REcml2ZS5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9Sb2JvdERyaXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxZTgwZAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvUm9ib3REcml2ZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5LmgiCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKworY2xhc3MgU3BlZWRDb250cm9sbGVyOworY2xhc3MgR2VuZXJpY0hJRDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBoYW5kbGluZyBSb2JvdCBkcml2ZSBiYXNlZCBvbiBhIGRlZmluaXRpb24gb2YgdGhlIG1vdG9yCisgKiBjb25maWd1cmF0aW9uLgorICogVGhlIHJvYm90IGRyaXZlIGNsYXNzIGhhbmRsZXMgYmFzaWMgZHJpdmluZyBmb3IgYSByb2JvdC4gQ3VycmVudGx5LCAyIGFuZCA0CisgKiBtb3RvciB0YW5rIGFuZAorICogbWVjYW51bSBkcml2ZSB0cmFpbnMgYXJlIHN1cHBvcnRlZC4gSW4gdGhlIGZ1dHVyZSBvdGhlciBkcml2ZSB0eXBlcyBsaWtlCisgKiBzd2VydmUgbWlnaHQgYmUKKyAqIGltcGxlbWVudGVkLiBNb3RvciBjaGFubmVsIG51bWJlcnMgYXJlIHBhc3NlZCBzdXBwbGllZCBvbiBjcmVhdGlvbiBvZiB0aGUKKyAqIGNsYXNzLiBUaG9zZQorICogYXJlIHVzZWQgZm9yIGVpdGhlciB0aGUgRHJpdmUgZnVuY3Rpb24gKGludGVuZGVkIGZvciBoYW5kIGNyZWF0ZWQgZHJpdmUgY29kZSwKKyAqIHN1Y2ggYXMKKyAqIGF1dG9ub21vdXMpIG9yIHdpdGggdGhlIFRhbmsvQXJjYWRlIGZ1bmN0aW9ucyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvcgorICogT3BlcmF0b3IgQ29udHJvbAorICogZHJpdmluZy4KKyAqLworY2xhc3MgUm9ib3REcml2ZSA6IHB1YmxpYyBNb3RvclNhZmV0eSwgcHVibGljIEVycm9yQmFzZSB7CisgcHVibGljOgorICBlbnVtIE1vdG9yVHlwZSB7CisgICAga0Zyb250TGVmdE1vdG9yID0gMCwKKyAgICBrRnJvbnRSaWdodE1vdG9yID0gMSwKKyAgICBrUmVhckxlZnRNb3RvciA9IDIsCisgICAga1JlYXJSaWdodE1vdG9yID0gMworICB9OworCisgIFJvYm90RHJpdmUodWludDMyX3QgbGVmdE1vdG9yQ2hhbm5lbCwgdWludDMyX3QgcmlnaHRNb3RvckNoYW5uZWwpOworICBSb2JvdERyaXZlKHVpbnQzMl90IGZyb250TGVmdE1vdG9yQ2hhbm5lbCwgdWludDMyX3QgcmVhckxlZnRNb3RvckNoYW5uZWwsCisgICAgICAgICAgICAgdWludDMyX3QgZnJvbnRSaWdodE1vdG9yQ2hhbm5lbCwgdWludDMyX3QgcmVhclJpZ2h0TW90b3JDaGFubmVsKTsKKyAgUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgKmxlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyICpyaWdodE1vdG9yKTsKKyAgUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgJmxlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyICZyaWdodE1vdG9yKTsKKyAgUm9ib3REcml2ZShzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBsZWZ0TW90b3IsCisgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gcmlnaHRNb3Rvcik7CisgIFJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICpmcm9udExlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyICpyZWFyTGVmdE1vdG9yLAorICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlciAqZnJvbnRSaWdodE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJlYXJSaWdodE1vdG9yKTsKKyAgUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgJmZyb250TGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgJnJlYXJMZWZ0TW90b3IsCisgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyICZmcm9udFJpZ2h0TW90b3IsIFNwZWVkQ29udHJvbGxlciAmcmVhclJpZ2h0TW90b3IpOworICBSb2JvdERyaXZlKHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IGZyb250TGVmdE1vdG9yLAorICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IHJlYXJMZWZ0TW90b3IsCisgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gZnJvbnRSaWdodE1vdG9yLAorICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IHJlYXJSaWdodE1vdG9yKTsKKyAgdmlydHVhbCB+Um9ib3REcml2ZSgpID0gZGVmYXVsdDsKKworICBSb2JvdERyaXZlKGNvbnN0IFJvYm90RHJpdmUmKSA9IGRlbGV0ZTsKKyAgUm9ib3REcml2ZSYgb3BlcmF0b3I9KGNvbnN0IFJvYm90RHJpdmUmKSA9IGRlbGV0ZTsKKworICB2b2lkIERyaXZlKGZsb2F0IG91dHB1dE1hZ25pdHVkZSwgZmxvYXQgY3VydmUpOworICB2b2lkIFRhbmtEcml2ZShHZW5lcmljSElEICpsZWZ0U3RpY2ssIEdlbmVyaWNISUQgKnJpZ2h0U3RpY2ssCisgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworICB2b2lkIFRhbmtEcml2ZShHZW5lcmljSElEICZsZWZ0U3RpY2ssIEdlbmVyaWNISUQgJnJpZ2h0U3RpY2ssCisgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworICB2b2lkIFRhbmtEcml2ZShHZW5lcmljSElEICpsZWZ0U3RpY2ssIHVpbnQzMl90IGxlZnRBeGlzLAorICAgICAgICAgICAgICAgICBHZW5lcmljSElEICpyaWdodFN0aWNrLCB1aW50MzJfdCByaWdodEF4aXMsCisgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworICB2b2lkIFRhbmtEcml2ZShHZW5lcmljSElEICZsZWZ0U3RpY2ssIHVpbnQzMl90IGxlZnRBeGlzLAorICAgICAgICAgICAgICAgICBHZW5lcmljSElEICZyaWdodFN0aWNrLCB1aW50MzJfdCByaWdodEF4aXMsCisgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworICB2b2lkIFRhbmtEcml2ZShmbG9hdCBsZWZ0VmFsdWUsIGZsb2F0IHJpZ2h0VmFsdWUsIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworICB2b2lkIEFyY2FkZURyaXZlKEdlbmVyaWNISUQgKnN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKyAgdm9pZCBBcmNhZGVEcml2ZShHZW5lcmljSElEICZzdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisgIHZvaWQgQXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAqbW92ZVN0aWNrLCB1aW50MzJfdCBtb3ZlQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICBHZW5lcmljSElEICpyb3RhdGVTdGljaywgdWludDMyX3Qgcm90YXRlQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKyAgdm9pZCBBcmNhZGVEcml2ZShHZW5lcmljSElEICZtb3ZlU3RpY2ssIHVpbnQzMl90IG1vdmVDaGFubmVsLAorICAgICAgICAgICAgICAgICAgIEdlbmVyaWNISUQgJnJvdGF0ZVN0aWNrLCB1aW50MzJfdCByb3RhdGVDaGFubmVsLAorICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworICB2b2lkIEFyY2FkZURyaXZlKGZsb2F0IG1vdmVWYWx1ZSwgZmxvYXQgcm90YXRlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisgIHZvaWQgTWVjYW51bURyaXZlX0NhcnRlc2lhbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGd5cm9BbmdsZSA9IDAuMCk7CisgIHZvaWQgTWVjYW51bURyaXZlX1BvbGFyKGZsb2F0IG1hZ25pdHVkZSwgZmxvYXQgZGlyZWN0aW9uLCBmbG9hdCByb3RhdGlvbik7CisgIHZvaWQgSG9sb25vbWljRHJpdmUoZmxvYXQgbWFnbml0dWRlLCBmbG9hdCBkaXJlY3Rpb24sIGZsb2F0IHJvdGF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIFNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhmbG9hdCBsZWZ0T3V0cHV0LCBmbG9hdCByaWdodE91dHB1dCk7CisgIHZvaWQgU2V0SW52ZXJ0ZWRNb3RvcihNb3RvclR5cGUgbW90b3IsIGJvb2wgaXNJbnZlcnRlZCk7CisgIHZvaWQgU2V0U2Vuc2l0aXZpdHkoZmxvYXQgc2Vuc2l0aXZpdHkpOworICB2b2lkIFNldE1heE91dHB1dChkb3VibGUgbWF4T3V0cHV0KTsKKyAgdm9pZCBTZXRDQU5KYWd1YXJTeW5jR3JvdXAodWludDhfdCBzeW5jR3JvdXApOworCisgIHZvaWQgU2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSBvdmVycmlkZTsKKyAgZmxvYXQgR2V0RXhwaXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzQWxpdmUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTW90b3IoKSBvdmVycmlkZTsKKyAgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0RGVzY3JpcHRpb24oc3RkOjpvc3RyaW5nc3RyZWFtJiBkZXNjKSBjb25zdCBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBJbml0Um9ib3REcml2ZSgpOworICBmbG9hdCBMaW1pdChmbG9hdCBudW0pOworICB2b2lkIE5vcm1hbGl6ZShkb3VibGUgKndoZWVsU3BlZWRzKTsKKyAgdm9pZCBSb3RhdGVWZWN0b3IoZG91YmxlICZ4LCBkb3VibGUgJnksIGRvdWJsZSBhbmdsZSk7CisKKyAgc3RhdGljIGNvbnN0IGludDMyX3Qga01heE51bWJlck9mTW90b3JzID0gNDsKKyAgZmxvYXQgbV9zZW5zaXRpdml0eSA9IDAuNTsKKyAgZG91YmxlIG1fbWF4T3V0cHV0ID0gMS4wOworICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBtX2Zyb250TGVmdE1vdG9yOworICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBtX2Zyb250UmlnaHRNb3RvcjsKKyAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gbV9yZWFyTGVmdE1vdG9yOworICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBtX3JlYXJSaWdodE1vdG9yOworICBzdGQ6OnVuaXF1ZV9wdHI8TW90b3JTYWZldHlIZWxwZXI+IG1fc2FmZXR5SGVscGVyOworICB1aW50OF90IG1fc3luY0dyb3VwID0gMDsKKworIHByaXZhdGU6CisgIGludDMyX3QgR2V0TnVtTW90b3JzKCkgeworICAgIGludCBtb3RvcnMgPSAwOworICAgIGlmIChtX2Zyb250TGVmdE1vdG9yKSBtb3RvcnMrKzsKKyAgICBpZiAobV9mcm9udFJpZ2h0TW90b3IpIG1vdG9ycysrOworICAgIGlmIChtX3JlYXJMZWZ0TW90b3IpIG1vdG9ycysrOworICAgIGlmIChtX3JlYXJSaWdodE1vdG9yKSBtb3RvcnMrKzsKKyAgICByZXR1cm4gbW90b3JzOworICB9Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TUEkuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvU1BJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzM2RkNwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvU1BJLmgKQEAgLTAsMCArMSw3MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKK2NsYXNzIERpZ2l0YWxPdXRwdXQ7CitjbGFzcyBEaWdpdGFsSW5wdXQ7CisKKy8qKgorICogU1BJIGJ1cyBpbnRlcmZhY2UgY2xhc3MuCisgKgorICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlbnNvciAoYW5kIG90aGVyIFNQSSBkZXZpY2UpIGRyaXZlcnMuCisgKiBJdCBwcm9iYWJseSBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuCisgKgorICovCitjbGFzcyBTUEkgOiBwdWJsaWMgU2Vuc29yQmFzZSB7CisgcHVibGljOgorICBlbnVtIFBvcnQgeyBrT25ib2FyZENTMCwga09uYm9hcmRDUzEsIGtPbmJvYXJkQ1MyLCBrT25ib2FyZENTMywga01YUCB9OworICBTUEkoUG9ydCBTUElwb3J0KTsKKyAgdmlydHVhbCB+U1BJKCk7CisKKyAgU1BJKGNvbnN0IFNQSSYpID0gZGVsZXRlOworICBTUEkmIG9wZXJhdG9yPShjb25zdCBTUEkmKSA9IGRlbGV0ZTsKKworICB2b2lkIFNldENsb2NrUmF0ZShkb3VibGUgaHopOworCisgIHZvaWQgU2V0TVNCRmlyc3QoKTsKKyAgdm9pZCBTZXRMU0JGaXJzdCgpOworCisgIHZvaWQgU2V0U2FtcGxlRGF0YU9uRmFsbGluZygpOworICB2b2lkIFNldFNhbXBsZURhdGFPblJpc2luZygpOworCisgIHZvaWQgU2V0Q2xvY2tBY3RpdmVMb3coKTsKKyAgdm9pZCBTZXRDbG9ja0FjdGl2ZUhpZ2goKTsKKworICB2b2lkIFNldENoaXBTZWxlY3RBY3RpdmVIaWdoKCk7CisgIHZvaWQgU2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpOworCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZSh1aW50OF90KiBkYXRhLCB1aW50OF90IHNpemUpOworICB2aXJ0dWFsIGludDMyX3QgUmVhZChib29sIGluaXRpYXRlLCB1aW50OF90KiBkYXRhUmVjZWl2ZWQsIHVpbnQ4X3Qgc2l6ZSk7CisgIHZpcnR1YWwgaW50MzJfdCBUcmFuc2FjdGlvbih1aW50OF90KiBkYXRhVG9TZW5kLCB1aW50OF90KiBkYXRhUmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNpemUpOworCisgIHZvaWQgSW5pdEFjY3VtdWxhdG9yKGRvdWJsZSBwZXJpb2QsIHVpbnQzMl90IGNtZCwgdWludDhfdCB4ZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbGlkX21hc2ssIHVpbnQzMl90IHZhbGlkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRhdGFfc2hpZnQsIHVpbnQ4X3QgZGF0YV9zaXplLCBib29sIGlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiaWdfZW5kaWFuKTsKKyAgdm9pZCBGcmVlQWNjdW11bGF0b3IoKTsKKyAgdm9pZCBSZXNldEFjY3VtdWxhdG9yKCk7CisgIHZvaWQgU2V0QWNjdW11bGF0b3JDZW50ZXIoaW50MzJfdCBjZW50ZXIpOworICB2b2lkIFNldEFjY3VtdWxhdG9yRGVhZGJhbmQoaW50MzJfdCBkZWFkYmFuZCk7CisgIGludDMyX3QgR2V0QWNjdW11bGF0b3JMYXN0VmFsdWUoKSBjb25zdDsKKyAgaW50NjRfdCBHZXRBY2N1bXVsYXRvclZhbHVlKCkgY29uc3Q7CisgIHVpbnQzMl90IEdldEFjY3VtdWxhdG9yQ291bnQoKSBjb25zdDsKKyAgZG91YmxlIEdldEFjY3VtdWxhdG9yQXZlcmFnZSgpIGNvbnN0OworICB2b2lkIEdldEFjY3VtdWxhdG9yT3V0cHV0KGludDY0X3QgJnZhbHVlLCB1aW50MzJfdCAmY291bnQpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICB1aW50OF90IG1fcG9ydDsKKyAgYm9vbCBtX21zYkZpcnN0ID0gZmFsc2U7IC8vIGRlZmF1bHQgbGl0dGxlLWVuZGlhbgorICBib29sIG1fc2FtcGxlT25UcmFpbGluZyA9IGZhbHNlOyAvLyBkZWZhdWx0IGRhdGEgdXBkYXRlZCBvbiBmYWxsaW5nIGVkZ2UKKyAgYm9vbCBtX2Nsa19pZGxlX2hpZ2ggPSBmYWxzZTsgLy8gZGVmYXVsdCBjbG9jayBhY3RpdmUgaGlnaAorCisgcHJpdmF0ZToKKyAgdm9pZCBJbml0KCk7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TYWZlUFdNLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NhZmVQV00uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY0NjI2Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TYWZlUFdNLmgKQEAgLTAsMCArMSw0MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgorI2luY2x1ZGUgIlBXTS5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8qKgorICogQSBzYWZlIHZlcnNpb24gb2YgdGhlIFBXTSBjbGFzcy4KKyAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpdCBpbXBsZW1lbnRzIHRoZSBNb3RvclNhZmV0eSBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcworICogdGltZW91dHMKKyAqIGluIHRoZSBldmVudCB0aGF0IHRoZSBtb3RvciB2YWx1ZSBpcyBub3QgdXBkYXRlZCBiZWZvcmUgdGhlIGV4cGlyYXRpb24gdGltZS4KKyAqIFRoaXMgZGVsZWdhdGVzIHRoZSBhY3R1YWwgd29yayB0byBhIE1vdG9yU2FmZXR5SGVscGVyIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yCisgKiBhbGwKKyAqIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgTW90b3JTYWZldHkuCisgKi8KK2NsYXNzIFNhZmVQV00gOiBwdWJsaWMgUFdNLCBwdWJsaWMgTW90b3JTYWZldHkgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2FmZVBXTSh1aW50MzJfdCBjaGFubmVsKTsKKyAgdmlydHVhbCB+U2FmZVBXTSgpID0gZGVmYXVsdDsKKworICB2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCk7CisgIGZsb2F0IEdldEV4cGlyYXRpb24oKSBjb25zdDsKKyAgYm9vbCBJc0FsaXZlKCkgY29uc3Q7CisgIHZvaWQgU3RvcE1vdG9yKCk7CisgIGJvb2wgSXNTYWZldHlFbmFibGVkKCkgY29uc3Q7CisgIHZvaWQgU2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpOworICB2b2lkIEdldERlc2NyaXB0aW9uKHN0ZDo6b3N0cmluZ3N0cmVhbSYgZGVzYykgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIFNldFNwZWVkKGZsb2F0IHNwZWVkKTsKKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxNb3RvclNhZmV0eUhlbHBlcj4gbV9zYWZldHlIZWxwZXI7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TYW1wbGVSb2JvdC5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TYW1wbGVSb2JvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2EzMmMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NhbXBsZVJvYm90LmgKQEAgLTAsMCArMSwyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJSb2JvdEJhc2UuaCIKKworY2xhc3MgU2FtcGxlUm9ib3QgOiBwdWJsaWMgUm9ib3RCYXNlIHsKKyBwdWJsaWM6CisgIFNhbXBsZVJvYm90KCk7CisgIHZpcnR1YWwgflNhbXBsZVJvYm90KCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIHZvaWQgUm9ib3RJbml0KCk7CisgIHZpcnR1YWwgdm9pZCBEaXNhYmxlZCgpOworICB2aXJ0dWFsIHZvaWQgQXV0b25vbW91cygpOworICB2aXJ0dWFsIHZvaWQgT3BlcmF0b3JDb250cm9sKCk7CisgIHZpcnR1YWwgdm9pZCBUZXN0KCk7CisgIHZpcnR1YWwgdm9pZCBSb2JvdE1haW4oKTsKKyAgdm9pZCBTdGFydENvbXBldGl0aW9uKCk7CisKKyBwcml2YXRlOgorICBib29sIG1fcm9ib3RNYWluT3ZlcnJpZGRlbjsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NlcmlhbFBvcnQuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvU2VyaWFsUG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDFjMWMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NlcmlhbFBvcnQuaApAQCAtMCwwICsxLDczIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorCisvKioKKyAqIERyaXZlciBmb3IgdGhlIFJTLTIzMiBzZXJpYWwgcG9ydCBvbiB0aGUgUm9ib1JJTy4KKyAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBWSVNBIGZvcm1hdHRlZCBJL08gbW9kZS4gIFRoaXMgbWVhbnMgdGhhdAorICogICBhbGwgdHJhZmZpYyBnb2VzIHRocm91Z2ggdGhlIGZvbWF0dGVkIGJ1ZmZlcnMuICBUaGlzIGFsbG93cyB0aGUKKyAqIGludGVybWluZ2xlZAorICogICB1c2Ugb2YgUHJpbnRmKCksIFNjYW5mKCksIGFuZCB0aGUgcmF3IGJ1ZmZlciBhY2Nlc3NvcnMgUmVhZCgpIGFuZCBXcml0ZSgpLgorICoKKyAqIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBOSS1WSVNBIFVzZXIgTWFudWFsIGhlcmU6CisgKiAgIGh0dHA6Ly93d3cubmkuY29tL3BkZi9tYW51YWxzLzM3MDQyM2EucGRmCisgKiBhbmQgdGhlIE5JLVZJU0EgUHJvZ3JhbW1lcidzIFJlZmVyZW5jZSBNYW51YWwgaGVyZToKKyAqICAgaHR0cDovL3d3dy5uaS5jb20vcGRmL21hbnVhbHMvMzcwMTMyYy5wZGYKKyAqLworY2xhc3MgU2VyaWFsUG9ydCA6IHB1YmxpYyBFcnJvckJhc2UgeworIHB1YmxpYzoKKyAgZW51bSBQYXJpdHkgeworICAgIGtQYXJpdHlfTm9uZSA9IDAsCisgICAga1Bhcml0eV9PZGQgPSAxLAorICAgIGtQYXJpdHlfRXZlbiA9IDIsCisgICAga1Bhcml0eV9NYXJrID0gMywKKyAgICBrUGFyaXR5X1NwYWNlID0gNAorICB9OworICBlbnVtIFN0b3BCaXRzIHsKKyAgICBrU3RvcEJpdHNfT25lID0gMTAsCisgICAga1N0b3BCaXRzX09uZVBvaW50Rml2ZSA9IDE1LAorICAgIGtTdG9wQml0c19Ud28gPSAyMAorICB9OworICBlbnVtIEZsb3dDb250cm9sIHsKKyAgICBrRmxvd0NvbnRyb2xfTm9uZSA9IDAsCisgICAga0Zsb3dDb250cm9sX1hvblhvZmYgPSAxLAorICAgIGtGbG93Q29udHJvbF9SdHNDdHMgPSAyLAorICAgIGtGbG93Q29udHJvbF9EdHJEc3IgPSA0CisgIH07CisgIGVudW0gV3JpdGVCdWZmZXJNb2RlIHsga0ZsdXNoT25BY2Nlc3MgPSAxLCBrRmx1c2hXaGVuRnVsbCA9IDIgfTsKKyAgZW51bSBQb3J0IHsga09uYm9hcmQgPSAwLCBrTVhQID0gMSwga1VTQiA9IDIgfTsKKworICBTZXJpYWxQb3J0KHVpbnQzMl90IGJhdWRSYXRlLCBQb3J0IHBvcnQgPSBrT25ib2FyZCwgdWludDhfdCBkYXRhQml0cyA9IDgsCisgICAgICAgICAgICAgUGFyaXR5IHBhcml0eSA9IGtQYXJpdHlfTm9uZSwgU3RvcEJpdHMgc3RvcEJpdHMgPSBrU3RvcEJpdHNfT25lKTsKKyAgflNlcmlhbFBvcnQoKTsKKworICBTZXJpYWxQb3J0KGNvbnN0IFNlcmlhbFBvcnQmKSA9IGRlbGV0ZTsKKyAgU2VyaWFsUG9ydCYgb3BlcmF0b3I9KGNvbnN0IFNlcmlhbFBvcnQmKSA9IGRlbGV0ZTsKKworICB2b2lkIFNldEZsb3dDb250cm9sKEZsb3dDb250cm9sIGZsb3dDb250cm9sKTsKKyAgdm9pZCBFbmFibGVUZXJtaW5hdGlvbihjaGFyIHRlcm1pbmF0b3IgPSAnXG4nKTsKKyAgdm9pZCBEaXNhYmxlVGVybWluYXRpb24oKTsKKyAgaW50MzJfdCBHZXRCeXRlc1JlY2VpdmVkKCk7CisgIHVpbnQzMl90IFJlYWQoY2hhciAqYnVmZmVyLCBpbnQzMl90IGNvdW50KTsKKyAgdWludDMyX3QgV3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcgJmJ1ZmZlciwgaW50MzJfdCBjb3VudCk7CisgIHZvaWQgU2V0VGltZW91dChmbG9hdCB0aW1lb3V0KTsKKyAgdm9pZCBTZXRSZWFkQnVmZmVyU2l6ZSh1aW50MzJfdCBzaXplKTsKKyAgdm9pZCBTZXRXcml0ZUJ1ZmZlclNpemUodWludDMyX3Qgc2l6ZSk7CisgIHZvaWQgU2V0V3JpdGVCdWZmZXJNb2RlKFdyaXRlQnVmZmVyTW9kZSBtb2RlKTsKKyAgdm9pZCBGbHVzaCgpOworICB2b2lkIFJlc2V0KCk7CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBtX3Jlc291cmNlTWFuYWdlckhhbmRsZSA9IDA7CisgIHVpbnQzMl90IG1fcG9ydEhhbmRsZSA9IDA7CisgIGJvb2wgbV9jb25zb2xlTW9kZUVuYWJsZWQgPSBmYWxzZTsKKyAgdWludDhfdCBtX3BvcnQ7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TZXJ2by5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TZXJ2by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MGQ5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NlcnZvLmgKQEAgLTAsMCArMSw1MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogU3RhbmRhcmQgaG9iYnkgc3R5bGUgc2Vydm8uCisgKgorICogVGhlIHJhbmdlIHBhcmFtZXRlcnMgZGVmYXVsdCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciB0aGUgSGl0ZWMgSFMtMzIySEQKKyAqIHNlcnZvIHByb3ZpZGVkCisgKiBpbiB0aGUgRklSU1QgS2l0IG9mIFBhcnRzIGluIDIwMDguCisgKi8KK2NsYXNzIFNlcnZvIDogcHVibGljIFNhZmVQV00geworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2Vydm8odWludDMyX3QgY2hhbm5lbCk7CisgIHZpcnR1YWwgflNlcnZvKCk7CisgIHZvaWQgU2V0KGZsb2F0IHZhbHVlKTsKKyAgdm9pZCBTZXRPZmZsaW5lKCk7CisgIGZsb2F0IEdldCgpIGNvbnN0OworICB2b2lkIFNldEFuZ2xlKGZsb2F0IGFuZ2xlKTsKKyAgZmxvYXQgR2V0QW5nbGUoKSBjb25zdDsKKyAgc3RhdGljIGZsb2F0IEdldE1heEFuZ2xlKCkgeyByZXR1cm4ga01heFNlcnZvQW5nbGU7IH0KKyAgc3RhdGljIGZsb2F0IEdldE1pbkFuZ2xlKCkgeyByZXR1cm4ga01pblNlcnZvQW5nbGU7IH0KKworICB2b2lkIFZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIG92ZXJyaWRlOworICB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fdGFibGU7CisKKyBwcml2YXRlOgorICBmbG9hdCBHZXRTZXJ2b0FuZ2xlUmFuZ2UoKSBjb25zdCB7IHJldHVybiBrTWF4U2Vydm9BbmdsZSAtIGtNaW5TZXJ2b0FuZ2xlOyB9CisKKyAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrTWF4U2Vydm9BbmdsZSA9IDE4MC4wOworICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtNaW5TZXJ2b0FuZ2xlID0gMC4wOworCisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNYXhTZXJ2b1BXTSA9IDIuNDsKKyAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1pblNlcnZvUFdNID0gLjY7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9Tb2xlbm9pZC5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9Tb2xlbm9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2Q1M2EKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NvbGVub2lkLmgKQEAgLTAsMCArMSw0NSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTb2xlbm9pZEJhc2UuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorI2luY2x1ZGUgInRhYmxlcy9JVGFibGVMaXN0ZW5lci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIFNvbGVub2lkIGNsYXNzIGZvciBydW5uaW5nIGhpZ2ggdm9sdGFnZSBEaWdpdGFsIE91dHB1dCAoUENNKS4KKyAqCisgKiBUaGUgU29sZW5vaWQgY2xhc3MgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHBuZXVtYXRpY3Mgc29sZW5vaWRzLCBidXQgY291bGQgYmUKKyAqIHVzZWQKKyAqIGZvciBhbnkgZGV2aWNlIHdpdGhpbiB0aGUgY3VycmVudCBzcGVjIG9mIHRoZSBQQ00uCisgKi8KK2NsYXNzIFNvbGVub2lkIDogcHVibGljIFNvbGVub2lkQmFzZSwKKyAgICAgICAgICAgICAgICAgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSwKKyAgICAgICAgICAgICAgICAgcHVibGljIElUYWJsZUxpc3RlbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNvbGVub2lkKHVpbnQzMl90IGNoYW5uZWwpOworICBTb2xlbm9pZCh1aW50OF90IG1vZHVsZU51bWJlciwgdWludDMyX3QgY2hhbm5lbCk7CisgIHZpcnR1YWwgflNvbGVub2lkKCk7CisgIHZpcnR1YWwgdm9pZCBTZXQoYm9vbCBvbik7CisgIHZpcnR1YWwgYm9vbCBHZXQoKSBjb25zdDsKKyAgYm9vbCBJc0JsYWNrTGlzdGVkKCkgY29uc3Q7CisKKyAgdm9pZCBWYWx1ZUNoYW5nZWQoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KTsKKyAgdm9pZCBVcGRhdGVUYWJsZSgpOworICB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKTsKKyAgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKTsKKyAgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Q7CisgIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHVpbnQzMl90IG1fY2hhbm5lbDsgIC8vLzwgVGhlIGNoYW5uZWwgb24gdGhlIG1vZHVsZSB0byBjb250cm9sLgorICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvU29sZW5vaWRCYXNlLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NvbGVub2lkQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OWJlZWIKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NvbGVub2lkQmFzZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiSEFML1BvcnQuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworLyoqCisgKiBTb2xlbm9pZEJhc2UgY2xhc3MgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciB0aGUgU29sZW5vaWQgYW5kCisgKiBEb3VibGVTb2xlbm9pZCBjbGFzc2VzLgorICovCitjbGFzcyBTb2xlbm9pZEJhc2UgOiBwdWJsaWMgU2Vuc29yQmFzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Tb2xlbm9pZEJhc2UoKSA9IGRlZmF1bHQ7CisgIHVpbnQ4X3QgR2V0QWxsKGludCBtb2R1bGUgPSAwKSBjb25zdDsKKworICB1aW50OF90IEdldFBDTVNvbGVub2lkQmxhY2tMaXN0KGludCBtb2R1bGUpIGNvbnN0OworICBib29sIEdldFBDTVNvbGVub2lkVm9sdGFnZVN0aWNreUZhdWx0KGludCBtb2R1bGUpIGNvbnN0OworICBib29sIEdldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KGludCBtb2R1bGUpIGNvbnN0OworICB2b2lkIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKGludCBtb2R1bGUpOworCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBTb2xlbm9pZEJhc2UodWludDhfdCBwY21JRCk7CisgIHZvaWQgU2V0KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgbWFzaywgaW50IG1vZHVsZSk7CisgIGNvbnN0IHN0YXRpYyBpbnQgbV9tYXhNb2R1bGVzID0gNjM7CisgIGNvbnN0IHN0YXRpYyBpbnQgbV9tYXhQb3J0cyA9IDg7CisgIHN0YXRpYyB2b2lkKiBtX3BvcnRzW21fbWF4TW9kdWxlc11bbV9tYXhQb3J0c107CisgIHVpbnQzMl90IG1fbW9kdWxlTnVtYmVyOyAgLy8vPCBTbG90IG51bWJlciB3aGVyZSB0aGUgbW9kdWxlIGlzIHBsdWdnZWQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL3RoZSBjaGFzc2lzLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFJlc291cmNlPiBtX2FsbG9jYXRlZDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1NwZWVkQ29udHJvbGxlci5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TcGVlZENvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdlZDJiCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9TcGVlZENvbnRyb2xsZXIuaApAQCAtMCwwICsxLDUwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorCisvKioKKyAqIEludGVyZmFjZSBmb3Igc3BlZWQgY29udHJvbGxpbmcgZGV2aWNlcy4KKyAqLworY2xhc3MgU3BlZWRDb250cm9sbGVyIDogcHVibGljIFBJRE91dHB1dCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5TcGVlZENvbnRyb2xsZXIoKSA9IGRlZmF1bHQ7CisgIC8qKgorICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBzZXR0aW5nIHRoZSBzcGVlZCBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisgICAqCisgICAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdG8gc2V0LiAgVmFsdWUgc2hvdWxkIGJlIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICAgKiBAcGFyYW0gc3luY0dyb3VwIFRoZSB1cGRhdGUgZ3JvdXAgdG8gYWRkIHRoaXMgU2V0KCkgdG8sIHBlbmRpbmcKKyAgICogVXBkYXRlU3luY0dyb3VwKCkuICBJZiAwLCB1cGRhdGUgaW1tZWRpYXRlbHkuCisgICAqLworICB2aXJ0dWFsIHZvaWQgU2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCA9IDApID0gMDsKKworICAvKioKKyAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzZXQgc3BlZWQgb2YgYSBzcGVlZCBjb250cm9sbGVyLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldCBzcGVlZC4gIFZhbHVlIGlzIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICAgKi8KKyAgdmlydHVhbCBmbG9hdCBHZXQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICogQ29tbW9uIGludGVyZmFjZSBmb3IgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisgICogQHBhcmFtIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KKyAgKi8KKyAgdmlydHVhbCB2b2lkIFNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgPSAwOworICAvKioKKworICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBEaXNhYmxlKCkgPSAwOworCisgIC8qKgorICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciByZXR1cm5pbmcgdGhlIGludmVyc2lvbiBzdGF0ZSBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisgICAqIEByZXR1cm4gaXNJbnZlcnRlZCBUaGUgc3RhdGUgb2YgaW52ZXJzaW9uLCB0cnVlIGlzIGludmVydGVkLgorICAgKi8KKyAgdmlydHVhbCBib29sIEdldEludmVydGVkKCkgY29uc3QgPSAwOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVGFsb24uaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVGFsb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODc2NGI4Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9UYWxvbi5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2FmZVBXTS5oIgorI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorCisvKioKKyAqIENyb3NzIHRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBUYWxvbiBhbmQgVGFsb24gU1IgU3BlZWQgQ29udHJvbGxlcgorICovCitjbGFzcyBUYWxvbiA6IHB1YmxpYyBTYWZlUFdNLCBwdWJsaWMgU3BlZWRDb250cm9sbGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFRhbG9uKHVpbnQzMl90IGNoYW5uZWwpOworICB2aXJ0dWFsIH5UYWxvbigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB2b2lkIFNldChmbG9hdCB2YWx1ZSwgdWludDhfdCBzeW5jR3JvdXAgPSAwKSBvdmVycmlkZTsKKyAgdmlydHVhbCBmbG9hdCBHZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIERpc2FibGUoKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHZvaWQgUElEV3JpdGUoZmxvYXQgb3V0cHV0KSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRJbnZlcnRlZCgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgYm9vbCBtX2lzSW52ZXJ0ZWQgPSBmYWxzZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1RhbG9uU1JYLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1RhbG9uU1JYLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxOTcyMwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVGFsb25TUlguaApAQCAtMCwwICsxLDMxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBDcm9zcyB0aGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgVGFsb24gU1JYIFNwZWVkIENvbnRyb2xsZXIgd2l0aCBQV00gY29udHJvbAorICogQHNlZSBDQU5UYWxvbiBmb3IgQ0FOIGNvbnRyb2wKKyAqLworY2xhc3MgVGFsb25TUlggOiBwdWJsaWMgU2FmZVBXTSwgcHVibGljIFNwZWVkQ29udHJvbGxlciB7CisgcHVibGljOgorICBleHBsaWNpdCBUYWxvblNSWCh1aW50MzJfdCBjaGFubmVsKTsKKyAgdmlydHVhbCB+VGFsb25TUlgoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBEaXNhYmxlKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBTZXRJbnZlcnRlZChib29sIGlzSW52ZXJ0ZWQpIG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgR2V0SW52ZXJ0ZWQoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGJvb2wgbV9pc0ludmVydGVkID0gZmFsc2U7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9VU0JDYW1lcmEuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVVNCQ2FtZXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyYzVkMwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVVNCQ2FtZXJhLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCisvKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAibml2aXNpb24uaCIKKyNpbmNsdWRlICJOSUlNQVFkeC5oIgorI2luY2x1ZGUgIkhBTC9jcHAvcHJpb3JpdHlfbXV0ZXguaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKwordHlwZWRlZiBlbnVtIHdoaXRlQmFsYW5jZV9lbnVtIHsKKyAga0ZpeGVkSW5kb29yID0gMzAwMCwKKyAga0ZpeGVkT3V0ZG9vcjEgPSA0MDAwLAorICBrRml4ZWRPdXRkb29yMiA9IDUwMDAsCisgIGtGaXhlZEZsdW9yZXNjZW50MSA9IDUxMDAsCisgIGtGaXhlZEZsb3VyZXNjZW50MiA9IDUyMDAKK30gd2hpdGVCYWxhbmNlOworCitjbGFzcyBVU0JDYW1lcmEgOiBwdWJsaWMgRXJyb3JCYXNlIHsKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QgKkFUVFJfV0JfTU9ERSA9CisgICAgICAiQ2FtZXJhQXR0cmlidXRlczo6V2hpdGVCYWxhbmNlOjpNb2RlIjsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0ICpBVFRSX1dCX1ZBTFVFID0KKyAgICAgICJDYW1lcmFBdHRyaWJ1dGVzOjpXaGl0ZUJhbGFuY2U6OlZhbHVlIjsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0ICpBVFRSX0VYX01PREUgPQorICAgICAgIkNhbWVyYUF0dHJpYnV0ZXM6OkV4cG9zdXJlOjpNb2RlIjsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0ICpBVFRSX0VYX1ZBTFVFID0KKyAgICAgICJDYW1lcmFBdHRyaWJ1dGVzOjpFeHBvc3VyZTo6VmFsdWUiOworICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QgKkFUVFJfQlJfTU9ERSA9CisgICAgICAiQ2FtZXJhQXR0cmlidXRlczo6QnJpZ2h0bmVzczo6TW9kZSI7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCAqQVRUUl9CUl9WQUxVRSA9CisgICAgICAiQ2FtZXJhQXR0cmlidXRlczo6QnJpZ2h0bmVzczo6VmFsdWUiOworCisgIC8vIENvbnN0YW50cyBmb3IgdGhlIG1hbnVhbCBhbmQgYXV0byB0eXBlcworICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIEFVVE8gPSAiQXV0byI7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogTUFOVUFMID0gIk1hbnVhbCI7CisKKyBwcm90ZWN0ZWQ6CisgIElNQVFkeFNlc3Npb24gbV9pZCA9IDA7CisgIHN0ZDo6c3RyaW5nIG1fbmFtZTsKKyAgYm9vbCBtX3VzZUpwZWc7CisgIGJvb2wgbV9hY3RpdmUgPSBmYWxzZTsKKyAgYm9vbCBtX29wZW4gPSBmYWxzZTsKKworICBwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggbV9tdXRleDsKKworICB1bnNpZ25lZCBpbnQgbV93aWR0aCA9IDMyMDsKKyAgdW5zaWduZWQgaW50IG1faGVpZ2h0ID0gMjQwOworICBkb3VibGUgbV9mcHMgPSAzMDsKKyAgc3RkOjpzdHJpbmcgbV93aGl0ZUJhbGFuY2UgPSBBVVRPOworICB1bnNpZ25lZCBpbnQgbV93aGl0ZUJhbGFuY2VWYWx1ZSA9IDA7CisgIGJvb2wgbV93aGl0ZUJhbGFuY2VWYWx1ZVByZXNlbnQgPSBmYWxzZTsKKyAgc3RkOjpzdHJpbmcgbV9leHBvc3VyZSA9IE1BTlVBTDsKKyAgdW5zaWduZWQgaW50IG1fZXhwb3N1cmVWYWx1ZSA9IDUwOworICBib29sIG1fZXhwb3N1cmVWYWx1ZVByZXNlbnQgPSBmYWxzZTsKKyAgdW5zaWduZWQgaW50IG1fYnJpZ2h0bmVzcyA9IDgwOworICBib29sIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gdHJ1ZTsKKworICB1bnNpZ25lZCBpbnQgR2V0SnBlZ1NpemUodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgYnVmZlNpemUpOworCisgcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QgKmtEZWZhdWx0Q2FtZXJhTmFtZSA9ICJjYW0wIjsKKworICBVU0JDYW1lcmEoc3RkOjpzdHJpbmcgbmFtZSwgYm9vbCB1c2VKcGVnKTsKKworICB2b2lkIE9wZW5DYW1lcmEoKTsKKyAgdm9pZCBDbG9zZUNhbWVyYSgpOworICB2b2lkIFN0YXJ0Q2FwdHVyZSgpOworICB2b2lkIFN0b3BDYXB0dXJlKCk7CisgIHZvaWQgU2V0RlBTKGRvdWJsZSBmcHMpOworICB2b2lkIFNldFNpemUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KTsKKworICB2b2lkIFVwZGF0ZVNldHRpbmdzKCk7CisgIC8qKgorICAgKiBTZXQgdGhlIGJyaWdodG5lc3MsIGFzIGEgcGVyY2VudGFnZSAoMC0xMDApLgorICAgKi8KKyAgdm9pZCBTZXRCcmlnaHRuZXNzKHVuc2lnbmVkIGludCBicmlnaHRuZXNzKTsKKworICAvKioKKyAgICogR2V0IHRoZSBicmlnaHRuZXNzLCBhcyBhIHBlcmNlbnRhZ2UgKDAtMTAwKS4KKyAgICovCisgIHVuc2lnbmVkIGludCBHZXRCcmlnaHRuZXNzKCk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgd2hpdGUgYmFsYW5jZSB0byBhdXRvCisgICAqLworICB2b2lkIFNldFdoaXRlQmFsYW5jZUF1dG8oKTsKKworICAvKioKKyAgICogU2V0IHRoZSB3aGl0ZSBiYWxhbmNlIHRvIGhvbGQgY3VycmVudAorICAgKi8KKyAgdm9pZCBTZXRXaGl0ZUJhbGFuY2VIb2xkQ3VycmVudCgpOworCisgIC8qKgorICAgKiBTZXQgdGhlIHdoaXRlIGJhbGFuY2UgdG8gbWFudWFsLCB3aXRoIHNwZWNpZmllZCBjb2xvciB0ZW1wZXJhdHVyZQorICAgKi8KKyAgdm9pZCBTZXRXaGl0ZUJhbGFuY2VNYW51YWwodW5zaWduZWQgaW50IHdiVmFsdWUpOworCisgIC8qKgorICAgKiBTZXQgdGhlIGV4cG9zdXJlIHRvIGF1dG8gZXhwb3N1cmUKKyAgICovCisgIHZvaWQgU2V0RXhwb3N1cmVBdXRvKCk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgZXhwb3N1cmUgdG8gaG9sZCBjdXJyZW50CisgICAqLworICB2b2lkIFNldEV4cG9zdXJlSG9sZEN1cnJlbnQoKTsKKworICAvKioKKyAgICogU2V0IHRoZSBleHBvc3VyZSB0byBtYW51YWwsIHdpdGggYSBnaXZlbiBwZXJjZW50YWdlICgwLTEwMCkKKyAgICovCisgIHZvaWQgU2V0RXhwb3N1cmVNYW51YWwodW5zaWduZWQgaW50IGV4cFZhbHVlKTsKKworICB2b2lkIEdldEltYWdlKEltYWdlICppbWFnZSk7CisgIHVuc2lnbmVkIGludCBHZXRJbWFnZURhdGEodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgYnVmZmVyU2l6ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9VbHRyYXNvbmljLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1VsdHJhc29uaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM2MTcxCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9VbHRyYXNvbmljLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlICJUYXNrLmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaCIKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlICJIQUwvY3BwL3ByaW9yaXR5X211dGV4LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK2NsYXNzIERpZ2l0YWxJbnB1dDsKK2NsYXNzIERpZ2l0YWxPdXRwdXQ7CisKKy8qKgorICogVWx0cmFzb25pYyByYW5nZWZpbmRlciBjbGFzcy4KKyAqIFRoZSBVbHRyYXNvbmljIHJhbmdlZmluZGVyIG1lYXN1cmVzIGFic29sdXRlIGRpc3RhbmNlIGJhc2VkIG9uIHRoZSByb3VuZC10cmlwCisgKiB0aW1lCisgKiBvZiBhIHBpbmcgZ2VuZXJhdGVkIGJ5IHRoZSBjb250cm9sbGVyLiBUaGVzZSBzZW5zb3JzIHVzZSB0d28gdHJhbnNkdWNlcnMsIGEKKyAqIHNwZWFrZXIgYW5kCisgKiBhIG1pY3JvcGhvbmUgYm90aCB0dW5lZCB0byB0aGUgdWx0cmFzb25pYyByYW5nZS4gQSBjb21tb24gdWx0cmFzb25pYyBzZW5zb3IsCisgKiB0aGUgRGF2ZW50ZWNoIFNSRjA0CisgKiByZXF1aXJlcyBhIHNob3J0IHB1bHNlIHRvIGJlIGdlbmVyYXRlZCBvbiBhIGRpZ2l0YWwgY2hhbm5lbC4gVGhpcyBjYXVzZXMgdGhlCisgKiBjaGlycCB0byBiZQorICogZW1taXR0ZWQuIEEgc2Vjb25kIGxpbmUgYmVjb21lcyBoaWdoIGFzIHRoZSBwaW5nIGlzIHRyYW5zbWl0dGVkIGFuZCBnb2VzIGxvdworICogd2hlbgorICogdGhlIGVjaG8gaXMgcmVjZWl2ZWQuIFRoZSB0aW1lIHRoYXQgdGhlIGxpbmUgaXMgaGlnaCBkZXRlcm1pbmVzIHRoZSByb3VuZAorICogdHJpcCBkaXN0YW5jZQorICogKHRpbWUgb2YgZmxpZ2h0KS4KKyAqLworY2xhc3MgVWx0cmFzb25pYyA6IHB1YmxpYyBTZW5zb3JCYXNlLAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQSURTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSB7CisgcHVibGljOgorICBlbnVtIERpc3RhbmNlVW5pdCB7IGtJbmNoZXMgPSAwLCBrTWlsbGlNZXRlcnMgPSAxIH07CisKKyAgVWx0cmFzb25pYyhEaWdpdGFsT3V0cHV0ICpwaW5nQ2hhbm5lbCwgRGlnaXRhbElucHV0ICplY2hvQ2hhbm5lbCwKKyAgICAgICAgICAgICBEaXN0YW5jZVVuaXQgdW5pdHMgPSBrSW5jaGVzKTsKKworICBVbHRyYXNvbmljKERpZ2l0YWxPdXRwdXQgJnBpbmdDaGFubmVsLCBEaWdpdGFsSW5wdXQgJmVjaG9DaGFubmVsLAorICAgICAgICAgICAgIERpc3RhbmNlVW5pdCB1bml0cyA9IGtJbmNoZXMpOworCisgIFVsdHJhc29uaWMoc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxPdXRwdXQ+IHBpbmdDaGFubmVsLAorICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsSW5wdXQ+IGVjaG9DaGFubmVsLAorICAgICAgICAgICAgIERpc3RhbmNlVW5pdCB1bml0cyA9IGtJbmNoZXMpOworICBVbHRyYXNvbmljKHVpbnQzMl90IHBpbmdDaGFubmVsLCB1aW50MzJfdCBlY2hvQ2hhbm5lbCwKKyAgICAgICAgICAgICBEaXN0YW5jZVVuaXQgdW5pdHMgPSBrSW5jaGVzKTsKKyAgdmlydHVhbCB+VWx0cmFzb25pYygpOworCisgIHZvaWQgUGluZygpOworICBib29sIElzUmFuZ2VWYWxpZCgpIGNvbnN0OworICBzdGF0aWMgdm9pZCBTZXRBdXRvbWF0aWNNb2RlKGJvb2wgZW5hYmxpbmcpOworICBkb3VibGUgR2V0UmFuZ2VJbmNoZXMoKSBjb25zdDsKKyAgZG91YmxlIEdldFJhbmdlTU0oKSBjb25zdDsKKyAgYm9vbCBJc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtX2VuYWJsZWQ7IH0KKyAgdm9pZCBTZXRFbmFibGVkKGJvb2wgZW5hYmxlKSB7IG1fZW5hYmxlZCA9IGVuYWJsZTsgfQorCisgIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSBvdmVycmlkZTsKKyAgdm9pZCBTZXREaXN0YW5jZVVuaXRzKERpc3RhbmNlVW5pdCB1bml0cyk7CisgIERpc3RhbmNlVW5pdCBHZXREaXN0YW5jZVVuaXRzKCkgY29uc3Q7CisKKyAgdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworICB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSBvdmVycmlkZTsKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHZvaWQgSW5pdGlhbGl6ZSgpOworCisgIHN0YXRpYyB2b2lkIFVsdHJhc29uaWNDaGVja2VyKCk7CisKKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1BpbmdUaW1lID0KKyAgICAgIDEwICogMWUtNjsgIC8vLzwgVGltZSAoc2VjKSBmb3IgdGhlIHBpbmcgdHJpZ2dlciBwdWxzZS4KKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtQcmlvcml0eSA9CisgICAgICA2NDsgIC8vLzwgUHJpb3JpdHkgdGhhdCB0aGUgdWx0cmFzb25pYyByb3VuZCByb2JpbiB0YXNrIHJ1bnMuCisgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtNYXhVbHRyYXNvbmljVGltZSA9CisgICAgICAwLjE7ICAvLy88IE1heCB0aW1lIChtcykgYmV0d2VlbiByZWFkaW5ncy4KKyAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1NwZWVkT2ZTb3VuZEluY2hlc1BlclNlYyA9IDExMzAuMCAqIDEyLjA7CisKKyAgc3RhdGljIFRhc2sgbV90YXNrOyAgLy8gdGFzayBkb2luZyB0aGUgcm91bmQtcm9iaW4gYXV0b21hdGljIHNlbnNpbmcKKyAgc3RhdGljIFVsdHJhc29uaWMgKm1fZmlyc3RTZW5zb3I7ICAvLyBoZWFkIG9mIHRoZSB1bHRyYXNvbmljIHNlbnNvciBsaXN0CisgIHN0YXRpYyBzdGQ6OmF0b21pYzxib29sPiBtX2F1dG9tYXRpY0VuYWJsZWQ7IC8vIGF1dG9tYXRpYyByb3VuZCByb2JpbiBtb2RlCisgIHN0YXRpYyBwcmlvcml0eV9tdXRleCBtX211dGV4OyAgLy8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBsaXN0IG9mIHNlbnNvcnMKKworICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbE91dHB1dD4gbV9waW5nQ2hhbm5lbDsKKyAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxJbnB1dD4gbV9lY2hvQ2hhbm5lbDsKKyAgYm9vbCBtX2VuYWJsZWQgPSBmYWxzZTsKKyAgQ291bnRlciBtX2NvdW50ZXI7CisgIFVsdHJhc29uaWMgKm1fbmV4dFNlbnNvcjsKKyAgRGlzdGFuY2VVbml0IG1fdW5pdHM7CisKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1ZpY3Rvci5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU5NTVmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaWN0b3IuaApAQCAtMCwwICsxLDM0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBWZXggUm9ib3RpY3MgVmljdG9yIDg4OCBTcGVlZCBDb250cm9sbGVyCisgKgorICogVGhlIFZleCBSb2JvdGljcyBWaWN0b3IgODg0IFNwZWVkIENvbnRyb2xsZXIgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoaXMKKyAqIGNsYXNzIGJ1dCBtYXkgbmVlZCB0byBiZSBjYWxpYnJhdGVkIHBlciB0aGUgVmljdG9yIDg4NCB1c2VyIG1hbnVhbC4KKyAqLworY2xhc3MgVmljdG9yIDogcHVibGljIFNhZmVQV00sIHB1YmxpYyBTcGVlZENvbnRyb2xsZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVmljdG9yKHVpbnQzMl90IGNoYW5uZWwpOworICB2aXJ0dWFsIH5WaWN0b3IoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBEaXNhYmxlKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIFNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRJbnZlcnRlZCgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgYm9vbCBtX2lzSW52ZXJ0ZWQgPSBmYWxzZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1ZpY3RvclNQLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1ZpY3RvclNQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4Y2QwYQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmljdG9yU1AuaApAQCAtMCwwICsxLDMxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBWZXggUm9ib3RpY3MgVmljdG9yIFNQIFNwZWVkIENvbnRyb2xsZXIKKyAqLworY2xhc3MgVmljdG9yU1AgOiBwdWJsaWMgU2FmZVBXTSwgcHVibGljIFNwZWVkQ29udHJvbGxlciB7CisgcHVibGljOgorICBleHBsaWNpdCBWaWN0b3JTUCh1aW50MzJfdCBjaGFubmVsKTsKKyAgdmlydHVhbCB+VmljdG9yU1AoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBEaXNhYmxlKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIFNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRJbnZlcnRlZCgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgYm9vbCBtX2lzSW52ZXJ0ZWQgPSBmYWxzZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9BeGlzQ2FtZXJhLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9BeGlzQ2FtZXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxNTkzOAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0F4aXNDYW1lcmEuaApAQCAtMCwwICsxLDEyMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJIQUwvY3BwL3ByaW9yaXR5X211dGV4LmgiCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJWaXNpb24vQ29sb3JJbWFnZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9IU0xJbWFnZS5oIgorI2luY2x1ZGUgIm5pdmlzaW9uLmgiCisKKy8qKgorICogQXhpcyBNMTAxMSBuZXR3b3JrIGNhbWVyYQorICovCitjbGFzcyBBeGlzQ2FtZXJhIDogcHVibGljIEVycm9yQmFzZSB7CisgcHVibGljOgorICBlbnVtIFdoaXRlQmFsYW5jZSB7CisgICAga1doaXRlQmFsYW5jZV9BdXRvbWF0aWMsCisgICAga1doaXRlQmFsYW5jZV9Ib2xkLAorICAgIGtXaGl0ZUJhbGFuY2VfRml4ZWRPdXRkb29yMSwKKyAgICBrV2hpdGVCYWxhbmNlX0ZpeGVkT3V0ZG9vcjIsCisgICAga1doaXRlQmFsYW5jZV9GaXhlZEluZG9vciwKKyAgICBrV2hpdGVCYWxhbmNlX0ZpeGVkRmx1b3Jlc2NlbnQxLAorICAgIGtXaGl0ZUJhbGFuY2VfRml4ZWRGbHVvcmVzY2VudDIKKyAgfTsKKworICBlbnVtIEV4cG9zdXJlQ29udHJvbCB7CisgICAga0V4cG9zdXJlQ29udHJvbF9BdXRvbWF0aWMsCisgICAga0V4cG9zdXJlQ29udHJvbF9Ib2xkLAorICAgIGtFeHBvc3VyZUNvbnRyb2xfRmxpY2tlckZyZWU1MEh6LAorICAgIGtFeHBvc3VyZUNvbnRyb2xfRmxpY2tlckZyZWU2MEh6CisgIH07CisKKyAgZW51bSBSZXNvbHV0aW9uIHsKKyAgICBrUmVzb2x1dGlvbl82NDB4NDgwLAorICAgIGtSZXNvbHV0aW9uXzQ4MHgzNjAsCisgICAga1Jlc29sdXRpb25fMzIweDI0MCwKKyAgICBrUmVzb2x1dGlvbl8yNDB4MTgwLAorICAgIGtSZXNvbHV0aW9uXzE3NngxNDQsCisgICAga1Jlc29sdXRpb25fMTYweDEyMCwKKyAgfTsKKworICBlbnVtIFJvdGF0aW9uIHsga1JvdGF0aW9uXzAsIGtSb3RhdGlvbl8xODAgfTsKKworICBleHBsaWNpdCBBeGlzQ2FtZXJhKHN0ZDo6c3RyaW5nIGNvbnN0ICZjYW1lcmFIb3N0KTsKKyAgdmlydHVhbCB+QXhpc0NhbWVyYSgpOworCisgIEF4aXNDYW1lcmEoY29uc3QgQXhpc0NhbWVyYSYpID0gZGVsZXRlOworICBBeGlzQ2FtZXJhJiBvcGVyYXRvcj0oY29uc3QgQXhpc0NhbWVyYSYpID0gZGVsZXRlOworCisgIGJvb2wgSXNGcmVzaEltYWdlKCkgY29uc3Q7CisKKyAgaW50IEdldEltYWdlKEltYWdlICppbWFnZSk7CisgIGludCBHZXRJbWFnZShDb2xvckltYWdlICppbWFnZSk7CisgIEhTTEltYWdlICpHZXRJbWFnZSgpOworICBpbnQgQ29weUpQRUcoY2hhciAqKmRlc3RJbWFnZSwgdW5zaWduZWQgaW50ICZkZXN0SW1hZ2VTaXplLAorICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICZkZXN0SW1hZ2VCdWZmZXJTaXplKTsKKworICB2b2lkIFdyaXRlQnJpZ2h0bmVzcyhpbnQgYnJpZ2h0bmVzcyk7CisgIGludCBHZXRCcmlnaHRuZXNzKCk7CisKKyAgdm9pZCBXcml0ZVdoaXRlQmFsYW5jZShXaGl0ZUJhbGFuY2Ugd2hpdGVCYWxhbmNlKTsKKyAgV2hpdGVCYWxhbmNlIEdldFdoaXRlQmFsYW5jZSgpOworCisgIHZvaWQgV3JpdGVDb2xvckxldmVsKGludCBjb2xvckxldmVsKTsKKyAgaW50IEdldENvbG9yTGV2ZWwoKTsKKworICB2b2lkIFdyaXRlRXhwb3N1cmVDb250cm9sKEV4cG9zdXJlQ29udHJvbCBleHBvc3VyZUNvbnRyb2wpOworICBFeHBvc3VyZUNvbnRyb2wgR2V0RXhwb3N1cmVDb250cm9sKCk7CisKKyAgdm9pZCBXcml0ZUV4cG9zdXJlUHJpb3JpdHkoaW50IGV4cG9zdXJlUHJpb3JpdHkpOworICBpbnQgR2V0RXhwb3N1cmVQcmlvcml0eSgpOworCisgIHZvaWQgV3JpdGVNYXhGUFMoaW50IG1heEZQUyk7CisgIGludCBHZXRNYXhGUFMoKTsKKworICB2b2lkIFdyaXRlUmVzb2x1dGlvbihSZXNvbHV0aW9uIHJlc29sdXRpb24pOworICBSZXNvbHV0aW9uIEdldFJlc29sdXRpb24oKTsKKworICB2b2lkIFdyaXRlQ29tcHJlc3Npb24oaW50IGNvbXByZXNzaW9uKTsKKyAgaW50IEdldENvbXByZXNzaW9uKCk7CisKKyAgdm9pZCBXcml0ZVJvdGF0aW9uKFJvdGF0aW9uIHJvdGF0aW9uKTsKKyAgUm90YXRpb24gR2V0Um90YXRpb24oKTsKKworIHByaXZhdGU6CisgIHN0ZDo6dGhyZWFkIG1fY2FwdHVyZVRocmVhZDsKKyAgc3RkOjpzdHJpbmcgbV9jYW1lcmFIb3N0OworICBpbnQgbV9jYW1lcmFTb2NrZXQgPSAtMTsKKyAgcHJpb3JpdHlfbXV0ZXggbV9jYXB0dXJlTXV0ZXg7CisKKyAgcHJpb3JpdHlfbXV0ZXggbV9pbWFnZURhdGFNdXRleDsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9pbWFnZURhdGE7CisgIGJvb2wgbV9mcmVzaEltYWdlID0gZmFsc2U7CisKKyAgaW50IG1fYnJpZ2h0bmVzcyA9IDUwOworICBXaGl0ZUJhbGFuY2UgbV93aGl0ZUJhbGFuY2UgPSBrV2hpdGVCYWxhbmNlX0F1dG9tYXRpYzsKKyAgaW50IG1fY29sb3JMZXZlbCA9IDUwOworICBFeHBvc3VyZUNvbnRyb2wgbV9leHBvc3VyZUNvbnRyb2wgPSBrRXhwb3N1cmVDb250cm9sX0F1dG9tYXRpYzsKKyAgaW50IG1fZXhwb3N1cmVQcmlvcml0eSA9IDUwOworICBpbnQgbV9tYXhGUFMgPSAwOworICBSZXNvbHV0aW9uIG1fcmVzb2x1dGlvbiA9IGtSZXNvbHV0aW9uXzY0MHg0ODA7CisgIGludCBtX2NvbXByZXNzaW9uID0gNTA7CisgIFJvdGF0aW9uIG1fcm90YXRpb24gPSBrUm90YXRpb25fMDsKKyAgYm9vbCBtX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisgIGJvb2wgbV9zdHJlYW1EaXJ0eSA9IHRydWU7CisgIHByaW9yaXR5X211dGV4IG1fcGFyYW1ldGVyc011dGV4OworCisgIGJvb2wgbV9kb25lID0gZmFsc2U7CisKKyAgdm9pZCBDYXB0dXJlKCk7CisgIHZvaWQgUmVhZEltYWdlc0Zyb21DYW1lcmEoKTsKKyAgYm9vbCBXcml0ZVBhcmFtZXRlcnMoKTsKKworICBpbnQgQ3JlYXRlQ2FtZXJhU29ja2V0KHN0ZDo6c3RyaW5nIGNvbnN0ICZyZXF1ZXN0U3RyaW5nLCBib29sIHNldEVycm9yKTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9CYWVVdGlsaXRpZXMuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0JhZVV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODNlZjQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9CYWVVdGlsaXRpZXMuaApAQCAtMCwwICsxLDY2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisKKy8qICBDb25zdGFudHMgKi8KKyNkZWZpbmUgTE9HX0RFQlVHIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBERUJVR19UWVBFCisjZGVmaW5lIExPR19JTkZPIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBJTkZPX1RZUEUKKyNkZWZpbmUgTE9HX0VSUk9SIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBFUlJPUl9UWVBFCisjZGVmaW5lIExPR19DUklUSUNBTCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgQ1JJVElDQUxfVFlQRQorI2RlZmluZSBMT0dfRkFUQUwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIEZBVEFMX1RZUEUKKyNkZWZpbmUgTE9HX0RFQlVHIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBERUJVR19UWVBFCisKKy8qICAgRW51bWVyYXRlZCBUeXBlcyAqLworCisvKiogZGVidWcgbGV2ZWxzICovCitlbnVtIGRwcmludF90eXBlIHsKKyAgREVCVUdfVFlQRSwKKyAgSU5GT19UWVBFLAorICBFUlJPUl9UWVBFLAorICBDUklUSUNBTF9UWVBFLAorICBGQVRBTF9UWVBFCit9OworCisvKiogZGVidWcgb3V0cHV0IHNldHRpbmcgKi8KK3R5cGVkZWYgZW51bSBEZWJ1Z091dHB1dFR5cGVfZW51bSB7CisgIERFQlVHX09GRiwKKyAgREVCVUdfTU9TVExZX09GRiwKKyAgREVCVUdfU0NSRUVOX09OTFksCisgIERFQlVHX0ZJTEVfT05MWSwKKyAgREVCVUdfU0NSRUVOX0FORF9GSUxFCit9IERlYnVnT3V0cHV0VHlwZTsKKworLyogIEVudW1lcmF0ZWQgVHlwZXMgKi8KKworLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyogZGVidWcgKi8KK3ZvaWQgU2V0RGVidWdGbGFnKERlYnVnT3V0cHV0VHlwZSBmbGFnKTsKK3ZvaWQgZHByaW50Zihjb25zdCBjaGFyICp0ZW1wU3RyaW5nLCAuLi4pOyAvKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0ICovCisKKy8qIHNldCBGUkMgcmFuZ2VzIGZvciBkcml2ZSAqLworZG91YmxlIFJhbmdlVG9Ob3JtYWxpemVkKGRvdWJsZSBwaXhlbCwgaW50IHJhbmdlKTsKKy8qIGNoYW5nZSBub3JtYWxpemVkIHZhbHVlIHRvIGFueSByYW5nZSAtIHVzZWQgZm9yIHNlcnZvICovCitmbG9hdCBOb3JtYWxpemVUb1JhbmdlKGZsb2F0IG5vcm1hbGl6ZWRWYWx1ZSwgZmxvYXQgbWluUmFuZ2UsIGZsb2F0IG1heFJhbmdlKTsKK2Zsb2F0IE5vcm1hbGl6ZVRvUmFuZ2UoZmxvYXQgbm9ybWFsaXplZFZhbHVlKTsKKworLyogc3lzdGVtIHV0aWxpdGllcyAqLwordm9pZCBTaG93QWN0aXZpdHkoY2hhciAqZm10LCAuLi4pOworZG91YmxlIEVsYXBzZWRUaW1lKGRvdWJsZSBzdGFydFRpbWUpOworCisvKiBzZXJ2byBwYW5uaW5nIHV0aWxpdGllcyAqLworY2xhc3MgU2Vydm87Citkb3VibGUgU2luUG9zaXRpb24oZG91YmxlICpwZXJpb2QsIGRvdWJsZSBzaW5TdGFydCk7Cit2b2lkIHBhbkluaXQoKTsKK3ZvaWQgcGFuSW5pdChkb3VibGUgcGVyaW9kKTsKK3ZvaWQgcGFuRm9yVGFyZ2V0KFNlcnZvICpwYW5TZXJ2byk7Cit2b2lkIHBhbkZvclRhcmdldChTZXJ2byAqcGFuU2Vydm8sIGRvdWJsZSBzaW5TdGFydCk7CisKKy8qIGNvbmZpZyBmaWxlIHJlYWQgdXRpbGl0aWVzICovCitpbnQgcHJvY2Vzc0ZpbGUoY2hhciAqaW5wdXRGaWxlLCBjaGFyICpvdXRwdXRTdHJpbmcsIGludCBsaW5lTnVtYmVyKTsKK2ludCBlbXB0eVN0cmluZyhjaGFyICpzdHJpbmcpOwordm9pZCBzdHJpcFN0cmluZyhjaGFyICpzdHJpbmcpOwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaXNpb24vQmluYXJ5SW1hZ2UuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0JpbmFyeUltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3YjI1YwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0JpbmFyeUltYWdlLmgKQEAgLTAsMCArMSw0MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiTW9ub0ltYWdlLmgiCisvKioKKyAqIEluY2x1ZGVkIGZvciBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IGRlZmluaXRpb24KKyAqIFRPRE86IEVsaW1pbmF0ZSB0aGlzIGRlcGVuZGVuY3khCisgKi8KKyNpbmNsdWRlICJWaXNpb24vVmlzaW9uQVBJLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCitjbGFzcyBCaW5hcnlJbWFnZSA6IHB1YmxpYyBNb25vSW1hZ2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+QmluYXJ5SW1hZ2UoKSA9IGRlZmF1bHQ7CisgIGludCBHZXROdW1iZXJQYXJ0aWNsZXMoKTsKKyAgUGFydGljbGVBbmFseXNpc1JlcG9ydCBHZXRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0KGludCBwYXJ0aWNsZU51bWJlcik7CisgIHZvaWQgR2V0UGFydGljbGVBbmFseXNpc1JlcG9ydChpbnQgcGFydGljbGVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0ICpwYXIpOworICBzdGQ6OnZlY3RvcjxQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0PiAqR2V0T3JkZXJlZFBhcnRpY2xlQW5hbHlzaXNSZXBvcnRzKCk7CisgIEJpbmFyeUltYWdlICpSZW1vdmVTbWFsbE9iamVjdHMoYm9vbCBjb25uZWN0aXZpdHk4LCBpbnQgZXJvc2lvbnMpOworICBCaW5hcnlJbWFnZSAqUmVtb3ZlTGFyZ2VPYmplY3RzKGJvb2wgY29ubmVjdGl2aXR5OCwgaW50IGVyb3Npb25zKTsKKyAgQmluYXJ5SW1hZ2UgKkNvbnZleEh1bGwoYm9vbCBjb25uZWN0aXZpdHk4KTsKKyAgQmluYXJ5SW1hZ2UgKlBhcnRpY2xlRmlsdGVyKFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyICpjcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjcml0ZXJpYUNvdW50KTsKKyAgdmlydHVhbCB2b2lkIFdyaXRlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKTsKKworIHByaXZhdGU6CisgIGJvb2wgUGFydGljbGVNZWFzdXJlbWVudChpbnQgcGFydGljbGVOdW1iZXIsIE1lYXN1cmVtZW50VHlwZSB3aGF0VG9NZWFzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZXN1bHQpOworICBib29sIFBhcnRpY2xlTWVhc3VyZW1lbnQoaW50IHBhcnRpY2xlTnVtYmVyLCBNZWFzdXJlbWVudFR5cGUgd2hhdFRvTWVhc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqcmVzdWx0KTsKKyAgc3RhdGljIGRvdWJsZSBOb3JtYWxpemVGcm9tUmFuZ2UoZG91YmxlIHBvc2l0aW9uLCBpbnQgcmFuZ2UpOworICBzdGF0aWMgYm9vbCBDb21wYXJlUGFydGljbGVTaXplcyhQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IHBhcnRpY2xlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGljbGVBbmFseXNpc1JlcG9ydCBwYXJ0aWNsZTIpOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0NvbG9ySW1hZ2UuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0NvbG9ySW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA0YWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaXNpb24vQ29sb3JJbWFnZS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkltYWdlQmFzZS5oIgorI2luY2x1ZGUgIkJpbmFyeUltYWdlLmgiCisjaW5jbHVkZSAiVGhyZXNob2xkLmgiCisKK2NsYXNzIENvbG9ySW1hZ2UgOiBwdWJsaWMgSW1hZ2VCYXNlIHsKKyBwdWJsaWM6CisgIENvbG9ySW1hZ2UoSW1hZ2VUeXBlIHR5cGUpOworICB2aXJ0dWFsIH5Db2xvckltYWdlKCkgPSBkZWZhdWx0OworICBCaW5hcnlJbWFnZSAqVGhyZXNob2xkUkdCKGludCByZWRMb3csIGludCByZWRIaWdoLCBpbnQgZ3JlZW5Mb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuSGlnaCwgaW50IGJsdWVMb3csIGludCBibHVlSGlnaCk7CisgIEJpbmFyeUltYWdlICpUaHJlc2hvbGRIU0woaW50IGh1ZUxvdywgaW50IGh1ZUhpZ2gsIGludCBzYXR1cmF0aW9uTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYXR1cmF0aW9uSGlnaCwgaW50IGx1bWluZW5jZUxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHVtaW5lbmNlSGlnaCk7CisgIEJpbmFyeUltYWdlICpUaHJlc2hvbGRIU1YoaW50IGh1ZUxvdywgaW50IGh1ZUhpZ2gsIGludCBzYXR1cmF0aW9uTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYXR1cmF0aW9uSGlnaCwgaW50IHZhbHVlSGlnaCwgaW50IHZhbHVlTG93KTsKKyAgQmluYXJ5SW1hZ2UgKlRocmVzaG9sZEhTSShpbnQgaHVlTG93LCBpbnQgaHVlSGlnaCwgaW50IHNhdHVyYXRpb25Mb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhdHVyYXRpb25IaWdoLCBpbnQgaW50ZW5zaXR5TG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlbnNpdHlIaWdoKTsKKyAgQmluYXJ5SW1hZ2UgKlRocmVzaG9sZFJHQihUaHJlc2hvbGQgJnRocmVzaG9sZCk7CisgIEJpbmFyeUltYWdlICpUaHJlc2hvbGRIU0woVGhyZXNob2xkICZ0aHJlc2hvbGQpOworICBCaW5hcnlJbWFnZSAqVGhyZXNob2xkSFNWKFRocmVzaG9sZCAmdGhyZXNob2xkKTsKKyAgQmluYXJ5SW1hZ2UgKlRocmVzaG9sZEhTSShUaHJlc2hvbGQgJnRocmVzaG9sZCk7CisgIE1vbm9JbWFnZSAqR2V0UmVkUGxhbmUoKTsKKyAgTW9ub0ltYWdlICpHZXRHcmVlblBsYW5lKCk7CisgIE1vbm9JbWFnZSAqR2V0Qmx1ZVBsYW5lKCk7CisgIE1vbm9JbWFnZSAqR2V0SFNMSHVlUGxhbmUoKTsKKyAgTW9ub0ltYWdlICpHZXRIU1ZIdWVQbGFuZSgpOworICBNb25vSW1hZ2UgKkdldEhTSUh1ZVBsYW5lKCk7CisgIE1vbm9JbWFnZSAqR2V0SFNMU2F0dXJhdGlvblBsYW5lKCk7CisgIE1vbm9JbWFnZSAqR2V0SFNWU2F0dXJhdGlvblBsYW5lKCk7CisgIE1vbm9JbWFnZSAqR2V0SFNJU2F0dXJhdGlvblBsYW5lKCk7CisgIE1vbm9JbWFnZSAqR2V0THVtaW5hbmNlUGxhbmUoKTsKKyAgTW9ub0ltYWdlICpHZXRWYWx1ZVBsYW5lKCk7CisgIE1vbm9JbWFnZSAqR2V0SW50ZW5zaXR5UGxhbmUoKTsKKyAgdm9pZCBSZXBsYWNlUmVkUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisgIHZvaWQgUmVwbGFjZUdyZWVuUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisgIHZvaWQgUmVwbGFjZUJsdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKyAgdm9pZCBSZXBsYWNlSFNMSHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisgIHZvaWQgUmVwbGFjZUhTVkh1ZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpOworICB2b2lkIFJlcGxhY2VIU0lIdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKyAgdm9pZCBSZXBsYWNlSFNMU2F0dXJhdGlvblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpOworICB2b2lkIFJlcGxhY2VIU1ZTYXR1cmF0aW9uUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisgIHZvaWQgUmVwbGFjZUhTSVNhdHVyYXRpb25QbGFuZShNb25vSW1hZ2UgKnBsYW5lKTsKKyAgdm9pZCBSZXBsYWNlTHVtaW5hbmNlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisgIHZvaWQgUmVwbGFjZVZhbHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSk7CisgIHZvaWQgUmVwbGFjZUludGVuc2l0eVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpOworICB2b2lkIENvbG9yRXF1YWxpemUoKTsKKyAgdm9pZCBMdW1pbmFuY2VFcXVhbGl6ZSgpOworCisgcHJpdmF0ZToKKyAgQmluYXJ5SW1hZ2UgKkNvbXB1dGVUaHJlc2hvbGQoQ29sb3JNb2RlIGNvbG9yTW9kZSwgaW50IGxvdzEsIGludCBoaWdoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvdzIsIGludCBoaWdoMiwgaW50IGxvdzMsIGludCBoaWdoMyk7CisgIHZvaWQgRXF1YWxpemUoYm9vbCBhbGxQbGFuZXMpOworICBNb25vSW1hZ2UgKkV4dHJhY3RDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlLCBpbnQgcGxhbmVOdW1iZXIpOworICBNb25vSW1hZ2UgKkV4dHJhY3RGaXJzdENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUpOworICBNb25vSW1hZ2UgKkV4dHJhY3RTZWNvbmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlKTsKKyAgTW9ub0ltYWdlICpFeHRyYWN0VGhpcmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlKTsKKyAgdm9pZCBSZXBsYWNlUGxhbmUoQ29sb3JNb2RlIG1vZGUsIE1vbm9JbWFnZSAqcGxhbmUsIGludCBwbGFuZU51bWJlcik7CisgIHZvaWQgUmVwbGFjZUZpcnN0Q29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSk7CisgIHZvaWQgUmVwbGFjZVNlY29uZENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUsIE1vbm9JbWFnZSAqcGxhbmUpOworICB2b2lkIFJlcGxhY2VUaGlyZENvbG9yUGxhbmUoQ29sb3JNb2RlIG1vZGUsIE1vbm9JbWFnZSAqcGxhbmUpOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0ZyY0Vycm9yLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9GcmNFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTdjODQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9GcmNFcnJvci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIG9uY2UKKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgRVJSX1ZJU0lPTl9HRU5FUkFMX0VSUk9SIDE2NjAwMCAgLy8KKyNkZWZpbmUgRVJSX0NPTE9SX05PVF9GT1VORCAxNjYxMDAgICAgICAgLy8gVHJhY2tBUEkuY3BwCisjZGVmaW5lIEVSUl9QQVJUSUNMRV9UT09fU01BTEwgMTY2MTAxICAgIC8vIFRyYWNrQVBJLmNwcAorCisjZGVmaW5lIEVSUl9DQU1FUkFfRkFJTFVSRSAxNjYyMDAgICAgICAgICAgICAgICAgICAvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX1NPQ0tFVF9DUkVBVEVfRkFJTEVEIDE2NjIwMSAgICAgLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9DT05ORUNUX0ZBSUxFRCAxNjYyMDIgICAgICAgICAgIC8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfU1RBTEVfSU1BR0UgMTY2MjAzICAgICAgICAgICAgICAvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX05PVF9JTklUSUFMSVpFRCAxNjYyMDQgICAgICAgICAgLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9OT19CVUZGRVJfQVZBSUxBQkxFIDE2NjIwNSAgICAgIC8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfSEVBREVSX0VSUk9SIDE2NjIwNiAgICAgICAgICAgICAvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX0JMT0NLSU5HX1RJTUVPVVQgMTY2MjA3ICAgICAgICAgLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9BVVRIT1JJWkFUSU9OX0ZBSUxFRCAxNjYyMDggICAgIC8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfVEFTS19TUEFXTl9GQUlMRUQgMTY2MjA5ICAgICAgICAvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX1RBU0tfSU5QVVRfT1VUX09GX1JBTkdFIDE2NjIxMCAgLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9DT01NQU5EX0ZBSUxVUkUgMTY2MjExICAgICAgICAgIC8vIEF4aXNDYW1lcmEuY3BwCisKKy8qIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucyAqLworaW50IEdldExhc3RWaXNpb25FcnJvcigpOworY29uc3QgY2hhciogR2V0VmlzaW9uRXJyb3JUZXh0KGludCBlcnJvckNvZGUpOwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaXNpb24vSFNMSW1hZ2UuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0hTTEltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwNzc0OAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL0hTTEltYWdlLmgKQEAgLTAsMCArMSwxOSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ29sb3JJbWFnZS5oIgorCisvKioKKyAqIEEgY29sb3IgaW1hZ2UgcmVwcmVzZW50ZWQgaW4gSFNMIGNvbG9yIHNwYWNlIGF0IDMgYnl0ZXMgcGVyIHBpeGVsLgorICovCitjbGFzcyBIU0xJbWFnZSA6IHB1YmxpYyBDb2xvckltYWdlIHsKKyBwdWJsaWM6CisgIEhTTEltYWdlKCk7CisgIEhTTEltYWdlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKTsKKyAgdmlydHVhbCB+SFNMSW1hZ2UoKSA9IGRlZmF1bHQ7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaXNpb24vSW1hZ2VCYXNlLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9JbWFnZUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjBlY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaXNpb24vSW1hZ2VCYXNlLmgKQEAgLTAsMCArMSwyNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJuaXZpc2lvbi5oIgorI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorCisjZGVmaW5lIERFRkFVTFRfQk9SREVSX1NJWkUgMworCitjbGFzcyBJbWFnZUJhc2UgOiBwdWJsaWMgRXJyb3JCYXNlIHsKKyBwdWJsaWM6CisgIEltYWdlQmFzZShJbWFnZVR5cGUgdHlwZSk7CisgIHZpcnR1YWwgfkltYWdlQmFzZSgpOworICB2aXJ0dWFsIHZvaWQgV3JpdGUoY29uc3QgY2hhciAqZmlsZU5hbWUpOworICBpbnQgR2V0SGVpZ2h0KCk7CisgIGludCBHZXRXaWR0aCgpOworICBJbWFnZSAqR2V0SW1hcUltYWdlKCk7CisKKyBwcm90ZWN0ZWQ6CisgIEltYWdlICptX2ltYXFJbWFnZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9Nb25vSW1hZ2UuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL01vbm9JbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMWYwYTQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9Nb25vSW1hZ2UuaApAQCAtMCwwICsxLDIzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJJbWFnZUJhc2UuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgTW9ub0ltYWdlIDogcHVibGljIEltYWdlQmFzZSB7CisgcHVibGljOgorICBNb25vSW1hZ2UoKTsKKyAgdmlydHVhbCB+TW9ub0ltYWdlKCkgPSBkZWZhdWx0OworCisgIHN0ZDo6dmVjdG9yPEVsbGlwc2VNYXRjaD4gKkRldGVjdEVsbGlwc2VzKAorICAgICAgRWxsaXBzZURlc2NyaXB0b3IgKmVsbGlwc2VEZXNjcmlwdG9yLCBDdXJ2ZU9wdGlvbnMgKmN1cnZlT3B0aW9ucywKKyAgICAgIFNoYXBlRGV0ZWN0aW9uT3B0aW9ucyAqc2hhcGVEZXRlY3Rpb25PcHRpb25zLCBST0kgKnJvaSk7CisgIHN0ZDo6dmVjdG9yPEVsbGlwc2VNYXRjaD4gKkRldGVjdEVsbGlwc2VzKAorICAgICAgRWxsaXBzZURlc2NyaXB0b3IgKmVsbGlwc2VEZXNjcmlwdG9yKTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9SR0JJbWFnZS5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaXNpb24vUkdCSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNiM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9WaXNpb24vUkdCSW1hZ2UuaApAQCAtMCwwICsxLDE5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJDb2xvckltYWdlLmgiCisKKy8qKgorICogQSBjb2xvciBpbWFnZSByZXByZXNlbnRlZCBpbiBSR0IgY29sb3Igc3BhY2UgYXQgMyBieXRlcyBwZXIgcGl4ZWwuCisgKi8KK2NsYXNzIFJHQkltYWdlIDogcHVibGljIENvbG9ySW1hZ2UgeworIHB1YmxpYzoKKyAgUkdCSW1hZ2UoKTsKKyAgUkdCSW1hZ2UoY29uc3QgY2hhciAqZmlsZU5hbWUpOworICB2aXJ0dWFsIH5SR0JJbWFnZSgpID0gZGVmYXVsdDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9UaHJlc2hvbGQuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL1RocmVzaG9sZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDkzZTgKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9UaHJlc2hvbGQuaApAQCAtMCwwICsxLDI1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBvbmNlCisKKy8qKgorICogQ29sb3IgdGhyZXNob2xkIHZhbHVlcy4KKyAqIFRoaXMgb2JqZWN0IHJlcHJlc250cyB0aGUgdGhyZXNob2xkIHZhbHVlcyBmb3IgYW55IHR5cGUgb2YgY29sb3Igb2JqZWN0CisgKiB0aGF0IGlzIHVzZWQgaW4gYSB0aHJlc2hob2xkIG9wZXJhdGlvbi4gSXQgc2ltcGxpZmllcyBwYXNzaW5nIHZhbHVlcworICogYXJvdW5kIGluIGEgcHJvZ3JhbSBmb3IgY29sb3IgZGV0ZWN0aW9uLgorICovCitjbGFzcyBUaHJlc2hvbGQgeworIHB1YmxpYzoKKyAgaW50IHBsYW5lMUxvdzsKKyAgaW50IHBsYW5lMUhpZ2g7CisgIGludCBwbGFuZTJMb3c7CisgIGludCBwbGFuZTJIaWdoOworICBpbnQgcGxhbmUzTG93OworICBpbnQgcGxhbmUzSGlnaDsKKyAgVGhyZXNob2xkKGludCBwbGFuZTFMb3csIGludCBwbGFuZTFIaWdoLCBpbnQgcGxhbmUyTG93LCBpbnQgcGxhbmUySGlnaCwKKyAgICAgICAgICAgIGludCBwbGFuZTNMb3csIGludCBwbGFuZTNIaWdoKTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9WaXNpb25BUEkuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvVmlzaW9uL1Zpc2lvbkFQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTNmMWIKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL1Zpc2lvbi9WaXNpb25BUEkuaApAQCAtMCwwICsxLDE3MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAibml2aXNpb24uaCIKKworLyogICBDb25zdGFudHMgKi8KKworI2RlZmluZSBERUZBVUxUX0JPUkRFUl9TSVpFIDMgIC8vIFZpc2lvbkFQSS5mcmNDcmVhdGVJbWFnZQorI2RlZmluZSBERUZBVUxUX1NBVFVSQVRJT05fVEhSRVNIT0xEIDQwICAvLyBUcmFja0FQSS5GaW5kQ29sb3IKKworLyogICBGb3J3YXJkIERlY2xhcmUgRGF0YSBTdHJ1Y3R1cmVzICovCit0eXBlZGVmIHN0cnVjdCBGaW5kRWRnZU9wdGlvbnNfc3RydWN0IEZpbmRFZGdlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENpcmN1bGFyRWRnZVJlcG9ydF9zdHJ1Y3QgQ2lyY3VsYXJFZGdlUmVwb3J0OworCisvKiAgIERhdGEgU3RydWN0dXJlcyAqLworCisvKiogIGZyY1BhcnRpY2xlQW5hbHlzaXMgcmV0dXJucyB0aGlzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVBbmFseXNpc1JlcG9ydF9zdHJ1Y3QgeworICBpbnQgaW1hZ2VIZWlnaHQ7CisgIGludCBpbWFnZVdpZHRoOworICBkb3VibGUgaW1hZ2VUaW1lc3RhbXA7CisgIGludCBwYXJ0aWNsZUluZGV4OyAgLy8gdGhlIHBhcnRpY2xlIGluZGV4IGFuYWx5emVkCisgIC8qIFgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZQorICAgKiB0b3RhbCBwYXJ0aWNsZSBtYXNzLCBhc3N1bWluZyBldmVyeSBwb2ludCBpbiB0aGUgcGFydGljbGUgaGFzIGEgY29uc3RhbnQKKyAgICogZGVuc2l0eSAqLworICBpbnQgY2VudGVyX21hc3NfeDsgIC8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19YCisgIC8qIFktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZQorICAgKiB0b3RhbCBwYXJ0aWNsZSBtYXNzLCBhc3N1bWluZyBldmVyeSBwb2ludCBpbiB0aGUgcGFydGljbGUgaGFzIGEgY29uc3RhbnQKKyAgICogZGVuc2l0eSAqLworICBpbnQgY2VudGVyX21hc3NfeTsgIC8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19ZCisgIGRvdWJsZSBjZW50ZXJfbWFzc194X25vcm1hbGl6ZWQ7ICAvLyBDZW50ZXIgb2YgbWFzcyB4IHZhbHVlIG5vcm1hbGl6ZWQgdG8gLTEuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gKzEuMCByYW5nZQorICBkb3VibGUgY2VudGVyX21hc3NfeV9ub3JtYWxpemVkOyAgLy8gQ2VudGVyIG9mIG1hc3MgeSB2YWx1ZSBub3JtYWxpemVkIHRvIC0xLjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvICsxLjAgcmFuZ2UKKyAgLyogQXJlYSBvZiB0aGUgcGFydGljbGUgKi8KKyAgZG91YmxlIHBhcnRpY2xlQXJlYTsgIC8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9BUkVBCisgIC8qIEJvdW5kaW5nIFJlY3RhbmdsZSAqLworICBSZWN0IGJvdW5kaW5nUmVjdDsgIC8vIGxlZnQvdG9wL3dpZHRoL2hlaWdodAorICAvKiBQZXJjZW50YWdlIG9mIHRoZSBwYXJ0aWNsZSBBcmVhIGNvdmVyaW5nIHRoZSBJbWFnZSBBcmVhLiAqLworICBkb3VibGUgcGFydGljbGVUb0ltYWdlUGVyY2VudDsgIC8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9BUkVBX0JZX0lNQUdFX0FSRUEKKyAgLyogUGVyY2VudGFnZSBvZiB0aGUgcGFydGljbGUgQXJlYSBpbiByZWxhdGlvbiB0byBpdHMgUGFydGljbGUgYW5kIEhvbGVzIEFyZWEKKyAgICovCisgIGRvdWJsZSBwYXJ0aWNsZVF1YWxpdHk7ICAvLyBNZWFzdXJlbWVudFR5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJTUFRX01UX0FSRUFfQllfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEKK30gUGFydGljbGVBbmFseXNpc1JlcG9ydDsKKworLyoqIFRyYWNraW5nIGZ1bmN0aW9ucyByZXR1cm4gdGhpcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IENvbG9yUmVwb3J0X3N0cnVjdCB7CisgIGludCBudW1iZXJQYXJ0aWNsZXNGb3VuZDsgICAvLyBOdW1iZXIgb2YgcGFydGljbGVzIGZvdW5kIGZvciB0aGlzIGNvbG9yCisgIGludCBsYXJnZXN0UGFydGljbGVOdW1iZXI7ICAvLyBUaGUgcGFydGljbGUgaW5kZXggb2YgdGhlIGxhcmdlc3QgcGFydGljbGUKKyAgLyogQ29sb3IgaW5mb3JtYXRpb24gKi8KKyAgZmxvYXQgcGFydGljbGVIdWVNYXg7ICAgLy8gSGlzdG9ncmFtUmVwb3J0OiBodWUgbWF4CisgIGZsb2F0IHBhcnRpY2xlSHVlTWluOyAgIC8vIEhpc3RvZ3JhbVJlcG9ydDogaHVlIG1heAorICBmbG9hdCBwYXJ0aWNsZUh1ZU1lYW47ICAvLyBIaXN0b2dyYW1SZXBvcnQ6IGh1ZSBtZWFuCisgIGZsb2F0IHBhcnRpY2xlU2F0TWF4OyAgIC8vIEhpc3RvZ3JhbVJlcG9ydDogc2F0dXJhdGlvbiBtYXgKKyAgZmxvYXQgcGFydGljbGVTYXRNaW47ICAgLy8gSGlzdG9ncmFtUmVwb3J0OiBzYXR1cmF0aW9uIG1heAorICBmbG9hdCBwYXJ0aWNsZVNhdE1lYW47ICAvLyBIaXN0b2dyYW1SZXBvcnQ6IHNhdHVyYXRpb24gbWVhbgorICBmbG9hdCBwYXJ0aWNsZUx1bU1heDsgICAvLyBIaXN0b2dyYW1SZXBvcnQ6IGx1bWluYW5jZSBtYXgKKyAgZmxvYXQgcGFydGljbGVMdW1NaW47ICAgLy8gSGlzdG9ncmFtUmVwb3J0OiBsdW1pbmFuY2UgIG1heAorICBmbG9hdCBwYXJ0aWNsZUx1bU1lYW47ICAvLyBIaXN0b2dyYW1SZXBvcnQ6IGx1bWluYW5jZSBtZWFuCit9IENvbG9yUmVwb3J0OworCisvKiAgIEltYWdlIE1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisKKy8qIENyZWF0ZTogY2FsbHMgaW1hcUNyZWF0ZUltYWdlLiBCb3JkZXIgc2l6ZSBpcyBzZXQgdG8gc29tZSBkZWZhdWx0IHZhbHVlICovCitJbWFnZSogZnJjQ3JlYXRlSW1hZ2UoSW1hZ2VUeXBlIHR5cGUpOworCisvKiBEaXNwb3NlOiBjYWxscyBpbWFxRGlzcG9zZSAqLworaW50IGZyY0Rpc3Bvc2Uodm9pZCogb2JqZWN0KTsKK2ludCBmcmNEaXNwb3NlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCAuLi4pOworCisvKiBDb3B5OiBjYWxscyBpbWFxRHVwbGljYXRlSW1hZ2UgKi8KK2ludCBmcmNDb3B5SW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworCisvKiBJbWFnZSBFeHRyYWN0aW9uOiBDcm9wOiBjYWxscyBpbWFxU2NhbGUgKi8KK2ludCBmcmNDcm9wKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBSZWN0IHJlY3QpOworCisvKiBJbWFnZSBFeHRyYWN0aW9uOiBTY2FsZTogY2FsbHMgaW1hcVNjYWxlLiAgU2NhbGVzIGVudGlyZSBpbWFnZSAqLworaW50IGZyY1NjYWxlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgeFNjYWxlLCBpbnQgeVNjYWxlLAorICAgICAgICAgICAgIFNjYWxpbmdNb2RlIHNjYWxlTW9kZSk7CisKKy8qIFJlYWQgSW1hZ2UgOiBjYWxscyBpbWFxUmVhZEZpbGUgKi8KK2ludCBmcmNSZWFkSW1hZ2UoSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSk7CisvKiBXcml0ZSBJbWFnZSA6IGNhbGxzIGltYXFXcml0ZUZpbGUgKi8KK2ludCBmcmNXcml0ZUltYWdlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUpOworCisvKiAgIE1lYXN1cmUgSW50ZW5zaXR5IGZ1bmN0aW9ucyAqLworCisvKiBIaXN0b2dyYW06IGNhbGxzIGltYXFIaXN0b2dyYW0gKi8KK0hpc3RvZ3JhbVJlcG9ydCogZnJjSGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIGZsb2F0IG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heCwgUmVjdCByZWN0KTsKKy8qIENvbG9yIEhpc3RvZ3JhbTogY2FsbHMgaW1hcUNvbG9ySGlzdG9ncmFtMiAqLworQ29sb3JIaXN0b2dyYW1SZXBvcnQqIGZyY0NvbG9ySGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JNb2RlIG1vZGUsIEltYWdlKiBtYXNrKTsKKworLyogR2V0IFBpeGVsIFZhbHVlOiBjYWxscyBpbWFxR2V0UGl4ZWwgKi8KK2ludCBmcmNHZXRQaXhlbFZhbHVlKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgcGl4ZWwsIFBpeGVsVmFsdWUqIHZhbHVlKTsKKworLyogICBQYXJ0aWNsZSBBbmFseXNpcyBmdW5jdGlvbnMgKi8KKworLyogUGFydGljbGUgRmlsdGVyOiBjYWxscyBpbWFxUGFydGljbGVGaWx0ZXIzICovCitpbnQgZnJjUGFydGljbGVGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjcml0ZXJpYUNvdW50LCBjb25zdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgUmVjdCByZWN0LCBpbnQqIG51bVBhcnRpY2xlcyk7CitpbnQgZnJjUGFydGljbGVGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjcml0ZXJpYUNvdW50LCBjb25zdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgaW50KiBudW1QYXJ0aWNsZXMpOworLyogTW9ycGhvbG9neTogY2FsbHMgaW1hcU1vcnBob2xvZ3kgKi8KK2ludCBmcmNNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCk7CitpbnQgZnJjTW9ycGhvbG9neShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgTW9ycGhvbG9neU1ldGhvZCBtZXRob2QsCisgICAgICAgICAgICAgICAgICBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCk7CisvKiBSZWplY3QgQm9yZGVyOiBjYWxscyBpbWFxUmVqZWN0Qm9yZGVyICovCitpbnQgZnJjUmVqZWN0Qm9yZGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlKTsKK2ludCBmcmNSZWplY3RCb3JkZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4KTsKKy8qIENvdW50IFBhcnRpY2xlczogY2FsbHMgaW1hcUNvdW50UGFydGljbGVzICovCitpbnQgZnJjQ291bnRQYXJ0aWNsZXMoSW1hZ2UqIGltYWdlLCBpbnQqIG51bVBhcnRpY2xlcyk7CisvKiBQYXJ0aWNsZSBBbmFseXNpcyBSZXBvcnQ6IGNhbGxzIGltYXFNZWFzdXJlUGFydGljbGUgKi8KK2ludCBmcmNQYXJ0aWNsZUFuYWx5c2lzKEltYWdlKiBpbWFnZSwgaW50IHBhcnRpY2xlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgUGFydGljbGVBbmFseXNpc1JlcG9ydCogcGFyKTsKKworLyogICBJbWFnZSBFbmhhbmNlbWVudCBmdW5jdGlvbnMgKi8KKworLyogRXF1YWxpemU6IGNhbGxzIGltYXFFcXVhbGl6ZSAqLworaW50IGZyY0VxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCBtaW4sIGZsb2F0IG1heCk7CitpbnQgZnJjRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LAorICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrKTsKKworLyogQ29sb3IgRXF1YWxpemU6IGNhbGxzIGltYXFDb2xvckVxdWFsaXplICovCitpbnQgZnJjQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitpbnQgZnJjQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbG9yRXF1YWxpemF0aW9uKTsKKworLyogICBJbWFnZSBUaHJlc2hvbGRpbmcgJiBDb252ZXJzaW9uIGZ1bmN0aW9ucyAqLworCisvKiBTbWFydCBUaHJlc2hvbGQ6IGNhbGxzIGltYXFMb2NhbFRocmVzaG9sZCAqLworaW50IGZyY1NtYXJ0VGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB3aW5kb3dXaWR0aCwgdW5zaWduZWQgaW50IHdpbmRvd0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBMb2NhbFRocmVzaG9sZE1ldGhvZCBtZXRob2QsIGRvdWJsZSBkZXZpYXRpb25XZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSB0eXBlKTsKK2ludCBmcmNTbWFydFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgd2luZG93V2lkdGgsIHVuc2lnbmVkIGludCB3aW5kb3dIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgTG9jYWxUaHJlc2hvbGRNZXRob2QgbWV0aG9kLCBkb3VibGUgZGV2aWF0aW9uV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgdHlwZSwgZmxvYXQgcmVwbGFjZVZhbHVlKTsKKworLyogU2ltcGxlIFRocmVzaG9sZDogY2FsbHMgaW1hcVRocmVzaG9sZCAqLworaW50IGZyY1NpbXBsZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgcmFuZ2VNaW4sCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJhbmdlTWF4LCBmbG9hdCBuZXdWYWx1ZSk7CitpbnQgZnJjU2ltcGxlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCByYW5nZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmFuZ2VNYXgpOworCisvKiBDb2xvci9IdWUgVGhyZXNob2xkOiBjYWxscyBpbWFxQ29sb3JUaHJlc2hvbGQgKi8KK2ludCBmcmNDb2xvclRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgQ29sb3JNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlKTsKK2ludCBmcmNDb2xvclRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHJlcGxhY2VWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBDb2xvck1vZGUgbW9kZSwgY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhbmdlKiBwbGFuZTJSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlKTsKK2ludCBmcmNIdWVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IFJhbmdlKiBodWVSYW5nZSk7CitpbnQgZnJjSHVlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBSYW5nZSogaHVlUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgIGludCBtaW5TYXR1cmF0aW9uKTsKKworLyogRXh0cmFjdCBDb2xvckh1ZSBQbGFuZTogY2FsbHMgaW1hcUV4dHJhY3RDb2xvclBsYW5lcyAqLworaW50IGZyY0V4dHJhY3RDb2xvclBsYW5lcyhjb25zdCBJbWFnZSogaW1hZ2UsIENvbG9yTW9kZSBtb2RlLCBJbWFnZSogcGxhbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSogcGxhbmUyLCBJbWFnZSogcGxhbmUzKTsKK2ludCBmcmNFeHRyYWN0SHVlUGxhbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZSogaHVlUGxhbmUpOworaW50IGZyY0V4dHJhY3RIdWVQbGFuZShjb25zdCBJbWFnZSogaW1hZ2UsIEltYWdlKiBodWVQbGFuZSwgaW50IG1pblNhdHVyYXRpb24pOwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9XUElMaWIuaCBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvV1BJTGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NmIwMwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL2luY2x1ZGUvV1BJTGliLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjZGVmaW5lIFJFQUwKKworI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiQURYTDM0NV9JMkMuaCIKKyNpbmNsdWRlICJBRFhMMzQ1X1NQSS5oIgorI2luY2x1ZGUgIkFEWEwzNjIuaCIKKyNpbmNsdWRlICJBRFhSUzQ1MF9HeXJvLmgiCisjaW5jbHVkZSAiQW5hbG9nQWNjZWxlcm9tZXRlci5oIgorI2luY2x1ZGUgIkFuYWxvZ0d5cm8uaCIKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIkFuYWxvZ091dHB1dC5oIgorI2luY2x1ZGUgIkFuYWxvZ1BvdGVudGlvbWV0ZXIuaCIKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyLmgiCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlck91dHB1dC5oIgorI2luY2x1ZGUgIkJ1aWx0SW5BY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiQnV0dG9ucy9JbnRlcm5hbEJ1dHRvbi5oIgorI2luY2x1ZGUgIkJ1dHRvbnMvSm95c3RpY2tCdXR0b24uaCIKKyNpbmNsdWRlICJCdXR0b25zL05ldHdvcmtCdXR0b24uaCIKKyNpbmNsdWRlICJDYW1lcmFTZXJ2ZXIuaCIKKyNpbmNsdWRlICJDQU5KYWd1YXIuaCIKKyNpbmNsdWRlICJDQU5UYWxvbi5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kR3JvdXAuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9QSURDb21tYW5kLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvUElEU3Vic3lzdGVtLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvUHJpbnRDb21tYW5kLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvU2NoZWR1bGVyLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvU3RhcnRDb21tYW5kLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvU3Vic3lzdGVtLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvV2FpdENvbW1hbmQuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9XYWl0Rm9yQ2hpbGRyZW4uaCIKKyNpbmNsdWRlICJDb21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmgiCisjaW5jbHVkZSAiQ29tcHJlc3Nvci5oIgorI2luY2x1ZGUgIkNvbnRyb2xsZXJQb3dlci5oIgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKKyNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCisjaW5jbHVkZSAiRGlnaXRhbFNvdXJjZS5oIgorI2luY2x1ZGUgIkRvdWJsZVNvbGVub2lkLmgiCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorI2luY2x1ZGUgIkVuY29kZXIuaCIKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJHZWFyVG9vdGguaCIKKyNpbmNsdWRlICJHZW5lcmljSElELmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9HeXJvLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy9Qb3RlbnRpb21ldGVyLmgiCisjaW5jbHVkZSAiSTJDLmgiCisjaW5jbHVkZSAiSXRlcmF0aXZlUm9ib3QuaCIKKyNpbmNsdWRlICJJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIkphZ3Vhci5oIgorI2luY2x1ZGUgIkpveXN0aWNrLmgiCisjaW5jbHVkZSAiTm90aWZpZXIuaCIKKyNpbmNsdWRlICJQSURDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisjaW5jbHVkZSAiUHJlZmVyZW5jZXMuaCIKKyNpbmNsdWRlICJQb3dlckRpc3RyaWJ1dGlvblBhbmVsLmgiCisjaW5jbHVkZSAiUFdNLmgiCisjaW5jbHVkZSAiUmVsYXkuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIlJvYm90QmFzZS5oIgorI2luY2x1ZGUgIlJvYm90RHJpdmUuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiU2VyaWFsUG9ydC5oIgorI2luY2x1ZGUgIlNlcnZvLmgiCisjaW5jbHVkZSAiU2FtcGxlUm9ib3QuaCIKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuaCIKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oIgorI2luY2x1ZGUgIlNvbGVub2lkLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiU1BJLmgiCisjaW5jbHVkZSAiVGFsb24uaCIKKyNpbmNsdWRlICJUYWxvblNSWC5oIgorI2luY2x1ZGUgIlRhc2suaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlVsdHJhc29uaWMuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSAiVmljdG9yLmgiCisjaW5jbHVkZSAiVmljdG9yU1AuaCIKKyNpbmNsdWRlICJWaXNpb24vQXhpc0NhbWVyYS5oIgorI2luY2x1ZGUgIlZpc2lvbi9CaW5hcnlJbWFnZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9Db2xvckltYWdlLmgiCisjaW5jbHVkZSAiVmlzaW9uL0hTTEltYWdlLmgiCisjaW5jbHVkZSAiVmlzaW9uL0ltYWdlQmFzZS5oIgorI2luY2x1ZGUgIlZpc2lvbi9Nb25vSW1hZ2UuaCIKKyNpbmNsdWRlICJWaXNpb24vUkdCSW1hZ2UuaCIKKyNpbmNsdWRlICJWaXNpb24vVGhyZXNob2xkLmgiCisvLyBYWFg6ICNpbmNsdWRlICJWaXNpb24vQXhpc0NhbWVyYS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9uaXZpc2lvbi5oIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9uaXZpc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTY5NjIKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL25pdmlzaW9uLmgKQEAgLTAsMCArMSw4ODI5IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICBJTUFRIFZpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDEuICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaXRsZTogICAgICAgTklWaXNpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWYgIWRlZmluZWQoTmlWaXNpb25faCkKKyNkZWZpbmUgTmlWaXNpb25faAorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbmNsdWRlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENvbnRyb2wgRGVmaW5lcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgIWRlZmluZWQoSU1BUV9JTVBPUlQpCisjaWZuZGVmIF9fR05VQ19fCisjZGVmaW5lIElNQVFfSU1QT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2Vsc2UKKyNkZWZpbmUgSU1BUV9JTVBPUlQKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChJTUFRX0ZVTkMpCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIElNQVFfRlVOQyBJTUFRX0lNUE9SVAorI2Vsc2UKKyNkZWZpbmUgSU1BUV9GVU5DIGV4dGVybiAiQyIgSU1BUV9JTVBPUlQKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChJTUFRX1NURENBTEwpCisjaWZuZGVmIF9fR05VQ19fCisjZGVmaW5lIElNQVFfU1REQ0FMTCBfX3N0ZGNhbGwKKyNlbHNlCisjZGVmaW5lIElNQVFfU1REQ0FMTAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9DVklfCisjcHJhZ21hIEVuYWJsZUxpYnJhcnlSdW50aW1lQ2hlY2tpbmcKKyNpbmNsdWRlIDxhbnNpX2MuaD4KKyNlbmRpZgorCisjZGVmaW5lIElNQVFfQ0FMTEJBQ0sgX19jZGVjbAorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNYW5pZmVzdCBDb25zdGFudHMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmbmRlZiBOVUxMCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgTlVMTCAoKHZvaWQqKTApCisjZWxzZQorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjZGVmaW5lIElNQVFfREVGQVVMVF9TSE9XX0NPT1JESU5BVEVTIFRSVUUKKyNkZWZpbmUgSU1BUV9ERUZBVUxUX01BWF9JQ09OU19QRVJfTElORSA0CisjZGVmaW5lIElNQVFfREVGQVVMVF9MRUFSTklOR19NT0RFIElNQVFfTEVBUk5fU0hJRlRfSU5GT1JNQVRJT04KKyNkZWZpbmUgSU1BUV9ERUZBVUxUX0JNUF9DT01QUkVTUyBGQUxTRQorI2RlZmluZSBJTUFRX0RFRkFVTFRfUE5HX1FVQUxJVFkgNzUwCisjZGVmaW5lIElNQVFfREVGQVVMVF9KUEVHX1FVQUxJVFkgNzUwCisjZGVmaW5lIElNQVFfQUxMX0NPTlRPVVJTIC0xCisjZGVmaW5lIElNQVFfQUxMX1dJTkRPV1MgLTEKKyNkZWZpbmUgSU1BUV9TSElGVCAxCisjZGVmaW5lIElNQVFfQUxUIDIKKyNkZWZpbmUgSU1BUV9DVFJMIDQKKyNkZWZpbmUgSU1BUV9DQVBTX0xPQ0sgOAorI2RlZmluZSBJTUFRX01PREFMX0RJQUxPRyAtMQorI2RlZmluZSBJTUFRX0lOSVRfUkdCX1RSQU5TUEFSRU5UIFwKKyAgeyAwLCAwLCAwLCAxIH0KKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9SRUQgXAorICB7IDAsIDAsIDI1NSwgMCB9CisjZGVmaW5lIElNQVFfSU5JVF9SR0JfQkxVRSBcCisgIHsgMjU1LCAwLCAwLCAwIH0KKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9HUkVFTiBcCisgIHsgMCwgMjU1LCAwLCAwIH0KKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9ZRUxMT1cgXAorICB7IDAsIDI1NSwgMjU1LCAwIH0KKyNkZWZpbmUgSU1BUV9JTklUX1JHQl9XSElURSBcCisgIHsgMjU1LCAyNTUsIDI1NSwgMCB9CisjZGVmaW5lIElNQVFfSU5JVF9SR0JfQkxBQ0sgXAorICB7IDAsIDAsIDAsIDAgfQorI2RlZmluZSBJTUFRX1VTRV9ERUZBVUxUX1FVQUxJVFkgLTEKKyNkZWZpbmUgSU1BUV9BTExfU0FNUExFUyAtMQorI2RlZmluZSBJTUFRX0FMTF9PQkpFQ1RTIC0xCisjZGVmaW5lIElNQVFfQUxMX0NIQVJBQ1RFUlMgLTEKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgUHJlZGVmaW5lZCBWYWxpZCBDaGFyYWN0ZXJzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgSU1BUV9BTllfQ0hBUkFDVEVSICIiICAvLyBBbnkgQ2hhcmFjdGVyCisjZGVmaW5lIElNQVFfQUxQSEFCRVRJQyBcCisgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiAgLy8gQWxwaGFiZXRpYworI2RlZmluZSBJTUFRX0FMUEhBTlVNRVJJQyBcCisgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIgIC8vIEFscGhhbnVtZXJpYworI2RlZmluZSBJTUFRX1VQUEVSQ0FTRV9MRVRURVJTICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIgIC8vIFVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldHRlcnMKKyNkZWZpbmUgSU1BUV9MT1dFUkNBU0VfTEVUVEVSUyAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiICAvLyBMb3dlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXR0ZXJzCisjZGVmaW5lIElNQVFfREVDSU1BTF9ESUdJVFMgIjAxMjM0NTY3ODkiICAvLyBEZWNpbWFsIERpZ2l0cworI2RlZmluZSBJTUFRX0hFWEFERUNJTUFMX0RJR0lUUyAiMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZiIgIC8vIEhleGFkZWNpbWFsIERpZ2l0cworI2RlZmluZSBJTUFRX1BBVFRFUk4gXAorICAiXHhGRiIgIC8vIFBhdHRlcm4gKEEgc2luZ2xlIGNoYXJhY3RlciBzdHJpbmcgd2l0aCB0aGUgY2hhcmFjdGVyIHZhbHVlIHNldCB0bworICAgICAgICAgIC8vIDI1NSkKKyNkZWZpbmUgSU1BUV9GT1JDRV9TUEFDRSAiICIgIC8vIEZvcmNlIFNwYWNlCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE1hY3JvcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIElNQVFfTk9fUkVDVCBpbWFxTWFrZVJlY3QoMCwgMCwgMHg3RkZGRkZGRiwgMHg3RkZGRkZGRikKKyNkZWZpbmUgSU1BUV9OT19ST1RBVEVEX1JFQ1QgXAorICBpbWFxTWFrZVJvdGF0ZWRSZWN0KDAsIDAsIDB4N0ZGRkZGRkYsIDB4N0ZGRkZGRkYsIDApCisjZGVmaW5lIElNQVFfTk9fUE9JTlQgaW1hcU1ha2VQb2ludCgtMSwgLTEpCisjZGVmaW5lIElNQVFfTk9fUE9JTlRfRkxPQVQgaW1hcU1ha2VQb2ludEZsb2F0KC0xLjAsIC0xLjApCisjZGVmaW5lIElNQVFfTk9fT0ZGU0VUIGltYXFNYWtlUG9pbnRGbG9hdCgwLjAsIDAuMCkKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgV2hlbiBpbiBCb3JsYW5kLCBzb21lIGZ1bmN0aW9ucyBtdXN0IGJlIG1hcHBlZCB0byBkaWZmZXJlbnQgbmFtZXMuCisvLyAgVGhpcyBhY2NvbXBsaXNoZXMgc2FpZCB0YXNrLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChkZWZpbmVkKF9DVklfKSAmJiBkZWZpbmVkKF9OSV9CQ18pKQorI2RlZmluZSBpbWFxTWFrZVBvaW50IGltYXFNYWtlUG9pbnRfQkMKKyNkZWZpbmUgaW1hcU1ha2VQb2ludEZsb2F0IGltYXFNYWtlUG9pbnRGbG9hdF9CQworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFdoZW4gaW4gV2F0Y29tLCBzb21lIGZ1bmN0aW9ucyBtdXN0IGJlIG1hcHBlZCB0byBkaWZmZXJlbnQgbmFtZXMuCisvLyAgVGhpcyBhY2NvbXBsaXNoZXMgc2FpZCB0YXNrLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgKGRlZmluZWQoX0NWSV8pICYmIGRlZmluZWQoX05JX1dDXykpCisjZGVmaW5lIGltYXFNYWtlUG9pbnQgaW1hcU1ha2VQb2ludF9CQworI2RlZmluZSBpbWFxTWFrZVBvaW50RmxvYXQgaW1hcU1ha2VQb2ludEZsb2F0X0JDCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgSWYgdXNpbmcgVmlzdWFsIEMrKywgZm9yY2Ugc3RhcnR1cCAmIHNodXRkb3duIGNvZGUgdG8gcnVuLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0NWSV8pICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKyNwcmFnbWEgY29tbWVudChsaW5rZXIsICIvSU5DTFVERTpfbml2aXNpb25fc3RhcnR1cF9zaHV0ZG93biIpCisjcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL0RFRkFVTFRMSUI6bml2aXNpb24ubGliIikKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBFcnJvciBDb2RlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEVSUl9TVUNDRVNTIDAgICAgICAgICAgICAgICAgIC8vIE5vIGVycm9yLgorI2RlZmluZSBFUlJfU1lTVEVNX0VSUk9SIC0xMDc0Mzk2MTYwICAvLyBTeXN0ZW0gZXJyb3IuCisjZGVmaW5lIEVSUl9PVVRfT0ZfTUVNT1JZIFwKKyAgLTEwNzQzOTYxNTkgIC8vIE5vdCBlbm91Z2ggbWVtb3J5IGZvciByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfTUVNT1JZX0VSUk9SIC0xMDc0Mzk2MTU4ICAvLyBNZW1vcnkgZXJyb3IuCisjZGVmaW5lIEVSUl9VTlJFR0lTVEVSRUQgLTEwNzQzOTYxNTcgIC8vIFVubGljZW5zZWQgY29weSBvZiBOSSBWaXNpb24uCisjZGVmaW5lIEVSUl9ORUVEX0ZVTExfVkVSU0lPTiBcCisgIC0xMDc0Mzk2MTU2ICAvLyBUaGUgZnVuY3Rpb24gcmVxdWlyZXMgYW4gTkkgVmlzaW9uIDUuMCBBZHZhbmNlZCBsaWNlbnNlLgorI2RlZmluZSBFUlJfVU5JTklUIC0xMDc0Mzk2MTU1ICAvLyBOSSBWaXNpb24gZGlkIG5vdCBpbml0aWFsaXplIHByb3Blcmx5LgorI2RlZmluZSBFUlJfSU1BR0VfVE9PX1NNQUxMIFwKKyAgLTEwNzQzOTYxNTQgIC8vIFRoZSBpbWFnZSBpcyBub3QgbGFyZ2UgZW5vdWdoIGZvciB0aGUgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DT0RBQkFSIFwKKyAgLTEwNzQzOTYxNTMgIC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIENvZGFiYXIgYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfQ09ERTM5IFwKKyAgLTEwNzQzOTYxNTIgIC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIENvZGUgMyBvZiA5IGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0NPREU5MyBcCisgIC0xMDc0Mzk2MTUxICAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBDb2RlOTMgYmFyY29kZS4KKyNkZWZpbmUgRVJSX0JBUkNPREVfQ09ERTEyOCBcCisgIC0xMDc0Mzk2MTUwICAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBDb2RlMTI4IGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0VBTjggXAorICAtMTA3NDM5NjE0OSAgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgRUFOOCBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9FQU4xMyBcCisgIC0xMDc0Mzk2MTQ4ICAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBFQU4xMyBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9JMjUgXAorICAtMTA3NDM5NjE0NyAgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgSW50ZXJsZWF2ZWQgMiBvZiA1IGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX01TSSAtMTA3NDM5NjE0NiAgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgTVNJIGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX1VQQ0EgXAorICAtMTA3NDM5NjE0NSAgLy8gVGhlIGJhcmNvZGUgaXMgbm90IGEgdmFsaWQgVVBDQSBiYXJjb2RlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DT0RFOTNfU0hJRlQgXAorICAtMTA3NDM5NjE0NCAgLy8gVGhlIENvZGU5MyBiYXJjb2RlIGNvbnRhaW5zIGludmFsaWQgc2hpZnQgZW5jb2RpbmcuCisjZGVmaW5lIEVSUl9CQVJDT0RFX1RZUEUgLTEwNzQzOTYxNDMgIC8vIFRoZSBiYXJjb2RlIHR5cGUgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0JBUkNPREVfSU5WQUxJRCBcCisgIC0xMDc0Mzk2MTQyICAvLyBUaGUgaW1hZ2UgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgbGluZWFyIGJhcmNvZGUuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0NPREUxMjhfRk5DIFwKKyAgLTEwNzQzOTYxNDEgIC8vIFRoZSBGTkMgdmFsdWUgaW4gdGhlIENvZGUxMjggYmFyY29kZSBpcyBub3QgbG9jYXRlZCBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAvLyBmaXJzdCBkYXRhIHZhbHVlLgorI2RlZmluZSBFUlJfQkFSQ09ERV9DT0RFMTI4X1NFVCBcCisgIC0xMDc0Mzk2MTQwICAvLyBUaGUgc3RhcnRpbmcgY29kZSBzZXQgaW4gdGhlIENvZGUxMjggYmFyY29kZSBpcyBub3QgdmFsaWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9PVVRfT0ZfTUVNT1JZIFwKKyAgLTEwNzQzOTYxMzkgIC8vIE5vdCBlbm91Z2ggcmVzZXJ2ZWQgbWVtb3J5IGluIHRoZSB0aW1lZCBlbnZpcm9ubWVudCBmb3IgdGhlCisgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfTk9UX1NVUFBPUlRFRCBcCisgIC0xMDc0Mzk2MTM4ICAvLyBUaGUgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aGVuIGEgdGltZSBsaW1pdCBpcyBhY3RpdmUuCisjZGVmaW5lIEVSUl9ESVJFQ1RYX0RMTF9OT1RfRk9VTkQgXAorICAtMTA3NDM5NjEzNyAgLy8gUXVhcnR6LmRsbCBub3QgZm91bmQuICBJbnN0YWxsIERpcmVjdFggOC4xIG9yIGxhdGVyLgorI2RlZmluZSBFUlJfRElSRUNUWF9JTlZBTElEX0ZJTFRFUl9RVUFMSVRZIFwKKyAgLTEwNzQzOTYxMzYgIC8vIFRoZSBmaWx0ZXIgcXVhbGl0eSB5b3UgcHJvdmlkZWQgaXMgaW52YWxpZC4gVmFsaWQgcXVhbGl0eQorICAgICAgICAgICAgICAgLy8gdmFsdWVzIHJhbmdlIGZyb20gLTEgdG8gMTAwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQlVUVE9OX0xBQkVMIC0xMDc0Mzk2MTM1ICAvLyBJbnZhbGlkIGJ1dHRvbiBsYWJlbC4KKyNkZWZpbmUgRVJSX1RIUkVBRF9JTklUSUFMSVpJTkcgXAorICAtMTA3NDM5NjEzNCAgLy8gQ291bGQgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGluIHRoZSBzZXBhcmF0ZSB0aHJlYWQgYmVjYXVzZQorICAgICAgICAgICAgICAgLy8gdGhlIHRocmVhZCBoYXMgbm90IGNvbXBsZXRlZCBpbml0aWFsaXphdGlvbi4KKyNkZWZpbmUgRVJSX1RIUkVBRF9DT1VMRF9OT1RfSU5JVElBTElaRSBcCisgIC0xMDc0Mzk2MTMzICAvLyBDb3VsZCBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW4gdGhlIHNlcGFyYXRlIHRocmVhZCBiZWNhdXNlCisgICAgICAgICAgICAgICAvLyB0aGUgdGhyZWFkIGNvdWxkIG5vdCBpbml0aWFsaXplLgorI2RlZmluZSBFUlJfTUFTS19OT1RfVEVNUExBVEVfU0laRSBcCisgIC0xMDc0Mzk2MTMyICAvLyBUaGUgbWFzayBtdXN0IGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIHRlbXBsYXRlLgorI2RlZmluZSBFUlJfTk9UX1JFQ1RfT1JfUk9UQVRFRF9SRUNUIFwKKyAgLTEwNzQzOTYxMzAgIC8vIFRoZSBST0kgbXVzdCBvbmx5IGhhdmUgZWl0aGVyIGEgc2luZ2xlIFJlY3RhbmdsZSBjb250b3VyIG9yIGEKKyAgICAgICAgICAgICAgIC8vIHNpbmdsZSBSb3RhdGVkIFJlY3RhbmdsZSBjb250b3VyLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfVU5CT1VOREVEX0lOVEVSRkFDRSBcCisgIC0xMDc0Mzk2MTI5ICAvLyBEdXJpbmcgdGltZWQgZXhlY3V0aW9uLCB5b3UgbXVzdCB1c2UgdGhlIHByZWFsbG9jYXRlZCB2ZXJzaW9uCisgICAgICAgICAgICAgICAvLyBvZiB0aGlzIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX0NPTkZMSUNUXzMgXAorICAtMTA3NDM5NjEyOCAgLy8gQW4gaW1hZ2UgYmVpbmcgbW9kaWZpZWQgYnkgb25lIHByb2Nlc3MgY2Fubm90IGJlIHJlcXVlc3RlZCBieQorICAgICAgICAgICAgICAgLy8gYW5vdGhlciBwcm9jZXNzIHdoaWxlIGEgdGltZSBsaW1pdCBpcyBhY3RpdmUuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9DT05GTElDVF8yIFwKKyAgLTEwNzQzOTYxMjcgIC8vIEFuIGltYWdlIHdpdGggcGF0dGVybiBtYXRjaGluZywgY2FsaWJyYXRpb24sIG9yIG92ZXJsYXkKKyAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtYW5pcHVsYXRlZCB3aGlsZSBhIHRpbWUgbGltaXQgaXMKKyAgICAgICAgICAgICAgIC8vIGFjdGl2ZS4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX0NPTkZMSUNUXzEgXAorICAtMTA3NDM5NjEyNiAgLy8gQW4gaW1hZ2UgY3JlYXRlZCBiZWZvcmUgYSB0aW1lIGxpbWl0IGlzIHN0YXJ0ZWQgY2Fubm90IGJlCisgICAgICAgICAgICAgICAvLyByZXNpemVkIHdoaWxlIGEgdGltZSBsaW1pdCBpcyBhY3RpdmUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTlRSQVNUX1RIUkVTSE9MRCBcCisgIC0xMDc0Mzk2MTI1ICAvLyBJbnZhbGlkIGNvbnRyYXN0IHRocmVzaG9sZC4gVGhlIHRocmVzaG9sZCB2YWx1ZSBtdXN0IGJlCisgICAgICAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ0FMSUJSQVRJT05fUk9JX01PREUgXAorICAtMTA3NDM5NjEyNCAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhbGlicmF0aW9uIFJPSSBtb2RlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NBTElCUkFUSU9OX01PREUgXAorICAtMTA3NDM5NjEyMyAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhbGlicmF0aW9uIG1vZGUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfRFJBV1RFWFRfQ09MT1JfTVVTVF9CRV9HUkFZU0NBTEUgXAorICAtMTA3NDM5NjEyMiAgLy8gU2V0IHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIHRleHQgY29sb3JzIHRvIGdyYXlzY2FsZSB0bworICAgICAgICAgICAgICAgLy8gZHJhdyBvbiBhIFU4IGltYWdlLgorI2RlZmluZSBFUlJfU0FUVVJBVElPTl9USFJFU0hPTERfT1VUX09GX1JBTkdFIFwKKyAgLTEwNzQzOTYxMjEgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgc2F0dXJhdGlvbiB0aHJlc2hvbGQgbXVzdCBiZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfTk9UX0lNQUdFIC0xMDc0Mzk2MTIwICAvLyBOb3QgYW4gaW1hZ2UuCisjZGVmaW5lIEVSUl9DVVNUT01EQVRBX0lOVkFMSURfS0VZIFwKKyAgLTEwNzQzOTYxMTkgIC8vIFRoZXkgY3VzdG9tIGRhdGEga2V5IHlvdSBzdXBwbGllZCBpcyBpbnZhbGlkLiBUaGUgb25seSB2YWxpZAorICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIHZhbHVlcyBhcmUgZGVjaW1hbCAzMi0xMjYgYW5kIDE2MS0yNTUuIFRoZXJlIG11c3QKKyAgICAgICAgICAgICAgIC8vIGFsc28gYmUgbm8gcmVwZWF0ZWQsIGxlYWRpbmcsIG9yIHRyYWlsaW5nIHNwYWNlcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUF9TSVpFIFwKKyAgLTEwNzQzOTYxMTggIC8vIFN0ZXAgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gSW1hZ2Ugc2l6ZQorI2RlZmluZSBFUlJfTUFUUklYX1NJWkUgXAorICAtMTA3NDM5NjExNyAgLy8gSW52YWxpZCBtYXRyaXggc2l6ZSBpbiB0aGUgc3RydWN0dXJpbmcgZWxlbWVudC4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lOU0ZfUE9JTlRTIFwKKyAgLTEwNzQzOTYxMTYgIC8vIEluc3VmZmljaWVudCBudW1iZXIgb2YgY2FsaWJyYXRpb24gZmVhdHVyZSBwb2ludHMuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTUFHRV9DT1JSRUNURUQgXAorICAtMTA3NDM5NjExNSAgLy8gVGhlIG9wZXJhdGlvbiBpcyBpbnZhbGlkIGluIGEgY29ycmVjdGVkIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5WQUxJRF9ST0kgXAorICAtMTA3NDM5NjExNCAgLy8gVGhlIFJPSSBjb250YWlucyBhbiBpbnZhbGlkIGNvbnRvdXIgdHlwZSBvciBpcyBub3QgY29udGFpbmVkCisgICAgICAgICAgICAgICAvLyBpbiB0aGUgUk9JIGxlYXJuZWQgZm9yIGNhbGlicmF0aW9uLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU1BR0VfVU5DQUxJQlJBVEVEIFwKKyAgLTEwNzQzOTYxMTMgIC8vIFRoZSBzb3VyY2UvaW5wdXQgaW1hZ2UgaGFzIG5vdCBiZWVuIGNhbGlicmF0ZWQuCisjZGVmaW5lIEVSUl9JTkNPTVBfTUFUUklYX1NJWkUgXAorICAtMTA3NDM5NjExMiAgLy8gVGhlIG51bWJlciBvZiBwaXhlbCBhbmQgcmVhbC13b3JsZCBjb29yZGluYXRlcyBtdXN0IGJlIGVxdWFsLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fRkFJTEVEX1RPX0ZJTkRfR1JJRCBcCisgIC0xMDc0Mzk2MTExICAvLyBVbmFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgZ3JpZCBiZWNhdXNlIHRoZSBpbWFnZSBpcyB0b28KKyAgICAgICAgICAgICAgIC8vIGRpc3RvcnRlZC4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fVkVSU0lPTiBcCisgIC0xMDc0Mzk2MTEwICAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIHZlcnNpb24uCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTlZBTElEX1NDQUxJTkdfRkFDVE9SIFwKKyAgLTEwNzQzOTYxMDkgIC8vIEludmFsaWQgY2FsaWJyYXRpb24gc2NhbGluZyBmYWN0b3IuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9FUlJPUk1BUCBcCisgIC0xMDc0Mzk2MTA4ICAvLyBUaGUgY2FsaWJyYXRpb24gZXJyb3IgbWFwIGNhbm5vdCBiZSBjb21wdXRlZC4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fMSBcCisgIC0xMDc0Mzk2MTA3ICAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT18yIFwKKyAgLTEwNzQzOTYxMDYgIC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPXzMgXAorICAtMTA3NDM5NjEwNSAgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fNCBcCisgIC0xMDc0Mzk2MTA0ICAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT181IFwKKyAgLTEwNzQzOTYxMDMgIC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9JTkZPXzYgXAorICAtMTA3NDM5NjEwMiAgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fTUlDUk9fUExBTkUgXAorICAtMTA3NDM5NjEwMSAgLy8gSW52YWxpZCBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NBTElCUkFUSU9OX0lORk9fUEVSU1BFQ1RJVkVfUFJPSkVDVElPTiBcCisgIC0xMDc0Mzk2MTAwICAvLyBJbnZhbGlkIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ0FMSUJSQVRJT05fSU5GT19TSU1QTEVfVFJBTlNGT1JNIFwKKyAgLTEwNzQzOTYwOTkgIC8vIEludmFsaWQgY2FsaWJyYXRpb24gdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9SRVNFUlZFRF9NVVNUX0JFX05VTEwgXAorICAtMTA3NDM5NjA5OCAgLy8gWW91IG11c3QgcGFzcyBOVUxMIGZvciB0aGUgcmVzZXJ2ZWQgcGFyYW1ldGVyLgorI2RlZmluZSBFUlJfSU5WQUxJRF9QQVJUSUNMRV9QQVJBTUVURVJfVkFMVUUgXAorICAtMTA3NDM5NjA5NyAgLy8gWW91IGVudGVyZWQgYW4gaW52YWxpZCBzZWxlY3Rpb24gaW4gdGhlIHBhcnRpY2xlIHBhcmFtZXRlci4KKyNkZWZpbmUgRVJSX05PVF9BTl9PQkpFQ1QgLTEwNzQzOTYwOTYgIC8vIE5vdCBhbiBvYmplY3QuCisjZGVmaW5lIEVSUl9DQUxJQlJBVElPTl9EVVBMSUNBVEVfUkVGRVJFTkNFX1BPSU5UIFwKKyAgLTEwNzQzOTYwOTUgIC8vIFRoZSByZWZlcmVuY2UgcG9pbnRzIHBhc3NlZCBhcmUgaW5jb25zaXN0ZW50LiAgQXQgbGVhc3QgdHdvCisgICAgICAgICAgICAgICAvLyBzaW1pbGFyIHBpeGVsIGNvb3JkaW5hdGVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50IHJlYWwtd29ybGQKKyAgICAgICAgICAgICAgIC8vIGNvb3JkaW5hdGVzLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfQ0FOTk9UX1VOTE9DSyBcCisgIC0xMDc0Mzk2MDk0ICAvLyBBIHJlc291cmNlIGNvbmZsaWN0IG9jY3VycmVkIGluIHRoZSB0aW1lZCBlbnZpcm9ubWVudC4gVHdvCisgICAgICAgICAgICAgICAvLyBwcm9jZXNzZXMgY2Fubm90IG1hbmFnZSB0aGUgc2FtZSByZXNvdXJjZSBhbmQgYmUgdGltZSBib3VuZGVkLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfTE9DS0VEIFwKKyAgLTEwNzQzOTYwOTMgIC8vIEEgcmVzb3VyY2UgY29uZmxpY3Qgb2NjdXJyZWQgaW4gdGhlIHRpbWVkIGVudmlyb25tZW50LiBUd28KKyAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBjYW5ub3QgYWNjZXNzIHRoZSBzYW1lIHJlc291cmNlIGFuZCBiZSB0aW1lIGJvdW5kZWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9OT05fRU1QVFlfSU5JVElBTElaRSBcCisgIC0xMDc0Mzk2MDkyICAvLyBNdWx0aXBsZSB0aW1lZCBlbnZpcm9ubWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9ST0xMQkFDS19SRVNPVVJDRV9VTklOSVRJQUxJWkVEX0VOQUJMRSBcCisgIC0xMDc0Mzk2MDkxICAvLyBBIHRpbWUgbGltaXQgY2Fubm90IGJlIHN0YXJ0ZWQgdW50aWwgdGhlIHRpbWVkIGVudmlyb25tZW50IGlzCisgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZC4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1JFU09VUkNFX0VOQUJMRUQgXAorICAtMTA3NDM5NjA5MCAgLy8gTXVsdGlwbGUgdGltZWQgZW52aXJvbm1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfUkVJTklUSUFMSVpFIFwKKyAgLTEwNzQzOTYwODkgIC8vIFRoZSB0aW1lZCBlbnZpcm9ubWVudCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfUkVTSVpFIFwKKyAgLTEwNzQzOTYwODggIC8vIFRoZSByZXN1bHRzIG9mIHRoZSBvcGVyYXRpb24gZXhjZWVkZWQgdGhlIHNpemUgbGltaXRzIG9uIHRoZQorICAgICAgICAgICAgICAgLy8gb3V0cHV0IGRhdGEgYXJyYXlzLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfU1RPUF9USU1FUiBcCisgIC0xMDc0Mzk2MDg3ICAvLyBObyB0aW1lIGxpbWl0IGlzIGF2YWlsYWJsZSB0byBzdG9wLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfU1RBUlRfVElNRVIgLTEwNzQzOTYwODYgIC8vIEEgdGltZSBsaW1pdCBjb3VsZCBub3QgYmUgc2V0LgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfSU5JVF9USU1FUiBcCisgIC0xMDc0Mzk2MDg1ICAvLyBUaGUgdGltZWQgZW52aXJvbm1lbnQgY291bGQgbm90IGJlIGluaXRpYWxpemVkLgorI2RlZmluZSBFUlJfUk9MTEJBQ0tfREVMRVRFX1RJTUVSIFwKKyAgLTEwNzQzOTYwODQgIC8vIE5vIGluaXRpYWxpemVkIHRpbWVkIGVudmlyb25tZW50IGlzIGF2YWlsYWJsZSB0byBjbG9zZS4KKyNkZWZpbmUgRVJSX1JPTExCQUNLX1RJTUVPVVQgLTEwNzQzOTYwODMgIC8vIFRoZSB0aW1lIGxpbWl0IGhhcyBleHBpcmVkLgorI2RlZmluZSBFUlJfUEFMRVRURV9OT1RfU1VQUE9SVEVEIFwKKyAgLTEwNzQzOTYwODIgIC8vIE9ubHkgOC1iaXQgaW1hZ2VzIHN1cHBvcnQgdGhlIHVzZSBvZiBwYWxldHRlcy4gIEVpdGhlciBkbyBub3QKKyAgICAgICAgICAgICAgIC8vIHVzZSBhIHBhbGV0dGUsIG9yIGNvbnZlcnQgeW91ciBpbWFnZSB0byBhbiA4LWJpdCBpbWFnZSBiZWZvcmUKKyAgICAgICAgICAgICAgIC8vIHVzaW5nIGEgcGFsZXR0ZS4KKyNkZWZpbmUgRVJSX0JBRF9QQVNTV09SRCAtMTA3NDM5NjA4MSAgICAgICAgICAgICAvLyBJbmNvcnJlY3QgcGFzc3dvcmQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0lNQUdFX1RZUEUgLTEwNzQzOTYwODAgICAgICAgLy8gSW52YWxpZCBpbWFnZSB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NRVRBRklMRV9IQU5ETEUgLTEwNzQzOTYwNzkgIC8vIEludmFsaWQgbWV0YWZpbGUgaGFuZGxlLgorI2RlZmluZSBFUlJfSU5DT01QX1RZUEUgLTEwNzQzOTYwNzcgICAgICAgICAgICAgIC8vIEluY29tcGF0aWJsZSBpbWFnZSB0eXBlLgorI2RlZmluZSBFUlJfQ09PUkRfU1lTX0ZJUlNUX0FYSVMgXAorICAtMTA3NDM5NjA3NiAgLy8gVW5hYmxlIHRvIGZpdCBhIGxpbmUgZm9yIHRoZSBwcmltYXJ5IGF4aXMuCisjZGVmaW5lIEVSUl9DT09SRF9TWVNfU0VDT05EX0FYSVMgXAorICAtMTA3NDM5NjA3NSAgLy8gVW5hYmxlIHRvIGZpdCBhIGxpbmUgZm9yIHRoZSBzZWNvbmRhcnkgYXhpcy4KKyNkZWZpbmUgRVJSX0lOQ09NUF9TSVpFIC0xMDc0Mzk2MDc0ICAvLyBJbmNvbXBhdGlibGUgaW1hZ2Ugc2l6ZS4KKyNkZWZpbmUgRVJSX01BU0tfT1VUU0lERV9JTUFHRSBcCisgIC0xMDc0Mzk2MDczICAvLyBXaGVuIHRoZSBtYXNrJ3Mgb2Zmc2V0IHdhcyBhcHBsaWVkLCB0aGUgbWFzayB3YXMgZW50aXJlbHkKKyAgICAgICAgICAgICAgIC8vIG91dHNpZGUgb2YgdGhlIGltYWdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CT1JERVIgLTEwNzQzOTYwNzIgICAgICAgICAgLy8gSW52YWxpZCBpbWFnZSBib3JkZXIuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NDQU5fRElSRUNUSU9OIC0xMDc0Mzk2MDcxICAvLyBJbnZhbGlkIHNjYW4gZGlyZWN0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9GVU5DVElPTiAtMTA3NDM5NjA3MCAgICAgICAgLy8gVW5zdXBwb3J0ZWQgZnVuY3Rpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SX01PREUgXAorICAtMTA3NDM5NjA2OSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvbG9yIG1vZGUgeW91IHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQUNUSU9OIFwKKyAgLTEwNzQzOTYwNjggIC8vIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgYWN0aW9uLgorI2RlZmluZSBFUlJfSU1BR0VTX05PVF9ESUZGIFwKKyAgLTEwNzQzOTYwNjcgIC8vIFRoZSBzb3VyY2UgaW1hZ2UgYW5kIGRlc3RpbmF0aW9uIGltYWdlIG11c3QgYmUgZGlmZmVyZW50LgorI2RlZmluZSBFUlJfSU5WQUxJRF9QT0lOVFNZTUJPTCAtMTA3NDM5NjA2NiAgLy8gSW52YWxpZCBwb2ludCBzeW1ib2wuCisjZGVmaW5lIEVSUl9DQU5UX1JFU0laRV9FWFRFUk5BTCBcCisgIC0xMDc0Mzk2MDY1ICAvLyBDYW5ub3QgcmVzaXplIGFuIGltYWdlIGluIGFuIGFjcXVpc2l0aW9uIGJ1ZmZlci4KKyNkZWZpbmUgRVJSX0VYVEVSTkFMX05PVF9TVVBQT1JURUQgXAorICAtMTA3NDM5NjA2NCAgLy8gVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgaW1hZ2VzIGluIGFuIGFjcXVpc2l0aW9uCisgICAgICAgICAgICAgICAvLyBidWZmZXIuCisjZGVmaW5lIEVSUl9FWFRFUk5BTF9BTElHTk1FTlQgXAorICAtMTA3NDM5NjA2MyAgLy8gVGhlIGV4dGVybmFsIGJ1ZmZlciBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZQorICAgICAgICAgICAgICAgLy8gbGluZSB3aWR0aCBhbmQgYm9yZGVyIHBpeGVscyBtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLCBhcyB3ZWxsLgorI2RlZmluZSBFUlJfSU5WQUxJRF9UT0xFUkFOQ0UgXAorICAtMTA3NDM5NjA2MiAgLy8gVGhlIHRvbGVyYW5jZSBwYXJhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfV0lORE9XX1NJWkUgXAorICAtMTA3NDM5NjA2MSAgLy8gVGhlIHNpemUgb2YgZWFjaCBkaW1lbnNpb24gb2YgdGhlIHdpbmRvdyBtdXN0IGJlIGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgLy8gMiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBpbiB0aGUKKyAgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZGltZW5zaW9uLgorI2RlZmluZSBFUlJfSlBFRzIwMDBfTE9TU0xFU1NfV0lUSF9GTE9BVElOR19QT0lOVCBcCisgIC0xMDc0Mzk2MDYwICAvLyBMb3NzbGVzcyBjb21wcmVzc2lvbiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBmbG9hdGluZyBwb2ludAorICAgICAgICAgICAgICAgLy8gd2F2ZWxldCB0cmFuc2Zvcm0gbW9kZS4gRWl0aGVyIHNldCB0aGUgd2F2ZWxldCB0cmFuc2Zvcm0gbW9kZQorICAgICAgICAgICAgICAgLy8gdG8gaW50ZWdlciwgb3IgdXNlIGxvc3N5IGNvbXByZXNzaW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhfSVRFUkFUSU9OUyBcCisgIC0xMDc0Mzk2MDU5ICAvLyBJbnZhbGlkIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIE1heGltdW0gbnVtYmVyIG9mCisgICAgICAgICAgICAgICAvLyBpdGVyYXRpb25zIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX1JPVEFUSU9OX01PREUgLTEwNzQzOTYwNTggIC8vIEludmFsaWQgcm90YXRpb24gbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0VBUkNIX1ZFQ1RPUl9XSURUSCBcCisgIC0xMDc0Mzk2MDU3ICAvLyBJbnZhbGlkIHNlYXJjaCB2ZWN0b3Igd2lkdGguIFRoZSB3aWR0aCBtdXN0IGJlIGFuIG9kZCBudW1iZXIKKyAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRSSVhfTUlSUk9SX01PREUgXAorICAtMTA3NDM5NjA1NiAgLy8gSW52YWxpZCBtYXRyaXggbWlycm9yIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0FTUEVDVF9SQVRJTyBcCisgIC0xMDc0Mzk2MDU1ICAvLyBJbnZhbGlkIGFzcGVjdCByYXRpby4gVmFsaWQgYXNwZWN0IHJhdGlvcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgLy8gb3IgZXF1YWwgdG8gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ0VMTF9GSUxMX1RZUEUgLTEwNzQzOTYwNTQgIC8vIEludmFsaWQgY2VsbCBmaWxsIHR5cGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0JPUkRFUl9JTlRFR1JJVFkgXAorICAtMTA3NDM5NjA1MyAgLy8gSW52YWxpZCBib3JkZXIgaW50ZWdyaXR5LiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDEwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfREVNT0RVTEFUSU9OX01PREUgLTEwNzQzOTYwNTIgIC8vIEludmFsaWQgZGVtb2R1bGF0aW9uIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NFTExfRklMVEVSX01PREUgLTEwNzQzOTYwNTEgICAvLyBJbnZhbGlkIGNlbGwgZmlsdGVyIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0VDQ19UWVBFIC0xMDc0Mzk2MDUwICAgICAgICAgICAvLyBJbnZhbGlkIEVDQyB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRSSVhfUE9MQVJJVFkgLTEwNzQzOTYwNDkgICAgLy8gSW52YWxpZCBtYXRyaXggcG9sYXJpdHkuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NFTExfU0FNUExFX1NJWkUgLTEwNzQzOTYwNDggICAvLyBJbnZhbGlkIGNlbGwgc2FtcGxlIHNpemUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0xJTkVBUl9BVkVSQUdFX01PREUgXAorICAtMTA3NDM5NjA0NyAgLy8gSW52YWxpZCBsaW5lYXIgYXZlcmFnZSBtb2RlLgorI2RlZmluZSBFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NPTlRSQVNUX0ZPUl9ST0kgXAorICAtMTA3NDM5NjA0NiAgLy8gV2hlbiB1c2luZyBhIHJlZ2lvbiBvZiBpbnRlcmVzdCB0aGF0IGlzIG5vdCBhIHJlY3RhbmdsZSwgeW91CisgICAgICAgICAgICAgICAvLyBtdXN0IHNwZWNpZnkgdGhlIGNvbnRyYXN0IG1vZGUgb2YgdGhlIGJhcmNvZGUgYXMgZWl0aGVyIGJsYWNrCisgICAgICAgICAgICAgICAvLyBvbiB3aGl0ZSBvciB3aGl0ZSBvbiBibGFjay4KKyNkZWZpbmUgRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TVUJUWVBFIFwKKyAgLTEwNzQzOTYwNDUgIC8vIEludmFsaWQgMi1EIGJhcmNvZGUgRGF0YSBNYXRyaXggc3VidHlwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TSEFQRSAtMTA3NDM5NjA0NCAgLy8gSW52YWxpZCAyLUQgYmFyY29kZSBzaGFwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9DRUxMX1NIQVBFIFwKKyAgLTEwNzQzOTYwNDMgIC8vIEludmFsaWQgMi1EIGJhcmNvZGUgY2VsbCBzaGFwZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9DT05UUkFTVCBcCisgIC0xMDc0Mzk2MDQyICAvLyBJbnZhbGlkIDItRCBiYXJjb2RlIGNvbnRyYXN0LgorI2RlZmluZSBFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX1RZUEUgLTEwNzQzOTYwNDEgIC8vIEludmFsaWQgMi1EIGJhcmNvZGUgdHlwZS4KKyNkZWZpbmUgRVJSX0RSSVZFUiAtMTA3NDM5NjA0MCAgICAvLyBDYW5ub3QgYWNjZXNzIE5JLUlNQVEgZHJpdmVyLgorI2RlZmluZSBFUlJfSU9fRVJST1IgLTEwNzQzOTYwMzkgIC8vIEkvTyBlcnJvci4KKyNkZWZpbmUgRVJSX0ZJTkRfQ09PUkRTWVNfTU9SRV9USEFOX09ORV9FREdFIFwKKyAgLTEwNzQzOTYwMzggIC8vIFdoZW4gc2VhcmNoaW5nIGZvciBhIGNvb3JkaW5hdGUgc3lzdGVtLCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvCisgICAgICAgICAgICAgICAvLyBmaXQgbXVzdCBiZSAxLgorI2RlZmluZSBFUlJfVElNRU9VVCAtMTA3NDM5NjAzNyAgLy8gVHJpZ2dlciB0aW1lb3V0LgorI2RlZmluZSBFUlJfSU5WQUxJRF9TS0VMRVRPTk1PREUgXAorICAtMTA3NDM5NjAzNiAgLy8gVGhlIFNrZWxldG9uIG1vZGUgeW91IHNwZWNpZmllZCBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfVEVNUExBVEVJTUFHRV9OT0NJUkNMRSBcCisgIC0xMDc0Mzk2MDM1ICAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggaW5mb3JtYXRpb24gZm9yCisgICAgICAgICAgICAgICAvLyBsZWFybmluZyB0aGUgYWdncmVzc2l2ZSBzZWFyY2ggc3RyYXRlZ3kuCisjZGVmaW5lIEVSUl9URU1QTEFURUlNQUdFX0VER0VJTkZPIFwKKyAgLTEwNzQzOTYwMzQgIC8vIFRoZSB0ZW1wbGF0ZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGVub3VnaCBlZGdlIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHNhbXBsZSBzaXplKHMpIHJlcXVlc3RlZC4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFREVTQ1JJUFRPUl9MRUFSTlNFVFVQREFUQSBcCisgIC0xMDc0Mzk2MDMzICAvLyBJbnZhbGlkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCisjZGVmaW5lIEVSUl9URU1QTEFURURFU0NSSVBUT1JfUk9UQVRJT05fU0VBUkNIU1RSQVRFR1kgXAorICAtMTA3NDM5NjAzMiAgLy8gVGhlIHRlbXBsYXRlIGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBkYXRhIHJlcXVpcmVkIGZvciB0aGUKKyAgICAgICAgICAgICAgIC8vIHJlcXVlc3RlZCBzZWFyY2ggc3RyYXRlZ3kgaW4gcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorI2RlZmluZSBFUlJfSU5WQUxJRF9URVRSQUdPTiBcCisgIC0xMDc0Mzk2MDMxICAvLyBUaGUgaW5wdXQgdGV0cmFnb24gbXVzdCBoYXZlIGZvdXIgcG9pbnRzLiBUaGUgcG9pbnRzIGFyZQorICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGNsb2Nrd2lzZSBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGVmdCBwb2ludC4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZX0NMQVNTSUZJQ0FUSU9OX1NFU1NJT05TIFwKKyAgLTEwNzQzOTYwMzAgIC8vIFRoZXJlIGFyZSB0b28gbWFueSBjbGFzc2lmaWNhdGlvbiBzZXNzaW9ucyBvcGVuLiAgWW91IG11c3QKKyAgICAgICAgICAgICAgIC8vIGNsb3NlIGEgc2Vzc2lvbiBiZWZvcmUgeW91IGNhbiBvcGVuIGFub3RoZXIgb25lLgorI2RlZmluZSBFUlJfVElNRV9CT1VOREVEX0VYRUNVVElPTl9OT1RfU1VQUE9SVEVEIFwKKyAgLTEwNzQzOTYwMjggIC8vIE5JIFZpc2lvbiBubyBsb25nZXIgc3VwcG9ydHMgdGltZS1ib3VuZGVkIGV4ZWN1dGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09MT1JfUkVTT0xVVElPTiBcCisgIC0xMDc0Mzk2MDI3ICAvLyBJbnZhbGlkIENvbG9yIFJlc29sdXRpb24gZm9yIHRoZSBDb2xvciBDbGFzc2lmaWVyCisjZGVmaW5lIEVSUl9JTlZBTElEX1BST0NFU1NfVFlQRV9GT1JfRURHRV9ERVRFQ1RJT04gXAorICAtMTA3NDM5NjAyNiAgLy8gSW52YWxpZCBwcm9jZXNzIHR5cGUgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9BTkdMRV9SQU5HRV9GT1JfU1RSQUlHSFRfRURHRSBcCisgIC0xMDc0Mzk2MDI1ICAvLyBBbmdsZSByYW5nZSB2YWx1ZSBzaG91bGQgYmUgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTl9DT1ZFUkFHRV9GT1JfU1RSQUlHSFRfRURHRSBcCisgIC0xMDc0Mzk2MDI0ICAvLyBNaW5pbXVtIGNvdmVyYWdlIHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQU5HTEVfVE9MX0ZPUl9TVFJBSUdIVF9FREdFIFwKKyAgLTEwNzQzOTYwMjMgIC8vIFRoZSBhbmdsZSB0b2xlcmFuY2Ugc2hvdWxkIGJlIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAwLjAwMS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0VBUkNIX01PREVfRk9SX1NUUkFJR0hUX0VER0UgXAorICAtMTA3NDM5NjAyMiAgLy8gSW52YWxpZCBzZWFyY2ggbW9kZSBmb3IgZGV0ZWN0aW5nIHN0cmFpZ2h0IGVkZ2VzCisjZGVmaW5lIEVSUl9JTlZBTElEX0tFUk5FTF9TSVpFX0ZPUl9FREdFX0RFVEVDVElPTiBcCisgIC0xMDc0Mzk2MDIxICAvLyBJbnZhbGlkIGtlcm5lbCBzaXplIGZvciBlZGdlIGRldGVjdGlvbi4gVGhlIG1pbmltdW0ga2VybmVsCisgICAgICAgICAgICAgICAvLyBzaXplIGlzIDMsIHRoZSBtYXhpbXVtIGtlcm5lbCBzaXplIGlzIDEwNzM3NDE4MjMgYW5kIHRoZQorICAgICAgICAgICAgICAgLy8ga2VybmVsIHNpemUgbXVzdCBiZSBvZGQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0dSQURJTkdfTU9ERSAtMTA3NDM5NjAyMCAgLy8gSW52YWxpZCBncmFkaW5nIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1RIUkVTSE9MRF9QRVJDRU5UQUdFIFwKKyAgLTEwNzQzOTYwMTkgIC8vIEludmFsaWQgdGhyZXNob2xkIHBlcmNlbnRhZ2UuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8KKyAgICAgICAgICAgICAgIC8vIDEwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRURHRV9QT0xBUklUWV9TRUFSQ0hfTU9ERSBcCisgIC0xMDc0Mzk2MDE4ICAvLyBJbnZhbGlkIGVkZ2UgcG9sYXJpdHkgc2VhcmNoIG1vZGUuCisjZGVmaW5lIEVSUl9PUEVOSU5HX05FV0VSX0FJTV9HUkFESU5HX0RBVEEgXAorICAtMTA3NDM5NjAxNyAgLy8gVGhlIEFJTSBncmFkaW5nIGRhdGEgYXR0YWNoZWQgdG8gdGhlIGltYWdlIHlvdSB0cmllZCB0byBvcGVuCisgICAgICAgICAgICAgICAvLyB3YXMgY3JlYXRlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlCisgICAgICAgICAgICAgICAvLyBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9OT19WSURFT19EUklWRVIgLTEwNzQzOTYwMTYgIC8vIE5vIHZpZGVvIGRyaXZlciBpcyBpbnN0YWxsZWQuCisjZGVmaW5lIEVSUl9SUENfRVhFQ1VURV9JVkIgXAorICAtMTA3NDM5NjAxNSAgLy8gVW5hYmxlIHRvIGVzdGFibGlzaCBuZXR3b3JrIGNvbm5lY3Rpb24gd2l0aCByZW1vdGUgc3lzdGVtLgorI2RlZmluZSBFUlJfSU5WQUxJRF9WSURFT19CTElUIFwKKyAgLTEwNzQzOTYwMTQgIC8vIFJUIFZpZGVvIE91dCBkb2VzIG5vdCBzdXBwb3J0IGRpc3BsYXlpbmcgdGhlIHN1cHBsaWVkIGltYWdlCisgICAgICAgICAgICAgICAvLyB0eXBlIGF0IHRoZSBzZWxlY3RlZCBjb2xvciBkZXB0aC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVklERU9fTU9ERSAtMTA3NDM5NjAxMyAgLy8gSW52YWxpZCB2aWRlbyBtb2RlLgorI2RlZmluZSBFUlJfUlBDX0VYRUNVVEUgXAorICAtMTA3NDM5NjAxMiAgLy8gVW5hYmxlIHRvIGRpc3BsYXkgcmVtb3RlIGltYWdlIG9uIG5ldHdvcmsgY29ubmVjdGlvbi4KKyNkZWZpbmUgRVJSX1JQQ19CSU5EIC0xMDc0Mzk2MDExICAvLyBVbmFibGUgdG8gZXN0YWJsaXNoIG5ldHdvcmsgY29ubmVjdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRlJBTUVfTlVNQkVSIC0xMDc0Mzk2MDEwICAvLyBJbnZhbGlkIGZyYW1lIG51bWJlci4KKyNkZWZpbmUgRVJSX0RJUkVDVFggXAorICAtMTA3NDM5NjAwOSAgLy8gQW4gaW50ZXJuYWwgRGlyZWN0WCBlcnJvciBoYXMgb2NjdXJyZWQuICBUcnkgdXBncmFkaW5nIHRvIHRoZQorICAgICAgICAgICAgICAgLy8gbGF0ZXN0IHZlcnNpb24gb2YgRGlyZWN0WC4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfTk9fRklMVEVSIFwKKyAgLTEwNzQzOTYwMDggIC8vIEFuIGFwcHJvcHJpYXRlIERpcmVjdFggZmlsdGVyIHRvIHByb2Nlc3MgdGhpcyBmaWxlIGNvdWxkIG5vdAorICAgICAgICAgICAgICAgLy8gYmUgZm91bmQuICBJbnN0YWxsIHRoZSBmaWx0ZXIgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcworICAgICAgICAgICAgICAgLy8gQVZJLiBVcGdyYWRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIERpcmVjdFggbWF5IGNvcnJlY3QKKyAgICAgICAgICAgICAgIC8vIHRoaXMgZXJyb3IuICBOSSBWaXNpb24gcmVxdWlyZXMgRGlyZWN0WCA4LjEgb3IgaGlnaGVyLgorI2RlZmluZSBFUlJfRElSRUNUWF9JTkNPTVBBVElCTEVfQ09NUFJFU1NJT05fRklMVEVSIFwKKyAgLTEwNzQzOTYwMDcgIC8vIEluY29tcGF0aWJsZSBjb21wcmVzc2lvbiBmaWx0ZXIuCisjZGVmaW5lIEVSUl9ESVJFQ1RYX1VOS05PV05fQ09NUFJFU1NJT05fRklMVEVSIFwKKyAgLTEwNzQzOTYwMDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVua25vd24gY29tcHJlc3Npb24gZmlsdGVyLgorI2RlZmluZSBFUlJfSU5WQUxJRF9BVklfU0VTU0lPTiAtMTA3NDM5NjAwNSAgLy8gSW52YWxpZCBBVkkgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfQ0VSVElGSUNBVElPTl9GQUlMVVJFIFwKKyAgLTEwNzQzOTYwMDQgIC8vIEEgc29mdHdhcmUga2V5IGlzIHJlc3RyaWN0aW5nIHRoZSB1c2Ugb2YgdGhpcyBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgLy8gZmlsdGVyLgorI2RlZmluZSBFUlJfQVZJX0RBVEFfRVhDRUVEU19CVUZGRVJfU0laRSBcCisgIC0xMDc0Mzk2MDAzICAvLyBUaGUgZGF0YSBmb3IgdGhpcyBmcmFtZSBleGNlZWRzIHRoZSBkYXRhIGJ1ZmZlciBzaXplIHNwZWNpZmllZAorICAgICAgICAgICAgICAgLy8gd2hlbiBjcmVhdGluZyB0aGUgQVZJIGZpbGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0xJTkVHQVVHRU1FVEhPRCAtMTA3NDM5NjAwMiAgLy8gSW52YWxpZCBsaW5lIGdhdWdlIG1ldGhvZC4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZX0FWSV9TRVNTSU9OUyBcCisgIC0xMDc0Mzk2MDAxICAvLyBUaGVyZSBhcmUgdG9vIG1hbnkgQVZJIHNlc3Npb25zIG9wZW4uICBZb3UgbXVzdCBjbG9zZSBhCisgICAgICAgICAgICAgICAvLyBzZXNzaW9uIGJlZm9yZSB5b3UgY2FuIG9wZW4gYW5vdGhlciBvbmUuCisjZGVmaW5lIEVSUl9GSUxFX0ZJTEVfSEVBREVSIC0xMDc0Mzk2MDAwICAgIC8vIEludmFsaWQgZmlsZSBoZWFkZXIuCisjZGVmaW5lIEVSUl9GSUxFX0ZJTEVfVFlQRSAtMTA3NDM5NTk5OSAgICAgIC8vIEludmFsaWQgZmlsZSB0eXBlLgorI2RlZmluZSBFUlJfRklMRV9DT0xPUl9UQUJMRSAtMTA3NDM5NTk5OCAgICAvLyBJbnZhbGlkIGNvbG9yIHRhYmxlLgorI2RlZmluZSBFUlJfRklMRV9BUkdFUlIgLTEwNzQzOTU5OTcgICAgICAgICAvLyBJbnZhbGlkIHBhcmFtZXRlci4KKyNkZWZpbmUgRVJSX0ZJTEVfT1BFTiAtMTA3NDM5NTk5NiAgICAgICAgICAgLy8gRmlsZSBpcyBhbHJlYWR5IG9wZW4gZm9yIHdyaXRpbmcuCisjZGVmaW5lIEVSUl9GSUxFX05PVF9GT1VORCAtMTA3NDM5NTk5NSAgICAgIC8vIEZpbGUgbm90IGZvdW5kLgorI2RlZmluZSBFUlJfRklMRV9UT09fTUFOWV9PUEVOIC0xMDc0Mzk1OTk0ICAvLyBUb28gbWFueSBmaWxlcyBvcGVuLgorI2RlZmluZSBFUlJfRklMRV9JT19FUlIgLTEwNzQzOTU5OTMgICAgICAgICAvLyBGaWxlIEkvTyBlcnJvci4KKyNkZWZpbmUgRVJSX0ZJTEVfUEVSTUlTU0lPTiAtMTA3NDM5NTk5MiAgICAgLy8gRmlsZSBhY2Nlc3MgZGVuaWVkLgorI2RlZmluZSBFUlJfRklMRV9JTlZBTElEX1RZUEUgXAorICAtMTA3NDM5NTk5MSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpbGUgdHlwZSB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfRklMRV9HRVRfSU5GTyAtMTA3NDM5NTk5MCAgIC8vIENvdWxkIG5vdCByZWFkIFZpc2lvbiBpbmZvIGZyb20gZmlsZS4KKyNkZWZpbmUgRVJSX0ZJTEVfUkVBRCAtMTA3NDM5NTk4OSAgICAgICAvLyBVbmFibGUgdG8gcmVhZCBkYXRhLgorI2RlZmluZSBFUlJfRklMRV9XUklURSAtMTA3NDM5NTk4OCAgICAgIC8vIFVuYWJsZSB0byB3cml0ZSBkYXRhLgorI2RlZmluZSBFUlJfRklMRV9FT0YgLTEwNzQzOTU5ODcgICAgICAgIC8vIFByZW1hdHVyZSBlbmQgb2YgZmlsZS4KKyNkZWZpbmUgRVJSX0ZJTEVfRk9STUFUIC0xMDc0Mzk1OTg2ICAgICAvLyBJbnZhbGlkIGZpbGUgZm9ybWF0LgorI2RlZmluZSBFUlJfRklMRV9PUEVSQVRJT04gLTEwNzQzOTU5ODUgIC8vIEludmFsaWQgZmlsZSBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9GSUxFX0lOVkFMSURfREFUQV9UWVBFIFwKKyAgLTEwNzQzOTU5ODQgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmaWxlIGRhdGEgdHlwZSB5b3Ugc3BlY2lmaWVkLgorI2RlZmluZSBFUlJfRklMRV9OT19TUEFDRSAtMTA3NDM5NTk4MyAgLy8gRGlzayBmdWxsLgorI2RlZmluZSBFUlJfSU5WQUxJRF9GUkFNRVNfUEVSX1NFQ09ORCBcCisgIC0xMDc0Mzk1OTgyICAvLyBUaGUgZnJhbWVzIHBlciBzZWNvbmQgaW4gYW4gQVZJIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uCisjZGVmaW5lIEVSUl9JTlNVRkZJQ0lFTlRfQlVGRkVSX1NJWkUgXAorICAtMTA3NDM5NTk4MSAgLy8gVGhlIGJ1ZmZlciB0aGF0IHdhcyBwYXNzZWQgaW4gaXMgbm90IGJpZyBlbm91Z2ggdG8gaG9sZCBhbGwgb2YKKyAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhLgorI2RlZmluZSBFUlJfQ09NX0lOSVRJQUxJWkUgLTEwNzQzOTU5ODAgIC8vIEVycm9yIGluaXRpYWxpemluZyBDT00uCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFX0lORk8gXAorICAtMTA3NDM5NTk3OSAgLy8gVGhlIGltYWdlIGhhcyBpbnZhbGlkIHBhcnRpY2xlIGluZm9ybWF0aW9uLiAgQ2FsbAorICAgICAgICAgICAgICAgLy8gaW1hcUNvdW50UGFydGljbGVzIG9uIHRoZSBpbWFnZSB0byBjcmVhdGUgcGFydGljbGUKKyAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9QQVJUSUNMRV9OVU1CRVIgLTEwNzQzOTU5NzggIC8vIEludmFsaWQgcGFydGljbGUgbnVtYmVyLgorI2RlZmluZSBFUlJfQVZJX1ZFUlNJT04gXAorICAtMTA3NDM5NTk3NyAgLy8gVGhlIEFWSSBmaWxlIHdhcyBjcmVhdGVkIGluIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uCisgICAgICAgICAgICAgICAvLyBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIEFWSQorICAgICAgICAgICAgICAgLy8gZmlsZS4KKyNkZWZpbmUgRVJSX05VTUJFUl9PRl9QQUxFVFRFX0NPTE9SUyBcCisgIC0xMDc0Mzk1OTc2ICAvLyBUaGUgY29sb3IgcGFsZXR0ZSBtdXN0IGhhdmUgZXhhY3RseSAwIG9yIDI1NiBlbnRyaWVzLgorI2RlZmluZSBFUlJfQVZJX1RJTUVPVVQgXAorICAtMTA3NDM5NTk3NSAgLy8gRGlyZWN0WCBoYXMgdGltZWQgb3V0IHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgQVZJIGZpbGUuICBXaGVuCisgICAgICAgICAgICAgICAvLyBjbG9zaW5nIGFuIEFWSSBmaWxlLCB0cnkgYWRkaW5nIGFuIGFkZGl0aW9uYWwgZGVsYXkuICBXaGVuCisgICAgICAgICAgICAgICAvLyByZWFkaW5nIGFuIEFWSSBmaWxlLCB0cnkgcmVkdWNpbmcgQ1BVIGFuZCBkaXNrIGxvYWQuCisjZGVmaW5lIEVSUl9VTlNVUFBPUlRFRF9KUEVHMjAwMF9DT0xPUlNQQUNFX01FVEhPRCBcCisgIC0xMDc0Mzk1OTc0ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIEpQRUcyMDAwIGZpbGVzIHdpdGggdGhpcworICAgICAgICAgICAgICAgLy8gY29sb3JzcGFjZSBtZXRob2QuCisjZGVmaW5lIEVSUl9KUEVHMjAwMF9VTlNVUFBPUlRFRF9NVUxUSVBMRV9MQVlFUlMgXAorICAtMTA3NDM5NTk3MyAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBKUEVHMjAwMCBmaWxlcyB3aXRoIG1vcmUKKyAgICAgICAgICAgICAgIC8vIHRoYW4gb25lIGxheWVyLgorI2RlZmluZSBFUlJfRElSRUNUWF9FTlVNRVJBVEVfRklMVEVSUyBcCisgIC0xMDc0Mzk1OTcyICAvLyBEaXJlY3RYIGlzIHVuYWJsZSB0byBlbnVtZXJhdGUgdGhlIGNvbXByZXNzaW9uIGZpbHRlcnMuIFRoaXMKKyAgICAgICAgICAgICAgIC8vIGlzIGNhdXNlZCBieSBhIHRoaXJkLXBhcnR5IGNvbXByZXNzaW9uIGZpbHRlciB0aGF0IGlzIGVpdGhlcgorICAgICAgICAgICAgICAgLy8gaW1wcm9wZXJseSBpbnN0YWxsZWQgb3IgaXMgcHJldmVudGluZyBpdHNlbGYgZnJvbSBiZWluZworICAgICAgICAgICAgICAgLy8gZW51bWVyYXRlZC4gUmVtb3ZlIGFueSByZWNlbnRseSBpbnN0YWxsZWQgY29tcHJlc3Npb24gZmlsdGVycworICAgICAgICAgICAgICAgLy8gYW5kIHRyeSBhZ2Fpbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfT0ZGU0VUIFwKKyAgLTEwNzQzOTU5NzEgICAgICAgICAgICAgICAgIC8vIFRoZSBvZmZzZXQgeW91IHNwZWNpZmllZCBtdXN0IGJlIHNpemUgMi4KKyNkZWZpbmUgRVJSX0lOSVQgLTEwNzQzOTU5NjAgIC8vIEluaXRpYWxpemF0aW9uIGVycm9yLgorI2RlZmluZSBFUlJfQ1JFQVRFX1dJTkRPVyAtMTA3NDM5NTk1OSAgLy8gVW5hYmxlIHRvIGNyZWF0ZSB3aW5kb3cuCisjZGVmaW5lIEVSUl9XSU5ET1dfSUQgLTEwNzQzOTU5NTggICAgICAvLyBJbnZhbGlkIHdpbmRvdyBJRC4KKyNkZWZpbmUgRVJSX0FSUkFZX1NJWkVfTUlTTUFUQ0ggXAorICAtMTA3NDM5NTk1NyAgLy8gVGhlIGFycmF5IHNpemVzIGFyZSBub3QgY29tcGF0aWJsZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUVVBTElUWSBcCisgIC0xMDc0Mzk1OTU2ICAvLyBUaGUgcXVhbGl0eSB5b3UgcHJvdmlkZWQgaXMgaW52YWxpZC4gVmFsaWQgcXVhbGl0eSB2YWx1ZXMKKyAgICAgICAgICAgICAgIC8vIHJhbmdlIGZyb20gLTEgdG8gMTAwMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFYX1dBVkVMRVRfVFJBTlNGT1JNX0xFVkVMIFwKKyAgLTEwNzQzOTU5NTUgIC8vIEludmFsaWQgbWF4aW11bSB3YXZlbGV0IHRyYW5zZm9ybSBsZXZlbC4gIFZhbGlkIHZhbHVlcyByYW5nZQorICAgICAgICAgICAgICAgLy8gZnJvbSAwIHRvIDI1NS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUVVBTlRJWkFUSU9OX1NURVBfU0laRSBcCisgIC0xMDc0Mzk1OTU0ICAvLyBUaGUgcXVhbnRpemF0aW9uIHN0ZXAgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9XQVZFTEVUX1RSQU5TRk9STV9NT0RFIFwKKyAgLTEwNzQzOTU5NTMgIC8vIEludmFsaWQgd2F2ZWxldCB0cmFuc2Zvcm0gbW9kZS4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfUE9JTlQgXAorICAtMTA3NDM5NTk1MiAgLy8gVGhlIFJPSSBtdXN0IG9ubHkgaGF2ZSBhIHNpbmdsZSBQb2ludCBjb250b3VyLgorI2RlZmluZSBFUlJfUk9JX05PVF9QT0lOVFMgXAorICAtMTA3NDM5NTk1MSAgLy8gVGhlIFJPSSBtdXN0IG9ubHkgaGF2ZSBQb2ludCBjb250b3Vycy4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfTElORSBcCisgIC0xMDc0Mzk1OTUwICAvLyBUaGUgUk9JIG11c3Qgb25seSBoYXZlIGEgc2luZ2xlIExpbmUgY29udG91ci4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfQU5OVUxVUyBcCisgIC0xMDc0Mzk1OTQ5ICAvLyBUaGUgUk9JIG11c3Qgb25seSBoYXZlIGEgc2luZ2xlIEFubnVsdXMgY29udG91ci4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUVBU1VSRV9QQVJUSUNMRVNfQ0FMSUJSQVRJT05fTU9ERSBcCisgIC0xMDc0Mzk1OTQ4ICAvLyBJbnZhbGlkIG1lYXN1cmUgcGFydGljbGVzIGNhbGlicmF0aW9uIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFX0NMQVNTSUZJRVJfVEhSRVNIT0xEX1RZUEUgXAorICAtMTA3NDM5NTk0NyAgLy8gSW52YWxpZCBwYXJ0aWNsZSBjbGFzc2lmaWVyIHRocmVzaG9sZCB0eXBlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9ESVNUQU5DRSAtMTA3NDM5NTk0NiAgLy8gSW52YWxpZCBDb2xvciBTZWdtZW50YXRpb24gRGlzdGFuY2UKKyNkZWZpbmUgRVJSX0lOVkFMSURfUEFSVElDTEVfQVJFQSBcCisgIC0xMDc0Mzk1OTQ1ICAvLyBJbnZhbGlkIENvbG9yIFNlZ21lbmF0aW9uIFBhcnRpY2xlIEFyZWEKKyNkZWZpbmUgRVJSX0NMQVNTX05BTUVfTk9UX0ZPVU5EIFwKKyAgLTEwNzQzOTU5NDQgIC8vIFJlcXVpcmVkIENsYXNzIG5hbWUgaXMgbm90IGZvdW5kIGluIHRyYWluZWQgbGFiZWxzL0NsYXNzIG5hbWVzCisjZGVmaW5lIEVSUl9OVU1CRVJfTEFCRUxfTElNSVRfRVhDRUVERUQgXAorICAtMTA3NDM5NTk0MyAgLy8gTnVtYmVyIG9mIExhYmVscyBleGNlZWRlZCBsaW1pdCBvZiBsYWJlbCBJbWFnZSB0eXBlCisjZGVmaW5lIEVSUl9JTlZBTElEX0RJU1RBTkNFX0xFVkVMIFwKKyAgLTEwNzQzOTU5NDIgIC8vIEludmFsaWQgQ29sb3IgU2VnbWVudGF0aW9uIGRpc3RhbmNlIGxldmVsCisjZGVmaW5lIEVSUl9JTlZBTElEX1NWTV9UWVBFIC0xMDc0Mzk1OTQxICAgIC8vIEludmFsaWQgU1ZNIG1vZGVsIHR5cGUKKyNkZWZpbmUgRVJSX0lOVkFMSURfU1ZNX0tFUk5FTCAtMTA3NDM5NTk0MCAgLy8gSW52YWxpZCBTVk0ga2VybmVsIHR5cGUKKyNkZWZpbmUgRVJSX05PX1NVUFBPUlRfVkVDVE9SX0ZPVU5EIFwKKyAgLTEwNzQzOTU5MzkgIC8vIE5vIFN1cHBvcnQgVmVjdG9yIGlzIGZvdW5kIGF0IFNWTSB0cmFpbmluZworI2RlZmluZSBFUlJfQ09TVF9MQUJFTF9OT1RfRk9VTkQgXAorICAtMTA3NDM5NTkzOCAgLy8gTGFiZWwgbmFtZSBpcyBub3QgZm91bmQgaW4gYWRkZWQgc2FtcGxlcworI2RlZmluZSBFUlJfRVhDRUVERURfU1ZNX01BWF9JVEVSQVRJT04gXAorICAtMTA3NDM5NTkzNyAgLy8gU1ZNIHRyYWluaW5nIGV4Y2VlZGVkIG1heGltaW0gSXRlcmF0aW9uIGxpbWl0CisjZGVmaW5lIEVSUl9JTlZBTElEX1NWTV9QQVJBTUVURVIgLTEwNzQzOTU5MzYgIC8vIEludmFsaWQgU1ZNIFBhcmFtZXRlcgorI2RlZmluZSBFUlJfSU5WQUxJRF9JREVOVElGSUNBVElPTl9TQ09SRSBcCisgIC0xMDc0Mzk1OTM1ICAvLyBJbnZhbGlkIElkZW50aWZpY2F0aW9uIHNjb3JlLiBNdXN0IGJlIGJldHdlZW4gMC0xMDAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9URVhUVVJFX0ZFQVRVUkUgXAorICAtMTA3NDM5NTkzNCAgLy8gUmVxdWVzdGVkIGZvciBpbnZhbGlkIHRleHR1cmUgZmVhdHVyZQorI2RlZmluZSBFUlJfSU5WQUxJRF9DT09DQ1VSUkVOQ0VfTEVWRUwgXAorICAtMTA3NDM5NTkzMyAgLy8gVGhlIGNvT2NjdXJyZW5jZSBMZXZlbCBtdXN0IGxpZSBiZXR3ZWVuIDEgYW5kIHRoZSBtYXhpbXVtCisgICAgICAgICAgICAgICAvLyBwaXhlbCB2YWx1ZSBvZiBhbiBpbWFnZSAoMjU1IGZvciBVOCBpbWFnZSkKKyNkZWZpbmUgRVJSX0lOVkFMSURfV0FWRUxFVF9TVUJCQU5EIFwKKyAgLTEwNzQzOTU5MzIgIC8vIFJlcXVlc3QgZm9yIGludmFsaWQgd2F2ZWxldCBzdWJCYW5kCisjZGVmaW5lIEVSUl9JTlZBTElEX0ZJTkFMX1NURVBfU0laRSBcCisgIC0xMDc0Mzk1OTMxICAvLyBUaGUgZmluYWwgc3RlcCBzaXplIG11c3QgYmUgbGVzc2VyIHRoYW4gdGhlIGluaXRpYWwgc3RlcCBzaXplCisjZGVmaW5lIEVSUl9JTlZBTElEX0VORVJHWSBcCisgIC0xMDc0Mzk1OTMwICAvLyBNaW5pbXVtIEVuZXJneSBzaG91bGQgbGllIGJldHdlZW4gMCBhbmQgMTAwCisjZGVmaW5lIEVSUl9JTlZBTElEX1RFWFRVUkVfTEFCRUwgXAorICAtMTA3NDM5NTkyOSAgLy8gVGhlIGNsYXNzaWZpY2F0aW9uIGxhYmVsIG11c3QgYmUgdGV4dHVyZSBvciBkZWZlY3QgZm9yIHRleHR1cmUKKyAgICAgICAgICAgICAgIC8vIGRlZmVjdCBjbGFzc2lmaWVyCisjZGVmaW5lIEVSUl9JTlZBTElEX1dBVkVMRVRfVFlQRSAtMTA3NDM5NTkyOCAgLy8gVGhlIHdhdmVsZXQgdHlwZSBpcyBpbnZhbGlkCisjZGVmaW5lIEVSUl9TQU1FX1dBVkVMRVRfQkFORFNfU0VMRUNURUQgXAorICAtMTA3NDM5NTkyNyAgLy8gU2FtZSBXYXZlbGV0IGJhbmQgaXMgc2VsZWN0ZWQgbXVsdGlwbGUgdGltZXMKKyNkZWZpbmUgRVJSX0lNQUdFX1NJWkVfTUlTTUFUQ0ggXAorICAtMTA3NDM5NTkyNiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdHdvIGlucHV0IGltYWdlIHNpemVzIGFyZSBkaWZmZXJlbnQKKyNkZWZpbmUgRVJSX05VTUJFUl9DTEFTUyAtMTA3NDM5NTkyMCAgLy8gSW52YWxpZCBudW1iZXIgb2YgY2xhc3Nlcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTFVDQVNfS0FOQURFX1dJTkRPV19TSVpFIFwKKyAgLTEwNzQzOTU4ODggIC8vIEJvdGggZGltZW5zaW9ucyBvZiB0aGUgd2luZG93IHNpemUgc2hvdWxkIGJlIG9kZCwgZ3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAvLyAyIGFuZCBsZXNzIHRoYW4gMTYuCisjZGVmaW5lIEVSUl9JTlZBTElEX01BVFJJWF9UWVBFIFwKKyAgLTEwNzQzOTU4ODcgIC8vIFRoZSB0eXBlIG9mIG1hdHJpeCBzdXBwbGllZCB0byB0aGUgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfT1BUSUNBTF9GTE9XX1RFUk1JTkFUSU9OX0NSSVRFUklBX1RZUEUgXAorICAtMTA3NDM5NTg4NiAgLy8gQW4gaW52YWxpZCB0ZXJtaW5hdGlvbiBjcml0ZXJpYSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgb3B0aWNhbAorICAgICAgICAgICAgICAgLy8gZmxvdyBjb21wdXRhdGlvbi4KKyNkZWZpbmUgRVJSX0xLUF9OVUxMX1BZUkFNSUQgXAorICAtMTA3NDM5NTg4NSAgLy8gVGhlIHB5cmFtaWQgbGV2ZWxzIHdoZXJlIG5vdCBwcm9wZXJseSBhbGxvY2F0ZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BZUkFNSURfTEVWRUwgXAorICAtMTA3NDM5NTg4NCAgLy8gVGhlIHB5cmFtaWQgbGV2ZWwgc3BlY2lmaWVkIGNhbm5vdCBiZSBuZWdhdGl2ZQorI2RlZmluZSBFUlJfSU5WQUxJRF9MS1BfS0VSTkVMIFwKKyAgLTEwNzQzOTU4ODMgIC8vIFRoZSBrZXJuZWwgbXVzdCBiZSBzeW1tZXRyaWMgIHdpdGggbm9uLXplcm8gY29lZmZpY2llbnRzIGFuZAorICAgICAgICAgICAgICAgLy8gb2Ygb2RkIHNpemUKKyNkZWZpbmUgRVJSX0lOVkFMSURfSE9STl9TQ0hVTkNLX0xBTUJEQSBcCisgIC0xMDc0Mzk1ODgyICAvLyBJbnZhbGlkIHNtb290aGluZyBwYXJhbWV0ZXIgaW4gSG9ybiBTY2h1bmNrIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSE9STl9TQ0hVTkNLX1RZUEUgXAorICAtMTA3NDM5NTg4MSAgLy8gSW52YWxpZCBzdG9wcGluZyBjcml0ZXJpYSB0eXBlIGZvciBIb3JuIFNjaHVuY2sgb3B0aWNhbCBmbG93LgorI2RlZmluZSBFUlJfUEFSVElDTEUgLTEwNzQzOTU4ODAgICAgIC8vIEludmFsaWQgcGFydGljbGUuCisjZGVmaW5lIEVSUl9CQURfTUVBU1VSRSAtMTA3NDM5NTg3OSAgLy8gSW52YWxpZCBtZWFzdXJlIG51bWJlci4KKyNkZWZpbmUgRVJSX1BST1BfTk9ERV9XUklURV9OT1RfU1VQUE9SVEVEIFwKKyAgLTEwNzQzOTU4NzggIC8vIFRoZSBJbWFnZSBEaXNwbGF5IGNvbnRyb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nIHRoaXMKKyAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IG5vZGUuCisjZGVmaW5lIEVSUl9DT0xPUk1PREVfUkVRVUlSRVNfQ0hBTkdFQ09MT1JTUEFDRTIgXAorICAtMTA3NDM5NTg3NyAgLy8gVGhlIHNwZWNpZmllZCBjb2xvciBtb2RlIHJlcXVpcmVzIHRoZSB1c2Ugb2YKKyAgICAgICAgICAgICAgIC8vIGltYXFDaGFuZ2VDb2xvclNwYWNlMi4KKyNkZWZpbmUgRVJSX1VOU1VQUE9SVEVEX0NPTE9SX01PREUgXAorICAtMTA3NDM5NTg3NiAgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgY29sb3IgbW9kZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0JBUkNPREVfUEhBUk1BQ09ERSBcCisgIC0xMDc0Mzk1ODc1ICAvLyBUaGUgYmFyY29kZSBpcyBub3QgYSB2YWxpZCBQaGFybWFjb2RlIHN5bWJvbAorI2RlZmluZSBFUlJfQkFEX0lOREVYIC0xMDc0Mzk1ODQwICAvLyBJbnZhbGlkIGhhbmRsZSB0YWJsZSBpbmRleC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09NUFJFU1NJT05fUkFUSU8gXAorICAtMTA3NDM5NTgzNyAgLy8gVGhlIGNvbXByZXNzaW9uIHJhdGlvIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9DT05UT1VSUyBcCisgIC0xMDc0Mzk1ODAxICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgUk9JIGNvbnRhaW5zIHRvbyBtYW55IGNvbnRvdXJzLgorI2RlZmluZSBFUlJfUFJPVEVDVElPTiAtMTA3NDM5NTgwMCAgLy8gUHJvdGVjdGlvbiBlcnJvci4KKyNkZWZpbmUgRVJSX0lOVEVSTkFMIC0xMDc0Mzk1Nzk5ICAgIC8vIEludGVybmFsIGVycm9yLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DVVNUT01fU0FNUExFIFwKKyAgLTEwNzQzOTU3OTggIC8vIFRoZSBzaXplIG9mIHRoZSBmZWF0dXJlIHZlY3RvciBpbiB0aGUgY3VzdG9tIHNhbXBsZSBtdXN0IG1hdGNoCisgICAgICAgICAgICAgICAvLyB0aGUgc2l6ZSBvZiB0aG9zZSB5b3UgaGF2ZSBhbHJlYWR5IGFkZGVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DTEFTU0lGSUVSX1NFU1NJT04gXAorICAtMTA3NDM5NTc5NyAgLy8gTm90IGEgdmFsaWQgY2xhc3NpZmllciBzZXNzaW9uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9LTk5fTUVUSE9EIFwKKyAgLTEwNzQzOTU3OTYgIC8vIFlvdSByZXF1ZXN0ZWQgYW4gaW52YWxpZCBOZWFyZXN0IE5laWdoYm9yIGNsYXNzaWZpZXIgbWV0aG9kLgorI2RlZmluZSBFUlJfS19UT09fTE9XIC0xMDc0Mzk1Nzk1ICAvLyBUaGUgayBwYXJhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gdHdvLgorI2RlZmluZSBFUlJfS19UT09fSElHSCBcCisgIC0xMDc0Mzk1Nzk0ICAvLyBUaGUgayBwYXJhbWV0ZXIgbXVzdCBiZSA8PSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gZWFjaAorICAgICAgICAgICAgICAgLy8gY2xhc3MuCisjZGVmaW5lIEVSUl9JTlZBTElEX09QRVJBVElPTl9PTl9DT01QQUNUX1NFU1NJT05fQVRURU1QVEVEIFwKKyAgLTEwNzQzOTU3OTMgIC8vIFRoaXMgY2xhc3NpZmllciBzZXNzaW9uIGlzIGNvbXBhY3QuIE9ubHkgdGhlIENsYXNzaWZ5IGFuZAorICAgICAgICAgICAgICAgLy8gRGlzcG9zZSBmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZCBvbiBhIGNvbXBhY3QgY2xhc3NpZmllcgorICAgICAgICAgICAgICAgLy8gc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0NMQVNTSUZJRVJfU0VTU0lPTl9OT1RfVFJBSU5FRCBcCisgIC0xMDc0Mzk1NzkyICAvLyBUaGlzIGNsYXNzaWZpZXIgc2Vzc2lvbiBpcyBub3QgdHJhaW5lZC4gWW91IG1heSBvbmx5IGNhbGwgdGhpcworICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gb24gYSB0cmFpbmVkIGNsYXNzaWZpZXIgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0NMQVNTSUZJRVJfSU5WQUxJRF9TRVNTSU9OX1RZUEUgXAorICAtMTA3NDM5NTc5MSAgLy8gVGhpcyBjbGFzc2lmaWVyIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgb24gdGhpcyB0eXBlIG9mCisgICAgICAgICAgICAgICAvLyBjbGFzc2lmaWVyIHNlc3Npb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0RJU1RBTkNFX01FVFJJQyBcCisgIC0xMDc0Mzk1NzkwICAvLyBZb3UgcmVxdWVzdGVkIGFuIGludmFsaWQgZGlzdGFuY2UgbWV0cmljLgorI2RlZmluZSBFUlJfT1BFTklOR19ORVdFUl9DTEFTU0lGSUVSX1NFU1NJT04gXAorICAtMTA3NDM5NTc4OSAgLy8gVGhlIGNsYXNzaWZpZXIgc2Vzc2lvbiB5b3UgdHJpZWQgdG8gb3BlbiB3YXMgY3JlYXRlZCB3aXRoIGEKKyAgICAgICAgICAgICAgIC8vIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZgorICAgICAgICAgICAgICAgLy8gTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBmaWxlLgorI2RlZmluZSBFUlJfTk9fU0FNUExFUyBcCisgIC0xMDc0Mzk1Nzg4ICAvLyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgeW91IGhhdmUgbm90IGFkZGVkCisgICAgICAgICAgICAgICAvLyBhbnkgc2FtcGxlcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ0xBU1NJRklFUl9UWVBFIFwKKyAgLTEwNzQzOTU3ODcgIC8vIFlvdSByZXF1ZXN0ZWQgYW4gaW52YWxpZCBjbGFzc2lmaWVyIHR5cGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFX09QVElPTlMgXAorICAtMTA3NDM5NTc4NiAgLy8gVGhlIHN1bSBvZiBTY2FsZSBEZXBlbmRlbmNlIGFuZCBTeW1tZXRyeSBEZXBlbmRlbmNlIG11c3QgYmUKKyAgICAgICAgICAgICAgIC8vIGxlc3MgdGhhbiAxMDAwLgorI2RlZmluZSBFUlJfTk9fUEFSVElDTEUgLTEwNzQzOTU3ODUgIC8vIFRoZSBpbWFnZSB5aWVsZGVkIG5vIHBhcnRpY2xlcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTElNSVRTIFwKKyAgLTEwNzQzOTU3ODQgIC8vIFRoZSBsaW1pdHMgeW91IHN1cHBsaWVkIGFyZSBub3QgdmFsaWQuCisjZGVmaW5lIEVSUl9CQURfU0FNUExFX0lOREVYIFwKKyAgLTEwNzQzOTU3ODMgIC8vIFRoZSBTYW1wbGUgSW5kZXggZmVsbCBvdXRzaWRlIHRoZSByYW5nZSBvZiBTYW1wbGVzLgorI2RlZmluZSBFUlJfREVTQ1JJUFRJT05fVE9PX0xPTkcgXAorICAtMTA3NDM5NTc4MiAgLy8gVGhlIGRlc2NyaXB0aW9uIG11c3QgYmUgPD0gMjU1IGNoYXJhY3RlcnMuCisjZGVmaW5lIEVSUl9DTEFTU0lGSUVSX0lOVkFMSURfRU5HSU5FX1RZUEUgXAorICAtMTA3NDM5NTc4MSAgLy8gVGhlIGVuZ2luZSBmb3IgdGhpcyBjbGFzc2lmaWVyIHNlc3Npb24gZG9lcyBub3Qgc3VwcG9ydCB0aGlzCisgICAgICAgICAgICAgICAvLyBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFX1RZUEUgXAorICAtMTA3NDM5NTc4MCAgLy8gWW91IHJlcXVlc3RlZCBhbiBpbnZhbGlkIHBhcnRpY2xlIHR5cGUuCisjZGVmaW5lIEVSUl9DQU5OT1RfQ09NUEFDVF9VTlRSQUlORUQgXAorICAtMTA3NDM5NTc3OSAgLy8gWW91IG1heSBvbmx5IHNhdmUgYSBzZXNzaW9uIGluIGNvbXBhY3QgZm9ybSBpZiBpdCBpcyB0cmFpbmVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9LRVJORUxfU0laRSBcCisgIC0xMDc0Mzk1Nzc4ICAvLyBUaGUgS2VybmVsIHNpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGhlIGltYWdlIHNpemUuCisjZGVmaW5lIEVSUl9JTkNPTVBBVElCTEVfQ0xBU1NJRklFUl9UWVBFUyBcCisgIC0xMDc0Mzk1Nzc3ICAvLyBUaGUgc2Vzc2lvbiB5b3UgcmVhZCBmcm9tIGZpbGUgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGFzIHRoZQorICAgICAgICAgICAgICAgLy8gc2Vzc2lvbiB5b3UgcGFzc2VkIGluLgorI2RlZmluZSBFUlJfSU5WQUxJRF9VU0VfT0ZfQ09NUEFDVF9TRVNTSU9OX0ZJTEUgXAorICAtMTA3NDM5NTc3NiAgLy8gWW91IGNhbiBub3QgdXNlIGEgY29tcGFjdCBjbGFzc2lmaWNhdGlvbiBmaWxlIHdpdGggcmVhZAorICAgICAgICAgICAgICAgLy8gb3B0aW9ucyBvdGhlciB0aGFuIFJlYWQgQWxsLgorI2RlZmluZSBFUlJfUk9JX0hBU19PUEVOX0NPTlRPVVJTIFwKKyAgLTEwNzQzOTU3NzUgIC8vIFRoZSBST0kgeW91IHBhc3NlZCBpbiBtYXkgb25seSBjb250YWluIGNsb3NlZCBjb250b3Vycy4KKyNkZWZpbmUgRVJSX05PX0xBQkVMIC0xMDc0Mzk1Nzc0ICAgICAgIC8vIFlvdSBtdXN0IHBhc3MgaW4gYSBsYWJlbC4KKyNkZWZpbmUgRVJSX05PX0RFU1RfSU1BR0UgLTEwNzQzOTU3NzMgIC8vIFlvdSBtdXN0IHByb3ZpZGUgYSBkZXN0aW5hdGlvbiBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUkVHSVNUUkFUSU9OX01FVEhPRCBcCisgIC0xMDc0Mzk1NzcyICAvLyBZb3UgcHJvdmlkZWQgYW4gaW52YWxpZCByZWdpc3RyYXRpb24gbWV0aG9kLgorI2RlZmluZSBFUlJfT1BFTklOR19ORVdFUl9JTlNQRUNUSU9OX1RFTVBMQVRFIFwKKyAgLTEwNzQzOTU3NzEgIC8vIFRoZSBnb2xkZW4gdGVtcGxhdGUgeW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyCisgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkKKyAgICAgICAgICAgICAgIC8vIFZpc2lvbiB0byByZWFkIHRoaXMgZmlsZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5TUEVDVElPTl9URU1QTEFURSAtMTA3NDM5NTc3MCAgLy8gSW52YWxpZCBnb2xkZW4gdGVtcGxhdGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX0VER0VfVEhJQ0tORVNTIFwKKyAgLTEwNzQzOTU3NjkgIC8vIEVkZ2UgVGhpY2tuZXNzIHRvIElnbm9yZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TQ0FMRSAtMTA3NDM5NTc2OCAgLy8gU2NhbGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQUxJR05NRU5UIFwKKyAgLTEwNzQzOTU3NjcgIC8vIFRoZSBzdXBwbGllZCBzY2FsZSBpcyBpbnZhbGlkIGZvciB5b3VyIHRlbXBsYXRlLgorI2RlZmluZSBFUlJfREVQUkVDQVRFRF9GVU5DVElPTiBcCisgIC0xMDc0Mzk1NzY2ICAvLyBUaGlzIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZ1bmN0aW9uIGNhbiBub3QgYmUgdXNlZCB3aXRoCisgICAgICAgICAgICAgICAvLyB0aGlzIHNlc3Npb24uIFVzZSBuZXdlciwgc3VwcG9ydGVkIGZ1bmN0aW9ucyBpbnN0ZWFkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OT1JNQUxJWkFUSU9OX01FVEhPRCBcCisgIC0xMDc0Mzk1NzYzICAvLyBZb3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgbm9ybWFsaXphdGlvbiBtZXRob2QuCisjZGVmaW5lIEVSUl9JTlZBTElEX05JQkxBQ0tfREVWSUFUSU9OX0ZBQ1RPUiBcCisgIC0xMDc0Mzk1NzYyICAvLyBUaGUgZGV2aWF0aW9uIGZhY3RvciBmb3IgTmlibGFjayBsb2NhbCB0aHJlc2hvbGQgbXVzdCBiZQorICAgICAgICAgICAgICAgLy8gYmV0d2VlbiAwIGFuZCAxLgorI2RlZmluZSBFUlJfQk9BUkRfTk9UX0ZPVU5EIC0xMDc0Mzk1NzYwICAgICAgICAgLy8gQm9hcmQgbm90IGZvdW5kLgorI2RlZmluZSBFUlJfQk9BUkRfTk9UX09QRU4gLTEwNzQzOTU3NTggICAgICAgICAgLy8gQm9hcmQgbm90IG9wZW5lZC4KKyNkZWZpbmUgRVJSX0RMTF9OT1RfRk9VTkQgLTEwNzQzOTU3NTcgICAgICAgICAgIC8vIERMTCBub3QgZm91bmQuCisjZGVmaW5lIEVSUl9ETExfRlVOQ1RJT05fTk9UX0ZPVU5EIC0xMDc0Mzk1NzU2ICAvLyBETEwgZnVuY3Rpb24gbm90IGZvdW5kLgorI2RlZmluZSBFUlJfVFJJR19USU1FT1VUIC0xMDc0Mzk1NzU0ICAgICAgICAgICAgLy8gVHJpZ2dlciB0aW1lb3V0LgorI2RlZmluZSBFUlJfQ09OVE9VUl9JTlZBTElEX1JFRklORU1FTlRTIFwKKyAgLTEwNzQzOTU3NDYgIC8vIEludmFsaWQgbnVtYmVyIHNwZWNpZmllZCBmb3IgbWF4aW11bSBjb250b3VyIHJlZmluZW1lbnRzLgorI2RlZmluZSBFUlJfVE9PX01BTllfQ1VSVkVTIFwKKyAgLTEwNzQzOTU3NDUgIC8vIFRvbyBtYW55IGN1cnZlcyBleHRyYWN0ZWQgZnJvbSBpbWFnZS4gUmFpc2UgdGhlIGVkZ2UgdGhyZXNob2xkCisgICAgICAgICAgICAgICAvLyBvciByZWR1Y2UgdGhlIFJPSS4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfSU5WQUxJRF9LRVJORUxfRk9SX1NNT09USElORyBcCisgIC0xMDc0Mzk1NzQ0ICAvLyBJbnZhbGlkIGtlcm5lbCBmb3IgY29udG91ciBzbW9vdGhpbmcuIFplcm8gaW5kaWNhdGVzIG5vCisgICAgICAgICAgICAgICAvLyBzbW9vdGhpbmcsIG90aGVyd2lzZSB2YWx1ZSBtdXN0IGJlIG9kZC4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfTElORV9JTlZBTElEIFwKKyAgLTEwNzQzOTU3NDMgIC8vIFRoZSBjb250b3VyIGxpbmUgZml0IGlzIGludmFsaWQuIExpbmUgc2VnbWVudCBzdGFydCBhbmQgc3RvcAorICAgICAgICAgICAgICAgLy8gbXVzdCBkaWZmZXIuCisjZGVmaW5lIEVSUl9DT05UT1VSX1RFTVBMQVRFX0lNQUdFX0lOVkFMSUQgXAorICAtMTA3NDM5NTc0MiAgLy8gVGhlIHRlbXBsYXRlIGltYWdlIG11c3QgYmUgdHJhaW5lZCB3aXRoIElNQVEgTGVhcm4gQ29udG91cgorICAgICAgICAgICAgICAgLy8gUGF0dGVybiBvciBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSB0YXJnZXQgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT05UT1VSX0dQTV9GQUlMIFwKKyAgLTEwNzQzOTU3NDEgIC8vIE1hdGNoaW5nIGZhaWxlZCB0byBhbGlnbiB0aGUgdGVtcGxhdGUgYW5kIHRhcmdldCBjb250b3Vycy4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfT1BFTklOR19ORVdFUl9WRVJTSU9OIFwKKyAgLTEwNzQzOTU3NDAgIC8vIFRoZSBjb250b3VyIHlvdSB0cmllZCB0byBvcGVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uCisgICAgICAgICAgICAgICAvLyBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0bworICAgICAgICAgICAgICAgLy8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9DT05UT1VSX0NPTk5FQ1RfRFVQTElDQVRFIFwKKyAgLTEwNzQzOTU3MzkgIC8vIE9ubHkgb25lIHJhbmdlIGlzIGFsbG93ZWQgcGVyIGN1cnZlIGNvbm5lY3Rpb24gY29uc3RyYWludAorICAgICAgICAgICAgICAgLy8gdHlwZS4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfQ09OTkVDVF9UWVBFIFwKKyAgLTEwNzQzOTU3MzggIC8vIEludmFsaWQgY29udG91ciBjb25uZWN0aW9uIGNvbnN0cmFpbnQgdHlwZS4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfTUFUQ0hfU1RSX05PVF9BUFBMSUNBQkxFIFwKKyAgLTEwNzQzOTU3MzcgIC8vIEluIG9yZGVyIHRvIHVzZSBjb250b3VyIG1hdGNoaW5nLCB5b3UgbXVzdCBwcm92aWRlIGEgdGVtcGxhdGUKKyAgICAgICAgICAgICAgIC8vIGltYWdlIHRoYXQgaGFzIGJlZW4gdHJhaW5lZCB3aXRoIElNQVEgTGVhcm4gQ29udG91ciBQYXR0ZXJuCisjZGVmaW5lIEVSUl9DT05UT1VSX0NVUlZBVFVSRV9LRVJORUwgXAorICAtMTA3NDM5NTczNiAgLy8gSW52YWxpZCBrZXJuZWwgd2lkdGggZm9yIGN1cnZhdHVyZSBjYWxjdWxhdGlvbi4gTXVzdCBiZSBhbiBvZGQKKyAgICAgICAgICAgICAgIC8vIHZhbHVlIGdyZWF0ZXIgdGhhbiAxLgorI2RlZmluZSBFUlJfQ09OVE9VUl9FWFRSQUNUX1NFTEVDVElPTiBcCisgIC0xMDc0Mzk1NzM1ICAvLyBJbnZhbGlkIENvbnRvdXIgU2VsZWN0aW9uIG1ldGhvZCBmb3IgY29udG91ciBleHRyYWN0aW9uLgorI2RlZmluZSBFUlJfQ09OVE9VUl9FWFRSQUNUX0RJUkVDVElPTiBcCisgIC0xMDc0Mzk1NzM0ICAvLyBJbnZhbGlkIFNlYXJjaCBEaXJlY3Rpb24gZm9yIGNvbnRvdXIgZXh0cmFjdGlvbi4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfRVhUUkFDVF9ST0kgXAorICAtMTA3NDM5NTczMyAgLy8gSW52YWxpZCBST0kgZm9yIGNvbnRvdXIgZXh0cmFjdGlvbi4gVGhlIFJPSSBtdXN0IGNvbnRhaW4gYW4KKyAgICAgICAgICAgICAgIC8vIGFubnVsdXMsIHJlY3RhbmdsZSBvciByb3RhdGVkIHJlY3RhbmdsZS4KKyNkZWZpbmUgRVJSX0NPTlRPVVJfTk9fQ1VSVkVTIC0xMDc0Mzk1NzMyICAvLyBObyBjdXJ2ZXMgd2VyZSBmb3VuZCBpbiB0aGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT05UT1VSX0NPTVBBUkVfS0VSTkVMIFwKKyAgLTEwNzQzOTU3MzEgIC8vIEludmFsaWQgU21vb3RoaW5nIEtlcm5lbCB3aWR0aCBmb3IgY29udG91ciBjb21wYXJpc29uLiBNdXN0IGJlCisgICAgICAgICAgICAgICAvLyB6ZXJvIG9yIGFuIG9kZCBwb3NpdGl2ZSBpbnRlZ2VyLgorI2RlZmluZSBFUlJfQ09OVE9VUl9DT01QQVJFX1NJTkdMRV9JTUFHRSBcCisgIC0xMDc0Mzk1NzMwICAvLyBJZiBubyB0ZW1wbGF0ZSBpbWFnZSBpcyBwcm92aWRlZCwgdGhlIHRhcmdldCBpbWFnZSBtdXN0CisgICAgICAgICAgICAgICAvLyBjb250YWluIGJvdGggYSBjb250b3VyIHdpdGggZXh0cmFjdGVkIHBvaW50cyBhbmQgYSBmaXR0ZWQKKyAgICAgICAgICAgICAgIC8vIGVxdWF0aW9uLgorI2RlZmluZSBFUlJfQ09OVE9VUl9JTlZBTElEIC0xMDc0Mzk1NzI5ICAvLyBJbnZhbGlkIGNvbnRvdXIgaW1hZ2UuCisjZGVmaW5lIEVSUl9JTlZBTElEXzJEX0JBUkNPREVfU0VBUkNIX01PREUgXAorICAtMTA3NDM5NTcyOCAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlYXJjaCBtb2RlIHlvdSBwcm92aWRlZC4KKyNkZWZpbmUgRVJSX1VOU1VQUE9SVEVEXzJEX0JBUkNPREVfU0VBUkNIX01PREUgXAorICAtMTA3NDM5NTcyNyAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlYXJjaCBtb2RlIHlvdSBwcm92aWRlZCBmb3IKKyAgICAgICAgICAgICAgIC8vIHRoZSB0eXBlIG9mIDJEIGJhcmNvZGUgZm9yIHdoaWNoIHlvdSBhcmUgc2VhcmNoaW5nLgorI2RlZmluZSBFUlJfTUFUQ0hGQUNUT1JfT0JTT0xFVEUgXAorICAtMTA3NDM5NTcyNiAgLy8gbWF0Y2hGYWN0b3IgaGFzIGJlZW4gb2Jzb2xldGVkLiBJbnN0ZWFkLCBzZXQgdGhlCisgICAgICAgICAgICAgICAvLyBpbml0aWFsTWF0Y2hMaXN0TGVuZ3RoIGFuZCBtYXRjaExpc3RSZWR1Y3Rpb25GYWN0b3IgaW4gdGhlCisgICAgICAgICAgICAgICAvLyBNYXRjaFBhdHRlcm5BZHZhbmNlZE9wdGlvbnMgc3RydWN0dXJlLgorI2RlZmluZSBFUlJfREFUQV9WRVJTSU9OIFwKKyAgLTEwNzQzOTU3MjUgIC8vIFRoZSBkYXRhIHdhcyBzdG9yZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgTkkgVmlzaW9uLiBVcGdyYWRlCisgICAgICAgICAgICAgICAvLyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTkkgVmlzaW9uIHRvIHJlYWQgdGhpcyBkYXRhLgorI2RlZmluZSBFUlJfQ1VTVE9NREFUQV9JTlZBTElEX1NJWkUgXAorICAtMTA3NDM5NTcyNCAgLy8gVGhlIHNpemUgeW91IHNwZWNpZmllZCBpcyBvdXQgb2YgdGhlIHZhbGlkIHJhbmdlLgorI2RlZmluZSBFUlJfQ1VTVE9NREFUQV9LRVlfTk9UX0ZPVU5EIFwKKyAgLTEwNzQzOTU3MjMgIC8vIFRoZSBrZXkgeW91IHNwZWNpZmllZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGltYWdlLgorI2RlZmluZSBFUlJfQ0xBU1NJRklFUl9DTEFTU0lGWV9JTUFHRV9XSVRIX0NVU1RPTV9TRVNTSU9OIFwKKyAgLTEwNzQzOTU3MjIgIC8vIEN1c3RvbSBjbGFzc2lmaWVyIHNlc3Npb25zIG9ubHkgY2xhc3NpZnkgZmVhdHVyZSB2ZWN0b3JzLiBUaGV5CisgICAgICAgICAgICAgICAvLyBkbyBub3Qgc3VwcG9ydCBjbGFzc2lmeWluZyBpbWFnZXMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0JJVF9ERVBUSCBcCisgIC0xMDc0Mzk1NzIxICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYml0IGRlcHRoIHlvdSBzdXBwbGllZCBmb3IgdGhlCisgICAgICAgICAgICAgICAvLyBpbWFnZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9CQURfUk9JIC0xMDc0Mzk1NzIwICAgICAgLy8gSW52YWxpZCBST0kuCisjZGVmaW5lIEVSUl9CQURfUk9JX0JPWCAtMTA3NDM5NTcxOSAgLy8gSW52YWxpZCBST0kgZ2xvYmFsIHJlY3RhbmdsZS4KKyNkZWZpbmUgRVJSX0xBQl9WRVJTSU9OIFwKKyAgLTEwNzQzOTU3MTggIC8vIFRoZSB2ZXJzaW9uIG9mIExhYlZJRVcgb3IgQnJpZGdlVklFVyB5b3UgYXJlIHJ1bm5pbmcgZG9lcyBub3QKKyAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgdGhpcyBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX1JBTkdFIC0xMDc0Mzk1NzE3ICAvLyBUaGUgcmFuZ2UgeW91IHN1cHBsaWVkIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NDQUxJTkdfTUVUSE9EIFwKKyAgLTEwNzQzOTU3MTYgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzY2FsaW5nIG1ldGhvZCB5b3UgcHJvdmlkZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NBTElCUkFUSU9OX1VOSVQgXAorICAtMTA3NDM5NTcxNSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhbGlicmF0aW9uIHVuaXQgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9BWElTX09SSUVOVEFUSU9OIFwKKyAgLTEwNzQzOTU3MTQgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBheGlzIG9yaWVudGF0aW9uIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX1ZBTFVFX05PVF9JTl9FTlVNIC0xMDc0Mzk1NzEzICAvLyBWYWx1ZSBub3QgaW4gZW51bWVyYXRpb24uCisjZGVmaW5lIEVSUl9XUk9OR19SRUdJT05fVFlQRSBcCisgIC0xMDc0Mzk1NzEyICAvLyBZb3Ugc2VsZWN0ZWQgYSByZWdpb24gdGhhdCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGUuCisjZGVmaW5lIEVSUl9OT1RfRU5PVUdIX1JFR0lPTlMgXAorICAtMTA3NDM5NTcxMSAgLy8gWW91IHNwZWNpZmllZCBhIHZpZXdlciB0aGF0IGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIHJlZ2lvbnMuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9QQVJUSUNMRVMgXAorICAtMTA3NDM5NTcxMCAgLy8gVGhlIGltYWdlIGhhcyB0b28gbWFueSBwYXJ0aWNsZXMgZm9yIHRoaXMgcHJvY2Vzcy4KKyNkZWZpbmUgRVJSX0FWSV9VTk9QRU5FRF9TRVNTSU9OIFwKKyAgLTEwNzQzOTU3MDkgIC8vIFRoZSBBVkkgc2Vzc2lvbiBoYXMgbm90IGJlZW4gb3BlbmVkLgorI2RlZmluZSBFUlJfQVZJX1JFQURfU0VTU0lPTl9SRVFVSVJFRCBcCisgIC0xMDc0Mzk1NzA4ICAvLyBUaGUgQVZJIHNlc3Npb24gaXMgYSB3cml0ZSBzZXNzaW9uLCBidXQgdGhpcyBvcGVyYXRpb24KKyAgICAgICAgICAgICAgIC8vIHJlcXVpcmVzIGEgcmVhZCBzZXNzaW9uLgorI2RlZmluZSBFUlJfQVZJX1dSSVRFX1NFU1NJT05fUkVRVUlSRUQgXAorICAtMTA3NDM5NTcwNyAgLy8gVGhlIEFWSSBzZXNzaW9uIGlzIGEgcmVhZCBzZXNzaW9uLCBidXQgdGhpcyBvcGVyYXRpb24gcmVxdWlyZXMKKyAgICAgICAgICAgICAgIC8vIGEgd3JpdGUgc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX0FWSV9TRVNTSU9OX0FMUkVBRFlfT1BFTiBcCisgIC0xMDc0Mzk1NzA2ICAvLyBUaGlzIEFWSSBzZXNzaW9uIGlzIGFscmVhZHkgb3Blbi4gWW91IG11c3QgY2xvc2UgaXQgYmVmb3JlCisgICAgICAgICAgICAgICAvLyBjYWxsaW5nIHRoZSBDcmVhdGUgb3IgT3BlbiBmdW5jdGlvbnMuCisjZGVmaW5lIEVSUl9EQVRBX0NPUlJVUFRFRCBcCisgIC0xMDc0Mzk1NzA1ICAvLyBUaGUgZGF0YSBpcyBjb3JydXB0ZWQgYW5kIGNhbm5vdCBiZSByZWFkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT01QUkVTU0lPTl9UWVBFIC0xMDc0Mzk1NzA0ICAvLyBJbnZhbGlkIGNvbXByZXNzaW9uIHR5cGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1RZUEVfT0ZfRkxBVFRFTiAtMTA3NDM5NTcwMyAgIC8vIEludmFsaWQgdHlwZSBvZiBmbGF0dGVuLgorI2RlZmluZSBFUlJfSU5WQUxJRF9MRU5HVEggXAorICAtMTA3NDM5NTcwMiAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgZWRnZSBkZXRlY3Rpb24gbGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgLy8gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFUUklYX1NJWkVfUkFOR0UgXAorICAtMTA3NDM5NTcwMSAgLy8gVGhlIG1heGltdW0gRGF0YSBNYXRyaXggYmFyY29kZSBzaXplIG11c3QgYmUgZXF1YWwgdG8gb3IKKyAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSBEYXRhIE1hdHJpeCBiYXJjb2RlIHNpemUuCisjZGVmaW5lIEVSUl9SRVFVSVJFU19XSU4yMDAwX09SX05FV0VSIFwKKyAgLTEwNzQzOTU3MDAgIC8vIFRoZSBmdW5jdGlvbiByZXF1aXJlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBiZSBNaWNyb3NvZnQKKyAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgMjAwMCBvciBuZXdlci4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ0FMSUJSQVRJT05fTUVUSE9EIFwKKyAgLTEwNzQzOTU2NjIgIC8vIEludmFsaWQgY2FsaWJyYXRpb24gbWV0aG9kIHJlcXVlc3RlZAorI2RlZmluZSBFUlJfSU5WQUxJRF9PUEVSQVRJT05fT05fQ09NUEFDVF9DQUxJQlJBVElPTl9BVFRFTVBURUQgXAorICAtMTA3NDM5NTY2MSAgLy8gVGhpcyBjYWxpYnJhdGlvbiBpcyBjb21wYWN0LiBSZS1MZWFybmluZyBjYWxpYnJhdGlvbiBhbmQKKyAgICAgICAgICAgICAgIC8vIHJldHJpZXZpbmcgdGh1bWJuYWlscyBhcmUgbm90IHBvc3NpYmxlIHdpdGggdGhpcyBjYWxpYnJhdGlvbgorI2RlZmluZSBFUlJfSU5WQUxJRF9QT0xZTk9NSUFMX01PREVMX0tfQ09VTlQgXAorICAtMTA3NDM5NTY2MCAgLy8gSW52YWxpZCBudW1iZXIgb2YgSyB2YWx1ZXMKKyNkZWZpbmUgRVJSX0lOVkFMSURfRElTVE9SVElPTl9NT0RFTCBcCisgIC0xMDc0Mzk1NjU5ICAvLyBJbnZhbGlkIGRpc3RvcnRpb24gbW9kZWwgdHlwZQorI2RlZmluZSBFUlJfQ0FNRVJBX01PREVMX05PVF9BVkFJTEFCTEUgXAorICAtMTA3NDM5NTY1OCAgLy8gQ2FtZXJhIE1vZGVsIGlzIG5vdCBsZWFybmVkCisjZGVmaW5lIEVSUl9JTlZBTElEX1RIVU1CTkFJTF9JTkRFWCBcCisgIC0xMDc0Mzk1NjU3ICAvLyBTdXBwbGllZCB0aHVtYm5haWwgaW5kZXggaXMgaW52YWxpZAorI2RlZmluZSBFUlJfU01PT1RIX0NPTlRPVVJTX01VU1RfQkVfU0FNRSBcCisgIC0xMDc0Mzk1NjU2ICAvLyBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgc21vb3RoIGNvbnRvdXJzCisgICAgICAgICAgICAgICAvLyBhZHZhbmNlZCBtYXRjaCBvcHRpb24gZm9yIGFsbCB0ZW1wbGF0ZXMgeW91IHdhbnQgdG8gbWF0Y2guCisjZGVmaW5lIEVSUl9FTkFCTEVfQ0FMSUJSQVRJT05fU1VQUE9SVF9NVVNUX0JFX1NBTUUgXAorICAtMTA3NDM5NTY1NSAgLy8gWW91IG11c3Qgc3BlY2lmeSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIGVuYWJsZSBjYWxpYnJhdGlvbgorICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBhZHZhbmNlZCBtYXRjaCBvcHRpb24gZm9yIGFsbCB0ZW1wbGF0ZXMgeW91IHdhbnQgdG8KKyAgICAgICAgICAgICAgIC8vIG1hdGNoLgorI2RlZmluZSBFUlJfR1JBRElOR19JTkZPUk1BVElPTl9OT1RfRk9VTkQgXAorICAtMTA3NDM5NTY1NCAgLy8gVGhlIHNvdXJjZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGdyYWRpbmcgaW5mb3JtYXRpb24uIFlvdQorICAgICAgICAgICAgICAgLy8gbXVzdCBwcmVwYXJlIHRoZSBzb3VyY2UgaW1hZ2UgZm9yIGdyYWRpbmcgd2hlbiByZWFkaW5nIHRoZQorICAgICAgICAgICAgICAgLy8gRGF0YSBNYXRyaXgsIGFuZCB5b3UgY2Fubm90IGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZQorICAgICAgICAgICAgICAgLy8gaW1hZ2UgYmV0d2VlbiByZWFkaW5nIGFuZCBncmFkaW5nIHRoZSBEYXRhIE1hdHJpeC4KKyNkZWZpbmUgRVJSX09QRU5JTkdfTkVXRVJfTVVMVElQTEVfR0VPTUVUUklDX1RFTVBMQVRFIFwKKyAgLTEwNzQzOTU2NTMgIC8vIFRoZSBtdWx0aXBsZSBnZW9tZXRyaWMgbWF0Y2hpbmcgdGVtcGxhdGUgeW91IHRyaWVkIHRvIG9wZW4gd2FzCisgICAgICAgICAgICAgICAvLyBjcmVhdGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUKKyAgICAgICAgICAgICAgIC8vIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoaXMgZmlsZS4KKyNkZWZpbmUgRVJSX09QRU5JTkdfTkVXRVJfR0VPTUVUUklDX01BVENISU5HX1RFTVBMQVRFIFwKKyAgLTEwNzQzOTU2NTIgIC8vIFRoZSBnZW9tZXRyaWMgbWF0Y2hpbmcgdGVtcGxhdGUgeW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgIC8vIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0CisgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoaXMgZmlsZS4KKyNkZWZpbmUgRVJSX0VER0VfRklMVEVSX1NJWkVfTVVTVF9CRV9TQU1FIFwKKyAgLTEwNzQzOTU2NTEgIC8vIFlvdSBtdXN0IHNwZWNpZnkgdGhlIHNhbWUgZWRnZSBmaWx0ZXIgc2l6ZSBmb3IgYWxsIHRoZQorICAgICAgICAgICAgICAgLy8gdGVtcGxhdGVzIHlvdSB3YW50IHRvIG1hdGNoLgorI2RlZmluZSBFUlJfQ1VSVkVfRVhUUkFDVElPTl9NT0RFX01VU1RfQkVfU0FNRSBcCisgIC0xMDc0Mzk1NjUwICAvLyBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBzYW1lIGN1cnZlIGV4dHJhY3Rpb24gbW9kZSBmb3IgYWxsIHRoZQorICAgICAgICAgICAgICAgLy8gdGVtcGxhdGVzIHlvdSB3YW50IHRvIG1hdGNoLgorI2RlZmluZSBFUlJfSU5WQUxJRF9HRU9NRVRSSUNfRkVBVFVSRV9UWVBFIFwKKyAgLTEwNzQzOTU2NDkgIC8vIFRoZSBnZW9tZXRyaWMgZmVhdHVyZSB0eXBlIHNwZWNpZmllZCBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfVEVNUExBVEVfTk9UX0xFQVJORUQgXAorICAtMTA3NDM5NTY0OCAgLy8gWW91IHN1cHBsaWVkIGEgdGVtcGxhdGUgdGhhdCB3YXMgbm90IGxlYXJuZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX01VTFRJUExFX0dFT01FVFJJQ19URU1QTEFURSBcCisgIC0xMDc0Mzk1NjQ3ICAvLyBJbnZhbGlkIG11bHRpcGxlIGdlb21ldHJpYyB0ZW1wbGF0ZS4KKyNkZWZpbmUgRVJSX05PX1RFTVBMQVRFX1RPX0xFQVJOIFwKKyAgLTEwNzQzOTU2NDYgIC8vIE5lZWQgYXQgbGVhc3Qgb25lIHRlbXBsYXRlIHRvIGxlYXJuLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OVU1CRVJfT0ZfTEFCRUxTIFwKKyAgLTEwNzQzOTU2NDUgIC8vIFlvdSBzdXBwbGllZCBhbiBpbnZhbGlkIG51bWJlciBvZiBsYWJlbHMuCisjZGVmaW5lIEVSUl9MQUJFTF9UT09fTE9ORyAtMTA3NDM5NTY0NCAgLy8gTGFiZWxzIG11c3QgYmUgPD0gMjU1IGNoYXJhY3RlcnMuCisjZGVmaW5lIEVSUl9JTlZBTElEX05VTUJFUl9PRl9NQVRDSF9PUFRJT05TIFwKKyAgLTEwNzQzOTU2NDMgIC8vIFlvdSBzdXBwbGllZCBhbiBpbnZhbGlkIG51bWJlciBvZiBtYXRjaCBvcHRpb25zLgorI2RlZmluZSBFUlJfTEFCRUxfTk9UX0ZPVU5EIFwKKyAgLTEwNzQzOTU2NDIgIC8vIENhbm5vdCBmaW5kIGEgbGFiZWwgdGhhdCBtYXRjaGVzIHRoZSBvbmUgeW91IHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0RVUExJQ0FURV9MQUJFTCAtMTA3NDM5NTY0MSAgLy8gRHVwbGljYXRlIGxhYmVscyBhcmUgbm90IGFsbG93ZWQuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9aT05FUyBcCisgIC0xMDc0Mzk1NjQwICAvLyBUaGUgbnVtYmVyIG9mIHpvbmVzIGZvdW5kIGV4Y2VlZGVkIHRoZSBjYXBhY2l0eSBvZiB0aGUKKyAgICAgICAgICAgICAgIC8vIGFsZ29yaXRobS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSEFUQ0hfU1RZTEUgXAorICAtMTA3NDM5NTYzOSAgLy8gVGhlIGhhdGNoIHN0eWxlIGZvciB0aGUgd2luZG93IGJhY2tncm91bmQgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRklMTF9TVFlMRSBcCisgIC0xMDc0Mzk1NjM4ICAvLyBUaGUgZmlsbCBzdHlsZSBmb3IgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9IQVJEV0FSRV9ET0VTTlRfU1VQUE9SVF9OT05URUFSSU5HIFwKKyAgLTEwNzQzOTU2MzcgIC8vIFlvdXIgaGFyZHdhcmUgaXMgbm90IHN1cHBvcnRlZCBieSBEaXJlY3RYIGFuZCBjYW5ub3QgYmUgcHV0CisgICAgICAgICAgICAgICAvLyBpbnRvIE5vblRlYXJpbmcgbW9kZS4KKyNkZWZpbmUgRVJSX0RJUkVDVFhfTk9UX0ZPVU5EIFwKKyAgLTEwNzQzOTU2MzYgIC8vIERpcmVjdFggaXMgcmVxdWlyZWQgZm9yIHRoaXMgZmVhdHVyZS4gIFBsZWFzZSBpbnN0YWxsIHRoZQorICAgICAgICAgICAgICAgLy8gbGF0ZXN0IHZlcnNpb24uLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TSEFQRV9ERVNDUklQVE9SIFwKKyAgLTEwNzQzOTU2MzUgIC8vIFRoZSBwYXNzZWQgc2hhcGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhfTUFUQ0hfT1ZFUkxBUCBcCisgIC0xMDc0Mzk1NjM0ICAvLyBJbnZhbGlkIG1heCBtYXRjaCBvdmVybGFwLiAgVmFsdWVzIG11c3QgYmUgYmV0d2VlbiAtMSBhbmQgMTAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0VQQVJBVElPTl9TQ0FMRSBcCisgIC0xMDc0Mzk1NjMzICAvLyBJbnZhbGlkIG1pbmltdW0gbWF0Y2ggc2VwYXJhdGlvbiBzY2FsZS4gIFZhbHVlcyBtdXN0IGJlCisgICAgICAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gLTEuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTl9NQVRDSF9TRVBBUkFUSU9OX0FOR0xFIFwKKyAgLTEwNzQzOTU2MzIgIC8vIEludmFsaWQgbWluaW11bSBtYXRjaCBzZXBhcmF0aW9uIGFuZ2xlLiAgVmFsdWVzIG11c3QgYmUKKyAgICAgICAgICAgICAgIC8vIGJldHdlZW4gLTEgYW5kIDM2MC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOX01BVENIX1NFUEFSQVRJT05fRElTVEFOQ0UgXAorICAtMTA3NDM5NTYzMSAgLy8gSW52YWxpZCBtaW5pbXVtIG1hdGNoIHNlcGFyYXRpb24gZGlzdGFuY2UuICBWYWx1ZXMgbXVzdCBiZQorICAgICAgICAgICAgICAgLy8gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIC0xLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhJTVVNX0ZFQVRVUkVTX0xFQVJORUQgXAorICAtMTA3NDM5NTYzMCAgLy8gSW52YWxpZCBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyBsZWFybi4gVmFsdWVzIG11c3QgYmUKKyAgICAgICAgICAgICAgIC8vIGludGVnZXJzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhJTVVNX1BJWEVMX0RJU1RBTkNFX0ZST01fTElORSBcCisgIC0xMDc0Mzk1NjI5ICAvLyBJbnZhbGlkIG1heGltdW0gcGl4ZWwgZGlzdGFuY2UgZnJvbSBsaW5lLiBWYWx1ZXMgbXVzdCBiZQorICAgICAgICAgICAgICAgLy8gcG9zaXRpdmUgcmVhbCBudW1iZXJzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9HRU9NRVRSSUNfTUFUQ0hJTkdfVEVNUExBVEUgXAorICAtMTA3NDM5NTYyOCAgLy8gSW52YWxpZCBnZW9tZXRyaWMgbWF0Y2hpbmcgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9OT1RfRU5PVUdIX1RFTVBMQVRFX0ZFQVRVUkVTXzEgXAorICAtMTA3NDM5NTYyNyAgLy8gVGhlIHRlbXBsYXRlIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGZlYXR1cmVzIGZvciBnZW9tZXRyaWMKKyAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nLgorI2RlZmluZSBFUlJfTk9UX0VOT1VHSF9URU1QTEFURV9GRUFUVVJFUyBcCisgIC0xMDc0Mzk1NjI2ICAvLyBUaGUgdGVtcGxhdGUgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggZmVhdHVyZXMgZm9yIGdlb21ldHJpYworICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9JTlZBTElEX01BVENIX0NPTlNUUkFJTlRfVFlQRSBcCisgIC0xMDc0Mzk1NjI1ICAvLyBZb3Ugc3BlY2lmaWVkIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBtYXRjaCBjb25zdHJhaW50IHZhbHVlCisgICAgICAgICAgICAgICAvLyBvZiB0aGUgIHJhbmdlIHNldHRpbmdzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9PQ0NMVVNJT05fUkFOR0UgXAorICAtMTA3NDM5NTYyNCAgLy8gSW52YWxpZCBvY2NsdXNpb24gcmFuZ2UuIFZhbGlkIHZhbHVlcyBmb3IgdGhlIGJvdW5kcyByYW5nZQorICAgICAgICAgICAgICAgLy8gZnJvbSAwIHRvIDEwMCBhbmQgdGhlIHVwcGVyIGJvdW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yCisgICAgICAgICAgICAgICAvLyBlcXVhbCB0byB0aGUgbG93ZXIgYm91bmQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NDQUxFX1JBTkdFIFwKKyAgLTEwNzQzOTU2MjMgIC8vIEludmFsaWQgc2NhbGUgcmFuZ2UuIFZhbHVlcyBmb3IgdGhlIGxvd2VyIGJvdW5kIG11c3QgYmUgYQorICAgICAgICAgICAgICAgLy8gcG9zaXRpdmUgcmVhbCBudW1iZXJzIGFuZCB0aGUgdXBwZXIgYm91bmQgbXVzdCBiZSBncmVhdGVyIHRoYW4KKyAgICAgICAgICAgICAgIC8vIG9yIGVxdWFsIHRvIHRoZSBsb3dlciBib3VuZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFUQ0hfR0VPTUVUUklDX1BBVFRFUk5fU0VUVVBfREFUQSBcCisgIC0xMDc0Mzk1NjIyICAvLyBJbnZhbGlkIG1hdGNoIGdlb21ldHJpYyBwYXR0ZXJuIHNldHVwIGRhdGEuCisjZGVmaW5lIEVSUl9JTlZBTElEX0xFQVJOX0dFT01FVFJJQ19QQVRURVJOX1NFVFVQX0RBVEEgXAorICAtMTA3NDM5NTYyMSAgLy8gSW52YWxpZCBsZWFybiBnZW9tZXRyaWMgcGF0dGVybiBzZXR1cCBkYXRhLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DVVJWRV9FWFRSQUNUSU9OX01PREUgXAorICAtMTA3NDM5NTYyMCAgLy8gSW52YWxpZCBjdXJ2ZSBleHRyYWN0aW9uIG1vZGUuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9PQ0NMVVNJT05fUkFOR0VTIFwKKyAgLTEwNzQzOTU2MTkgIC8vIFlvdSBjYW4gc3BlY2lmeSBvbmx5IG9uZSBvY2NsdXNpb24gcmFuZ2UuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9TQ0FMRV9SQU5HRVMgXAorICAtMTA3NDM5NTYxOCAgLy8gWW91IGNhbiBzcGVjaWZ5IG9ubHkgb25lIHNjYWxlIHJhbmdlLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OVU1CRVJfT0ZfRkVBVFVSRVNfUkFOR0UgXAorICAtMTA3NDM5NTYxNyAgLy8gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0VER0VfRklMVEVSX1NJWkUgLTEwNzQzOTU2MTYgIC8vIEludmFsaWQgZWRnZSBmaWx0ZXIgc2l6ZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX1NUUkVOR1RIIFwKKyAgLTEwNzQzOTU2MTUgIC8vIEludmFsaWQgbWluaW11bSBzdHJlbmd0aCBmb3IgZmVhdHVyZXMuIFZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlCisgICAgICAgICAgICAgICAvLyByZWFsIG51bWJlcnMuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRV9BU1BFQ1RfUkFUSU8gXAorICAtMTA3NDM5NTYxNCAgLy8gSW52YWxpZCBhc3BlY3QgcmF0aW8gZm9yIHJlY3Rhbmd1bGFyIGZlYXR1cmVzLiBWYWx1ZXMgbXVzdCBiZQorICAgICAgICAgICAgICAgLy8gcG9zaXRpdmUgcmVhbCBudW1iZXJzIGluIHRoZSByYW5nZSAwLjAxIHRvIDEuMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX0xFTkdUSCBcCisgIC0xMDc0Mzk1NjEzICAvLyBJbnZhbGlkIG1pbmltdW0gbGVuZ3RoIGZvciBsaW5lYXIgZmVhdHVyZXMuIFZhbHVlcyBtdXN0IGJlCisgICAgICAgICAgICAgICAvLyBpbnRlZ2VycyBncmVhdGVyIHRoYW4gMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX1JBRElVUyBcCisgIC0xMDc0Mzk1NjEyICAvLyBJbnZhbGlkIG1pbmltdW0gcmFkaXVzIGZvciBjaXJjdWxhciBmZWF0dXJlcy4gVmFsdWVzIG11c3QgYmUKKyAgICAgICAgICAgICAgIC8vIGludGVnZXJzIGdyZWF0ZXIgdGhhbiAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NSU5JTVVNX1JFQ1RBTkdMRV9ESU1FTlNJT04gXAorICAtMTA3NDM5NTYxMSAgLy8gSW52YWxpZCBtaW5pbXVtIHJlY3RhbmdsZSBkaW1lbnNpb24uIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzCisgICAgICAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gMC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5JVElBTF9NQVRDSF9MSVNUX0xFTkdUSCBcCisgIC0xMDc0Mzk1NjEwICAvLyBJbnZhbGlkIGluaXRpYWwgbWF0Y2ggbGlzdCBsZW5ndGguIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzCisgICAgICAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gNS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1VCUElYRUxfVE9MRVJBTkNFIFwKKyAgLTEwNzQzOTU2MDkgIC8vIEludmFsaWQgc3VicGl4ZWwgdG9sZXJhbmNlLiBWYWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZSByZWFsCisgICAgICAgICAgICAgICAvLyBudW1iZXJzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVUJQSVhFTF9JVEVSQVRJT05TIFwKKyAgLTEwNzQzOTU2MDggIC8vIEludmFsaWQgbnVtYmVyIG9mIHN1YnBpeGVsIGl0ZXJhdGlvbnMuIFZhbHVlcyBtdXN0IGJlIGludGVnZXJzCisgICAgICAgICAgICAgICAvLyBncmVhdGVyIDEwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhJTVVNX0ZFQVRVUkVTX1BFUl9NQVRDSCBcCisgIC0xMDc0Mzk1NjA3ICAvLyBJbnZhbGlkIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHVzZWQgcGVyIG1hdGNoLiBWYWx1ZXMgbXVzdAorICAgICAgICAgICAgICAgLy8gYmUgaW50ZWdlcnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRVNfVE9fTUFUQ0ggXAorICAtMTA3NDM5NTYwNiAgLy8gSW52YWxpZCBtaW5pbXVtIG51bWJlciBvZiBmZWF0dXJlcyB1c2VkIGZvciBtYXRjaGluZy4gVmFsdWVzCisgICAgICAgICAgICAgICAvLyBtdXN0IGJlIGludGVnZXJzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVhJTVVNX0VORF9QT0lOVF9HQVAgXAorICAtMTA3NDM5NTYwNSAgLy8gSW52YWxpZCBtYXhpbXVtIGVuZCBwb2ludCBnYXAuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8KKyAgICAgICAgICAgICAgIC8vIDMyNzY3LgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT0xVTU5fU1RFUCBcCisgIC0xMDc0Mzk1NjA0ICAvLyBJbnZhbGlkIGNvbHVtbiBzdGVwLiBWYWxpZCByYW5nZSBpcyAxIHRvIDI1NS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUk9XX1NURVAgXAorICAtMTA3NDM5NTYwMyAgLy8gSW52YWxpZCByb3cgc3RlcC4gVmFsaWQgcmFuZ2UgaXMgMSB0byAyNTUuCisjZGVmaW5lIEVSUl9JTlZBTElEX01JTklNVU1fQ1VSVkVfTEVOR1RIIFwKKyAgLTEwNzQzOTU2MDIgIC8vIEludmFsaWQgbWluaW11bSBsZW5ndGguIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvcgorICAgICAgICAgICAgICAgLy8gZXF1YWwgdG8gemVyby4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRURHRV9USFJFU0hPTEQgXAorICAtMTA3NDM5NTYwMSAgLy8gSW52YWxpZCBlZGdlIHRocmVzaG9sZC4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMSB0byAzNjAuCisjZGVmaW5lIEVSUl9JTkZPX05PVF9GT1VORCBcCisgIC0xMDc0Mzk1NjAwICAvLyBZb3UgbXVzdCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdWJpbWFnZSB3aXRoaW4gdGhlCisgICAgICAgICAgICAgICAvLyBicm93c2VyLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9BQ0NFUFRBTkNFX0xFVkVMIFwKKyAgLTEwNzQzOTU1OTggIC8vIFRoZSBhY2NlcHRhbmNlIGxldmVsIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIG9mICAwIHRvIDEwMDAuCisjZGVmaW5lIEVSUl9OSU9DUl9OT1RfQV9WQUxJRF9TRVNTSU9OIC0xMDc0Mzk1NTk3ICAvLyBOb3QgYSB2YWxpZCBPQ1Igc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NJWkUgXAorICAtMTA3NDM5NTU5NiAgLy8gSW52YWxpZCBjaGFyYWN0ZXIgc2l6ZS4gQ2hhcmFjdGVyIHNpemUgbXVzdCBiZSA+PSAxLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9USFJFU0hPTERfTU9ERSBcCisgIC0xMDc0Mzk1NTk1ICAvLyBJbnZhbGlkIHRocmVzaG9sZCBtb2RlIHZhbHVlLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9TVUJTVElUVVRJT05fQ0hBUkFDVEVSIFwKKyAgLTEwNzQzOTU1OTQgIC8vIEludmFsaWQgc3Vic3RpdHV0aW9uIGNoYXJhY3Rlci4gVmFsaWQgc3Vic3RpdHV0aW9uIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgIC8vIGFyZSBBU0NJSSB2YWx1ZXMgdGhhdCByYW5nZSBmcm9tIDEgdG8gMjU0LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfQkxPQ0tTIFwKKyAgLTEwNzQzOTU1OTMgIC8vIEludmFsaWQgbnVtYmVyIG9mIGJsb2Nrcy4gTnVtYmVyIG9mIGJsb2NrcyBtdXN0IGJlID49IDQgYW5kIDw9CisgICAgICAgICAgICAgICAvLyA1MC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfUkVBRF9TVFJBVEVHWSAtMTA3NDM5NTU5MiAgLy8gSW52YWxpZCByZWFkIHN0cmF0ZWd5LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfSU5ERVggXAorICAtMTA3NDM5NTU5MSAgLy8gSW52YWxpZCBjaGFyYWN0ZXIgaW5kZXguCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9WQUxJRF9DSEFSQUNURVJfUE9TSVRJT05TIFwKKyAgLTEwNzQzOTU1OTAgIC8vIEludmFsaWQgbnVtYmVyIG9mIGNoYXJhY3RlciBwb3NpdGlvbnMuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tCisgICAgICAgICAgICAgICAvLyAwIHRvIDI1NS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTE9XX1RIUkVTSE9MRF9WQUxVRSBcCisgIC0xMDc0Mzk1NTg5ICAvLyBJbnZhbGlkIGxvdyB0aHJlc2hvbGQgdmFsdWUuIFZhbGlkIHRocmVzaG9sZCB2YWx1ZXMgcmFuZ2UgZnJvbQorICAgICAgICAgICAgICAgLy8gMCB0byAyNTUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0hJR0hfVEhSRVNIT0xEX1ZBTFVFIFwKKyAgLTEwNzQzOTU1ODggIC8vIEludmFsaWQgaGlnaCB0aHJlc2hvbGQgdmFsdWUuIFZhbGlkIHRocmVzaG9sZCB2YWx1ZXMgcmFuZ2UKKyAgICAgICAgICAgICAgIC8vIGZyb20gMCB0byAyNTUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9SQU5HRSBcCisgIC0xMDc0Mzk1NTg3ICAvLyBUaGUgbG93IHRocmVzaG9sZCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgaGlnaCB0aHJlc2hvbGQuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0xPV0VSX1RIUkVTSE9MRF9MSU1JVCBcCisgIC0xMDc0Mzk1NTg2ICAvLyBJbnZhbGlkIGxvd2VyIHRocmVzaG9sZCBsaW1pdC4gVmFsaWQgbG93ZXIgdGhyZXNob2xkIGxpbWl0cworICAgICAgICAgICAgICAgLy8gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfVVBQRVJfVEhSRVNIT0xEX0xJTUlUIFwKKyAgLTEwNzQzOTU1ODUgIC8vIEludmFsaWQgdXBwZXIgdGhyZXNob2xkIGxpbWl0LiBWYWxpZCB1cHBlciB0aHJlc2hvbGQgbGltaXRzCisgICAgICAgICAgICAgICAvLyByYW5nZSBmcm9tIDAgdG8gMjU1LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9USFJFU0hPTERfTElNSVRTIFwKKyAgLTEwNzQzOTU1ODQgIC8vIFRoZSBsb3dlciB0aHJlc2hvbGQgbGltaXQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHVwcGVyCisgICAgICAgICAgICAgICAvLyB0aHJlc2hvbGQgbGltaXQuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX01JTl9DSEFSX1NQQUNJTkcgXAorICAtMTA3NDM5NTU4MyAgLy8gSW52YWxpZCBtaW5pbXVtIGNoYXJhY3RlciBzcGFjaW5nIHZhbHVlLiBDaGFyYWN0ZXIgc3BhY2luZworICAgICAgICAgICAgICAgLy8gbXVzdCBiZSA+PSAxIHBpeGVsLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9NQVhfSE9SSVpfRUxFTUVOVF9TUEFDSU5HIFwKKyAgLTEwNzQzOTU1ODIgIC8vIEludmFsaWQgbWF4aW11bSBob3Jpem9udGFsIGVsZW1lbnQgc3BhY2luZyB2YWx1ZS4gTWF4aW11bQorICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBlbGVtZW50IHNwYWNpbmcgbXVzdCBiZSA+PSAwLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9NQVhfVkVSVF9FTEVNRU5UX1NQQUNJTkcgXAorICAtMTA3NDM5NTU4MSAgLy8gSW52YWxpZCBtYXhpbXVtIHZlcnRpY2FsIGVsZW1lbnQgc3BhY2luZyB2YWx1ZS4gTWF4aW11bQorICAgICAgICAgICAgICAgLy8gdmVydGljYWwgZWxlbWVudCBzcGFjaW5nIG11c3QgYmUgPj0gMC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTUlOX0JPVU5ESU5HX1JFQ1RfV0lEVEggXAorICAtMTA3NDM5NTU4MCAgLy8gSW52YWxpZCBtaW5pbXVtIGJvdW5kaW5nIHJlY3RhbmdsZSB3aWR0aC4gTWluaW11bSBib3VuZGluZworICAgICAgICAgICAgICAgLy8gcmVjdGFuZ2xlIHdpZHRoIG11c3QgYmUgPj0gMS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQVNQRUNUX1JBVElPIFwKKyAgLTEwNzQzOTU1NzkgIC8vIEludmFsaWQgYXNwZWN0IHJhdGlvIHZhbHVlLiBUaGUgYXNwZWN0IHJhdGlvIG11c3QgYmUgemVybyBvcgorICAgICAgICAgICAgICAgLy8gPj0gMTAwLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0VUX0ZJTEUgXAorICAtMTA3NDM5NTU3OCAgLy8gSW52YWxpZCBvciBjb3JydXB0IGNoYXJhY3RlciBzZXQgZmlsZS4KKyNkZWZpbmUgRVJSX05JT0NSX0NIQVJBQ1RFUl9WQUxVRV9DQU5OT1RfQkVfRU1QVFlTVFJJTkcgXAorICAtMTA3NDM5NTU3NyAgLy8gVGhlIGNoYXJhY3RlciB2YWx1ZSBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuCisjZGVmaW5lIEVSUl9OSU9DUl9DSEFSQUNURVJfVkFMVUVfVE9PX0xPTkcgXAorICAtMTA3NDM5NTU3NiAgLy8gQ2hhcmFjdGVyIHZhbHVlcyBtdXN0IGJlIDw9MjU1IGNoYXJhY3RlcnMuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9FUk9TSU9OUyBcCisgIC0xMDc0Mzk1NTc1ICAvLyBJbnZhbGlkIG51bWJlciBvZiBlcm9zaW9ucy4gVGhlIG51bWJlciBvZiBlcm9zaW9ucyBtdXN0IGJlID49CisgICAgICAgICAgICAgICAvLyAwLgorI2RlZmluZSBFUlJfTklPQ1JfQ0hBUkFDVEVSX1NFVF9ERVNDUklQVElPTl9UT09fTE9ORyBcCisgIC0xMDc0Mzk1NTc0ICAvLyBUaGUgY2hhcmFjdGVyIHNldCBkZXNjcmlwdGlvbiBtdXN0IGJlIDw9MjU1IGNoYXJhY3RlcnMuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9TRVRfRklMRV9WRVJTSU9OIFwKKyAgLTEwNzQzOTU1NzMgIC8vIFRoZSBjaGFyYWN0ZXIgc2V0IGZpbGUgd2FzIGNyZWF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIE5JCisgICAgICAgICAgICAgICAvLyBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byByZWFkIHRoZQorICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIHNldCBmaWxlLgorI2RlZmluZSBFUlJfTklPQ1JfSU5URUdFUl9WQUxVRV9GT1JfU1RSSU5HX0FUVFJJQlVURSBcCisgIC0xMDc0Mzk1NTcyICAvLyBZb3UgbXVzdCBzcGVjaWZ5IGNoYXJhY3RlcnMgZm9yIGEgc3RyaW5nLiBBIHN0cmluZyBjYW5ub3QKKyAgICAgICAgICAgICAgIC8vIGNvbnRhaW4gaW50ZWdlcnMuCisjZGVmaW5lIEVSUl9OSU9DUl9HRVRfT05MWV9BVFRSSUJVVEUgXAorICAtMTA3NDM5NTU3MSAgLy8gVGhpcyBhdHRyaWJ1dGUgaXMgcmVhZC1vbmx5LgorI2RlZmluZSBFUlJfTklPQ1JfSU5URUdFUl9WQUxVRV9GT1JfQk9PTEVBTl9BVFRSSUJVVEUgXAorICAtMTA3NDM5NTU3MCAgLy8gVGhpcyBhdHRyaWJ1dGUgcmVxdWlyZXMgYSBCb29sZWFuIHZhbHVlLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9BVFRSSUJVVEUgLTEwNzQzOTU1NjkgIC8vIEludmFsaWQgYXR0cmlidXRlLgorI2RlZmluZSBFUlJfTklPQ1JfU1RSSU5HX1ZBTFVFX0ZPUl9JTlRFR0VSX0FUVFJJQlVURSBcCisgIC0xMDc0Mzk1NTY4ICAvLyBUaGlzIGF0dHJpYnV0ZSByZXF1aXJlcyBpbnRlZ2VyIHZhbHVlcy4KKyNkZWZpbmUgRVJSX05JT0NSX1NUUklOR19WQUxVRV9GT1JfQk9PTEVBTl9BVFRSSUJVVEUgXAorICAtMTA3NDM5NTU2NyAgLy8gU3RyaW5nIHZhbHVlcyBhcmUgaW52YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGUuIEVudGVyIGEgYm9vbGVhbgorICAgICAgICAgICAgICAgLy8gdmFsdWUuCisjZGVmaW5lIEVSUl9OSU9DUl9CT09MRUFOX1ZBTFVFX0ZPUl9JTlRFR0VSX0FUVFJJQlVURSBcCisgIC0xMDc0Mzk1NTY2ICAvLyBCb29sZWFuIHZhbHVlcyBhcmUgbm90IHZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZS4gRW50ZXIgYW4KKyAgICAgICAgICAgICAgIC8vIGludGVnZXIgdmFsdWUuCisjZGVmaW5lIEVSUl9OSU9DUl9NVVNUX0JFX1NJTkdMRV9DSEFSQUNURVIgXAorICAtMTA3NDM5NTU2NSAgLy8gUmVxdWlyZXMgYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZy4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfUFJFREVGSU5FRF9DSEFSQUNURVIgXAorICAtMTA3NDM5NTU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBwcmVkZWZpbmVkIGNoYXJhY3RlciB2YWx1ZS4KKyNkZWZpbmUgRVJSX05JT0NSX1VOTElDRU5TRUQgLTEwNzQzOTU1NjMgIC8vIFRoaXMgY29weSBvZiBOSSBPQ1IgaXMgdW5saWNlbnNlZC4KKyNkZWZpbmUgRVJSX05JT0NSX0JPT0xFQU5fVkFMVUVfRk9SX1NUUklOR19BVFRSSUJVVEUgXAorICAtMTA3NDM5NTU2MiAgLy8gU3RyaW5nIHZhbHVlcyBhcmUgbm90IHZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZS4gRW50ZXIgYQorICAgICAgICAgICAgICAgLy8gQm9vbGVhbiB2YWx1ZS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX0NIQVJBQ1RFUlMgXAorICAtMTA3NDM5NTU2MSAgLy8gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIgdmFsdWUgbXVzdCBtYXRjaCB0aGUKKyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBpbWFnZS4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfT0JKRUNUX0lOREVYIC0xMDc0Mzk1NTYwICAvLyBJbnZhbGlkIG9iamVjdCBpbmRleC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfUkVBRF9PUFRJT04gLTEwNzQzOTU1NTkgICAvLyBJbnZhbGlkIHJlYWQgb3B0aW9uLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0laRV9SQU5HRSBcCisgIC0xMDc0Mzk1NTU4ICAvLyBUaGUgbWluaW11bSBjaGFyYWN0ZXIgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbWF4aW11bQorICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIHNpemUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX0JPVU5ESU5HX1JFQ1RfV0lEVEhfUkFOR0UgXAorICAtMTA3NDM5NTU1NyAgLy8gVGhlIG1pbmltdW0gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZSB3aWR0aCBtdXN0IGJlIGxlc3MKKyAgICAgICAgICAgICAgIC8vIHRoYW4gdGhlIG1heGltdW0gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZSB3aWR0aC4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfQk9VTkRJTkdfUkVDVF9IRUlHSFRfUkFOR0UgXAorICAtMTA3NDM5NTU1NiAgLy8gVGhlIG1pbmltdW0gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZSBoZWlnaHQgbXVzdCBiZSBsZXNzCisgICAgICAgICAgICAgICAvLyB0aGFuIHRoZSBtYXhpbXVtIGNoYXJhY3RlciBib3VuZGluZyByZWN0YW5nbGUgaGVpZ2h0LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9TUEFDSU5HX1JBTkdFIFwKKyAgLTEwNzQzOTU1NTUgIC8vIFRoZSBtYXhpbXVtIGhvcml6b250YWwgZWxlbWVudCBzcGFjaW5nIHZhbHVlIG11c3Qgbm90IGV4Y2VlZAorICAgICAgICAgICAgICAgLy8gdGhlIG1pbmltdW0gY2hhcmFjdGVyIHNwYWNpbmcgdmFsdWUuCisjZGVmaW5lIEVSUl9OSU9DUl9JTlZBTElEX1JFQURfUkVTT0xVVElPTiBcCisgIC0xMDc0Mzk1NTU0ICAvLyBJbnZhbGlkIHJlYWQgcmVzb2x1dGlvbi4KKyNkZWZpbmUgRVJSX05JT0NSX0lOVkFMSURfTUlOX0JPVU5ESU5HX1JFQ1RfSEVJR0hUIFwKKyAgLTEwNzQzOTU1NTMgIC8vIEludmFsaWQgbWluaW11bSBib3VuZGluZyByZWN0YW5nbGUgaGVpZ2h0LiBUaGUgbWluaW11bQorICAgICAgICAgICAgICAgLy8gYm91bmRpbmcgcmVjdGFuZ2xlIGhlaWdodCBtdXN0IGJlID49IDEuCisjZGVmaW5lIEVSUl9OSU9DUl9OT1RfQV9WQUxJRF9DSEFSQUNURVJfU0VUIFwKKyAgLTEwNzQzOTU1NTIgIC8vIE5vdCBhIHZhbGlkIGNoYXJhY3RlciBzZXQuCisjZGVmaW5lIEVSUl9OSU9DUl9SRU5BTUVfUkVGQ0hBUiBcCisgIC0xMDc0Mzk1NTUxICAvLyBBIHRyYWluZWQgT0NSIGNoYXJhY3RlciBjYW5ub3QgYmUgcmVuYW1lZCB3aGlsZSBpdCBpcyBhCisgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgY2hhcmFjdGVyLgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfVkFMVUUgXAorICAtMTA3NDM5NTU1MCAgLy8gQSBjaGFyYWN0ZXIgY2Fubm90IGhhdmUgYW4gQVNDSUkgdmFsdWUgb2YgMjU1LgorI2RlZmluZSBFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfT0JKRUNUU19UT19WRVJJRlkgXAorICAtMTA3NDM5NTU0OSAgLy8gVGhlIG51bWJlciBvZiBvYmplY3RzIGZvdW5kIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGNoYXJhY3RlcnMgb3IgcGF0dGVybnMgdG8gdmVyaWZ5LgorI2RlZmluZSBFUlJfSU5WQUxJRF9TVEVSRU9fQkxPQ0tNQVRDSElOR19QUkVGSUxURVJfQ0FQIFwKKyAgLTEwNzQzOTU0MjEgIC8vIFRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIHRoZSBmaWx0ZXIgY2FwIGZvciBibG9jayBtYXRjaGluZyBpcworICAgICAgICAgICAgICAgLy8gaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfUFJFRklMVEVSX1NJWkUgXAorICAtMTA3NDM5NTQyMCAgLy8gVGhlIHNwZWNpZmllZCBwcmVmaWx0ZXIgc2l6ZSBmb3IgYmxvY2sgbWF0Y2hpbmcgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfUFJFRklMVEVSX1RZUEUgXAorICAtMTA3NDM5NTQxOSAgLy8gVGhlIHNwZWNpZmllZCBwcmVmaWx0ZXIgdHlwZSBmb3IgYmxvY2sgbWF0Y2hpbmcgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfTlVNRElTUEFSSVRJRVMgXAorICAtMTA3NDM5NTQxOCAgLy8gVGhlIHNwZWNpZmVkIHZhbHVlIGZvciBudW1iZXIgb2YgZGlzcGFyaXRpZXMgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfV0lORE9XX1NJWkUgXAorICAtMTA3NDM5NTQxNyAgLy8gVGhlIHNwZWNpZmllZCB3aW5kb3cgc2l6ZSBmb3IgYmxvY2sgbWF0Y2hpbmcgaXMgaW52YWxpZC4KKyNkZWZpbmUgRVJSXzNEVklTSU9OX0lOVkFMSURfU0VTU0lPTl9UWVBFIFwKKyAgLTEwNzQzOTU0MTYgIC8vIFRoaXMgM0QgdmlzaW9uIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgb24gdGhpcyB0eXBlIG9mIDNkCisgICAgICAgICAgICAgICAvLyB2aXNpb24gc2Vzc2lvbi4KKyNkZWZpbmUgRVJSX1RPT19NQU5ZXzNEVklTSU9OX1NFU1NJT05TIFwKKyAgLTEwNzQzOTU0MTUgIC8vIFRoZXJlIGFyZSB0b28gbWFueSAzRCB2aXNpb24gc2Vzc2lvbnMgb3Blbi4gIFlvdSBtdXN0IGNsb3NlIGEKKyAgICAgICAgICAgICAgIC8vIHNlc3Npb24gYmVmb3JlIHlvdSBjYW4gb3BlbiBhbm90aGVyIG9uZS4KKyNkZWZpbmUgRVJSX09QRU5JTkdfTkVXRVJfM0RWSVNJT05fU0VTU0lPTiBcCisgIC0xMDc0Mzk1NDE0ICAvLyBUaGUgM0QgdmlzaW9uIHNlc3Npb24geW91IHRyaWVkIHRvIG9wZW4gd2FzIGNyZWF0ZWQgd2l0aCBhCisgICAgICAgICAgICAgICAvLyBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YKKyAgICAgICAgICAgICAgIC8vIE5JIFZpc2lvbiB0byByZWFkIHRoaXMgZmlsZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFUkVPX0JMT0NLTUFUQ0hJTkdfRklMVEVSVFlQRSBcCisgIC0xMDc0Mzk1NDEzICAvLyBZb3UgaGF2ZSBzcGVjaWZpZWQgYW4gaW52YWxpZCBmaWx0ZXIgdHlwZSBmb3IgYmxvY2sgbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NURVJFT19DQU1FUkFfUE9TSVRJT04gXAorICAtMTA3NDM5NTQxMiAgLy8gWW91IGhhdmUgcmVxdWVzdGVkIHJlc3VsdHMgYXQgYW4gaW52YWxpZCBjYW1lcmEgcG9zaXRpb24gaW4KKyAgICAgICAgICAgICAgIC8vIHRoZSBzdGVyZW8gc2V0dXAuCisjZGVmaW5lIEVSUl9JTlZBTElEXzNEVklTSU9OX1NFU1NJT04gXAorICAtMTA3NDM5NTQxMSAgLy8gTm90IGEgdmFsaWQgM0QgVmlzaW9uIHNlc3Npb24uCisjZGVmaW5lIEVSUl9JTlZBTElEX0lDT05TX1BFUl9MSU5FIFwKKyAgLTEwNzQzOTU0MTAgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IGxlc3MgdGhhbiBvbmUgaWNvbiBwZXIgbGluZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1VCUElYRUxfRElWSVNJT05TIFwKKyAgLTEwNzQzOTU0MDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgc3VicGl4ZWwgZGl2aXNpb25zLgorI2RlZmluZSBFUlJfSU5WQUxJRF9ERVRFQ1RJT05fTU9ERSAtMTA3NDM5NTQwOCAgLy8gSW52YWxpZCBkZXRlY3Rpb24gbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09OVFJBU1QgXAorICAtMTA3NDM5NTQwNyAgLy8gSW52YWxpZCBjb250cmFzdCB2YWx1ZS4gVmFsaWQgY29udHJhc3QgdmFsdWVzIHJhbmdlIGZyb20gMCB0bworICAgICAgICAgICAgICAgLy8gMjU1LgorI2RlZmluZSBFUlJfQ09PUkRTWVNfTk9UX0ZPVU5EIFwKKyAgLTEwNzQzOTU0MDYgIC8vIFRoZSBjb29yZGluYXRlIHN5c3RlbSBjb3VsZCBub3QgYmUgZm91bmQgb24gdGhpcyBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVEVYVE9SSUVOVEFUSU9OIFwKKyAgLTEwNzQzOTU0MDUgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSB0ZXh0IG9yaWVudGF0aW9uIHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfRk9SX1VOV1JBUCBcCisgIC0xMDc0Mzk1NDA0ICAvLyBVbndyYXBJbWFnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBpbnRlcnBvbGF0aW9uIG1ldGhvZCB2YWx1ZQorICAgICAgICAgICAgICAgLy8geW91IHN1cHBsaWVkLiAgVmFsaWQgaW50ZXJwb2xhdGlvbiBtZXRob2RzIGFyZSB6ZXJvIG9yZGVyIGFuZAorICAgICAgICAgICAgICAgLy8gYmlsaW5lYXIuCisjZGVmaW5lIEVSUl9FWFRSQUlORk9fVkVSU0lPTiBcCisgIC0xMDc0Mzk1NDAzICAvLyBUaGUgaW1hZ2Ugd2FzIGNyZWF0ZWQgaW4gYSBuZXdlciB2ZXJzaW9uIG9mIE5JIFZpc2lvbi4gVXBncmFkZQorICAgICAgICAgICAgICAgLy8gdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE5JIFZpc2lvbiB0byB1c2UgdGhpcyBpbWFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFYUE9JTlRTIFwKKyAgLTEwNzQzOTU0MDIgIC8vIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMKKyAgICAgICAgICAgICAgIC8vIHRoYXQgeW91IHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFUQ0hGQUNUT1IgXAorICAtMTA3NDM5NTQwMSAgLy8gVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1hdGNoRmFjdG9yIHRoYXQgeW91CisgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQuCisjZGVmaW5lIEVSUl9NVUxUSUNPUkVfT1BFUkFUSU9OIFwKKyAgLTEwNzQzOTU0MDAgIC8vIFRoZSBvcGVyYXRpb24geW91IGhhdmUgZ2l2ZW4gTXVsdGljb3JlIE9wdGlvbnMgaXMgaW52YWxpZC4KKyAgICAgICAgICAgICAgIC8vIFBsZWFzZSBzZWUgdGhlIGF2YWlsYWJsZSBlbnVtZXJhdGlvbiB2YWx1ZXMgZm9yIE11bHRpY29yZQorICAgICAgICAgICAgICAgLy8gT3BlcmF0aW9uLgorI2RlZmluZSBFUlJfTVVMVElDT1JFX0lOVkFMSURfQVJHVU1FTlQgXAorICAtMTA3NDM5NTM5OSAgLy8gWW91IGhhdmUgZ2l2ZW4gTXVsdGljb3JlIE9wdGlvbnMgYW4gaW52YWxpZCBhcmd1bWVudC4KKyNkZWZpbmUgRVJSX0NPTVBMRVhfSU1BR0VfUkVRVUlSRUQgLTEwNzQzOTUzOTcgIC8vIEEgY29tcGxleCBpbWFnZSBpcyByZXF1aXJlZC4KKyNkZWZpbmUgRVJSX0NPTE9SX0lNQUdFX1JFUVVJUkVEIFwKKyAgLTEwNzQzOTUzOTUgIC8vIFRoZSBpbnB1dCBpbWFnZSBtdXN0IGJlIGEgY29sb3IgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9TUEVDVFJVTV9NQVNLIFwKKyAgLTEwNzQzOTUzOTQgIC8vIFRoZSBjb2xvciBtYXNrIHJlbW92ZXMgdG9vIG11Y2ggY29sb3IgaW5mb3JtYXRpb24uCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9UT09fU01BTEwgXAorICAtMTA3NDM5NTM5MyAgLy8gVGhlIGNvbG9yIHRlbXBsYXRlIGltYWdlIGlzIHRvbyBzbWFsbC4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0lNQUdFX1RPT19MQVJHRSBcCisgIC0xMDc0Mzk1MzkyICAvLyBUaGUgY29sb3IgdGVtcGxhdGUgaW1hZ2UgaXMgdG9vIGxhcmdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfSFVFX0NPTlRSQVNUX1RPT19MT1cgXAorICAtMTA3NDM5NTM5MSAgLy8gVGhlIGNvbnRyYXN0IGluIHRoZSBodWUgcGxhbmUgb2YgdGhlIGltYWdlIGlzIHRvbyBsb3cgZm9yCisgICAgICAgICAgICAgICAvLyBsZWFybmluZyBzaGFwZSBmZWF0dXJlcy4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0lNQUdFX0xVTUlOQU5DRV9DT05UUkFTVF9UT09fTE9XIFwKKyAgLTEwNzQzOTUzOTAgIC8vIFRoZSBjb250cmFzdCBpbiB0aGUgbHVtaW5hbmNlIHBsYW5lIG9mIHRoZSBpbWFnZSBpcyB0b28gbG93IHRvCisgICAgICAgICAgICAgICAvLyBsZWFybiBzaGFwZSBmZWF0dXJlcy4KKyNkZWZpbmUgRVJSX0NPTE9SX0xFQVJOX1NFVFVQX0RBVEEgXAorICAtMTA3NDM5NTM4OSAgLy8gSW52YWxpZCBjb2xvciBsZWFybiBzZXR1cCBkYXRhLgorI2RlZmluZSBFUlJfQ09MT1JfTEVBUk5fU0VUVVBfREFUQV9TSEFQRSBcCisgIC0xMDc0Mzk1Mzg4ICAvLyBJbnZhbGlkIGNvbG9yIGxlYXJuIHNldHVwIGRhdGEuCisjZGVmaW5lIEVSUl9DT0xPUl9NQVRDSF9TRVRVUF9EQVRBIFwKKyAgLTEwNzQzOTUzODcgIC8vIEludmFsaWQgY29sb3IgbWF0Y2ggc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0NPTE9SX01BVENIX1NFVFVQX0RBVEFfU0hBUEUgXAorICAtMTA3NDM5NTM4NiAgLy8gSW52YWxpZCBjb2xvciBtYXRjaCBzZXR1cCBkYXRhLgorI2RlZmluZSBFUlJfQ09MT1JfUk9UQVRJT05fUkVRVUlSRVNfU0hBUEVfRkVBVFVSRSBcCisgIC0xMDc0Mzk1Mzg1ICAvLyBSb3RhdGlvbi1pbnZhcmlhbnQgY29sb3IgcGF0dGVybiBtYXRjaGluZyByZXF1aXJlcyBhIGZlYXR1cmUKKyAgICAgICAgICAgICAgIC8vIG1vZGUgaW5jbHVkaW5nIHNoYXBlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUiBcCisgIC0xMDc0Mzk1Mzg0ICAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl8xIFwKKyAgLTEwNzQzOTUzODMgIC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzIgXAorICAtMTA3NDM5NTM4MiAgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMyBcCisgIC0xMDc0Mzk1MzgxICAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl80IFwKKyAgLTEwNzQzOTUzODAgIC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzUgXAorICAtMTA3NDM5NTM3OSAgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNiBcCisgIC0xMDc0Mzk1Mzc4ICAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVCBcCisgIC0xMDc0Mzk1Mzc3ICAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NISUZUIFwKKyAgLTEwNzQzOTUzNzYgIC8vIFRoZSBjb2xvciB0ZW1wbGF0ZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGRhdGEgcmVxdWlyZWQgZm9yCisgICAgICAgICAgICAgICAvLyBzaGlmdC1pbnZhcmlhbnQgY29sb3IgbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1NISUZUXzEgXAorICAtMTA3NDM5NTM3NSAgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMiBcCisgIC0xMDc0Mzk1Mzc0ICAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTiBcCisgIC0xMDc0Mzk1MzczICAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1JPVEFUSU9OIFwKKyAgLTEwNzQzOTUzNzIgIC8vIFRoZSBjb2xvciB0ZW1wbGF0ZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGRhdGEgcmVxdWlyZWQgZm9yCisgICAgICAgICAgICAgICAvLyByb3RhdGlvbi1pbnZhcmlhbnQgY29sb3IgbWF0Y2hpbmcuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzEgXAorICAtMTA3NDM5NTM3MSAgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fMiBcCisgIC0xMDc0Mzk1MzcwICAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl8zIFwKKyAgLTEwNzQzOTUzNjkgIC8vIEludmFsaWQgY29sb3IgdGVtcGxhdGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzQgXAorICAtMTA3NDM5NTM2OCAgLy8gSW52YWxpZCBjb2xvciB0ZW1wbGF0ZSBpbWFnZS4KKyNkZWZpbmUgRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fNSBcCisgIC0xMDc0Mzk1MzY3ICAvLyBJbnZhbGlkIGNvbG9yIHRlbXBsYXRlIGltYWdlLgorI2RlZmluZSBFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NIQVBFIFwKKyAgLTEwNzQzOTUzNjYgIC8vIFRoZSBjb2xvciB0ZW1wbGF0ZSBpbWFnZSBkb2VzIG5vdCBjb250YWluIGRhdGEgcmVxdWlyZWQgZm9yCisgICAgICAgICAgICAgICAvLyBjb2xvciBtYXRjaGluZyBpbiBzaGFwZSBmZWF0dXJlIG1vZGUuCisjZGVmaW5lIEVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU1BFQ1RSVU0gXAorICAtMTA3NDM5NTM2NSAgLy8gVGhlIGNvbG9yIHRlbXBsYXRlIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3IKKyAgICAgICAgICAgICAgIC8vIGNvbG9yIG1hdGNoaW5nIGluIGNvbG9yIGZlYXR1cmUgbW9kZS4KKyNkZWZpbmUgRVJSX0lHTk9SRV9DT0xPUl9TUEVDVFJVTV9TRVQgXAorICAtMTA3NDM5NTM2NCAgLy8gVGhlIGlnbm9yZSBjb2xvciBzcGVjdHJhIGFycmF5IGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NVQlNBTVBMSU5HX1JBVElPIC0xMDc0Mzk1MzYzICAvLyBJbnZhbGlkIHN1YnNhbXBsaW5nIHJhdGlvLgorI2RlZmluZSBFUlJfSU5WQUxJRF9XSURUSCAtMTA3NDM5NTM2MiAgICAgICAgICAgICAgLy8gSW52YWxpZCBwaXhlbCB3aWR0aC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1RFRVBORVNTIC0xMDc0Mzk1MzYxICAgICAgICAgIC8vIEludmFsaWQgc3RlZXBuZXNzLgorI2RlZmluZSBFUlJfQ09NUExFWF9QTEFORSAtMTA3NDM5NTM2MCAgICAgICAgICAgICAgLy8gSW52YWxpZCBjb21wbGV4IHBsYW5lLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT0xPUl9JR05PUkVfTU9ERSAtMTA3NDM5NTM1NyAgLy8gSW52YWxpZCBjb2xvciBpZ25vcmUgbW9kZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUlOX01BVENIX1NDT1JFIFwKKyAgLTEwNzQzOTUzNTYgIC8vIEludmFsaWQgbWluaW11bSBtYXRjaCBzY29yZS4gQWNjZXB0YWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvCisgICAgICAgICAgICAgICAvLyAxMDAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9OVU1fTUFUQ0hFU19SRVFVRVNURUQgXAorICAtMTA3NDM5NTM1NSAgLy8gSW52YWxpZCBudW1iZXIgb2YgbWF0Y2hlcyByZXF1ZXN0ZWQuIFlvdSBtdXN0IHJlcXVlc3QgYQorICAgICAgICAgICAgICAgLy8gbWluaW11bSBvZiBvbmUgbWF0Y2guCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SX1dFSUdIVCBcCisgIC0xMDc0Mzk1MzU0ICAvLyBJbnZhbGlkIGNvbG9yIHdlaWdodC4gQWNjZXB0YWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDEwMDAuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NFQVJDSF9TVFJBVEVHWSAtMTA3NDM5NTM1MyAgLy8gSW52YWxpZCBzZWFyY2ggc3RyYXRlZ3kuCisjZGVmaW5lIEVSUl9JTlZBTElEX0ZFQVRVUkVfTU9ERSAtMTA3NDM5NTM1MiAgICAgLy8gSW52YWxpZCBmZWF0dXJlIG1vZGUuCisjZGVmaW5lIEVSUl9JTlZBTElEX1JFQ1QgXAorICAtMTA3NDM5NTM1MSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgcmVjdGFuZ2xlcyB3aXRoIG5lZ2F0aXZlIHdpZHRocyBvcgorICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgaGVpZ2h0cy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVklTSU9OX0lORk8gXAorICAtMTA3NDM5NTM1MCAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHZpc2lvbiBpbmZvcm1hdGlvbiB0eXBlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NLRUxFVE9OTUVUSE9EIFwKKyAgLTEwNzQzOTUzNDkgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTa2VsZXRvbk1ldGhvZCB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF8zRFBMQU5FIFwKKyAgLTEwNzQzOTUzNDggIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSAzRFBsYW5lIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfM0RESVJFQ1RJT04gXAorICAtMTA3NDM5NTM0NyAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIDNERGlyZWN0aW9uIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRF9GT1JfUk9UQVRFIFwKKyAgLTEwNzQzOTUzNDYgIC8vIGltYXFSb3RhdGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSW50ZXJwb2xhdGlvbk1ldGhvZCB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9GTElQQVhJUyBcCisgIC0xMDc0Mzk1MzQ1ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYXhpcyBvZiBzeW1tZXRyeSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9GSUxFX0ZJTEVOQU1FX05VTEwgXAorICAtMTA3NDM5NTM0MyAgLy8gWW91IG11c3QgcGFzcyBhIHZhbGlkIGZpbGUgbmFtZS4gRG8gbm90IHBhc3MgaW4gTlVMTC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU0laRVRZUEUgXAorICAtMTA3NDM5NTM0MCAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNpemVUeXBlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX1VOS05PV05fQUxHT1JJVEhNIFwKKyAgLTEwNzQzOTUzMzYgIC8vIFlvdSBzcGVjaWZpZWQgdGhlIGRpc3BhdGNoIHN0YXR1cyBvZiBhbiB1bmtub3duIGFsZ29yaXRobS4KKyNkZWZpbmUgRVJSX0RJU1BBVENIX1NUQVRVU19DT05GTElDVCBcCisgIC0xMDc0Mzk1MzM1ICAvLyBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gc2V0IHRoZSBzYW1lIGFsZ29yaXRobSB0byBkaXNwYXRjaCBhbmQKKyAgICAgICAgICAgICAgIC8vIHRvIG5vdCBkaXNwYXRjaC4gUmVtb3ZlIG9uZSBvZiB0aGUgY29uZmxpY3Rpbmcgc2V0dGluZ3MuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTlZFUlNJT05TVFlMRSBcCisgIC0xMDc0Mzk1MzM0ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ29udmVyc2lvbiBNZXRob2QgdmFsdWUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVkVSVElDQUxfVEVYVF9BTElHTk1FTlQgXAorICAtMTA3NDM5NTMzMyAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFZlcnRpY2FsVGV4dEFsaWdubWVudCB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT01QQVJFRlVOQ1RJT04gXAorICAtMTA3NDM5NTMzMiAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvbXBhcmVGdW5jdGlvbiB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CT1JERVJNRVRIT0QgXAorICAtMTA3NDM5NTMzMSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIEJvcmRlck1ldGhvZCB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9CT1JERVJfU0laRSBcCisgIC0xMDc0Mzk1MzMwICAvLyBJbnZhbGlkIGJvcmRlciBzaXplLiBBY2NlcHRhYmxlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gNTAuCisjZGVmaW5lIEVSUl9JTlZBTElEX09VVExJTkVNRVRIT0QgXAorICAtMTA3NDM5NTMyOSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIE91dGxpbmVNZXRob2QgdmFsdWUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRCBcCisgIC0xMDc0Mzk1MzI4ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgSW50ZXJwb2xhdGlvbk1ldGhvZCB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9TQ0FMSU5HTU9ERSBcCisgIC0xMDc0Mzk1MzI3ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgU2NhbGluZ01vZGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9EUkFXTU9ERV9GT1JfTElORSBcCisgIC0xMDc0Mzk1MzI2ICAvLyBpbWFxRHJhd0xpbmVPbkltYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlIERyYXdNb2RlIHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0RSQVdNT0RFIFwKKyAgLTEwNzQzOTUzMjUgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBEcmF3TW9kZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NIQVBFTU9ERSBcCisgIC0xMDc0Mzk1MzI0ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgU2hhcGVNb2RlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRk9OVENPTE9SIFwKKyAgLTEwNzQzOTUzMjMgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBGb250Q29sb3IgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9URVhUQUxJR05NRU5UIFwKKyAgLTEwNzQzOTUzMjIgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBUZXh0QWxpZ25tZW50IHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX01PUlBIT0xPR1lNRVRIT0QgXAorICAtMTA3NDM5NTMyMSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIE1vcnBob2xvZ3lNZXRob2QgdmFsdWUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0VNUFRZIC0xMDc0Mzk1MzIwICAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgaXMgZW1wdHkuCisjZGVmaW5lIEVSUl9JTlZBTElEX1NVQlBJWF9UWVBFIFwKKyAgLTEwNzQzOTUzMTkgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBpbnRlcnBvbGF0aW9uIHR5cGUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOU0ZfUE9JTlRTIFwKKyAgLTEwNzQzOTUzMTggIC8vIFlvdSBzdXBwbGllZCBhbiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIHBvaW50cyB0byBwZXJmb3JtIHRoaXMKKyAgICAgICAgICAgICAgIC8vIG9wZXJhdGlvbi4KKyNkZWZpbmUgRVJSX1VOREVGX1BPSU5UIFwKKyAgLTEwNzQzOTUzMTcgIC8vIFlvdSBzcGVjaWZpZWQgYSBwb2ludCB0aGF0IGxpZXMgb3V0c2lkZSB0aGUgaW1hZ2UuCisjZGVmaW5lIEVSUl9JTlZBTElEX0tFUk5FTF9DT0RFIC0xMDc0Mzk1MzE2ICAvLyBJbnZhbGlkIGtlcm5lbCBjb2RlLgorI2RlZmluZSBFUlJfSU5FRkZJQ0lFTlRfUE9JTlRTIFwKKyAgLTEwNzQzOTUzMTUgIC8vIFlvdSBzdXBwbGllZCBhbiBpbmVmZmljaWVudCBzZXQgb2YgcG9pbnRzIHRvIG1hdGNoIHRoZSBtaW5pbXVtCisgICAgICAgICAgICAgICAvLyBzY29yZS4KKyNkZWZpbmUgRVJSX1dSSVRFX0ZJTEVfTk9UX1NVUFBPUlRFRCBcCisgIC0xMDc0Mzk1MzEzICAvLyBXcml0aW5nIGZpbGVzIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuCisjZGVmaW5lIEVSUl9MQ0RfQ0FMSUJSQVRFIFwKKyAgLTEwNzQzOTUzMTIgIC8vIFRoZSBpbnB1dCBpbWFnZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgdmFsaWQgTENEIG9yIExFRAorICAgICAgICAgICAgICAgLy8gY2FsaWJyYXRpb24gaW1hZ2UuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SX1NQRUNUUlVNIFwKKyAgLTEwNzQzOTUzMTEgIC8vIFRoZSBjb2xvciBzcGVjdHJ1bSBhcnJheSB5b3UgcHJvdmlkZWQgaGFzIGFuIGludmFsaWQgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBvciBjb250YWlucyBhbiBlbGVtZW50IHNldCB0byBub3QtYS1udW1iZXIgKE5hTikuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBTEVUVEVfVFlQRSBcCisgIC0xMDc0Mzk1MzEwICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgUGFsZXR0ZVR5cGUgdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9XSU5ET1dfVEhSRUFEX1BPTElDWSBcCisgIC0xMDc0Mzk1MzA5ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgV2luZG93VGhyZWFkUG9saWN5IHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX0NPTE9SU0VOU0lUSVZJVFkgXAorICAtMTA3NDM5NTMwOCAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvbG9yU2Vuc2l0aXZpdHkgdmFsdWUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX1BSRUNJU0lPTl9OT1RfR1RSX1RIQU5fMCBcCisgIC0xMDc0Mzk1MzA3ICAvLyBUaGUgcHJlY2lzaW9uIHBhcmFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorI2RlZmluZSBFUlJfSU5WQUxJRF9UT09MIFwKKyAgLTEwNzQzOTUzMDYgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBUb29sIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUkVGRVJFTkNFTU9ERSBcCisgIC0xMDc0Mzk1MzA1ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgUmVmZXJlbmNlTW9kZSB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NQVRIVFJBTlNGT1JNTUVUSE9EIFwKKyAgLTEwNzQzOTUzMDQgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBNYXRoVHJhbnNmb3JtTWV0aG9kIHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX05VTV9PRl9DTEFTU0VTIFwKKyAgLTEwNzQzOTUzMDMgIC8vIEludmFsaWQgbnVtYmVyIG9mIGNsYXNzZXMgZm9yIGF1dG8gdGhyZXNob2xkLiBBY2NlcHRhYmxlCisgICAgICAgICAgICAgICAvLyB2YWx1ZXMgcmFuZ2UgZnJvbSAyIHRvIDI1Ni4KKyNkZWZpbmUgRVJSX0lOVkFMSURfVEhSRVNIT0xETUVUSE9EIFwKKyAgLTEwNzQzOTUzMDIgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSB0aHJlc2hvbGQgbWV0aG9kIHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9ST0lfTk9UXzJfTElORVMgXAorICAtMTA3NDM5NTMwMSAgLy8gVGhlIFJPSSB5b3UgcGFzc2VkIGludG8gaW1hcUdldE1ldGVyQXJjIG11c3QgY29uc2lzdCBvZiB0d28KKyAgICAgICAgICAgICAgIC8vIGxpbmVzLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NRVRFUkFSQ01PREUgXAorICAtMTA3NDM5NTMwMCAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIE1ldGVyQXJjTW9kZSB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT01QTEVYUExBTkUgXAorICAtMTA3NDM5NTI5OSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvbXBsZXhQbGFuZSB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfQ09NUExFWFBMQU5FX05PVF9SRUFMX09SX0lNQUdJTkFSWSBcCisgIC0xMDc0Mzk1Mjk4ICAvLyBZb3UgY2FuIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gb24gYSByZWFsIG9yIGFuIGltYWdpbmFyeQorICAgICAgICAgICAgICAgLy8gQ29tcGxleFBsYW5lIG9ubHkuCisjZGVmaW5lIEVSUl9JTlZBTElEX1BBUlRJQ0xFSU5GT01PREUgXAorICAtMTA3NDM5NTI5NyAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFBhcnRpY2xlSW5mb01vZGUgdmFsdWUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfQkFSQ09ERVRZUEUgXAorICAtMTA3NDM5NTI5NiAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIEJhcmNvZGVUeXBlIHZhbHVlIHlvdSBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRF9JTlRFUlBPTEFURVBPSU5UUyBcCisgIC0xMDc0Mzk1Mjk1ICAvLyBpbWFxSW50ZXJwb2xhdGVQb2ludHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSW50ZXJwb2xhdGlvbk1ldGhvZAorICAgICAgICAgICAgICAgLy8gdmFsdWUgeW91IHN1cHBsaWVkLgorI2RlZmluZSBFUlJfQ09OVE9VUl9JTkRFWF9PVVRfT0ZfUkFOR0UgXAorICAtMTA3NDM5NTI5NCAgLy8gVGhlIGNvbnRvdXIgaW5kZXggeW91IHN1cHBsaWVkIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgIC8vIGNvbnRvdXJzIGluIHRoZSBST0kuCisjZGVmaW5lIEVSUl9DT05UT1VSSURfTk9UX0ZPVU5EIFwKKyAgLTEwNzQzOTUyOTMgIC8vIFRoZSBzdXBwbGllZCBDb250b3VySUQgZGlkIG5vdCBjb3JyZWxhdGUgdG8gYSBjb250b3VyIGluc2lkZQorICAgICAgICAgICAgICAgLy8gdGhlIFJPSS4KKyNkZWZpbmUgRVJSX1BPSU5UU19BUkVfQ09MTElORUFSIFwKKyAgLTEwNzQzOTUyOTIgIC8vIERvIG5vdCBzdXBwbHkgY29sbGluZWFyIHBvaW50cyBmb3IgdGhpcyBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9TSEFQRU1BVENIX0JBRElNQUdFREFUQSBcCisgIC0xMDc0Mzk1MjkxICAvLyBTaGFwZSBNYXRjaCByZXF1aXJlcyB0aGUgaW1hZ2UgdG8gY29udGFpbiBvbmx5IHBpeGVsIHZhbHVlcyBvZgorICAgICAgICAgICAgICAgLy8gMCBvciAxLgorI2RlZmluZSBFUlJfU0hBUEVNQVRDSF9CQURURU1QTEFURSBcCisgIC0xMDc0Mzk1MjkwICAvLyBUaGUgdGVtcGxhdGUgeW91IHN1cHBsaWVkIGZvciBTaGFwZU1hdGNoIGNvbnRhaW5zIG5vIHNoYXBlCisgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbi4KKyNkZWZpbmUgRVJSX0NPTlRBSU5FUl9DQVBBQ0lUWV9FWENFRURFRF9VSU5UX01BWCBcCisgIC0xMDc0Mzk1Mjg5ICAvLyBUaGUgb3BlcmF0aW9uIHdvdWxkIGhhdmUgZXhjZWVkZWQgdGhlIGNhcGFjaXR5IG9mIGFuIGludGVybmFsCisgICAgICAgICAgICAgICAvLyBjb250YWluZXIsIHdoaWNoIGlzIGxpbWl0ZWQgdG8gNDI5NDk2NzI5NiB1bmlxdWUgZWxlbWVudHMuCisjZGVmaW5lIEVSUl9DT05UQUlORVJfQ0FQQUNJVFlfRVhDRUVERURfSU5UX01BWCBcCisgIC0xMDc0Mzk1Mjg4ICAvLyBUaGUgb3BlcmF0aW9uIHdvdWxkIGhhdmUgZXhjZWVkZWQgdGhlIGNhcGFjaXR5IG9mIGFuIGludGVybmFsCisgICAgICAgICAgICAgICAvLyBjb250YWluZXIsIHdoaWNoIGlzIGxpbWl0ZWQgdG8gMjE0NzQ4MzY0OCB1bmlxdWUgZWxlbWVudHMuCisjZGVmaW5lIEVSUl9JTlZBTElEX0xJTkUgXAorICAtMTA3NDM5NTI4NyAgLy8gVGhlIGxpbmUgeW91IHByb3ZpZGVkIGNvbnRhaW5zIHR3byBpZGVudGljYWwgcG9pbnRzLCBvciBvbmUgb2YKKyAgICAgICAgICAgICAgIC8vIHRoZSBjb29yZGluYXRlIGxvY2F0aW9ucyBmb3IgdGhlIGxpbmUgaXMgbm90IGEgbnVtYmVyIChOYU4pLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT05DRU5UUklDX1JBS0VfRElSRUNUSU9OIFwKKyAgLTEwNzQzOTUyODYgIC8vIEludmFsaWQgY29uY2VudHJpYyByYWtlIGRpcmVjdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfU1BPS0VfRElSRUNUSU9OIC0xMDc0Mzk1Mjg1ICAvLyBJbnZhbGlkIHNwb2tlIGRpcmVjdGlvbi4KKyNkZWZpbmUgRVJSX0lOVkFMSURfRURHRV9QUk9DRVNTIC0xMDc0Mzk1Mjg0ICAgICAvLyBJbnZhbGlkIGVkZ2UgcHJvY2Vzcy4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUkFLRV9ESVJFQ1RJT04gLTEwNzQzOTUyODMgICAvLyBJbnZhbGlkIHJha2UgZGlyZWN0aW9uLgorI2RlZmluZSBFUlJfQ0FOVF9EUkFXX0lOVE9fVklFV0VSIFwKKyAgLTEwNzQzOTUyODIgIC8vIFVuYWJsZSB0byBkcmF3IHRvIHZpZXdlci4gWW91IG11c3QgaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YKKyAgICAgICAgICAgICAgIC8vIHRoZSBjb250cm9sLgorI2RlZmluZSBFUlJfSU1BR0VfU01BTExFUl9USEFOX0JPUkRFUiBcCisgIC0xMDc0Mzk1MjgxICAvLyBZb3VyIGltYWdlIG11c3QgYmUgbGFyZ2VyIHRoYW4gaXRzIGJvcmRlciBzaXplIGZvciB0aGlzCisgICAgICAgICAgICAgICAvLyBvcGVyYXRpb24uCisjZGVmaW5lIEVSUl9ST0lfTk9UX1JFQ1QgXAorICAtMTA3NDM5NTI4MCAgLy8gVGhlIFJPSSBtdXN0IG9ubHkgaGF2ZSBhIHNpbmdsZSBSZWN0YW5nbGUgY29udG91ci4KKyNkZWZpbmUgRVJSX1JPSV9OT1RfUE9MWUdPTiAtMTA3NDM5NTI3OSAgLy8gUk9JIGlzIG5vdCBhIHBvbHlnb24uCisjZGVmaW5lIEVSUl9MQ0RfTk9UX05VTUVSSUMgLTEwNzQzOTUyNzggIC8vIExDRCBpbWFnZSBpcyBub3QgYSBudW1iZXIuCisjZGVmaW5lIEVSUl9CQVJDT0RFX0NIRUNLU1VNIFwKKyAgLTEwNzQzOTUyNzcgIC8vIFRoZSBkZWNvZGVkIGJhcmNvZGUgaW5mb3JtYXRpb24gZGlkIG5vdCBwYXNzIHRoZSBjaGVja3N1bQorICAgICAgICAgICAgICAgLy8gdGVzdC4KKyNkZWZpbmUgRVJSX0xJTkVTX1BBUkFMTEVMIFwKKyAgLTEwNzQzOTUyNzYgIC8vIFlvdSBzcGVjaWZpZWQgcGFyYWxsZWwgbGluZXMgZm9yIHRoZSBtZXRlciBST0kuCisjZGVmaW5lIEVSUl9JTlZBTElEX0JST1dTRVJfSU1BR0UgLTEwNzQzOTUyNzUgIC8vIEludmFsaWQgYnJvd3NlciBpbWFnZS4KKyNkZWZpbmUgRVJSX0RJVl9CWV9aRVJPIC0xMDc0Mzk1MjcwICAgICAgICAgICAgLy8gQ2Fubm90IGRpdmlkZSBieSB6ZXJvLgorI2RlZmluZSBFUlJfTlVMTF9QT0lOVEVSIC0xMDc0Mzk1MjY5ICAgICAgICAgICAvLyBOdWxsIHBvaW50ZXIuCisjZGVmaW5lIEVSUl9MSU5FQVJfQ09FRkYgXAorICAtMTA3NDM5NTI2OCAgLy8gVGhlIGxpbmVhciBlcXVhdGlvbnMgYXJlIG5vdCBpbmRlcGVuZGVudC4KKyNkZWZpbmUgRVJSX0NPTVBMRVhfUk9PVCAtMTA3NDM5NTI2NyAgLy8gVGhlIHJvb3RzIG9mIHRoZSBlcXVhdGlvbiBhcmUgY29tcGxleC4KKyNkZWZpbmUgRVJSX0JBUkNPREUgXAorICAtMTA3NDM5NTI2NSAgLy8gVGhlIGJhcmNvZGUgZG9lcyBub3QgbWF0Y2ggdGhlIHR5cGUgeW91IHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0xDRF9OT19TRUdNRU5UUyAtMTA3NDM5NTI2MyAgLy8gTm8gbGl0IHNlZ21lbnQuCisjZGVmaW5lIEVSUl9MQ0RfQkFEX01BVENIIC0xMDc0Mzk1MjYyICAgIC8vIFRoZSBMQ0QgZG9lcyBub3QgZm9ybSBhIGtub3duIGRpZ2l0LgorI2RlZmluZSBFUlJfR0lQX1JBTkdFIFwKKyAgLTEwNzQzOTUyNjEgIC8vIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGFuCisgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGNvb3JkaW5hdGUgb24gYW4gaW1hZ2UuCisjZGVmaW5lIEVSUl9IRUFQX1RSQVNIRUQgLTEwNzQzOTUyNjAgIC8vIEFuIGludGVybmFsIG1lbW9yeSBlcnJvciBvY2N1cnJlZC4KKyNkZWZpbmUgRVJSX0JBRF9GSUxURVJfV0lEVEggXAorICAtMTA3NDM5NTI1OCAgLy8gVGhlIGZpbHRlciB3aWR0aCBtdXN0IGJlIG9kZCBmb3IgdGhlIENhbm55IG9wZXJhdG9yLgorI2RlZmluZSBFUlJfSU5WQUxJRF9FREdFX0RJUiBcCisgIC0xMDc0Mzk1MjU3ICAvLyBZb3Ugc3VwcGxpZWQgYW4gaW52YWxpZCBlZGdlIGRpcmVjdGlvbiBpbiB0aGUgQ2Fubnkgb3BlcmF0b3IuCisjZGVmaW5lIEVSUl9FVkVOX1dJTkRPV19TSVpFIFwKKyAgLTEwNzQzOTUyNTYgIC8vIFRoZSB3aW5kb3cgc2l6ZSBtdXN0IGJlIG9kZCBmb3IgdGhlIENhbm55IG9wZXJhdG9yLgorI2RlZmluZSBFUlJfSU5WQUxJRF9MRUFSTl9NT0RFIC0xMDc0Mzk1MjUzICAvLyBJbnZhbGlkIGxlYXJuIG1vZGUuCisjZGVmaW5lIEVSUl9MRUFSTl9TRVRVUF9EQVRBIC0xMDc0Mzk1MjUyICAgIC8vIEludmFsaWQgbGVhcm4gc2V0dXAgZGF0YS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfTUFUQ0hfTU9ERSAtMTA3NDM5NTI1MSAgLy8gSW52YWxpZCBtYXRjaCBtb2RlLgorI2RlZmluZSBFUlJfTUFUQ0hfU0VUVVBfREFUQSAtMTA3NDM5NTI1MCAgICAvLyBJbnZhbGlkIG1hdGNoIHNldHVwIGRhdGEuCisjZGVmaW5lIEVSUl9ST1RBVElPTl9BTkdMRV9SQU5HRV9UT09fTEFSR0UgXAorICAtMTA3NDM5NTI0OSAgLy8gQXQgbGVhc3Qgb25lIHJhbmdlIGluIHRoZSBhcnJheSBvZiByb3RhdGlvbiBhbmdsZSByYW5nZXMKKyAgICAgICAgICAgICAgIC8vIGV4Y2VlZHMgMzYwIGRlZ3JlZXMuCisjZGVmaW5lIEVSUl9UT09fTUFOWV9ST1RBVElPTl9BTkdMRV9SQU5HRVMgXAorICAtMTA3NDM5NTI0OCAgLy8gVGhlIGFycmF5IG9mIHJvdGF0aW9uIGFuZ2xlIHJhbmdlcyBjb250YWlucyB0b28gbWFueSByYW5nZXMuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SIC0xMDc0Mzk1MjQ3ICAgIC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfMSAtMTA3NDM5NTI0NiAgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl8yIC0xMDc0Mzk1MjQ1ICAvLyBJbnZhbGlkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SXzMgLTEwNzQzOTUyNDQgIC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfNCBcCisgIC0xMDc0Mzk1MjQzICAvLyBUaGUgdGVtcGxhdGUgZGVzY3JpcHRvciB3YXMgY3JlYXRlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBOSQorICAgICAgICAgICAgICAgLy8gVmlzaW9uLiBVcGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBOSSBWaXNpb24gdG8gdXNlIHRoaXMKKyAgICAgICAgICAgICAgIC8vIHRlbXBsYXRlLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTiBcCisgIC0xMDc0Mzk1MjQyICAvLyBJbnZhbGlkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SX05PUk9UQVRJT04gXAorICAtMTA3NDM5NTI0MSAgLy8gVGhlIHRlbXBsYXRlIGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBkYXRhIHJlcXVpcmVkIGZvcgorICAgICAgICAgICAgICAgLy8gcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl8xIFwKKyAgLTEwNzQzOTUyNDAgIC8vIEludmFsaWQgdGVtcGxhdGUgZGVzY3JpcHRvci4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlQgXAorICAtMTA3NDM5NTIzOSAgLy8gSW52YWxpZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yLgorI2RlZmluZSBFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NISUZUIFwKKyAgLTEwNzQzOTUyMzggIC8vIFRoZSB0ZW1wbGF0ZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gZGF0YSByZXF1aXJlZCBmb3IKKyAgICAgICAgICAgICAgIC8vIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMSBcCisgIC0xMDc0Mzk1MjM3ICAvLyBJbnZhbGlkIHRlbXBsYXRlIGRlc2NyaXB0b3IuCisjZGVmaW5lIEVSUl9URU1QTEFURV9ERVNDUklQVE9SX05PU0NBTEUgXAorICAtMTA3NDM5NTIzNiAgLy8gVGhlIHRlbXBsYXRlIGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBkYXRhIHJlcXVpcmVkIGZvcgorICAgICAgICAgICAgICAgLy8gc2NhbGUtaW52YXJpYW50IG1hdGNoaW5nLgorI2RlZmluZSBFUlJfVEVNUExBVEVfSU1BR0VfQ09OVFJBU1RfVE9PX0xPVyBcCisgIC0xMDc0Mzk1MjM1ICAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggY29udHJhc3QuCisjZGVmaW5lIEVSUl9URU1QTEFURV9JTUFHRV9UT09fU01BTEwgXAorICAtMTA3NDM5NTIzNCAgLy8gVGhlIHRlbXBsYXRlIGltYWdlIGlzIHRvbyBzbWFsbC4KKyNkZWZpbmUgRVJSX1RFTVBMQVRFX0lNQUdFX1RPT19MQVJHRSBcCisgIC0xMDc0Mzk1MjMzICAvLyBUaGUgdGVtcGxhdGUgaW1hZ2UgaXMgdG9vIGxhcmdlLgorI2RlZmluZSBFUlJfVE9PX01BTllfT0NSX1NFU1NJT05TIFwKKyAgLTEwNzQzOTUyMTQgIC8vIFRoZXJlIGFyZSB0b28gbWFueSBPQ1Igc2Vzc2lvbnMgb3Blbi4gIFlvdSBtdXN0IGNsb3NlIGEKKyAgICAgICAgICAgICAgIC8vIHNlc3Npb24gYmVmb3JlIHlvdSBjYW4gb3BlbiBhbm90aGVyIG9uZS4KKyNkZWZpbmUgRVJSX09DUl9URU1QTEFURV9XUk9OR19TSVpFIFwKKyAgLTEwNzQzOTUyMTIgIC8vIFRoZSBzaXplIG9mIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgbXVzdCBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICAgICAgICAgIC8vIHN0cmluZyB5b3UgYXJlIHRyeWluZyB0byBjb3JyZWN0LgorI2RlZmluZSBFUlJfT0NSX0JBRF9URVhUX1RFTVBMQVRFIFwKKyAgLTEwNzQzOTUyMTEgIC8vIFRoZSBzdXBwbGllZCB0ZXh0IHRlbXBsYXRlIGNvbnRhaW5zIG5vbnN0YW5kYXJkIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgIC8vIHRoYXQgY2Fubm90IGJlIGdlbmVyYXRlZCBieSBPQ1IuCisjZGVmaW5lIEVSUl9PQ1JfQ0FOTk9UX01BVENIX1RFWFRfVEVNUExBVEUgXAorICAtMTA3NDM5NTIxMCAgLy8gQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgdGV4dCB0ZW1wbGF0ZSB3YXMgb2YgYSBsZXhpY2FsCisgICAgICAgICAgICAgICAvLyBjbGFzcyB0aGF0IGRpZCBub3QgbWF0Y2ggdGhlIHN1cHBsaWVkIGNoYXJhY3RlciByZXBvcnRzLgorI2RlZmluZSBFUlJfT0NSX0xJQl9JTklUIFwKKyAgLTEwNzQzOTUyMDMgIC8vIFRoZSBPQ1IgbGlicmFyeSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LgorI2RlZmluZSBFUlJfT0NSX0xPQURfTElCUkFSWSBcCisgIC0xMDc0Mzk1MjAxICAvLyBUaGVyZSB3YXMgYSBmYWlsdXJlIHdoZW4gbG9hZGluZyBvbmUgb2YgdGhlIGludGVybmFsIE9DUgorICAgICAgICAgICAgICAgLy8gZW5naW5lIG9yIExhYlZpZXcgbGlicmFyaWVzLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfUEFSQU1FVEVSIFwKKyAgLTEwNzQzOTUyMDAgIC8vIE9uZSBvZiB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCB0byB0aGUgT0NSIGZ1bmN0aW9uIHRoYXQKKyAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlZCB0aGlzIGVycm9yIGlzIGludmFsaWQuCisjZGVmaW5lIEVSUl9NQVJLRVJfSU5GT1JNQVRJT05fTk9UX1NVUFBMSUVEIFwKKyAgLTEwNzQzOTUxOTkgIC8vIE1hcmtlciBpbWFnZSBhbmQgcG9pbnRzIGFyZSBub3Qgc3VwcGxpZWQKKyNkZWZpbmUgRVJSX0lOQ09NUEFUSUJMRV9NQVJLRVJfSU1BR0VfU0laRSBcCisgIC0xMDc0Mzk1MTk4ICAvLyBTb3VyY2UgSW1hZ2UgYW5kIE1hcmtlciBJbWFnZSBzaG91bGQgYmUgb2Ygc2FtZSBzaXplLgorI2RlZmluZSBFUlJfQk9USF9NQVJLRVJfSU5QVVRTX1NVUFBMSUVEIFwKKyAgLTEwNzQzOTUxOTcgIC8vIEJvdGggTWFya2VyIEltYWdlIGFuZCBQb2ludHMgYXJlIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9NT1JQSE9MT0dJQ0FMX09QRVJBVElPTiBcCisgIC0xMDc0Mzk1MTk2ICAvLyBJbnZhbGlkIE1vcnBob2xvZ2ljYWwgT3BlcmF0aW9uLgorI2RlZmluZSBFUlJfSU1BR0VfQ09OVEFJTlNfTkFOX1ZBTFVFUyBcCisgIC0xMDc0Mzk1MTk1ICAvLyBGbG9hdCBpbWFnZSBjb250YWlucyBOYU4gdmFsdWVzCisjZGVmaW5lIEVSUl9PVkVSTEFZX0VYVFJBSU5GT19PUEVOSU5HX05FV19WRVJTSU9OIFwKKyAgLTEwNzQzOTUxOTQgIC8vIFRoZSBvdmVybGF5IGluZm9ybWF0aW9uIHlvdSB0cmllZCB0byBvcGVuIHdhcyBjcmVhdGVkIHdpdGggYQorICAgICAgICAgICAgICAgLy8gbmV3ZXIgdmVyc2lvbiBvZiBOSSBWaXNpb24uIFVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mCisgICAgICAgICAgICAgICAvLyBOSSBWaXNpb24gdG8gcmVhZCB0aGlzIGZpbGUuCisjZGVmaW5lIEVSUl9OT19DTEFNUF9GT1VORCBcCisgIC0xMDc0Mzk1MTkzICAvLyBObyB2YWxpZCBjbGFtcCB3YXMgZm91bmQgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisjZGVmaW5lIEVSUl9OT19DTEFNUF9XSVRISU5fQU5HTEVfUkFOR0UgXAorICAtMTA3NDM5NTE5MiAgLy8gU3VwcGxpZWQgYW5nbGUgcmFuZ2UgZm9yIGNsYW1wIGlzIGluc3VmZmljaWVudAorI2RlZmluZSBFUlJfR0hUX0lOVkFMSURfVVNFX0FMTF9DVVJWRVNfVkFMVUUgXAorICAtMTA3NDM5NTE4OCAgLy8gVGhlIHVzZSBhbGwgY3VydmVzIGFkdmFuY2VkIG9wdGlvbiBzcGVjaWZpZWQgZHVyaW5nIGxlYXJuIGlzCisgICAgICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkCisjZGVmaW5lIEVSUl9JTlZBTElEX0dBVVNTX1NJR01BX1ZBTFVFIFwKKyAgLTEwNzQzOTUxODcgIC8vIFRoZSBzaWdtYSB2YWx1ZSBzcGVjaWZpZWQgZm9yIHRoZSBHYXVzc2lhbiBmaWx0ZXIgaXMgdG9vCisgICAgICAgICAgICAgICAvLyBzbWFsbC4KKyNkZWZpbmUgRVJSX0lOVkFMSURfR0FVU1NfRklMVEVSX1RZUEUgXAorICAtMTA3NDM5NTE4NiAgLy8gVGhlIHNwZWNpZmllZCBHYXVzc2lhbiBmaWx0ZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfSU5WQUxJRF9DT05UUkFTVF9SRVZFUlNBTF9NT0RFIFwKKyAgLTEwNzQzOTUxODUgIC8vIFRoZSBjb250cmFzdCByZXZlcnNhbCBtb2RlIHNwZWNpZmllZCBkdXJpbmcgbWF0Y2hpbmcgaXMKKyAgICAgICAgICAgICAgIC8vIGludmFsaWQuCisjZGVmaW5lIEVSUl9JTlZBTElEX1JPVEFUSU9OX1JBTkdFIFwKKyAgLTEwNzQzOTUxODQgIC8vIEludmFsaWQgcm9hdGlvbiBhbmdsZSByYW5nZS4gVGhlIHVwcGVyIGJvdW5kIG11c3QgYmUgZ3JlYXRlcgorICAgICAgICAgICAgICAgLy8gdGhhbiBvciBlcXVhbCB0byB0aGUgbG93ZXIgYm91bmQuCisjZGVmaW5lIEVSUl9HSFRfSU5WQUxJRF9NSU5JTVVNX0xFQVJOX0FOR0xFX1ZBTFVFIFwKKyAgLTEwNzQzOTUxODMgIC8vIFRoZSBtaW5pbXVtIHJvdGF0aW9uIGFuZ2xlIHZhbHVlIHNwZWNpZmVkIGR1cmluZyBsZWFybmluZyBvZgorICAgICAgICAgICAgICAgLy8gdGhlIHRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9HSFRfSU5WQUxJRF9NQVhJTVVNX0xFQVJOX0FOR0xFX1ZBTFVFIFwKKyAgLTEwNzQzOTUxODIgIC8vIFRoZSBtYXhpbXVtIHJvdGF0aW9uIGFuZ2xlIHZhbHVlIHNwZWNpZmVkIGR1cmluZyBsZWFybmluZyBvZgorICAgICAgICAgICAgICAgLy8gdGhlIHRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQuCisjZGVmaW5lIEVSUl9HSFRfSU5WQUxJRF9NQVhJTVVNX0xFQVJOX1NDQUxFX0ZBQ1RPUiBcCisgIC0xMDc0Mzk1MTgxICAvLyBUaGUgbWF4aW11bSBzY2FsZSBmYWN0b3Igc3BlY2lmZWQgZHVyaW5nIGxlYXJuaW5nIG9mIHRoZQorICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUgaXMgbm90IHN1cHBvcnRlZC4KKyNkZWZpbmUgRVJSX0dIVF9JTlZBTElEX01JTklNVU1fTEVBUk5fU0NBTEVfRkFDVE9SIFwKKyAgLTEwNzQzOTUxODAgIC8vIFRoZSBtaW5pbXVtIHNjYWxlIGZhY3RvciBzcGVjaWZlZCBkdXJpbmcgbGVhcm5pbmcgb2YgdGhlCisgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSBpcyBub3Qgc3VwcG9ydGVkLgorI2RlZmluZSBFUlJfT0NSX1BSRVBST0NFU1NJTkdfRkFJTEVEIFwKKyAgLTEwNzQzOTUxNzkgIC8vIFRoZSBPQ1IgZW5naW5lIGZhaWxlZCBkdXJpbmcgdGhlIHByZXByb2Nlc3Npbmcgc3RhZ2UuCisjZGVmaW5lIEVSUl9PQ1JfUkVDT0dOSVRJT05fRkFJTEVEIFwKKyAgLTEwNzQzOTUxNzggIC8vIFRoZSBPQ1IgZW5naW5lIGZhaWxlZCBkdXJpbmcgdGhlIHJlY29nbml0aW9uIHN0YWdlLgorI2RlZmluZSBFUlJfT0NSX0JBRF9VU0VSX0RJQ1RJT05BUlkgXAorICAtMTA3NDM5NTE3NSAgLy8gVGhlIHByb3ZpZGVkIGZpbGVuYW1lIGlzIG5vdCB2YWxpZCB1c2VyIGRpY3Rpb25hcnkgZmlsZW5hbWUuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9BVVRPT1JJRU5UTU9ERSBcCisgIC0xMDc0Mzk1MTc0ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQXV0b09yaWVudE1vZGUgdmFsdWUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX0xBTkdVQUdFIFwKKyAgLTEwNzQzOTUxNzMgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBMYW5ndWFnZSB2YWx1ZSB5b3Ugc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9DSEFSQUNURVJTRVQgXAorICAtMTA3NDM5NTE3MiAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENoYXJhY3RlclNldCB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOSV9GSUxFX05PVF9GT1VORCBcCisgIC0xMDc0Mzk1MTcxICAvLyBUaGUgc3lzdGVtIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgcmVxdWlyZWQKKyAgICAgICAgICAgICAgIC8vIGZvciBPQ1IgaW5pdGlhbGl6YXRpb24uCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9DSEFSQUNURVJUWVBFIFwKKyAgLTEwNzQzOTUxNzAgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDaGFyYWN0ZXJUeXBlIHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9SRUNPR05JVElPTk1PREUgXAorICAtMTA3NDM5NTE2OSAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIFJlY29nbml0aW9uTW9kZSB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQVVUT0NPUlJFQ1RJT05NT0RFIFwKKyAgLTEwNzQzOTUxNjggIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBBdXRvQ29ycmVjdGlvbk1vZGUgdmFsdWUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX09VVFBVVERFTElNSVRFUiBcCisgIC0xMDc0Mzk1MTY3ICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgT3V0cHV0RGVsaW1pdGVyIHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfQklOX0RJUl9OT1RfRk9VTkQgXAorICAtMTA3NDM5NTE2NiAgLy8gVGhlIHN5c3RlbSBjb3VsZCBub3QgbG9jYXRlIHRoZSBPQ1IgYmluYXJ5IGRpcmVjdG9yeSByZXF1aXJlZAorICAgICAgICAgICAgICAgLy8gZm9yIE9DUiBpbml0aWFsaXphdGlvbi4KKyNkZWZpbmUgRVJSX09DUl9XVFNfRElSX05PVF9GT1VORCBcCisgIC0xMDc0Mzk1MTY1ICAvLyBUaGUgc3lzdGVtIGNvdWxkIG5vdCBsb2NhdGUgdGhlIE9DUiB3ZWlnaHRzIGRpcmVjdG9yeSByZXF1aXJlZAorICAgICAgICAgICAgICAgLy8gZm9yIE9DUiBpbml0aWFsaXphdGlvbi4KKyNkZWZpbmUgRVJSX09DUl9BRERfV09SRF9GQUlMRUQgXAorICAtMTA3NDM5NTE2NCAgLy8gVGhlIHN1cHBsaWVkIHdvcmQgY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSB1c2VyIGRpY3Rpb25hcnkuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9DSEFSQUNURVJQUkVGRVJFTkNFIFwKKyAgLTEwNzQzOTUxNjMgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDaGFyYWN0ZXJQcmVmZXJlbmNlIHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9DT1JSRUNUSU9OTU9ERSBcCisgIC0xMDc0Mzk1MTYyICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgQ29ycmVjdGlvbk1ldGhvZCB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfQ09SUkVDVElPTkxFVkVMIFwKKyAgLTEwNzQzOTUxNjEgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBDb3JyZWN0aW9uTGV2ZWwgdmFsdWUgeW91CisgICAgICAgICAgICAgICAvLyBzdXBwbGllZC4KKyNkZWZpbmUgRVJSX09DUl9JTlZBTElEX01BWFBPSU5UU0laRSBcCisgIC0xMDc0Mzk1MTYwICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgbWF4aW11bSBwb2ludCBzaXplIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuICBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSA0IHRvIDcyLgorI2RlZmluZSBFUlJfT0NSX0lOVkFMSURfVE9MRVJBTkNFIFwKKyAgLTEwNzQzOTUxNTkgIC8vIE5JIFZpc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSB0b2xlcmFuY2UgdmFsdWUgeW91IHN1cHBsaWVkLgorICAgICAgICAgICAgICAgLy8gVmFsaWQgdmFsdWVzIGFyZSBub24tbmVnYXRpdmUuCisjZGVmaW5lIEVSUl9PQ1JfSU5WQUxJRF9DT05UUkFTVE1PREUgXAorICAtMTA3NDM5NTE1OCAgLy8gTkkgVmlzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIENvbnRyYXN0TW9kZSB2YWx1ZSB5b3UKKyAgICAgICAgICAgICAgIC8vIHN1cHBsaWVkLgorI2RlZmluZSBFUlJfT0NSX1NLRVdfREVURUNUX0ZBSUxFRCBcCisgIC0xMDc0Mzk1MTU2ICAvLyBUaGUgT0NSIGF0dGVtcHRlZCB0byBkZXRlY3RlZCB0aGUgdGV4dCBza2V3IGFuZCBmYWlsZWQuCisjZGVmaW5lIEVSUl9PQ1JfT1JJRU5UX0RFVEVDVF9GQUlMRUQgXAorICAtMTA3NDM5NTE1NSAgLy8gVGhlIE9DUiBhdHRlbXB0ZWQgdG8gZGV0ZWN0ZWQgdGhlIHRleHQgb3JpZW50YXRpb24gYW5kIGZhaWxlZC4KKyNkZWZpbmUgRVJSX0ZPTlRfRklMRV9GT1JNQVQgLTEwNzQzOTUxNTMgICAgIC8vIEludmFsaWQgZm9udCBmaWxlIGZvcm1hdC4KKyNkZWZpbmUgRVJSX0ZPTlRfRklMRV9OT1RfRk9VTkQgLTEwNzQzOTUxNTIgIC8vIEZvbnQgZmlsZSBub3QgZm91bmQuCisjZGVmaW5lIEVSUl9PQ1JfQ09SUkVDVElPTl9GQUlMRUQgXAorICAtMTA3NDM5NTE1MSAgLy8gVGhlIE9DUiBlbmdpbmUgZmFpbGVkIGR1cmluZyB0aGUgY29ycmVjdGlvbiBzdGFnZS4KKyNkZWZpbmUgRVJSX0lOVkFMSURfUk9VTkRJTkdfTU9ERSBcCisgIC0xMDc0Mzk1MTUwICAvLyBOSSBWaXNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgUm91bmRpbmdNb2RlIHZhbHVlIHlvdQorICAgICAgICAgICAgICAgLy8gc3VwcGxpZWQuCisjZGVmaW5lIEVSUl9EVVBMSUNBVEVfVFJBTlNGT1JNX1RZUEUgXAorICAtMTA3NDM5NTE0OSAgLy8gRm91bmQgYSBkdXBsaWNhdGUgdHJhbnNmb3JtIHR5cGUgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkuIEVhY2gKKyAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYXJyYXkgbWF5IG9ubHkgY29udGFpbiBvbmUgYmVoYXZpb3IgZm9yIGVhY2gKKyAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0eXBlLgorI2RlZmluZSBFUlJfT1ZFUkxBWV9HUk9VUF9OT1RfRk9VTkQgLTEwNzQzOTUxNDggIC8vIE92ZXJsYXkgR3JvdXAgTm90IEZvdW5kLgorI2RlZmluZSBFUlJfQkFSQ09ERV9SU1NMSU1JVEVEIFwKKyAgLTEwNzQzOTUxNDcgIC8vIFRoZSBiYXJjb2RlIGlzIG5vdCBhIHZhbGlkIFJTUyBMaW1pdGVkIHN5bWJvbAorI2RlZmluZSBFUlJfUVJfREVURUNUSU9OX1ZFUlNJT04gXAorICAtMTA3NDM5NTE0NiAgLy8gQ291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIFFSIGNvZGUuCisjZGVmaW5lIEVSUl9RUl9JTlZBTElEX1JFQUQgLTEwNzQzOTUxNDUgIC8vIEludmFsaWQgcmVhZCBvZiB0aGUgUVIgY29kZS4KKyNkZWZpbmUgRVJSX1FSX0lOVkFMSURfQkFSQ09ERSBcCisgIC0xMDc0Mzk1MTQ0ICAvLyBUaGUgYmFyY29kZSB0aGF0IHdhcyByZWFkIGNvbnRhaW5zIGludmFsaWQgcGFyYW1ldGVycy4KKyNkZWZpbmUgRVJSX1FSX0RFVEVDVElPTl9NT0RFIFwKKyAgLTEwNzQzOTUxNDMgIC8vIFRoZSBkYXRhIHN0cmVhbSB0aGF0IHdhcyBkZW1vZHVsYXRlZCBjb3VsZCBub3QgYmUgcmVhZCBiZWNhdXNlCisgICAgICAgICAgICAgICAvLyB0aGUgbW9kZSB3YXMgbm90IGRldGVjdGVkLgorI2RlZmluZSBFUlJfUVJfREVURUNUSU9OX01PREVMVFlQRSBcCisgIC0xMDc0Mzk1MTQyICAvLyBDb3VsZG4ndCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgbW9kZWwgb2YgdGhlIFFSIGNvZGUuCisjZGVmaW5lIEVSUl9PQ1JfTk9fVEVYVF9GT1VORCBcCisgIC0xMDc0Mzk1MTQxICAvLyBUaGUgT0NSIGVuZ2luZSBjb3VsZCBub3QgZmluZCBhbnkgdGV4dCBpbiB0aGUgc3VwcGxpZWQgcmVnaW9uLgorI2RlZmluZSBFUlJfT0NSX0NIQVJfUkVQT1JUX0NPUlJVUFRFRCBcCisgIC0xMDc0Mzk1MTQwICAvLyBPbmUgb2YgdGhlIGNoYXJhY3RlciByZXBvcnRzIGlzIG5vIGxvbmdlciB1c2FibGUgYnkgdGhlCisgICAgICAgICAgICAgICAvLyBzeXN0ZW0uCisjZGVmaW5lIEVSUl9JTUFRX1FSX0RJTUVOU0lPTl9JTlZBTElEIC0xMDc0Mzk1MTM5ICAvLyBJbnZhbGlkIERpbWVuc2lvbnMuCisjZGVmaW5lIEVSUl9PQ1JfUkVHSU9OX1RPT19TTUFMTCBcCisgIC0xMDc0Mzk1MTM4ICAvLyBUaGUgT0NSIHJlZ2lvbiBwcm92aWRlZCB3YXMgdG9vIHNtYWxsIHRvIGhhdmUgY29udGFpbmVkIGFueQorICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycy4KKyNkZWZpbmUgX0ZJUlNUX0VSUiBFUlJfU1lTVEVNX0VSUk9SCisjZGVmaW5lIF9MQVNUX0VSUiBFUlJfT0NSX1JFR0lPTl9UT09fU01BTEwKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRW51bWVyYXRlZCBUeXBlcworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIGVudW0gUG9pbnRTeW1ib2xfZW51bSB7CisgIElNQVFfUE9JTlRfQVNfUElYRUwgPSAwLCAgLy8gQSBzaW5nbGUgcGl4ZWwgcmVwcmVzZW50cyBhIHBvaW50IGluIHRoZSBvdmVybGF5LgorICBJTUFRX1BPSU5UX0FTX0NST1NTID0gMSwgIC8vIEEgY3Jvc3MgcmVwcmVzZW50cyBhIHBvaW50IGluIHRoZSBvdmVybGF5LgorICBJTUFRX1BPSU5UX1VTRVJfREVGSU5FRCA9CisgICAgICAyLCAgLy8gVGhlIHBhdHRlcm4gc3VwcGxpZWQgYnkgdGhlIHVzZXIgcmVwcmVzZW50cyBhIHBvaW50IGluIHRoZSBvdmVybGF5LgorICBJTUFRX1BPSU5UX1NZTUJPTF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBQb2ludFN5bWJvbDsKKwordHlwZWRlZiBlbnVtIE1lYXN1cmVtZW50VmFsdWVfZW51bSB7CisgIElNQVFfQVJFQSA9IDAsICAvLyBTdXJmYWNlIGFyZWEgb2YgdGhlIHBhcnRpY2xlIGluIHBpeGVscy4KKyAgSU1BUV9BUkVBX0NBTElCUkFURUQgPQorICAgICAgMSwgIC8vIFN1cmZhY2UgYXJlYSBvZiB0aGUgcGFydGljbGUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgSU1BUV9OVU1fSE9MRVMgPSAyLCAgLy8gTnVtYmVyIG9mIGhvbGVzIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9BUkVBX09GX0hPTEVTID0gMywgIC8vIFN1cmZhY2UgYXJlYSBvZiB0aGUgaG9sZXMgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgSU1BUV9UT1RBTF9BUkVBID0KKyAgICAgIDQsICAvLyBUb3RhbCBzdXJmYWNlIGFyZWEgKGhvbGVzIGFuZCBwYXJ0aWNsZSkgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgSU1BUV9JTUFHRV9BUkVBID0gNSwgIC8vIFN1cmZhY2UgYXJlYSBvZiB0aGUgZW50aXJlIGltYWdlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgIElNQVFfUEFSVElDTEVfVE9fSU1BR0UgPSA2LCAgLy8gUmF0aW8sIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cmZhY2UgYXJlYSBvZiBhIHBhcnRpY2xlIGluIHJlbGF0aW9uIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvdGFsIGFyZWEgb2YgdGhlIHBhcnRpY2xlLgorICBJTUFRX1BBUlRJQ0xFX1RPX1RPVEFMID0gNywgIC8vIFJhdGlvLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlIGFyZWEgb2YgYSBwYXJ0aWNsZSBpbiByZWxhdGlvbiB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3RhbCBhcmVhIG9mIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9DRU5URVJfTUFTU19YID0gOCwgIC8vIFgtY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIG1hc3MuCisgIElNQVFfQ0VOVEVSX01BU1NfWSA9IDksICAvLyBZLWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiBtYXNzLgorICBJTUFRX0xFRlRfQ09MVU1OID0gMTAsICAvLyBMZWZ0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgSU1BUV9UT1BfUk9XID0gMTEsICAvLyBUb3AgZWRnZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgorICBJTUFRX1JJR0hUX0NPTFVNTiA9IDEyLCAgLy8gUmlnaHQgZWRnZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgorICBJTUFRX0JPVFRPTV9ST1cgPSAxMywgIC8vIEJvdHRvbSBlZGdlIG9mIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgSU1BUV9XSURUSCA9IDE0LCAgLy8gV2lkdGggb2YgYm91bmRpbmcgcmVjdGFuZ2xlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgIElNQVFfSEVJR0hUID0gMTUsICAvLyBIZWlnaHQgb2YgYm91bmRpbmcgcmVjdGFuZ2xlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgIElNQVFfTUFYX1NFR01FTlRfTEVOR1RIID0gMTYsICAvLyBMZW5ndGggb2YgbG9uZ2VzdCBob3Jpem9udGFsIGxpbmUgc2VnbWVudC4KKyAgSU1BUV9NQVhfU0VHTUVOVF9MRUZUX0NPTFVNTiA9CisgICAgICAxNywgIC8vIExlZnRtb3N0IHgtY29vcmRpbmF0ZSBvZiBsb25nZXN0IGhvcml6b250YWwgbGluZSBzZWdtZW50LgorICBJTUFRX01BWF9TRUdNRU5UX1RPUF9ST1cgPQorICAgICAgMTgsICAvLyBZLWNvb3JkaW5hdGUgb2YgbG9uZ2VzdCBob3Jpem9udGFsIGxpbmUgc2VnbWVudC4KKyAgSU1BUV9QRVJJTUVURVIgPSAxOSwgIC8vIE91dGVyIHBlcmltZXRlciBvZiB0aGUgcGFydGljbGUuCisgIElNQVFfUEVSSU1FVEVSX09GX0hPTEVTID0gMjAsICAvLyBQZXJpbWV0ZXIgb2YgYWxsIGhvbGVzIHdpdGhpbiB0aGUgcGFydGljbGUuCisgIElNQVFfU0lHTUFfWCA9IDIxLCAgLy8gU3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcy4KKyAgSU1BUV9TSUdNQV9ZID0gMjIsICAvLyBTdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeS1heGlzLgorICBJTUFRX1NJR01BX1hYID0gMjMsICAvLyBTdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeC1heGlzIHNxdWFyZWQuCisgIElNQVFfU0lHTUFfWVkgPSAyNCwgIC8vIFN1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB5LWF4aXMgc3F1YXJlZC4KKyAgSU1BUV9TSUdNQV9YWSA9IDI1LCAgLy8gU3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcyBhbmQgeS1heGlzLgorICBJTUFRX1BST0pfWCA9IDI2LCAgLy8gUHJvamVjdGlvbiBjb3JyZWN0ZWQgaW4gWC4KKyAgSU1BUV9QUk9KX1kgPSAyNywgIC8vIFByb2plY3Rpb24gY29ycmVjdGVkIGluIFkuCisgIElNQVFfSU5FUlRJQV9YWCA9IDI4LCAgLy8gSW5lcnRpYSBtYXRyaXggY29lZmZpY2llbnQgaW4gWFguCisgIElNQVFfSU5FUlRJQV9ZWSA9IDI5LCAgLy8gSW5lcnRpYSBtYXRyaXggY29lZmZpY2llbnQgaW4gWVkuCisgIElNQVFfSU5FUlRJQV9YWSA9IDMwLCAgLy8gSW5lcnRpYSBtYXRyaXggY29lZmZpY2llbnQgaW4gWFkuCisgIElNQVFfTUVBTl9IID0gMzEsICAvLyBNZWFuIGxlbmd0aCBvZiBob3Jpem9udGFsIHNlZ21lbnRzLgorICBJTUFRX01FQU5fViA9IDMyLCAgLy8gTWVhbiBsZW5ndGggb2YgdmVydGljYWwgc2VnbWVudHMuCisgIElNQVFfTUFYX0lOVEVSQ0VQVCA9IDMzLCAgLy8gTGVuZ3RoIG9mIGxvbmdlc3Qgc2VnbWVudCBvZiB0aGUgY29udmV4IGh1bGwuCisgIElNQVFfTUVBTl9JTlRFUkNFUFQgPSAzNCwgIC8vIE1lYW4gbGVuZ3RoIG9mIHRoZSBjaG9yZHMgaW4gYW4gb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcnBlbmRpY3VsYXIgdG8gaXRzIG1heCBpbnRlcmNlcHQuCisgIElNQVFfT1JJRU5UQVRJT04gPSAzNSwgIC8vIFRoZSBvcmllbnRhdGlvbiBiYXNlZCBvbiB0aGUgaW5lcnRpYSBvZiB0aGUgcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9FUVVJVl9FTExJUFNFX01JTk9SID0gMzYsICAvLyBUb3RhbCBsZW5ndGggb2YgdGhlIGF4aXMgb2YgdGhlIGVsbGlwc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZpbmcgdGhlIHNhbWUgYXJlYSBhcyB0aGUgcGFydGljbGUgYW5kIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWpvciBheGlzIGVxdWFsIHRvIGhhbGYgdGhlIG1heCBpbnRlcmNlcHQuCisgIElNQVFfRUxMSVBTRV9NQUpPUiA9IDM3LCAgLy8gVG90YWwgbGVuZ3RoIG9mIG1ham9yIGF4aXMgaGF2aW5nIHRoZSBzYW1lIGFyZWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGVyaW1ldGVyIGFzIHRoZSBwYXJ0aWNsZSBpbiBjYWxpYnJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pdHMuCisgIElNQVFfRUxMSVBTRV9NSU5PUiA9IDM4LCAgLy8gVG90YWwgbGVuZ3RoIG9mIG1pbm9yIGF4aXMgaGF2aW5nIHRoZSBzYW1lIGFyZWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGVyaW1ldGVyIGFzIHRoZSBwYXJ0aWNsZSBpbiBjYWxpYnJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pdHMuCisgIElNQVFfRUxMSVBTRV9SQVRJTyA9IDM5LCAgLy8gRnJhY3Rpb24gb2YgbWFqb3IgYXhpcyB0byBtaW5vciBheGlzLgorICBJTUFRX1JFQ1RfTE9OR19TSURFID0gNDAsICAvLyBMZW5ndGggb2YgdGhlIGxvbmcgc2lkZSBvZiBhIHJlY3RhbmdsZSBoYXZpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgYXJlYSBhbmQgcGVyaW1ldGVyIGFzIHRoZSBwYXJ0aWNsZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxpYnJhdGVkIHVuaXRzLgorICBJTUFRX1JFQ1RfU0hPUlRfU0lERSA9IDQxLCAgLy8gTGVuZ3RoIG9mIHRoZSBzaG9ydCBzaWRlIG9mIGEgcmVjdGFuZ2xlIGhhdmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgYXJlYSBhbmQgcGVyaW1ldGVyIGFzIHRoZSBwYXJ0aWNsZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsaWJyYXRlZCB1bml0cy4KKyAgSU1BUV9SRUNUX1JBVElPID0KKyAgICAgIDQyLCAgLy8gUmF0aW8gb2YgcmVjdGFuZ2xlIGxvbmcgc2lkZSB0byByZWN0YW5nbGUgc2hvcnQgc2lkZS4KKyAgSU1BUV9FTE9OR0FUSU9OID0gNDMsICAvLyBNYXggaW50ZXJjZXB0L21lYW4gcGVycGVuZGljdWxhciBpbnRlcmNlcHQuCisgIElNQVFfQ09NUEFDVE5FU1MgPSA0NCwgIC8vIFBhcnRpY2xlIGFyZWEvKGhlaWdodCB4IHdpZHRoKS4KKyAgSU1BUV9IRVlXT09EID0gNDUsICAvLyBQYXJ0aWNsZSBwZXJpbWV0ZXIvcGVyaW1ldGVyIG9mIHRoZSBjaXJjbGUgaGF2aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgYXJlYSBhcyB0aGUgcGFydGljbGUuCisgIElNQVFfVFlQRV9GQUNUT1IgPSA0NiwgIC8vIEEgY29tcGxleCBmYWN0b3IgcmVsYXRpbmcgdGhlIHN1cmZhY2UgYXJlYSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9tZW50IG9mIGluZXJ0aWEuCisgIElNQVFfSFlEUkFVTElDID0gNDcsICAvLyBQYXJ0aWNsZSBhcmVhL3BhcnRpY2xlIHBlcmltZXRlci4KKyAgSU1BUV9XQURETEVfRElTSyA9IDQ4LCAgLy8gRGlhbWV0ZXIgb2YgdGhlIGRpc2sgaGF2aW5nIHRoZSBzYW1lIGFyZWEgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnRpY2xlIGluIHVzZXIgdW5pdHMuCisgIElNQVFfRElBR09OQUwgPSA0OSwgIC8vIERpYWdvbmFsIG9mIGFuIGVxdWl2YWxlbnQgcmVjdGFuZ2xlIGluIHVzZXIgdW5pdHMuCisgIElNQVFfTUVBU1VSRU1FTlRfVkFMVUVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gTWVhc3VyZW1lbnRWYWx1ZTsKKwordHlwZWRlZiBlbnVtIFNjYWxpbmdNb2RlX2VudW0geworICBJTUFRX1NDQUxFX0xBUkdFUiA9CisgICAgICAwLCAgLy8gVGhlIGZ1bmN0aW9uIGR1cGxpY2F0ZXMgcGl4ZWxzIHRvIG1ha2UgdGhlIGltYWdlIGxhcmdlci4KKyAgSU1BUV9TQ0FMRV9TTUFMTEVSID0KKyAgICAgIDEsICAvLyBUaGUgZnVuY3Rpb24gc3Vic2FtcGxlcyBwaXhlbHMgdG8gbWFrZSB0aGUgaW1hZ2Ugc21hbGxlci4KKyAgSU1BUV9TQ0FMSU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gU2NhbGluZ01vZGU7CisKK3R5cGVkZWYgZW51bSBTY2FsaW5nTWV0aG9kX2VudW0geworICBJTUFRX1NDQUxFX1RPX1BSRVNFUlZFX0FSRUEgPSAwLCAgLy8gQ29ycmVjdGlvbiBmdW5jdGlvbnMgc2NhbGUgdGhlIGltYWdlIHN1Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGZlYXR1cmVzIGluIHRoZSBjb3JyZWN0ZWQgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIHNhbWUgYXJlYSBhcyB0aGUgZmVhdHVyZXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBpbWFnZS4KKyAgSU1BUV9TQ0FMRV9UT19GSVQgPSAxLCAgLy8gQ29ycmVjdGlvbiBmdW5jdGlvbnMgc2NhbGUgdGhlIGltYWdlIHN1Y2ggdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdGVkIGltYWdlIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBJTUFRX1NDQUxJTkdfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFNjYWxpbmdNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBSZWZlcmVuY2VNb2RlX2VudW0geworICBJTUFRX0NPT1JEX1hfWSA9CisgICAgICAwLCAgLy8gVGhpcyBtZXRob2QgcmVxdWlyZXMgdGhyZWUgZWxlbWVudHMgaW4gdGhlIHBvaW50cyBhcnJheS4KKyAgSU1BUV9DT09SRF9PUklHSU5fWCA9CisgICAgICAxLCAgLy8gVGhpcyBtZXRob2QgcmVxdWlyZXMgdHdvIGVsZW1lbnRzIGluIHRoZSBwb2ludHMgYXJyYXkuCisgIElNQVFfUkVGRVJFTkNFX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUmVmZXJlbmNlTW9kZTsKKwordHlwZWRlZiBlbnVtIFJlY3RPcmllbnRhdGlvbl9lbnVtIHsKKyAgSU1BUV9CQVNFX0lOU0lERSA9IDAsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgYmFzZSBvZiB0aGUgcmVjdGFuZ3VsYXIgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWVzIGFsb25nIHRoZSBpbnNpZGUgZWRnZSBvZiB0aGUgYW5udWx1cy4KKyAgSU1BUV9CQVNFX09VVFNJREUgPSAxLCAgLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGJhc2Ugb2YgdGhlIHJlY3Rhbmd1bGFyIGltYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpZXMgYWxvbmcgdGhlIG91dHNpZGUgZWRnZSBvZiB0aGUgYW5udWx1cy4KKyAgSU1BUV9URVhUX09SSUVOVEFUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFJlY3RPcmllbnRhdGlvbjsKKwordHlwZWRlZiBlbnVtIFNoYXBlTW9kZV9lbnVtIHsKKyAgSU1BUV9TSEFQRV9SRUNUID0gMSwgIC8vIFRoZSBmdW5jdGlvbiBkcmF3cyBhIHJlY3RhbmdsZS4KKyAgSU1BUV9TSEFQRV9PVkFMID0gMiwgIC8vIFRoZSBmdW5jdGlvbiBkcmF3cyBhbiBvdmFsLgorICBJTUFRX1NIQVBFX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gU2hhcGVNb2RlOworCit0eXBlZGVmIGVudW0gUG9sYXJpdHlUeXBlX2VudW0geworICBJTUFRX0VER0VfUklTSU5HID0gMSwgIC8vIFRoZSBlZGdlIGlzIGEgcmlzaW5nIGVkZ2UuCisgIElNQVFfRURHRV9GQUxMSU5HID0gLTEsICAvLyBUaGUgZWRnZSBpcyBhIGZhbGxpbmcgZWRnZS4KKyAgSU1BUV9QT0xBUklUWV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFBvbGFyaXR5VHlwZTsKKwordHlwZWRlZiBlbnVtIFNpemVUeXBlX2VudW0geworICBJTUFRX0tFRVBfTEFSR0UgPQorICAgICAgMCwgIC8vIFRoZSBmdW5jdGlvbiBrZWVwcyBsYXJnZSBwYXJ0aWNsZXMgcmVtYWluaW5nIGFmdGVyIHRoZSBlcm9zaW9uLgorICBJTUFRX0tFRVBfU01BTEwgPQorICAgICAgMSwgIC8vIFRoZSBmdW5jdGlvbiBrZWVwcyBzbWFsbCBwYXJ0aWNsZXMgZWxpbWluYXRlZCBieSB0aGUgZXJvc2lvbi4KKyAgSU1BUV9TSVpFX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gU2l6ZVR5cGU7CisKK3R5cGVkZWYgZW51bSBQbGFuZTNEX2VudW0geworICBJTUFRXzNEX1JFQUwgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNob3dzIHRoZSByZWFsIHBhcnQgb2YgY29tcGxleCBpbWFnZXMuCisgIElNQVFfM0RfSU1BR0lOQVJZID0KKyAgICAgIDEsICAvLyBUaGUgZnVuY3Rpb24gc2hvd3MgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGNvbXBsZXggaW1hZ2VzLgorICBJTUFRXzNEX01BR05JVFVERSA9CisgICAgICAyLCAgLy8gVGhlIGZ1bmN0aW9uIHNob3dzIHRoZSBtYWduaXR1ZGUgcGFydCBvZiBjb21wbGV4IGltYWdlcy4KKyAgSU1BUV8zRF9QSEFTRSA9IDMsICAvLyBUaGUgZnVuY3Rpb24gc2hvd3MgdGhlIHBoYXNlIHBhcnQgb2YgY29tcGxleCBpbWFnZXMuCisgIElNQVFfUExBTkVfM0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUGxhbmUzRDsKKwordHlwZWRlZiBlbnVtIFBob3RvbWV0cmljTW9kZV9lbnVtIHsKKyAgSU1BUV9XSElURV9JU19aRVJPID0KKyAgICAgIDAsICAvLyBUaGUgZnVuY3Rpb24gaW50ZXJwcmV0cyB6ZXJvLXZhbHVlIHBpeGVscyBhcyB3aGl0ZS4KKyAgSU1BUV9CTEFDS19JU19aRVJPID0KKyAgICAgIDEsICAvLyBUaGUgZnVuY3Rpb24gaW50ZXJwcmV0cyB6ZXJvLXZhbHVlIHBpeGVscyBhcyBibGFjay4KKyAgSU1BUV9QSE9UT01FVFJJQ19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFBob3RvbWV0cmljTW9kZTsKKwordHlwZWRlZiBlbnVtIFBhcnRpY2xlSW5mb01vZGVfZW51bSB7CisgIElNQVFfQkFTSUNfSU5GTyA9IDAsICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBvbmx5IHRoZSBmb2xsb3dpbmcgZWxlbWVudHMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggcmVwb3J0OiBhcmVhLCBjYWxpYnJhdGVkQXJlYSwgYm91bmRpbmdSZWN0LgorICBJTUFRX0FMTF9JTkZPID0KKyAgICAgIDEsICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcGFydGljbGUuCisgIElNQVFfUEFSVElDTEVfSU5GT19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFBhcnRpY2xlSW5mb01vZGU7CisKK3R5cGVkZWYgZW51bSBPdXRsaW5lTWV0aG9kX2VudW0geworICBJTUFRX0VER0VfRElGRkVSRU5DRSA9IDAsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IHByb2R1Y2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVvdXMgY29udG91cnMgYnkgaGlnaGxpZ2h0aW5nIGVhY2ggcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgYW4gaW50ZW5zaXR5IHZhcmlhdGlvbiBvY2N1cnMgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHNlbGYgYW5kIGl0cyB0aHJlZSB1cHBlci1sZWZ0IG5laWdoYm9ycy4KKyAgSU1BUV9FREdFX0dSQURJRU5UID0gMSwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgb3V0bGluZXMgY29udG91cnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIGFuIGludGVuc2l0eSB2YXJpYXRpb24gb2NjdXJzIGFsb25nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVydGljYWwgYXhpcy4KKyAgSU1BUV9FREdFX1BSRVdJVFQgPSAyLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBleHRyYWN0cyB0aGUgb3V0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udG91cnMgb2Ygb2JqZWN0cy4KKyAgSU1BUV9FREdFX1JPQkVSVFMgPSAzLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBvdXRsaW5lcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udG91cnMgdGhhdCBoaWdobGlnaHQgcGl4ZWxzIHdoZXJlIGFuIGludGVuc2l0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYXRpb24gb2NjdXJzIGFsb25nIHRoZSBkaWFnb25hbCBheGVzLgorICBJTUFRX0VER0VfU0lHTUEgPSA0LCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBvdXRsaW5lcyBjb250b3VycyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldGFpbHMgYnkgc2V0dGluZyBwaXhlbHMgdG8gdGhlIG1lYW4gdmFsdWUgZm91bmQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZWlyIG5laWdoYm9yaG9vZCwgaWYgdGhlaXIgZGV2aWF0aW9uIGZyb20gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgbm90IHNpZ25pZmljYW50LgorICBJTUFRX0VER0VfU09CRUwgPSA1LCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBleHRyYWN0cyB0aGUgb3V0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRvdXJzIG9mIG9iamVjdHMuCisgIElNQVFfT1VUTElORV9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gT3V0bGluZU1ldGhvZDsKKwordHlwZWRlZiBlbnVtIE1vcnBob2xvZ3lNZXRob2RfZW51bSB7CisgIElNQVFfQVVUT00gPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGdlbmVyYXRlcyBzaW1wbGVyCisgICAgICAgICAgICAgICAgICAgLy8gcGFydGljbGVzIHRoYXQgY29udGFpbiBmZXdlciBkZXRhaWxzLgorICBJTUFRX0NMT1NFID0gMSwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBmaWxscyB0aW55IGhvbGVzCisgICAgICAgICAgICAgICAgICAgLy8gYW5kIHNtb290aHMgYm91bmRhcmllcy4KKyAgSU1BUV9ESUxBVEUgPSAyLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGVsaW1pbmF0ZXMgdGlueQorICAgICAgICAgICAgICAgICAgICAvLyBob2xlcyBpc29sYXRlZCBpbiBwYXJ0aWNsZXMgYW5kIGV4cGFuZHMgdGhlIGNvbnRvdXIgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBhcnRpY2xlcyBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlIGRlZmluZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgIElNQVFfRVJPREUgPSAzLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGVsaW1pbmF0ZXMgcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgLy8gaXNvbGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgYW5kIGVyb2RlcyB0aGUgY29udG91ciBvZgorICAgICAgICAgICAgICAgICAgIC8vIHBhcnRpY2xlcyBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlIGRlZmluZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0dXJpbmcgZWxlbWVudC4KKyAgSU1BUV9HUkFESUVOVCA9IDQsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgbGVhdmVzIG9ubHkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgLy8gcGl4ZWxzIHRoYXQgd291bGQgYmUgYWRkZWQgYnkgdGhlIGRpbGF0aW9uIHByb2Nlc3Mgb3IKKyAgICAgICAgICAgICAgICAgICAgICAvLyBlbGltaW5hdGVkIGJ5IHRoZSBlcm9zaW9uIHByb2Nlc3MuCisgIElNQVFfR1JBRElFTlRPVVQgPSA1LCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGxlYXZlcyBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBpeGVscyB0aGF0IHdvdWxkIGJlIGFkZGVkIGJ5IHRoZSBkaWxhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MuCisgIElNQVFfR1JBRElFTlRJTiA9IDYsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgbGVhdmVzIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwaXhlbHMgdGhhdCB3b3VsZCBiZSBlbGltaW5hdGVkIGJ5IHRoZSBlcm9zaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzLgorICBJTUFRX0hJVE1JU1MgPSA3LCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGV4dHJhY3RzIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVsIGxvY2F0ZWQgaW4gYSBuZWlnaGJvcmhvb2QgZXhhY3RseSBtYXRjaGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgIC8vIHRlbXBsYXRlIGRlZmluZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgIElNQVFfT1BFTiA9IDgsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgcmVtb3ZlcyBzbWFsbAorICAgICAgICAgICAgICAgICAgLy8gcGFydGljbGVzIGFuZCBzbW9vdGhzIGJvdW5kYXJpZXMuCisgIElNQVFfUENMT1NFID0gOSwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBmaWxscyB0aW55IGhvbGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzbW9vdGhzIHRoZSBpbm5lciBjb250b3VyIG9mIHBhcnRpY2xlcyBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlbXBsYXRlIGRlZmluZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgIElNQVFfUE9QRU4gPSAxMCwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIGEgdHJhbnNmb3JtYXRpb24gdGhhdCByZW1vdmVzIHNtYWxsCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnRpY2xlcyBhbmQgc21vb3RocyB0aGUgY29udG91ciBvZiBwYXJ0aWNsZXMgYWNjb3JkaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSB0ZW1wbGF0ZSBkZWZpbmVkIGJ5IHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LgorICBJTUFRX1RISUNLID0gMTEsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgYWRkcyB0byBhbiBpbWFnZQorICAgICAgICAgICAgICAgICAgICAvLyB0aG9zZSBwaXhlbHMgbG9jYXRlZCBpbiBhIG5laWdoYm9yaG9vZCB0aGF0IG1hdGNoZXMgYQorICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSBzcGVjaWZpZWQgYnkgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCisgIElNQVFfVEhJTiA9IDEyLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGVsaW1pbmF0ZXMgcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhcmUgbG9jYXRlZCBpbiBhIG5laWdoYm9yaG9vZCBtYXRjaGluZyBhIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LgorICBJTUFRX01PUlBIT0xPR1lfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IE1vcnBob2xvZ3lNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBNZXRlckFyY01vZGVfZW51bSB7CisgIElNQVFfTUVURVJfQVJDX1JPSSA9IDAsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyB0aGUgcm9pIHBhcmFtZXRlciBhbmQgaWdub3JlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhc2UsIHN0YXJ0LCBhbmQgZW5kIHBhcmFtZXRlcnMuCisgIElNQVFfTUVURVJfQVJDX1BPSU5UUyA9IDEsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyB0aGUgYmFzZSxzdGFydCwgYW5kIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVycyBhbmQgaWdub3JlcyB0aGUgcm9pIHBhcmFtZXRlci4KKyAgSU1BUV9NRVRFUl9BUkNfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBNZXRlckFyY01vZGU7CisKK3R5cGVkZWYgZW51bSBSYWtlRGlyZWN0aW9uX2VudW0geworICBJTUFRX0xFRlRfVE9fUklHSFQgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBhcmVhIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgSU1BUV9SSUdIVF9UT19MRUZUID0gMSwgIC8vIFRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmcm9tIHRoZSByaWdodCBzaWRlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGFyZWEgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgIElNQVFfVE9QX1RPX0JPVFRPTSA9IDIsICAvLyBUaGUgZnVuY3Rpb24gc2VhcmNoZXMgZnJvbSB0aGUgdG9wIHNpZGUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFyY2ggYXJlYSB0byB0aGUgYm90dG9tIHNpZGUgb2YgdGhlIHNlYXJjaCBhcmVhLgorICBJTUFRX0JPVFRPTV9UT19UT1AgPSAzLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZyb20gdGhlIGJvdHRvbSBzaWRlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGFyZWEgdG8gdGhlIHRvcCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgSU1BUV9SQUtFX0RJUkVDVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBSYWtlRGlyZWN0aW9uOworCit0eXBlZGVmIGVudW0gVHJ1bmNhdGVNb2RlX2VudW0geworICBJTUFRX1RSVU5DQVRFX0xPVyA9IDAsICAvLyBUaGUgZnVuY3Rpb24gdHJ1bmNhdGVzIGxvdyBmcmVxdWVuY2llcy4KKyAgSU1BUV9UUlVOQ0FURV9ISUdIID0gMSwgIC8vIFRoZSBmdW5jdGlvbiB0cnVuY2F0ZXMgaGlnaCBmcmVxdWVuY2llcy4KKyAgSU1BUV9UUlVOQ0FURV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFRydW5jYXRlTW9kZTsKKwordHlwZWRlZiBlbnVtIEF0dGVudWF0ZU1vZGVfZW51bSB7CisgIElNQVFfQVRURU5VQVRFX0xPVyA9IDAsICAvLyBUaGUgZnVuY3Rpb24gYXR0ZW51YXRlcyBsb3cgZnJlcXVlbmNpZXMuCisgIElNQVFfQVRURU5VQVRFX0hJR0ggPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIGF0dGVudWF0ZXMgaGlnaCBmcmVxdWVuY2llcy4KKyAgSU1BUV9BVFRFTlVBVEVfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBBdHRlbnVhdGVNb2RlOworCit0eXBlZGVmIGVudW0gV2luZG93VGhyZWFkUG9saWN5X2VudW0geworICBJTUFRX0NBTExJTkdfVEhSRUFEID0gMCwgIC8vIFVzaW5nIHRoaXMgcG9saWN5LCBOSSBWaXNpb24gY3JlYXRlcyB3aW5kb3dzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRocmVhZCB0aGF0IG1ha2VzIHRoZSBmaXJzdCBkaXNwbGF5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBmb3IgYSBnaXZlbiB3aW5kb3cgbnVtYmVyLgorICBJTUFRX1NFUEFSQVRFX1RIUkVBRCA9IDEsICAvLyBVc2luZyB0aGlzIHBvbGljeSwgTkkgVmlzaW9uIGNyZWF0ZXMgd2luZG93cyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHRocmVhZCBhbmQgcHJvY2Vzc2VzIG1lc3NhZ2VzIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93cyBhdXRvbWF0aWNhbGx5LgorICBJTUFRX1dJTkRPV19USFJFQURfUE9MSUNZX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFdpbmRvd1RocmVhZFBvbGljeTsKKwordHlwZWRlZiBlbnVtIFdpbmRvd09wdGlvbnNfZW51bSB7CisgIElNQVFfV0lORF9SRVNJWkFCTEUgPQorICAgICAgMSwgIC8vIFdoZW4gcHJlc2VudCwgdGhlIHVzZXIgbWF5IHJlc2l6ZSB0aGUgd2luZG93IGludGVyYWN0aXZlbHkuCisgIElNQVFfV0lORF9USVRMRUJBUiA9CisgICAgICAyLCAgLy8gV2hlbiBwcmVzZW50LCB0aGUgdGl0bGUgYmFyIG9uIHRoZSB3aW5kb3cgaXMgdmlzaWJsZS4KKyAgSU1BUV9XSU5EX0NMT1NFQUJMRSA9IDQsICAvLyBXaGVuIHByZXNlbnQsIHRoZSBjbG9zZSBib3ggaXMgYXZhaWxhYmxlLgorICBJTUFRX1dJTkRfVE9QTU9TVCA9IDgsICAvLyBXaGVuIHByZXNlbnQsIHRoZSB3aW5kb3cgaXMgYWx3YXlzIG9uIHRvcC4KKyAgSU1BUV9XSU5ET1dfT1BUSU9OU19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBXaW5kb3dPcHRpb25zOworCit0eXBlZGVmIGVudW0gV2luZG93RXZlbnRUeXBlX2VudW0geworICBJTUFRX05PX0VWRU5UID0KKyAgICAgIDAsICAvLyBObyBldmVudCBvY2N1cnJlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIGltYXFHZXRMYXN0RXZlbnQoKS4KKyAgSU1BUV9DTElDS19FVkVOVCA9IDEsICAvLyBUaGUgdXNlciBjbGlja2VkIG9uIGEgd2luZG93LgorICBJTUFRX0RSQVdfRVZFTlQgPSAyLCAgLy8gVGhlIHVzZXIgZHJldyBhbiBST0kgaW4gYSB3aW5kb3cuCisgIElNQVFfTU9WRV9FVkVOVCA9IDMsICAvLyBUaGUgdXNlciBtb3ZlZCBhIHdpbmRvdy4KKyAgSU1BUV9TSVpFX0VWRU5UID0gNCwgIC8vIFRoZSB1c2VyIHNpemVkIGEgd2luZG93LgorICBJTUFRX1NDUk9MTF9FVkVOVCA9IDUsICAvLyBUaGUgdXNlciBzY3JvbGxlZCBhIHdpbmRvdy4KKyAgSU1BUV9BQ1RJVkFURV9FVkVOVCA9IDYsICAvLyBUaGUgdXNlciBhY3RpdmF0ZWQgYSB3aW5kb3cuCisgIElNQVFfQ0xPU0VfRVZFTlQgPSA3LCAgLy8gVGhlIHVzZXIgY2xvc2VkIGEgd2luZG93LgorICBJTUFRX0RPVUJMRV9DTElDS19FVkVOVCA9IDgsICAvLyBUaGUgdXNlciBkb3VibGUtY2xpY2tlZCBpbiBhIHdpbmRvdy4KKyAgSU1BUV9XSU5ET1dfRVZFTlRfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBXaW5kb3dFdmVudFR5cGU7CisKK3R5cGVkZWYgZW51bSBWaXNpb25JbmZvVHlwZV9lbnVtIHsKKyAgSU1BUV9BTllfVklTSU9OX0lORk8gPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbnkgZXh0cmEgdmlzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuCisgIElNQVFfUEFUVEVSTl9NQVRDSElOR19JTkZPID0gMSwgIC8vIFRoZSBmdW5jdGlvbiBjaGVja3MgaWYgYW55IHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgdGVtcGxhdGUgaW5mb3JtYXRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZS4KKyAgSU1BUV9DQUxJQlJBVElPTl9JTkZPID0gMiwgIC8vIFRoZSBmdW5jdGlvbiBjaGVja3MgaWYgYW55IGNhbGlicmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlLgorICBJTUFRX09WRVJMQVlfSU5GTyA9IDMsICAvLyBUaGUgZnVuY3Rpb24gY2hlY2tzIGlmIGFueSBvdmVybGF5IGluZm9ybWF0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuCisgIElNQVFfVklTSU9OX0lORk9fVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBWaXNpb25JbmZvVHlwZTsKKwordHlwZWRlZiBlbnVtIFNlYXJjaFN0cmF0ZWd5X2VudW0geworICBJTUFRX0NPTlNFUlZBVElWRSA9IDEsICAvLyBJbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFyZ2VzdCBwb3NzaWJsZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgYXQgdGhlIGV4cGVuc2Ugb2Ygc2xvd2luZyBkb3duIHRoZSBzcGVlZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWxnb3JpdGhtLgorICBJTUFRX0JBTEFOQ0VEID0gMiwgIC8vIEluc3RydWN0cyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gdG8gYmFsYW5jZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UgaXQgdXNlcyB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWVkIG9mIHRoZSBhbGdvcml0aG0uCisgIElNQVFfQUdHUkVTU0lWRSA9IDMsICAvLyBJbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIHVzZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3dlciBhbW91bnQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UsIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgdGhlIGFsZ29yaXRobSB0byBydW4gcXVpY2tseSBidXQgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlbnNlIG9mIGFjY3VyYWN5LgorICBJTUFRX1ZFUllfQUdHUkVTU0lWRSA9IDQsICAvLyBJbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGluZm9ybWF0aW9uIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGltYWdlLCB3aGljaCBhbGxvd3MgdGhlIGFsZ29yaXRobSB0byBydW4gYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGhpZ2hlc3Qgc3BlZWQgcG9zc2libGUgYnV0IGF0IHRoZSBleHBlbnNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY3VyYWN5LgorICBJTUFRX1NFQVJDSF9TVFJBVEVHWV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBTZWFyY2hTdHJhdGVneTsKKwordHlwZWRlZiBlbnVtIFR3b0VkZ2VQb2xhcml0eVR5cGVfZW51bSB7CisgIElNQVFfTk9ORSA9IDAsICAvLyBUaGUgZnVuY3Rpb24gaWdub3JlcyB0aGUgcG9sYXJpdHkgb2YgdGhlIGVkZ2VzLgorICBJTUFRX1JJU0lOR19GQUxMSU5HID0gMSwgIC8vIFRoZSBwb2xhcml0eSBvZiB0aGUgZmlyc3QgZWRnZSBpcyByaXNpbmcgKGRhcmsgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWdodCkgYW5kIHRoZSBwb2xhcml0eSBvZiB0aGUgc2Vjb25kIGVkZ2UgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsaW5nIChsaWdodCB0byBkYXJrKS4KKyAgSU1BUV9GQUxMSU5HX1JJU0lORyA9IDIsICAvLyBUaGUgcG9sYXJpdHkgb2YgdGhlIGZpcnN0IGVkZ2UgaXMgZmFsbGluZyAobGlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBkYXJrKSBhbmQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzZWNvbmQgZWRnZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpc2luZyAoZGFyayB0byBsaWdodCkuCisgIElNQVFfUklTSU5HX1JJU0lORyA9IDMsICAvLyBUaGUgcG9sYXJpdHkgb2YgdGhlIGZpcnN0IGVkZ2UgaXMgcmlzaW5nIChkYXJrIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWdodCkgYW5kIHRoZSBwb2xhcml0eSBvZiB0aGUgc2Vjb25kIGVkZ2UgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpc2luZyAoZGFyayB0byBsaWdodCkuCisgIElNQVFfRkFMTElOR19GQUxMSU5HID0gNCwgIC8vIFRoZSBwb2xhcml0eSBvZiB0aGUgZmlyc3QgZWRnZSBpcyBmYWxsaW5nIChsaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBkYXJrKSBhbmQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzZWNvbmQgZWRnZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsaW5nIChsaWdodCB0byBkYXJrKS4KKyAgSU1BUV9UV09fRURHRV9QT0xBUklUWV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFR3b0VkZ2VQb2xhcml0eVR5cGU7CisKK3R5cGVkZWYgZW51bSBPYmplY3RUeXBlX2VudW0geworICBJTUFRX0JSSUdIVF9PQkpFQ1RTID0gMCwgIC8vIFRoZSBmdW5jdGlvbiBkZXRlY3RzIGJyaWdodCBvYmplY3RzLgorICBJTUFRX0RBUktfT0JKRUNUUyA9IDEsICAvLyBUaGUgZnVuY3Rpb24gZGV0ZWN0cyBkYXJrIG9iamVjdHMuCisgIElNQVFfT0JKRUNUX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gT2JqZWN0VHlwZTsKKwordHlwZWRlZiBlbnVtIFRvb2xfZW51bSB7CisgIElNQVFfTk9fVE9PTCA9IC0xLCAgLy8gTm8gdG9vbCBpcyBpbiB0aGUgc2VsZWN0ZWQgc3RhdGUuCisgIElNQVFfU0VMRUNUSU9OX1RPT0wgPQorICAgICAgMCwgIC8vIFRoZSBzZWxlY3Rpb24gdG9vbCBzZWxlY3RzIGFuIGV4aXN0aW5nIFJPSSBpbiBhbiBpbWFnZS4KKyAgSU1BUV9QT0lOVF9UT09MID0gMSwgIC8vIFRoZSBwb2ludCB0b29sIGRyYXdzIGEgcG9pbnQgb24gdGhlIGltYWdlLgorICBJTUFRX0xJTkVfVE9PTCA9IDIsICAvLyBUaGUgbGluZSB0b29sIGRyYXdzIGEgbGluZSBvbiB0aGUgaW1hZ2UuCisgIElNQVFfUkVDVEFOR0xFX1RPT0wgPQorICAgICAgMywgIC8vIFRoZSByZWN0YW5nbGUgdG9vbCBkcmF3cyBhIHJlY3RhbmdsZSBvbiB0aGUgaW1hZ2UuCisgIElNQVFfT1ZBTF9UT09MID0gNCwgIC8vIFRoZSBvdmFsIHRvb2wgZHJhd3MgYW4gb3ZhbCBvbiB0aGUgaW1hZ2UuCisgIElNQVFfUE9MWUdPTl9UT09MID0gNSwgIC8vIFRoZSBwb2x5Z29uIHRvb2wgZHJhd3MgYSBwb2x5Z29uIG9uIHRoZSBpbWFnZS4KKyAgSU1BUV9DTE9TRURfRlJFRUhBTkRfVE9PTCA9CisgICAgICA2LCAgLy8gVGhlIGNsb3NlZCBmcmVlaGFuZCB0b29sIGRyYXdzIGNsb3NlZCBmcmVlaGFuZCBzaGFwZXMgb24gdGhlIGltYWdlLgorICBJTUFRX0FOTlVMVVNfVE9PTCA9IDcsICAvLyBUaGUgYW5udWx1cyB0b29sIGRyYXdzIGFubnVsdXNlcyBvbiB0aGUgaW1hZ2UuCisgIElNQVFfWk9PTV9UT09MID0gOCwgIC8vIFRoZSB6b29tIHRvb2wgY29udHJvbHMgdGhlIHpvb20gb2YgYW4gaW1hZ2UuCisgIElNQVFfUEFOX1RPT0wgPSA5LCAgLy8gVGhlIHBhbiB0b29sIHNoaWZ0cyB0aGUgdmlldyBvZiB0aGUgaW1hZ2UuCisgIElNQVFfUE9MWUxJTkVfVE9PTCA9IDEwLCAgLy8gVGhlIHBvbHlsaW5lIHRvb2wgZHJhd3MgYSBzZXJpZXMgb2YgY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyYWlnaHQgbGluZXMgb24gdGhlIGltYWdlLgorICBJTUFRX0ZSRUVIQU5EX1RPT0wgPQorICAgICAgMTEsICAvLyBUaGUgZnJlZWhhbmQgdG9vbCBkcmF3cyBmcmVlaGFuZCBsaW5lcyBvbiB0aGUgaW1hZ2UuCisgIElNQVFfUk9UQVRFRF9SRUNUX1RPT0wgPQorICAgICAgMTIsICAvLyBUaGUgcm90YXRlZCByZWN0YW5nbGUgdG9vbCBkcmF3cyByb3RhdGVkIHJlY3RhbmdsZXMgb24gdGhlIGltYWdlLgorICBJTUFRX1pPT01fT1VUX1RPT0wgPSAxMywgIC8vIFRoZSB6b29tIG91dCB0b29sIGNvbnRyb2xzIHRoZSB6b29tIG9mIGFuIGltYWdlLgorICBJTUFRX1RPT0xfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gVG9vbDsKKwordHlwZWRlZiBlbnVtIFRJRkZDb21wcmVzc2lvblR5cGVfZW51bSB7CisgIElNQVFfTk9fQ09NUFJFU1NJT04gPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvbXByZXNzIHRoZSBUSUZGIGZpbGUuCisgIElNQVFfSlBFRyA9IDEsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyB0aGUgSlBFRyBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8KKyAgICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzIHRoZSBUSUZGIGZpbGUuCisgIElNQVFfUlVOX0xFTkdUSCA9IDIsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIHJ1biBsZW5ndGggY29tcHJlc3Npb24gYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjb21wcmVzcyB0aGUgVElGRiBmaWxlLgorICBJTUFRX1pJUCA9IDMsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyB0aGUgWklQIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0byBjb21wcmVzcworICAgICAgICAgICAgICAgICAvLyB0aGUgVElGRiBmaWxlLgorICBJTUFRX1RJRkZfQ09NUFJFU1NJT05fVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBUSUZGQ29tcHJlc3Npb25UeXBlOworCit0eXBlZGVmIGVudW0gVGhyZXNob2xkTWV0aG9kX2VudW0geworICBJTUFRX1RIUkVTSF9DTFVTVEVSSU5HID0gMCwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgc29ydHMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlzdG9ncmFtIG9mIHRoZSBpbWFnZSB3aXRoaW4gYSBkaXNjcmV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjbGFzc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHBoYXNlcyBwZXJjZWl2ZWQgaW4gYW4gaW1hZ2UuCisgIElNQVFfVEhSRVNIX0VOVFJPUFkgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBpcyBiZXN0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdGluZyBwYXJ0aWNsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiBtaW51c2N1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wb3J0aW9ucyBvbiB0aGUgaW1hZ2UuCisgIElNQVFfVEhSRVNIX01FVFJJQyA9IDIsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIG1ldGhvZCB0aGF0IGlzIHdlbGwtc3VpdGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2VzIGluIHdoaWNoIGNsYXNzZXMgYXJlIG5vdCB0b28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3Byb3BvcnRpb25hdGUuCisgIElNQVFfVEhSRVNIX01PTUVOVFMgPSAzLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBtZXRob2QgdGhhdCBpcyBzdWl0ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2VzIHRoYXQgaGF2ZSBwb29yIGNvbnRyYXN0LgorICBJTUFRX1RIUkVTSF9JTlRFUkNMQVNTID0gNCwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIGEgbWV0aG9kIHRoYXQgaXMgd2VsbC1zdWl0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgaW1hZ2VzIGluIHdoaWNoIGNsYXNzZXMgaGF2ZSB3ZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGVkIHBpeGVsIHZhbHVlIGRpc3RyaWJ1dGlvbnMuCisgIElNQVFfVEhSRVNIT0xEX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBUaHJlc2hvbGRNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBUZXh0QWxpZ25tZW50X2VudW0geworICBJTUFRX0xFRlQgPSAwLCAgLy8gTGVmdCBhbGlnbnMgdGhlIHRleHQgYXQgdGhlIHJlZmVyZW5jZSBwb2ludC4KKyAgSU1BUV9DRU5URVIgPSAxLCAgLy8gQ2VudGVycyB0aGUgdGV4dCBhcm91bmQgdGhlIHJlZmVyZW5jZSBwb2ludC4KKyAgSU1BUV9SSUdIVCA9IDIsICAvLyBSaWdodCBhbGlnbnMgdGhlIHRleHQgYXQgdGhlIHJlZmVyZW5jZSBwb2ludC4KKyAgSU1BUV9URVhUX0FMSUdOTUVOVF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBUZXh0QWxpZ25tZW50OworCit0eXBlZGVmIGVudW0gU3Bva2VEaXJlY3Rpb25fZW51bSB7CisgIElNQVFfT1VUU0lERV9UT19JTlNJREUgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZyb20gdGhlIG91dHNpZGUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGFyZWEgdG8gdGhlIGluc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgIElNQVFfSU5TSURFX1RPX09VVFNJREUgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZyb20gdGhlIGluc2lkZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFyY2ggYXJlYSB0byB0aGUgb3V0c2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEuCisgIElNQVFfU1BPS0VfRElSRUNUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFNwb2tlRGlyZWN0aW9uOworCit0eXBlZGVmIGVudW0gU2tlbGV0b25NZXRob2RfZW51bSB7CisgIElNQVFfU0tFTEVUT05fTCA9CisgICAgICAwLCAgLy8gVXNlcyBhbiBMLXNoYXBlZCBzdHJ1Y3R1cmluZyBlbGVtZW50IGluIHRoZSBza2VsZXRvbiBmdW5jdGlvbi4KKyAgSU1BUV9TS0VMRVRPTl9NID0KKyAgICAgIDEsICAvLyBVc2VzIGFuIE0tc2hhcGVkIHN0cnVjdHVyaW5nIGVsZW1lbnQgaW4gdGhlIHNrZWxldG9uIGZ1bmN0aW9uLgorICBJTUFRX1NLRUxFVE9OX0lOVkVSU0UgPSAyLCAgLy8gVXNlcyBhbiBMLXNoYXBlZCBzdHJ1Y3R1cmluZyBlbGVtZW50IG9uIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZlcnNlIG9mIHRoZSBpbWFnZSBpbiB0aGUgc2tlbGV0b24gZnVuY3Rpb24uCisgIElNQVFfU0tFTEVUT05fTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFNrZWxldG9uTWV0aG9kOworCit0eXBlZGVmIGVudW0gVmVydGljYWxUZXh0QWxpZ25tZW50X2VudW0geworICBJTUFRX0JPVFRPTSA9IDAsICAvLyBBbGlnbnMgdGhlIGJvdHRvbSBvZiB0aGUgdGV4dCBhdCB0aGUgcmVmZXJlbmNlIHBvaW50LgorICBJTUFRX1RPUCA9IDEsICAvLyBBbGlnbnMgdGhlIHRvcCBvZiB0aGUgdGV4dCBhdCB0aGUgcmVmZXJlbmNlIHBvaW50LgorICBJTUFRX0JBU0VMSU5FID0gMiwgIC8vIEFsaWducyB0aGUgYmFzZWxpbmUgb2YgdGhlIHRleHQgYXQgdGhlIHJlZmVyZW5jZSBwb2ludC4KKyAgSU1BUV9WRVJUSUNBTF9URVhUX0FMSUdOTUVOVF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBWZXJ0aWNhbFRleHRBbGlnbm1lbnQ7CisKK3R5cGVkZWYgZW51bSBDYWxpYnJhdGlvblJPSV9lbnVtIHsKKyAgSU1BUV9GVUxMX0lNQUdFID0gMCwgIC8vIFRoZSBjb3JyZWN0aW9uIGZ1bmN0aW9uIGNvcnJlY3RzIHRoZSB3aG9sZSBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIHVzZXItZGVmaW5lZCBvciBjYWxpYnJhdGlvbi1kZWZpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBST0lzLgorICBJTUFRX0NBTElCUkFUSU9OX1JPSSA9IDEsICAvLyBUaGUgY29ycmVjdGlvbiBmdW5jdGlvbiBjb3JyZWN0cyB0aGUgYXJlYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIGJ5IHRoZSBjYWxpYnJhdGlvbiBST0kuCisgIElNQVFfVVNFUl9ST0kgPSAyLCAgLy8gVGhlIGNvcnJlY3Rpb24gZnVuY3Rpb24gY29ycmVjdHMgdGhlIGFyZWEgZGVmaW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyLWRlZmluZWQgUk9JLgorICBJTUFRX0NBTElCUkFUSU9OX0FORF9VU0VSX1JPSSA9CisgICAgICAzLCAgLy8gVGhlIGNvcnJlY3Rpb24gZnVuY3Rpb24gY29ycmVjdHMgdGhlIGFyZWEgZGVmaW5lZCBieSB0aGUKKyAgICAgICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgdGhlIHVzZXItZGVmaW5lZCBST0kgYW5kIHRoZSBjYWxpYnJhdGlvbiBST0kuCisgIElNQVFfQ0FMSUJSQVRJT05fT1JfVVNFUl9ST0kgPQorICAgICAgNCwgIC8vIFRoZSBjb3JyZWN0aW9uIGZ1bmN0aW9uIGNvcnJlY3RzIHRoZSBhcmVhIGRlZmluZWQgYnkgdGhlIHVuaW9uIG9mCisgICAgICAgICAgLy8gdGhlIHVzZXItZGVmaW5lZCBST0kgYW5kIHRoZSBjYWxpYnJhdGlvbiBST0kuCisgIElNQVFfQ0FMSUJSQVRJT05fUk9JX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IENhbGlicmF0aW9uUk9JOworCit0eXBlZGVmIGVudW0gQ29udG91clR5cGVfZW51bSB7CisgIElNQVFfRU1QVFlfQ09OVE9VUiA9IDAsICAvLyBUaGUgY29udG91ciBpcyBlbXB0eS4KKyAgSU1BUV9QT0lOVCA9IDEsICAvLyBUaGUgY29udG91ciByZXByZXNlbnRzIGEgcG9pbnQuCisgIElNQVFfTElORSA9IDIsICAvLyBUaGUgY29udG91ciByZXByZXNlbnRzIGEgbGluZS4KKyAgSU1BUV9SRUNUID0gMywgIC8vIFRoZSBjb250b3VyIHJlcHJlc2VudHMgYSByZWN0YW5nbGUuCisgIElNQVFfT1ZBTCA9IDQsICAvLyBUaGUgY29udG91ciByZXByZXNlbnRzIGFuIG92YWwuCisgIElNQVFfQ0xPU0VEX0NPTlRPVVIgPSA1LCAgLy8gVGhlIGNvbnRvdXIgcmVwcmVzZW50cyBhIHNlcmllcyBvZiBjb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludHMgd2hlcmUgdGhlIGxhc3QgcG9pbnQgY29ubmVjdHMgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QuCisgIElNQVFfT1BFTl9DT05UT1VSID0gNiwgIC8vIFRoZSBjb250b3VyIHJlcHJlc2VudHMgYSBzZXJpZXMgb2YgY29ubmVjdGVkIHBvaW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSB0aGUgbGFzdCBwb2ludCBkb2VzIG5vdCBjb25uZWN0IHRvIHRoZSBmaXJzdC4KKyAgSU1BUV9BTk5VTFVTID0gNywgIC8vIFRoZSBjb250b3VyIHJlcHJlc2VudHMgYW4gYW5udWx1cy4KKyAgSU1BUV9ST1RBVEVEX1JFQ1QgPSA4LCAgLy8gVGhlIGNvbnRvdXIgcmVwcmVzZW50cyBhIHJvdGF0ZWQgcmVjdGFuZ2xlLgorICBJTUFRX0NPTlRPVVJfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBDb250b3VyVHlwZTsKKwordHlwZWRlZiBlbnVtIE1hdGhUcmFuc2Zvcm1NZXRob2RfZW51bSB7CisgIElNQVFfVFJBTlNGT1JNX0xJTkVBUiA9IDAsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBsaW5lYXIgcmVtYXBwaW5nLgorICBJTUFRX1RSQU5TRk9STV9MT0cgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgbG9nYXJpdGhtaWMgcmVtYXBwaW5nLgorICBJTUFRX1RSQU5TRk9STV9FWFAgPSAyLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgZXhwb25lbnRpYWwgcmVtYXBwaW5nLgorICBJTUFRX1RSQU5TRk9STV9TUVIgPSAzLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgc3F1YXJlIHJlbWFwcGluZy4KKyAgSU1BUV9UUkFOU0ZPUk1fU1FSVCA9IDQsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBzcXVhcmUgcm9vdCByZW1hcHBpbmcuCisgIElNQVFfVFJBTlNGT1JNX1BPV1ggPSA1LCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgcG93ZXIgWCByZW1hcHBpbmcuCisgIElNQVFfVFJBTlNGT1JNX1BPVzFYID0gNiwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIHBvd2VyIDEvWCByZW1hcHBpbmcuCisgIElNQVFfTUFUSF9UUkFOU0ZPUk1fTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IE1hdGhUcmFuc2Zvcm1NZXRob2Q7CisKK3R5cGVkZWYgZW51bSBDb21wbGV4UGxhbmVfZW51bSB7CisgIElNQVFfUkVBTCA9CisgICAgICAwLCAgLy8gVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIHRoZSByZWFsIHBsYW5lIG9mIHRoZSBjb21wbGV4IGltYWdlLgorICBJTUFRX0lNQUdJTkFSWSA9CisgICAgICAxLCAgLy8gVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIHRoZSBpbWFnaW5hcnkgcGxhbmUgb2YgdGhlIGNvbXBsZXggaW1hZ2UuCisgIElNQVFfTUFHTklUVURFID0KKyAgICAgIDIsICAvLyBUaGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24gdGhlIG1hZ25pdHVkZSBwbGFuZSBvZiB0aGUgY29tcGxleCBpbWFnZS4KKyAgSU1BUV9QSEFTRSA9CisgICAgICAzLCAgLy8gVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIHRoZSBwaGFzZSBwbGFuZSBvZiB0aGUgY29tcGxleCBpbWFnZS4KKyAgSU1BUV9DT01QTEVYX1BMQU5FX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IENvbXBsZXhQbGFuZTsKKwordHlwZWRlZiBlbnVtIFBhbGV0dGVUeXBlX2VudW0geworICBJTUFRX1BBTEVUVEVfR1JBWSA9IDAsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIHBhbGV0dGUgdGhhdCBoYXMgYSBncmFkdWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYXktbGV2ZWwgdmFyaWF0aW9uIGZyb20gYmxhY2sgdG8gd2hpdGUuCisgIElNQVFfUEFMRVRURV9CSU5BUlkgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBwYWxldHRlIG9mIDE2IGN5Y2xlcyBvZiAxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb2xvcnMgdGhhdCBpcyB1c2VmdWwgd2l0aCBiaW5hcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZXMuCisgIElNQVFfUEFMRVRURV9HUkFESUVOVCA9IDIsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIHBhbGV0dGUgdGhhdCBoYXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhZGF0aW9uIGZyb20gcmVkIHRvIHdoaXRlIHdpdGggYSBwcm9taW5lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlIG9mIGxpZ2h0IGJsdWUgaW4gdGhlIHVwcGVyIHZhbHVlIHJhbmdlLgorICBJTUFRX1BBTEVUVEVfUkFJTkJPVyA9IDMsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhIHBhbGV0dGUgdGhhdCBoYXMgYSBncmFkYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBibHVlIHRvIHJlZCB3aXRoIGEgcHJvbWluZW50IHJhbmdlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyZWVucyBpbiB0aGUgbWlkZGxlIHZhbHVlIHJhbmdlLgorICBJTUFRX1BBTEVUVEVfVEVNUEVSQVRVUkUgPSA0LCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBwYWxldHRlIHRoYXQgaGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYWRhdGlvbiBmcm9tIGxpZ2h0IGJyb3duIHRvIGRhcmsgYnJvd24uCisgIElNQVFfUEFMRVRURV9VU0VSID0gNSwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIGEgcGFsZXR0ZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLgorICBJTUFRX1BBTEVUVEVfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBQYWxldHRlVHlwZTsKKwordHlwZWRlZiBlbnVtIENvbG9yU2Vuc2l0aXZpdHlfZW51bSB7CisgIElNQVFfU0VOU0lUSVZJVFlfTE9XID0gMCwgIC8vIEluc3RydWN0cyB0aGUgYWxnb3JpdGhtIHRvIGRpdmlkZSB0aGUgaHVlIHBsYW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludG8gYSBsb3cgbnVtYmVyIG9mIHNlY3RvcnMsIGFsbG93aW5nIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGUgY29sb3IgYW5hbHlzaXMuCisgIElNQVFfU0VOU0lUSVZJVFlfTUVEID0gMSwgIC8vIEluc3RydWN0cyB0aGUgYWxnb3JpdGhtIHRvIGRpdmlkZSB0aGUgaHVlIHBsYW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludG8gYSBtZWRpdW0gbnVtYmVyIG9mIHNlY3RvcnMsIGFsbG93aW5nIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBhbmFseXNpcyB0aGF0IGJhbGFuY2VzIHNlbnNpdGl2aXR5IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV4aXR5LgorICBJTUFRX1NFTlNJVElWSVRZX0hJR0ggPSAyLCAgLy8gSW5zdHJ1Y3RzIHRoZSBhbGdvcml0aG0gdG8gZGl2aWRlIHRoZSBodWUgcGxhbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludG8gYSBoaWdoIG51bWJlciBvZiBzZWN0b3JzLCBhbGxvd2luZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXgsIHNlbnNpdGl2ZSBjb2xvciBhbmFseXNpcy4KKyAgSU1BUV9DT0xPUl9TRU5TSVRJVklUWV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBDb2xvclNlbnNpdGl2aXR5OworCit0eXBlZGVmIGVudW0gQ29sb3JNb2RlX2VudW0geworICBJTUFRX1JHQiA9CisgICAgICAwLCAgLy8gVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGluIHRoZSBSR0IgKFJlZCwgQmx1ZSwgR3JlZW4pIGNvbG9yIHNwYWNlLgorICBJTUFRX0hTTCA9IDEsICAvLyBUaGUgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gdGhlIEhTTCAoSHVlLCBTYXR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAvLyBMdW1pbmFuY2UpIGNvbG9yIHNwYWNlLgorICBJTUFRX0hTViA9IDIsICAvLyBUaGUgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gdGhlIEhTViAoSHVlLCBTYXR1cmF0aW9uLCBWYWx1ZSkKKyAgICAgICAgICAgICAgICAgLy8gY29sb3Igc3BhY2UuCisgIElNQVFfSFNJID0gMywgIC8vIFRoZSBmdW5jdGlvbiBvcGVyYXRlcyBpbiB0aGUgSFNJIChIdWUsIFNhdHVyYXRpb24sCisgICAgICAgICAgICAgICAgIC8vIEludGVuc2l0eSkgY29sb3Igc3BhY2UuCisgIElNQVFfQ0lFID0gNCwgIC8vIFRoZSBmdW5jdGlvbiBvcGVyYXRlcyBpbiB0aGUgQ0lFIEwqYSpiKiBjb2xvciBzcGFjZS4KKyAgSU1BUV9DSUVYWVogPSA1LCAgLy8gVGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGluIHRoZSBDSUUgWFlaIGNvbG9yIHNwYWNlLgorICBJTUFRX0NPTE9SX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQ29sb3JNb2RlOworCit0eXBlZGVmIGVudW0gRGV0ZWN0aW9uTW9kZV9lbnVtIHsKKyAgSU1BUV9ERVRFQ1RfUEVBS1MgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIGRldGVjdHMgcGVha3MuCisgIElNQVFfREVURUNUX1ZBTExFWVMgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIGRldGVjdHMgdmFsbGV5cy4KKyAgSU1BUV9ERVRFQ1RJT05fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBEZXRlY3Rpb25Nb2RlOworCit0eXBlZGVmIGVudW0gQ2FsaWJyYXRpb25Vbml0X2VudW0geworICBJTUFRX1VOREVGSU5FRCA9IDAsICAvLyBUaGUgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhIGRlZmluZWQgdW5pdCBvZiBtZWFzdXJlbWVudC4KKyAgSU1BUV9BTkdTVFJPTSA9IDEsICAvLyBUaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UgaXMgYW5nc3Ryb21zLgorICBJTUFRX01JQ1JPTUVURVIgPSAyLCAgLy8gVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIG1pY3JvbWV0ZXJzLgorICBJTUFRX01JTExJTUVURVIgPSAzLCAgLy8gVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIG1pbGxpbWV0ZXJzLgorICBJTUFRX0NFTlRJTUVURVIgPSA0LCAgLy8gVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIGNlbnRpbWV0ZXJzLgorICBJTUFRX01FVEVSID0gNSwgIC8vIFRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBtZXRlcnMuCisgIElNQVFfS0lMT01FVEVSID0gNiwgIC8vIFRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBraWxvbWV0ZXJzLgorICBJTUFRX01JQ1JPSU5DSCA9IDcsICAvLyBUaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UgaXMgbWljcm9pbmNoZXMuCisgIElNQVFfSU5DSCA9IDgsICAvLyBUaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UgaXMgaW5jaGVzLgorICBJTUFRX0ZPT1QgPSA5LCAgLy8gVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIGZlZXQuCisgIElNQVFfTkFVVElDTUlMRSA9IDEwLCAgLy8gVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIG5hdXRpY2FsIG1pbGVzLgorICBJTUFRX0dST1VORE1JTEUgPSAxMSwgIC8vIFRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBpbWFnZSBpcyBncm91bmQgbWlsZXMuCisgIElNQVFfU1RFUCA9IDEyLCAgLy8gVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIGltYWdlIGlzIHN0ZXBzLgorICBJTUFRX0NBTElCUkFUSU9OX1VOSVRfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQ2FsaWJyYXRpb25Vbml0OworCit0eXBlZGVmIGVudW0gQ29uY2VudHJpY1Jha2VEaXJlY3Rpb25fZW51bSB7CisgIElNQVFfQ09VTlRFUl9DTE9DS1dJU0UgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBzZWFyY2ggYXJlYSBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnRlci1jbG9ja3dpc2UgZGlyZWN0aW9uLgorICBJTUFRX0NMT0NLV0lTRSA9CisgICAgICAxLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBzZWFyY2ggYXJlYSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCisgIElNQVFfQ09OQ0VOVFJJQ19SQUtFX0RJUkVDVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBDb25jZW50cmljUmFrZURpcmVjdGlvbjsKKwordHlwZWRlZiBlbnVtIENhbGlicmF0aW9uTW9kZV9lbnVtIHsKKyAgSU1BUV9QRVJTUEVDVElWRSA9IDAsICAvLyBGdW5jdGlvbnMgY29ycmVjdCBmb3IgZGlzdG9ydGlvbiBjYXVzZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FtZXJhJ3MgcGVyc3BlY3RpdmUuCisgIElNQVFfTk9OTElORUFSID0KKyAgICAgIDEsICAvLyBGdW5jdGlvbnMgY29ycmVjdCBmb3IgZGlzdG9ydGlvbiBjYXVzZWQgYnkgdGhlIGNhbWVyYSdzIGxlbnMuCisgIElNQVFfU0lNUExFX0NBTElCUkFUSU9OID0gMiwgIC8vIEZ1bmN0aW9ucyBkbyBub3QgY29ycmVjdCBmb3IgZGlzdG9ydGlvbi4KKyAgSU1BUV9DT1JSRUNURURfSU1BR0UgPSAzLCAgLy8gVGhlIGltYWdlIGlzIGFscmVhZHkgY29ycmVjdGVkLgorICBJTUFRX0NBTElCUkFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQ2FsaWJyYXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gQnJvd3NlckxvY2F0aW9uX2VudW0geworICBJTUFRX0lOU0VSVF9GSVJTVF9GUkVFID0KKyAgICAgIDAsICAvLyBJbnNlcnRzIHRoZSB0aHVtYm5haWwgaW4gdGhlIGZpcnN0IGF2YWlsYWJsZSBjZWxsLgorICBJTUFRX0lOU0VSVF9FTkQgPSAxLCAgLy8gSW5zZXJ0cyB0aGUgdGh1bWJuYWlsIGFmdGVyIHRoZSBsYXN0IG9jY3VwaWVkIGNlbGwuCisgIElNQVFfQlJPV1NFUl9MT0NBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBCcm93c2VyTG9jYXRpb247CisKK3R5cGVkZWYgZW51bSBCcm93c2VyRnJhbWVTdHlsZV9lbnVtIHsKKyAgSU1BUV9SQUlTRURfRlJBTUUgPSAwLCAgLy8gRWFjaCB0aHVtYm5haWwgaGFzIGEgcmFpc2VkIGZyYW1lLgorICBJTUFRX0JFVkVMTEVEX0ZSQU1FID0gMSwgIC8vIEVhY2ggdGh1bWJuYWlsIGhhcyBhIGJldmVsZWQgZnJhbWUuCisgIElNQVFfT1VUTElORV9GUkFNRSA9IDIsICAvLyBFYWNoIHRodW1ibmFpbCBoYXMgYW4gb3V0bGluZWQgZnJhbWUuCisgIElNQVFfSElEREVOX0ZSQU1FID0gMywgIC8vIEVhY2ggdGh1bWJuYWlsIGhhcyBhIGhpZGRlbiBmcmFtZS4KKyAgSU1BUV9TVEVQX0ZSQU1FID0gNCwgIC8vIEVhY2ggdGh1bWJuYWlsIGhhcyBhIHN0ZXBwZWQgZnJhbWUuCisgIElNQVFfUkFJU0VEX09VVExJTkVfRlJBTUUgPQorICAgICAgNSwgIC8vIEVhY2ggdGh1bWJuYWlsIGhhcyBhIHJhaXNlZCwgb3V0bGluZWQgZnJhbWUuCisgIElNQVFfQlJPV1NFUl9GUkFNRV9TVFlMRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBCcm93c2VyRnJhbWVTdHlsZTsKKwordHlwZWRlZiBlbnVtIEJvcmRlck1ldGhvZF9lbnVtIHsKKyAgSU1BUV9CT1JERVJfTUlSUk9SID0KKyAgICAgIDAsICAvLyBTeW1tZXRyaWNhbGx5IGNvcGllcyBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUgaW1hZ2UgaW50byB0aGUgYm9yZGVyLgorICBJTUFRX0JPUkRFUl9DT1BZID0gMSwgIC8vIENvcGllcyB0aGUgdmFsdWUgb2YgdGhlIHBpeGVsIGNsb3Nlc3QgdG8gdGhlIGVkZ2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW1hZ2UgaW50byB0aGUgYm9yZGVyLgorICBJTUFRX0JPUkRFUl9DTEVBUiA9IDIsICAvLyBTZXRzIGFsbCBwaXhlbHMgaW4gdGhlIGJvcmRlciB0byAwLgorICBJTUFRX0JPUkRFUl9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQm9yZGVyTWV0aG9kOworCit0eXBlZGVmIGVudW0gQmFyY29kZVR5cGVfZW51bSB7CisgIElNQVFfSU5WQUxJRCA9IC0xLCAgLy8gVGhlIGJhcmNvZGUgaXMgbm90IG9mIGEgdHlwZSBrbm93biBieSBOSSBWaXNpb24uCisgIElNQVFfQ09EQUJBUiA9IDEsICAvLyBUaGUgYmFyY29kZSBpcyBvZiB0eXBlIENvZGFiYXIuCisgIElNQVFfQ09ERTM5ID0gMiwgIC8vIFRoZSBiYXJjb2RlIGlzIG9mIHR5cGUgQ29kZSAzOS4KKyAgSU1BUV9DT0RFOTMgPSA0LCAgLy8gVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBDb2RlIDkzLgorICBJTUFRX0NPREUxMjggPSA4LCAgLy8gVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBDb2RlIDEyOC4KKyAgSU1BUV9FQU44ID0gMTYsICAvLyBUaGUgYmFyY29kZSBpcyBvZiB0eXBlIEVBTiA4LgorICBJTUFRX0VBTjEzID0gMzIsICAvLyBUaGUgYmFyY29kZSBpcyBvZiB0eXBlIEVBTiAxMy4KKyAgSU1BUV9JMl9PRl81ID0gNjQsICAvLyBUaGUgYmFyY29kZSBpcyBvZiB0eXBlIENvZGUgMjUuCisgIElNQVFfTVNJID0gMTI4LCAgLy8gVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBNU0kgY29kZS4KKyAgSU1BUV9VUENBID0gMjU2LCAgLy8gVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBVUEMgQS4KKyAgSU1BUV9QSEFSTUFDT0RFID0gNTEyLCAgLy8gVGhlIGJhcmNvZGUgaXMgb2YgdHlwZSBQaGFybWFjb2RlLgorICBJTUFRX1JTU19MSU1JVEVEID0gMTAyNCwgIC8vIFRoZSBiYXJjb2RlIGlzIG9mIHR5cGUgUlNTIExpbWl0ZWQuCisgIElNQVFfQkFSQ09ERV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEJhcmNvZGVUeXBlOworCit0eXBlZGVmIGVudW0gQXhpc09yaWVudGF0aW9uX2VudW0geworICBJTUFRX0RJUkVDVCA9IDAsICAvLyBUaGUgeS1heGlzIGRpcmVjdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgeS1heGlzIGRpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtLgorICBJTUFRX0lORElSRUNUID0gMSwgIC8vIFRoZSB5LWF4aXMgZGlyZWN0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSB5LWF4aXMKKyAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Rpb24gb2YgYW4gaW1hZ2UuCisgIElNQVFfQVhJU19PUklFTlRBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBBeGlzT3JpZW50YXRpb247CisKK3R5cGVkZWYgZW51bSBDb2xvcklnbm9yZU1vZGVfZW51bSB7CisgIElNQVFfSUdOT1JFX05PTkUgPQorICAgICAgMCwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBpZ25vcmUgYW55IHBpeGVscy4KKyAgSU1BUV9JR05PUkVfQkxBQ0sgPSAxLCAgLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlnbm9yZXMgYmxhY2sgcGl4ZWxzLgorICBJTUFRX0lHTk9SRV9XSElURSA9IDIsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gaWdub3JlcyB3aGl0ZSBwaXhlbHMuCisgIElNQVFfSUdOT1JFX0JMQUNLX0FORF9XSElURSA9CisgICAgICAzLCAgLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlnbm9yZXMgYmxhY2sgcGl4ZWxzIGFuZCB3aGl0ZSBwaXhlbHMuCisgIElNQVFfQkxBQ0tfV0hJVEVfSUdOT1JFX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQ29sb3JJZ25vcmVNb2RlOworCit0eXBlZGVmIGVudW0gTGV2ZWxUeXBlX2VudW0geworICBJTUFRX0FCU09MVVRFID0gMCwgIC8vIFRoZSBmdW5jdGlvbiBldmFsdWF0ZXMgdGhlIHRocmVzaG9sZCBhbmQgaHlzdGVyZXNpcworICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcyBhYnNvbHV0ZSB2YWx1ZXMuCisgIElNQVFfUkVMQVRJVkUgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIGV2YWx1YXRlcyB0aGUgdGhyZXNob2xkIGFuZCBoeXN0ZXJlc2lzCisgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSBkeW5hbWljIHJhbmdlIG9mIHRoZSBnaXZlbiBwYXRoLgorICBJTUFRX0xFVkVMX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gTGV2ZWxUeXBlOworCit0eXBlZGVmIGVudW0gTWF0Y2hpbmdNb2RlX2VudW0geworICBJTUFRX01BVENIX1NISUZUX0lOVkFSSUFOVCA9IDEsICAvLyBTZWFyY2hlcyBmb3Igb2NjdXJyZW5jZXMgb2YgdGhlIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIGFueXdoZXJlIGluIHRoZSBzZWFyY2hSZWN0LCBhc3N1bWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBwYXR0ZXJuIGlzIG5vdCByb3RhdGVkIG1vcmUgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbHVzIG9yIG1pbnVzIDQgZGVncmVlcy4KKyAgSU1BUV9NQVRDSF9ST1RBVElPTl9JTlZBUklBTlQgPSAyLCAgLy8gU2VhcmNoZXMgZm9yIG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBpbWFnZSB3aXRoIG5vIHJlc3RyaWN0aW9uIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3RhdGlvbiBvZiB0aGUgcGF0dGVybi4KKyAgSU1BUV9NQVRDSElOR19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IE1hdGNoaW5nTW9kZTsKKwordHlwZWRlZiBlbnVtIE1hcHBpbmdNZXRob2RfZW51bSB7CisgIElNQVFfRlVMTF9EWU5BTUlDID0gMCwgIC8vKE9ic29sZXRlKSBXaGVuIHRoZSBpbWFnZSBiaXQgZGVwdGggaXMgMCwgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnVuY3Rpb24gbWFwcyB0aGUgZnVsbCBkeW5hbWljIHJhbmdlIG9mIHRoZSAxNi1iaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbWFnZSB0byBhbiA4LWJpdCBzY2FsZS4KKyAgSU1BUV9ET1dOU0hJRlQgPSAxLCAgLy8oT2Jzb2xldGUpIFdoZW4gdGhlIGltYWdlIGJpdCBkZXB0aCBpcyAwLCB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgLy9zaGlmdHMgdGhlIDE2LWJpdCBpbWFnZSBwaXhlbHMgdG8gdGhlIHJpZ2h0IHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgLy9vZiB0aW1lcyBzcGVjaWZpZWQgYnkgdGhlIHNoaWZ0Q291bnQgZWxlbWVudCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy9EaXNwbGF5TWFwcGluZyBzdHJ1Y3R1cmUuCisgIElNQVFfUkFOR0UgPSAyLCAgLy8oT2Jzb2xldGUpIFdoZW4gdGhlIGltYWdlIGJpdCBkZXB0aCBpcyAwLCB0aGUgZnVuY3Rpb24gbWFwcworICAgICAgICAgICAgICAgICAgIC8vdGhlIHBpeGVsIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBtaW5pbXVtVmFsdWUKKyAgICAgICAgICAgICAgICAgICAvL2FuZCBtYXhpbXVtVmFsdWUgZWxlbWVudHMgb2YgdGhlIERpc3BsYXlNYXBwaW5nIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgIC8vdG8gYW4gOC1iaXQgc2NhbGUuCisgIElNQVFfOTBfUENUX0RZTkFNSUMgPQorICAgICAgMywgIC8vKE9ic29sZXRlKSBXaGVuIHRoZSBpbWFnZSBiaXQgZGVwdGggdG8gMCwgdGhlIGZ1bmN0aW9uIG1hcHMgdGhlCisgICAgICAgICAgLy9keW5hbWljIHJhbmdlIGNvbnRhaW5pbmcgdGhlIG1pZGRsZSA5MCBwZXJjZW50IG9mIHRoZSBjdW11bGF0ZWQKKyAgICAgICAgICAvL2hpc3RvZ3JhbSBvZiB0aGUgaW1hZ2UgdG8gYW4gOC1iaXQgKDI1NiBncmF5c2NhbGUgdmFsdWVzKSBzY2FsZS4KKyAgSU1BUV9QRVJDRU5UX1JBTkdFID0gNCwgIC8vKE9ic29sZXRlKSBXaGVuIHRoZSBpbWFnZSBiaXQgZGVwdGggaXMgMCwgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Z1bmN0aW9uIG1hcHMgdGhlIHBpeGVsIHZhbHVlcyBpbiB0aGUgcmVsYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcGVyY2VudGFnZSByYW5nZSAoMCB0byAxMDApIG9mIHRoZSBjdW11bGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaGlzdG9ncmFtIHNwZWNpZmllZCBieSBtaW5pbXVtVmFsdWUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21heGltdW1WYWx1ZSB0byBhbiA4LWJpdCBzY2FsZS4KKyAgSU1BUV9ERUZBVUxUX01BUFBJTkcgPQorICAgICAgMTAsICAvLyBJZiB0aGUgYml0IGRlcHRoIGlzIDAsIHRoZSBmdW5jdGlvbiBtYXBzIHRoZSAxNi1iaXQgaW1hZ2UgdG8gOAorICAgICAgICAgICAvLyBiaXRzIGJ5IGZvbGxvd2luZyB0aGUgSU1BUV9GVUxMX0RZTkFNSUNfQUxXQVlTIGJlaGF2aW9yOworICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBmdW5jdGlvbiBzaGlmdHMgdGhlIGltYWdlIGRhdGEgdG8gdGhlIHJpZ2h0CisgICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgSU1BUV9NT1NUX1NJR05JRklDQU5UIGJlaGF2aW9yLgorICBJTUFRX01PU1RfU0lHTklGSUNBTlQgPSAxMSwgIC8vIFRoZSBmdW5jdGlvbiBzaGlmdHMgdGhlIDE2LWJpdCBpbWFnZSBwaXhlbHMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmlnaHQgdW50aWwgdGhlIDggbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGltYWdlIGRhdGEgYXJlIHJlbWFpbmluZy4KKyAgSU1BUV9GVUxMX0RZTkFNSUNfQUxXQVlTID0gMTIsICAvLyBUaGUgZnVuY3Rpb24gbWFwcyB0aGUgZnVsbCBkeW5hbWljIHJhbmdlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIDE2LWJpdCBpbWFnZSB0byBhbiA4LWJpdCBzY2FsZS4KKyAgSU1BUV9ET1dOU0hJRlRfQUxXQVlTID0gMTMsICAvLyBUaGUgZnVuY3Rpb24gc2hpZnRzIHRoZSAxNi1iaXQgaW1hZ2UgcGl4ZWxzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IHRoZSBudW1iZXIgb2YgdGltZXMgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNoaWZ0Q291bnQgZWxlbWVudCBvZiB0aGUgRGlzcGxheU1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3R1cmUuCisgIElNQVFfUkFOR0VfQUxXQVlTID0gMTQsICAvLyBUaGUgZnVuY3Rpb24gbWFwcyB0aGUgcGl4ZWwgdmFsdWVzIGluIHRoZSByYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBtaW5pbXVtVmFsdWUgYW5kIG1heGltdW1WYWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgb2YgdGhlIERpc3BsYXlNYXBwaW5nIHN0cnVjdHVyZSB0byBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOC1iaXQgc2NhbGUuCisgIElNQVFfOTBfUENUX0RZTkFNSUNfQUxXQVlTID0gMTUsICAvLyBUaGUgZnVuY3Rpb24gbWFwcyB0aGUgZHluYW1pYyByYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbmluZyB0aGUgbWlkZGxlIDkwIHBlcmNlbnQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdW11bGF0ZWQgaGlzdG9ncmFtIG9mIHRoZSBpbWFnZSB0byBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOC1iaXQgKDI1NiBncmF5c2NhbGUgdmFsdWVzKSBzY2FsZS4KKyAgSU1BUV9QRVJDRU5UX1JBTkdFX0FMV0FZUyA9CisgICAgICAxNiwgIC8vIFRoZSBmdW5jdGlvbiBtYXBzIHRoZSBwaXhlbCB2YWx1ZXMgaW4gdGhlIHJlbGF0aXZlIHBlcmNlbnRhZ2UKKyAgICAgICAgICAgLy8gcmFuZ2UgKDAgdG8gMTAwKSBvZiB0aGUgY3VtdWxhdGVkIGhpc3RvZ3JhbSBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgLy8gbWluaW11bVZhbHVlIGFuZCBtYXhpbXVtVmFsdWUgdG8gYW4gOC1iaXQgc2NhbGUuCisgIElNQVFfTUFQUElOR19NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gTWFwcGluZ01ldGhvZDsKKwordHlwZWRlZiBlbnVtIENvbXBhcmlzb25GdW5jdGlvbl9lbnVtIHsKKyAgSU1BUV9DTEVBUl9MRVNTID0gMCwgIC8vIFRoZSBjb21wYXJpc29uIGlzIHRydWUgaWYgdGhlIHNvdXJjZSBwaXhlbCB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVzcyB0aGFuIHRoZSBjb21wYXJpc29uIGltYWdlIHBpeGVsIHZhbHVlLgorICBJTUFRX0NMRUFSX0xFU1NfT1JfRVFVQUwgPSAxLCAgLy8gVGhlIGNvbXBhcmlzb24gaXMgdHJ1ZSBpZiB0aGUgc291cmNlIHBpeGVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJpc29uIGltYWdlIHBpeGVsIHZhbHVlLgorICBJTUFRX0NMRUFSX0VRVUFMID0gMiwgIC8vIFRoZSBjb21wYXJpc29uIGlzIHRydWUgaWYgdGhlIHNvdXJjZSBwaXhlbCB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVxdWFsIHRvIHRoZSBjb21wYXJpc29uIGltYWdlIHBpeGVsIHZhbHVlLgorICBJTUFRX0NMRUFSX0dSRUFURVJfT1JfRVFVQUwgPSAzLCAgLy8gVGhlIGNvbXBhcmlzb24gaXMgdHJ1ZSBpZiB0aGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wYXJpc29uIGltYWdlIHBpeGVsIHZhbHVlLgorICBJTUFRX0NMRUFSX0dSRUFURVIgPSA0LCAgLy8gVGhlIGNvbXBhcmlzb24gaXMgdHJ1ZSBpZiB0aGUgc291cmNlIHBpeGVsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBncmVhdGVyIHRoYW4gdGhlIGNvbXBhcmlzb24gaW1hZ2UgcGl4ZWwgdmFsdWUuCisgIElNQVFfQ09NUEFSRV9GVU5DVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBDb21wYXJpc29uRnVuY3Rpb247CisKK3R5cGVkZWYgZW51bSBMaW5lR2F1Z2VNZXRob2RfZW51bSB7CisgIElNQVFfRURHRV9UT19FREdFID0gMCwgIC8vIE1lYXN1cmVzIGZyb20gdGhlIGZpcnN0IGVkZ2Ugb24gdGhlIGxpbmUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3QgZWRnZSBvbiB0aGUgbGluZS4KKyAgSU1BUV9FREdFX1RPX1BPSU5UID0gMSwgIC8vIE1lYXN1cmVzIGZyb20gdGhlIGZpcnN0IGVkZ2Ugb24gdGhlIGxpbmUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgcG9pbnQgb2YgdGhlIGxpbmUuCisgIElNQVFfUE9JTlRfVE9fRURHRSA9IDIsICAvLyBNZWFzdXJlcyBmcm9tIHRoZSBzdGFydCBwb2ludCBvZiB0aGUgbGluZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVkZ2Ugb24gdGhlIGxpbmUuCisgIElNQVFfUE9JTlRfVE9fUE9JTlQgPSAzLCAgLy8gTWVhc3VyZXMgZnJvbSB0aGUgc3RhcnQgcG9pbnQgb2YgdGhlIGxpbmUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIHBvaW50IG9mIHRoZSBsaW5lLgorICBJTUFRX0xJTkVfR0FVR0VfTUVUSE9EX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IExpbmVHYXVnZU1ldGhvZDsKKwordHlwZWRlZiBlbnVtIERpcmVjdGlvbjNEX2VudW0geworICBJTUFRXzNEX05XID0gMCwgIC8vIFRoZSB2aWV3aW5nIGFuZ2xlIGZvciB0aGUgM0QgaW1hZ2UgaXMgZnJvbSB0aGUgbm9ydGh3ZXN0LgorICBJTUFRXzNEX1NXID0gMSwgIC8vIFRoZSB2aWV3aW5nIGFuZ2xlIGZvciB0aGUgM0QgaW1hZ2UgaXMgZnJvbSB0aGUgc291dGh3ZXN0LgorICBJTUFRXzNEX1NFID0gMiwgIC8vIFRoZSB2aWV3aW5nIGFuZ2xlIGZvciB0aGUgM0QgaW1hZ2UgaXMgZnJvbSB0aGUgc291dGhlYXN0LgorICBJTUFRXzNEX05FID0gMywgIC8vIFRoZSB2aWV3aW5nIGFuZ2xlIGZvciB0aGUgM0QgaW1hZ2UgaXMgZnJvbSB0aGUgbm9ydGhlYXN0LgorICBJTUFRX0RJUkVDVElPTl8zRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBEaXJlY3Rpb24zRDsKKwordHlwZWRlZiBlbnVtIExlYXJuaW5nTW9kZV9lbnVtIHsKKyAgSU1BUV9MRUFSTl9BTEwgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIGV4dHJhY3RzIGluZm9ybWF0aW9uIGZvciBzaGlmdC0gYW5kCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyAgSU1BUV9MRUFSTl9TSElGVF9JTkZPUk1BVElPTiA9CisgICAgICAxLCAgLy8gVGhlIGZ1bmN0aW9uIGV4dHJhY3RzIGluZm9ybWF0aW9uIGZvciBzaGlmdC1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgIElNQVFfTEVBUk5fUk9UQVRJT05fSU5GT1JNQVRJT04gPQorICAgICAgMiwgIC8vIFRoZSBmdW5jdGlvbiBleHRyYWN0cyBpbmZvcm1hdGlvbiBmb3Igcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorICBJTUFRX0xFQVJOSU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gTGVhcm5pbmdNb2RlOworCit0eXBlZGVmIGVudW0gS2VybmVsRmFtaWx5X2VudW0geworICBJTUFRX0dSQURJRU5UX0ZBTUlMWSA9IDAsICAvLyBUaGUga2VybmVsIGlzIGluIHRoZSBncmFkaWVudCBmYW1pbHkuCisgIElNQVFfTEFQTEFDSUFOX0ZBTUlMWSA9IDEsICAvLyBUaGUga2VybmVsIGlzIGluIHRoZSBMYXBsYWNpYW4gZmFtaWx5LgorICBJTUFRX1NNT09USElOR19GQU1JTFkgPSAyLCAgLy8gVGhlIGtlcm5lbCBpcyBpbiB0aGUgc21vb3RoaW5nIGZhbWlseS4KKyAgSU1BUV9HQVVTU0lBTl9GQU1JTFkgPSAzLCAgLy8gVGhlIGtlcm5lbCBpcyBpbiB0aGUgR2F1c3NpYW4gZmFtaWx5LgorICBJTUFRX0tFUk5FTF9GQU1JTFlfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gS2VybmVsRmFtaWx5OworCit0eXBlZGVmIGVudW0gSW50ZXJwb2xhdGlvbk1ldGhvZF9lbnVtIHsKKyAgSU1BUV9aRVJPX09SREVSID0gMCwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIGFuIGludGVycG9sYXRpb24gbWV0aG9kIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVycG9sYXRlcyBuZXcgcGl4ZWwgdmFsdWVzIHVzaW5nIHRoZSBuZWFyZXN0IHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWlnaGJvcmluZyBwaXhlbC4KKyAgSU1BUV9CSUxJTkVBUiA9IDEsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcnBvbGF0aW9uIG1ldGhvZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGVzIG5ldyBwaXhlbCB2YWx1ZXMgdXNpbmcgYSBiaWRpcmVjdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgLy8gYXZlcmFnZSBvZiB0aGUgbmVpZ2hib3JpbmcgcGl4ZWxzLgorICBJTUFRX1FVQURSQVRJQyA9IDIsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcnBvbGF0aW9uIG1ldGhvZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVycG9sYXRlcyBuZXcgcGl4ZWwgdmFsdWVzIHVzaW5nIGEgcXVhZHJhdGljCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcHJveGltYXRpbmcgcG9seW5vbWlhbC4KKyAgSU1BUV9DVUJJQ19TUExJTkUgPSAzLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYW4gaW50ZXJwb2xhdGlvbiBtZXRob2QgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZXMgbmV3IHBpeGVsIHZhbHVlcyBieSBmaXR0aW5nIHRoZW0gdG8gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdWJpYyBzcGxpbmUgY3VydmUsIHdoZXJlIHRoZSBjdXJ2ZSBpcyBiYXNlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrbm93biBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUgaW1hZ2UuCisgIElNQVFfQklMSU5FQVJfRklYRUQgPSA0LCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYW4gaW50ZXJwb2xhdGlvbiBtZXRob2QgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVycG9sYXRlcyBuZXcgcGl4ZWwgdmFsdWVzIHVzaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaWRpcmVjdGlvbmFsIGF2ZXJhZ2Ugb2YgdGhlIG5laWdoYm9yaW5nIHBpeGVscy4KKyAgSU1BUV9JTlRFUlBPTEFUSU9OX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBJbnRlcnBvbGF0aW9uTWV0aG9kOworCit0eXBlZGVmIGVudW0gSW1hZ2VUeXBlX2VudW0geworICBJTUFRX0lNQUdFX1U4ID0gMCwgIC8vIFRoZSBpbWFnZSB0eXBlIGlzIDgtYml0IHVuc2lnbmVkIGludGVnZXIgZ3JheXNjYWxlLgorICBJTUFRX0lNQUdFX1UxNiA9IDcsICAvLyBUaGUgaW1hZ2UgdHlwZSBpcyAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBncmF5c2NhbGUuCisgIElNQVFfSU1BR0VfSTE2ID0gMSwgIC8vIFRoZSBpbWFnZSB0eXBlIGlzIDE2LWJpdCBzaWduZWQgaW50ZWdlciBncmF5c2NhbGUuCisgIElNQVFfSU1BR0VfU0dMID0gMiwgIC8vIFRoZSBpbWFnZSB0eXBlIGlzIDMyLWJpdCBmbG9hdGluZy1wb2ludCBncmF5c2NhbGUuCisgIElNQVFfSU1BR0VfQ09NUExFWCA9IDMsICAvLyBUaGUgaW1hZ2UgdHlwZSBpcyBjb21wbGV4LgorICBJTUFRX0lNQUdFX1JHQiA9IDQsICAvLyBUaGUgaW1hZ2UgdHlwZSBpcyBSR0IgY29sb3IuCisgIElNQVFfSU1BR0VfSFNMID0gNSwgIC8vIFRoZSBpbWFnZSB0eXBlIGlzIEhTTCBjb2xvci4KKyAgSU1BUV9JTUFHRV9SR0JfVTY0ID0gNiwgIC8vIFRoZSBpbWFnZSB0eXBlIGlzIDY0LWJpdCB1bnNpZ25lZCBSR0IgY29sb3IuCisgIElNQVFfSU1BR0VfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBJbWFnZVR5cGU7CisKK3R5cGVkZWYgZW51bSBJbWFnZUZlYXR1cmVNb2RlX2VudW0geworICBJTUFRX0NPTE9SX0FORF9TSEFQRV9GRUFUVVJFUyA9IDAsICAvLyBJbnN0cnVjdHMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0aGUgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBzaGFwZSBmZWF0dXJlcyBvZiB0aGUgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0dGVybi4KKyAgSU1BUV9DT0xPUl9GRUFUVVJFUyA9IDEsICAvLyBJbnN0cnVjdHMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0aGUgY29sb3IgZmVhdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgY29sb3IgcGF0dGVybi4KKyAgSU1BUV9TSEFQRV9GRUFUVVJFUyA9IDIsICAvLyBJbnN0cnVjdHMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0aGUgc2hhcGUgZmVhdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgY29sb3IgcGF0dGVybi4KKyAgSU1BUV9GRUFUVVJFX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gSW1hZ2VGZWF0dXJlTW9kZTsKKwordHlwZWRlZiBlbnVtIEZvbnRDb2xvcl9lbnVtIHsKKyAgSU1BUV9XSElURSA9IDAsICAvLyBEcmF3cyB0ZXh0IGluIHdoaXRlLgorICBJTUFRX0JMQUNLID0gMSwgIC8vIERyYXdzIHRleHQgaW4gYmxhY2suCisgIElNQVFfSU5WRVJUID0gMiwgIC8vIEludmVydHMgdGhlIHRleHQgcGl4ZWxzLgorICBJTUFRX0JMQUNLX09OX1dISVRFID0gMywgIC8vIERyYXdzIHRleHQgaW4gYmxhY2sgd2l0aCBhIHdoaXRlIGJhY2tncm91bmQuCisgIElNQVFfV0hJVEVfT05fQkxBQ0sgPSA0LCAgLy8gRHJhd3MgdGV4dCBpbiB3aGl0ZSB3aXRoIGEgYmxhY2sgYmFja2dyb3VuZC4KKyAgSU1BUV9GT05UX0NPTE9SX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEZvbnRDb2xvcjsKKwordHlwZWRlZiBlbnVtIEZsaXBBeGlzX2VudW0geworICBJTUFRX0hPUklaT05UQUxfQVhJUyA9CisgICAgICAwLCAgLy8gRmxpcHMgdGhlIGltYWdlIG92ZXIgdGhlIGNlbnRyYWwgaG9yaXpvbnRhbCBheGlzLgorICBJTUFRX1ZFUlRJQ0FMX0FYSVMgPSAxLCAgLy8gRmxpcHMgdGhlIGltYWdlIG92ZXIgdGhlIGNlbnRyYWwgdmVydGljYWwgYXhpcy4KKyAgSU1BUV9DRU5URVJfQVhJUyA9CisgICAgICAyLCAgLy8gRmxpcHMgdGhlIGltYWdlIG92ZXIgYm90aCB0aGUgY2VudHJhbCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBheGVzLgorICBJTUFRX0RJQUdfTF9UT19SX0FYSVMgPSAzLCAgLy8gRmxpcHMgdGhlIGltYWdlIG92ZXIgYW4gYXhpcyBmcm9tIHRoZSB1cHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVmdCBjb3JuZXIgdG8gbG93ZXIgcmlnaHQgY29ybmVyLgorICBJTUFRX0RJQUdfUl9UT19MX0FYSVMgPSA0LCAgLy8gRmxpcHMgdGhlIGltYWdlIG92ZXIgYW4gYXhpcyBmcm9tIHRoZSB1cHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHQgY29ybmVyIHRvIGxvd2VyIGxlZnQgY29ybmVyLgorICBJTUFRX0ZMSVBfQVhJU19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBGbGlwQXhpczsKKwordHlwZWRlZiBlbnVtIEVkZ2VQcm9jZXNzX2VudW0geworICBJTUFRX0ZJUlNUID0gMCwgIC8vIFRoZSBmdW5jdGlvbiBsb29rcyBmb3IgdGhlIGZpcnN0IGVkZ2UuCisgIElNQVFfRklSU1RfQU5EX0xBU1QgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIGxvb2tzIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgZWRnZS4KKyAgSU1BUV9BTEwgPSAyLCAgLy8gVGhlIGZ1bmN0aW9uIGxvb2tzIGZvciBhbGwgZWRnZXMuCisgIElNQVFfQkVTVCA9IDMsICAvLyBUaGUgZnVuY3Rpb24gbG9va3MgZm9yIHRoZSBiZXN0IGVkZ2UuCisgIElNQVFfRURHRV9QUk9DRVNTX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEVkZ2VQcm9jZXNzOworCit0eXBlZGVmIGVudW0gRHJhd01vZGVfZW51bSB7CisgIElNQVFfRFJBV19WQUxVRSA9CisgICAgICAwLCAgLy8gRHJhd3MgdGhlIGJvdW5kYXJ5IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBpeGVsIHZhbHVlLgorICBJTUFRX0RSQVdfSU5WRVJUID0KKyAgICAgIDIsICAvLyBJbnZlcnRzIHRoZSBwaXhlbCB2YWx1ZXMgb2YgdGhlIGJvdW5kYXJ5IG9mIHRoZSBvYmplY3QuCisgIElNQVFfUEFJTlRfVkFMVUUgPSAxLCAgLy8gRmlsbHMgdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBwaXhlbCB2YWx1ZS4KKyAgSU1BUV9QQUlOVF9JTlZFUlQgPSAzLCAgLy8gSW52ZXJ0cyB0aGUgcGl4ZWwgdmFsdWVzIG9mIHRoZSBvYmplY3QuCisgIElNQVFfSElHSExJR0hUX1ZBTFVFID0gNCwgIC8vIFRoZSBmdW5jdGlvbiBmaWxscyB0aGUgb2JqZWN0IGJ5IGhpZ2hsaWdodGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZW5jbG9zZWQgcGl4ZWxzIHdpdGggdGhlIGNvbG9yIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QuCisgIElNQVFfRFJBV19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IERyYXdNb2RlOworCit0eXBlZGVmIGVudW0gTmVhcmVzdE5laWdoYm9yTWV0cmljX2VudW0geworICBJTUFRX01FVFJJQ19NQVhJTVVNID0gMCwgIC8vIFRoZSBtYXhpbXVtIG1ldHJpYy4KKyAgSU1BUV9NRVRSSUNfU1VNID0gMSwgIC8vIFRoZSBzdW0gbWV0cmljLgorICBJTUFRX01FVFJJQ19FVUNMSURFQU4gPSAyLCAgLy8gVGhlIEV1Y2xpZGVhbiBtZXRyaWMuCisgIElNQVFfTkVBUkVTVF9ORUlHSEJPUl9NRVRSSUNfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gTmVhcmVzdE5laWdoYm9yTWV0cmljOworCit0eXBlZGVmIGVudW0gUmVhZFJlc29sdXRpb25fZW51bSB7CisgIElNQVFfTE9XX1JFU09MVVRJT04gPQorICAgICAgMCwgIC8vIENvbmZpZ3VyZXMgTkkgVmlzaW9uIHRvIHVzZSBsb3cgcmVzb2x1dGlvbiBkdXJpbmcgdGhlIHJlYWQgcHJvY2Vzcy4KKyAgSU1BUV9NRURJVU1fUkVTT0xVVElPTiA9IDEsICAvLyBDb25maWd1cmVzIE5JIFZpc2lvbiB0byB1c2UgbWVkaXVtIHJlc29sdXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlYWQgcHJvY2Vzcy4KKyAgSU1BUV9ISUdIX1JFU09MVVRJT04gPSAyLCAgLy8gQ29uZmlndXJlcyBOSSBWaXNpb24gdG8gdXNlIGhpZ2ggcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlYWQgcHJvY2Vzcy4KKyAgSU1BUV9SRUFEX1JFU09MVVRJT05fU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUmVhZFJlc29sdXRpb247CisKK3R5cGVkZWYgZW51bSBUaHJlc2hvbGRNb2RlX2VudW0geworICBJTUFRX0ZJWEVEX1JBTkdFID0gMCwgIC8vIFBlcmZvcm1zIHRocmVzaG9sZGluZyB1c2luZyB0aGUgdmFsdWVzIHlvdSBwcm92aWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGxvd1RocmVzaG9sZCBhbmQgaGlnaFRocmVzaG9sZCBlbGVtZW50cyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DUlByb2Nlc3NpbmdPcHRpb25zLgorICBJTUFRX0NPTVBVVEVEX1VOSUZPUk0gPQorICAgICAgMSwgIC8vIENhbGN1bGF0ZXMgYSBzaW5nbGUgdGhyZXNob2xkIHZhbHVlIGZvciB0aGUgZW50aXJlIFJPSS4KKyAgSU1BUV9DT01QVVRFRF9MSU5FQVIgPSAyLCAgLy8gQ2FsY3VsYXRlcyBhIHZhbHVlIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIFJPSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlcyBhIHZhbHVlIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBST0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lYXJseSBmaWxscyB0aGUgbWlkZGxlIHZhbHVlcyBmcm9tIGxlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmlnaHQuCisgIElNQVFfQ09NUFVURURfTk9OTElORUFSID0gMywgIC8vIERpdmlkZXMgdGhlIFJPSSBpbnRvIHRoZSBudW1iZXIgb2YgYmxvY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBieSB0aGUgYmxvY2tDb3VudCBlbGVtZW50IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DUlByb2Nlc3NpbmdPcHRpb25zIGFuZCBjYWxjdWxhdGVzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZXNob2xkIHZhbHVlIGZvciBlYWNoIGJsb2NrLgorICBJTUFRX1RIUkVTSE9MRF9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFRocmVzaG9sZE1vZGU7CisKK3R5cGVkZWYgZW51bSBSZWFkU3RyYXRlZ3lfZW51bSB7CisgIElNQVFfUkVBRF9BR0dSRVNTSVZFID0gMCwgIC8vIENvbmZpZ3VyZXMgTkkgVmlzaW9uIHRvIHBlcmZvcm0gZmV3ZXIgY2hlY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYW5hbHl6aW5nIG9iamVjdHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggdHJhaW5lZCBjaGFyYWN0ZXJzLgorICBJTUFRX1JFQURfQ09OU0VSVkFUSVZFID0gMSwgIC8vIENvbmZpZ3VyZXMgTkkgVmlzaW9uIHRvIHBlcmZvcm0gbW9yZSBjaGVja3MgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgYW4gb2JqZWN0IG1hdGNoZXMgYSB0cmFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgorICBJTUFRX1JFQURfU1RSQVRFR1lfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUmVhZFN0cmF0ZWd5OworCit0eXBlZGVmIGVudW0gTWVhc3VyZW1lbnRUeXBlX2VudW0geworICBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1ggPSAwLCAgLy8gWC1jb29yZGluYXRlIG9mIHRoZSBwb2ludCByZXByZXNlbnRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3RhbCBwYXJ0aWNsZSBtYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgZXZlcnkgcG9pbnQgaW4gdGhlIHBhcnRpY2xlIGhhcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGFudCBkZW5zaXR5LgorICBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1kgPSAxLCAgLy8gWS1jb29yZGluYXRlIG9mIHRoZSBwb2ludCByZXByZXNlbnRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3RhbCBwYXJ0aWNsZSBtYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgZXZlcnkgcG9pbnQgaW4gdGhlIHBhcnRpY2xlIGhhcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdGFudCBkZW5zaXR5LgorICBJTUFRX01UX0ZJUlNUX1BJWEVMX1ggPQorICAgICAgMiwgIC8vIFgtY29vcmRpbmF0ZSBvZiB0aGUgaGlnaGVzdCwgbGVmdG1vc3QgcGFydGljbGUgcGl4ZWwuCisgIElNQVFfTVRfRklSU1RfUElYRUxfWSA9CisgICAgICAzLCAgLy8gWS1jb29yZGluYXRlIG9mIHRoZSBoaWdoZXN0LCBsZWZ0bW9zdCBwYXJ0aWNsZSBwaXhlbC4KKyAgSU1BUV9NVF9CT1VORElOR19SRUNUX0xFRlQgPQorICAgICAgNCwgIC8vIFgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdG1vc3QgcGFydGljbGUgcG9pbnQuCisgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9UT1AgPSA1LCAgLy8gWS1jb29yZGluYXRlIG9mIGhpZ2hlc3QgcGFydGljbGUgcG9pbnQuCisgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9SSUdIVCA9CisgICAgICA2LCAgLy8gWC1jb29yZGluYXRlIG9mIHRoZSByaWdodG1vc3QgcGFydGljbGUgcG9pbnQuCisgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9CT1RUT00gPQorICAgICAgNywgIC8vIFktY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXN0IHBhcnRpY2xlIHBvaW50LgorICBJTUFRX01UX01BWF9GRVJFVF9ESUFNRVRFUl9TVEFSVF9YID0KKyAgICAgIDgsICAvLyBYLWNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgdHdvCisgICAgICAgICAgLy8gcGVyaW1ldGVyIHBvaW50cyB0aGF0IGFyZSB0aGUgZnVydGhlc3QgYXBhcnQuCisgIElNQVFfTVRfTUFYX0ZFUkVUX0RJQU1FVEVSX1NUQVJUX1kgPQorICAgICAgOSwgIC8vIFktY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28KKyAgICAgICAgICAvLyBwZXJpbWV0ZXIgcG9pbnRzIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgSU1BUV9NVF9NQVhfRkVSRVRfRElBTUVURVJfRU5EX1ggPQorICAgICAgMTAsICAvLyBYLWNvb3JkaW5hdGUgb2YgdGhlIGVuZCBvZiB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3bworICAgICAgICAgICAvLyBwZXJpbWV0ZXIgcG9pbnRzIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgSU1BUV9NVF9NQVhfRkVSRVRfRElBTUVURVJfRU5EX1kgPQorICAgICAgMTEsICAvLyBZLWNvb3JkaW5hdGUgb2YgdGhlIGVuZCBvZiB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3bworICAgICAgICAgICAvLyBwZXJpbWV0ZXIgcG9pbnRzIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgSU1BUV9NVF9NQVhfSE9SSVpfU0VHTUVOVF9MRU5HVEhfTEVGVCA9CisgICAgICAxMiwgIC8vIFgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdG1vc3QgcGl4ZWwgaW4gdGhlIGxvbmdlc3Qgcm93IG9mCisgICAgICAgICAgIC8vIGNvbnRpZ3VvdXMgcGl4ZWxzIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9NQVhfSE9SSVpfU0VHTUVOVF9MRU5HVEhfUklHSFQgPQorICAgICAgMTMsICAvLyBYLWNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0bW9zdCBwaXhlbCBpbiB0aGUgbG9uZ2VzdCByb3cgb2YKKyAgICAgICAgICAgLy8gY29udGlndW91cyBwaXhlbHMgaW4gdGhlIHBhcnRpY2xlLgorICBJTUFRX01UX01BWF9IT1JJWl9TRUdNRU5UX0xFTkdUSF9ST1cgPQorICAgICAgMTQsICAvLyBZLWNvb3JkaW5hdGUgb2YgYWxsIG9mIHRoZSBwaXhlbHMgaW4gdGhlIGxvbmdlc3Qgcm93IG9mIGNvbnRpZ3VvdXMKKyAgICAgICAgICAgLy8gcGl4ZWxzIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9CT1VORElOR19SRUNUX1dJRFRIID0KKyAgICAgIDE2LCAgLy8gRGlzdGFuY2UgYmV0d2VlbiB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBsZWZ0bW9zdCBwYXJ0aWNsZSBwb2ludAorICAgICAgICAgICAvLyBhbmQgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHRtb3N0IHBhcnRpY2xlIHBvaW50LgorICBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfSEVJR0hUID0KKyAgICAgIDE3LCAgLy8gRGlzdGFuY2UgYmV0d2VlbiB0aGUgeS1jb29yZGluYXRlIG9mIGhpZ2hlc3QgcGFydGljbGUgcG9pbnQgYW5kCisgICAgICAgICAgIC8vIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGxvd2VzdCBwYXJ0aWNsZSBwb2ludC4KKyAgSU1BUV9NVF9CT1VORElOR19SRUNUX0RJQUdPTkFMID0KKyAgICAgIDE4LCAgLy8gRGlzdGFuY2UgYmV0d2VlbiBvcHBvc2l0ZSBjb3JuZXJzIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCisgIElNQVFfTVRfUEVSSU1FVEVSID0gMTksICAvLyBMZW5ndGggb2YgdGhlIG91dGVyIGJvdW5kYXJ5IG9mIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9DT05WRVhfSFVMTF9QRVJJTUVURVIgPSAyMCwgIC8vIFBlcmltZXRlciBvZiB0aGUgc21hbGxlc3QgY29udmV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2x5Z29uIGNvbnRhaW5pbmcgYWxsIHBvaW50cyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnRpY2xlLgorICBJTUFRX01UX0hPTEVTX1BFUklNRVRFUiA9CisgICAgICAyMSwgIC8vIFN1bSBvZiB0aGUgcGVyaW1ldGVycyBvZiBlYWNoIGhvbGUgaW4gdGhlIHBhcnRpY2xlLgorICBJTUFRX01UX01BWF9GRVJFVF9ESUFNRVRFUiA9IDIyLCAgLy8gRGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcGVyaW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludHMgdGhhdCBhcmUgdGhlIGZ1cnRoZXN0IGFwYXJ0LgorICBJTUFRX01UX0VRVUlWQUxFTlRfRUxMSVBTRV9NQUpPUl9BWElTID0KKyAgICAgIDIzLCAgLy8gTGVuZ3RoIG9mIHRoZSBtYWpvciBheGlzIG9mIHRoZSBlbGxpcHNlIHdpdGggdGhlIHNhbWUgcGVyaW1ldGVyCisgICAgICAgICAgIC8vIGFuZCBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9FUVVJVkFMRU5UX0VMTElQU0VfTUlOT1JfQVhJUyA9CisgICAgICAyNCwgIC8vIExlbmd0aCBvZiB0aGUgbWlub3IgYXhpcyBvZiB0aGUgZWxsaXBzZSB3aXRoIHRoZSBzYW1lIHBlcmltZXRlcgorICAgICAgICAgICAvLyBhbmQgYXJlYSBhcyB0aGUgcGFydGljbGUuCisgIElNQVFfTVRfRVFVSVZBTEVOVF9FTExJUFNFX01JTk9SX0FYSVNfRkVSRVQgPQorICAgICAgMjUsICAvLyBMZW5ndGggb2YgdGhlIG1pbm9yIGF4aXMgb2YgdGhlIGVsbGlwc2Ugd2l0aCB0aGUgc2FtZSBhcmVhIGFzIHRoZQorICAgICAgICAgICAvLyBwYXJ0aWNsZSwgYW5kIE1ham9yIEF4aXMgZXF1YWwgaW4gbGVuZ3RoIHRvIHRoZSBNYXggRmVyZXQKKyAgICAgICAgICAgLy8gRGlhbWV0ZXIuCisgIElNQVFfTVRfRVFVSVZBTEVOVF9SRUNUX0xPTkdfU0lERSA9IDI2LCAgLy8gTG9uZ2VzdCBzaWRlIG9mIHRoZSByZWN0YW5nbGUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIHBlcmltZXRlciBhbmQgYXJlYSBhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9FUVVJVkFMRU5UX1JFQ1RfU0hPUlRfU0lERSA9IDI3LCAgLy8gU2hvcnRlc3Qgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIHNhbWUgcGVyaW1ldGVyIGFuZCBhcmVhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9FUVVJVkFMRU5UX1JFQ1RfRElBR09OQUwgPSAyOCwgIC8vIERpc3RhbmNlIGJldHdlZW4gb3Bwb3NpdGUgY29ybmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJpbWV0ZXIgYW5kIGFyZWEgYXMgdGhlIHBhcnRpY2xlLgorICBJTUFRX01UX0VRVUlWQUxFTlRfUkVDVF9TSE9SVF9TSURFX0ZFUkVUID0KKyAgICAgIDI5LCAgLy8gU2hvcnRlc3Qgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIHNhbWUgYXJlYSBhcyB0aGUgcGFydGljbGUsCisgICAgICAgICAgIC8vIGFuZCBsb25nZXN0IHNpZGUgZXF1YWwgaW4gbGVuZ3RoIHRvIHRoZSBNYXggRmVyZXQgRGlhbWV0ZXIuCisgIElNQVFfTVRfQVZFUkFHRV9IT1JJWl9TRUdNRU5UX0xFTkdUSCA9CisgICAgICAzMCwgIC8vIEF2ZXJhZ2UgbGVuZ3RoIG9mIGEgaG9yaXpvbnRhbCBzZWdtZW50IGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9BVkVSQUdFX1ZFUlRfU0VHTUVOVF9MRU5HVEggPQorICAgICAgMzEsICAvLyBBdmVyYWdlIGxlbmd0aCBvZiBhIHZlcnRpY2FsIHNlZ21lbnQgaW4gdGhlIHBhcnRpY2xlLgorICBJTUFRX01UX0hZRFJBVUxJQ19SQURJVVMgPQorICAgICAgMzIsICAvLyBUaGUgcGFydGljbGUgYXJlYSBkaXZpZGVkIGJ5IHRoZSBwYXJ0aWNsZSBwZXJpbWV0ZXIuCisgIElNQVFfTVRfV0FEREVMX0RJU0tfRElBTUVURVIgPQorICAgICAgMzMsICAvLyBEaWFtZXRlciBvZiBhIGRpc2sgd2l0aCB0aGUgc2FtZSBhcmVhIGFzIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9BUkVBID0gMzUsICAvLyBBcmVhIG9mIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9IT0xFU19BUkVBID0gMzYsICAvLyBTdW0gb2YgdGhlIGFyZWFzIG9mIGVhY2ggaG9sZSBpbiB0aGUgcGFydGljbGUuCisgIElNQVFfTVRfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEgPQorICAgICAgMzcsICAvLyBBcmVhIG9mIGEgcGFydGljbGUgdGhhdCBjb21wbGV0ZWx5IGNvdmVycyB0aGUgaW1hZ2UuCisgIElNQVFfTVRfQ09OVkVYX0hVTExfQVJFQSA9IDM4LCAgLy8gQXJlYSBvZiB0aGUgc21hbGxlc3QgY29udmV4IHBvbHlnb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250YWluaW5nIGFsbCBwb2ludHMgaW4gdGhlIHBhcnRpY2xlLgorICBJTUFRX01UX0lNQUdFX0FSRUEgPSAzOSwgIC8vIEFyZWEgb2YgdGhlIGltYWdlLgorICBJTUFRX01UX05VTUJFUl9PRl9IT0xFUyA9IDQxLCAgLy8gTnVtYmVyIG9mIGhvbGVzIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9OVU1CRVJfT0ZfSE9SSVpfU0VHTUVOVFMgPQorICAgICAgNDIsICAvLyBOdW1iZXIgb2YgaG9yaXpvbnRhbCBzZWdtZW50cyBpbiB0aGUgcGFydGljbGUuCisgIElNQVFfTVRfTlVNQkVSX09GX1ZFUlRfU0VHTUVOVFMgPQorICAgICAgNDMsICAvLyBOdW1iZXIgb2YgdmVydGljYWwgc2VnbWVudHMgaW4gdGhlIHBhcnRpY2xlLgorICBJTUFRX01UX09SSUVOVEFUSU9OID0gNDUsICAvLyBUaGUgYW5nbGUgb2YgdGhlIGxpbmUgdGhhdCBwYXNzZXMgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFydGljbGUgQ2VudGVyIG9mIE1hc3MgYWJvdXQgd2hpY2ggdGhlIHBhcnRpY2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgbG93ZXN0IG1vbWVudCBvZiBpbmVydGlhLgorICBJTUFRX01UX01BWF9GRVJFVF9ESUFNRVRFUl9PUklFTlRBVElPTiA9CisgICAgICA0NiwgIC8vIFRoZSBhbmdsZSBvZiB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3byBwZXJpbWV0ZXIgcG9pbnRzCisgICAgICAgICAgIC8vIHRoYXQgYXJlIHRoZSBmdXJ0aGVzdCBhcGFydC4KKyAgSU1BUV9NVF9BUkVBX0JZX0lNQUdFX0FSRUEgPQorICAgICAgNDgsICAvLyBQZXJjZW50YWdlIG9mIHRoZSBwYXJ0aWNsZSBBcmVhIGNvdmVyaW5nIHRoZSBJbWFnZSBBcmVhLgorICBJTUFRX01UX0FSRUFfQllfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEgPSA0OSwgIC8vIFBlcmNlbnRhZ2Ugb2YgdGhlIHBhcnRpY2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXJlYSBpbiByZWxhdGlvbiB0byBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJ0aWNsZSBhbmQgSG9sZXMgQXJlYS4KKyAgSU1BUV9NVF9SQVRJT19PRl9FUVVJVkFMRU5UX0VMTElQU0VfQVhFUyA9IDUwLCAgLy8gRXF1aXZhbGVudCBFbGxpcHNlIE1ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF4aXMgZGl2aWRlZCBieSBFcXVpdmFsZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsbGlwc2UgTWlub3IgQXhpcy4KKyAgSU1BUV9NVF9SQVRJT19PRl9FUVVJVkFMRU5UX1JFQ1RfU0lERVMgPQorICAgICAgNTEsICAvLyBFcXVpdmFsZW50IFJlY3QgTG9uZyBTaWRlIGRpdmlkZWQgYnkgRXF1aXZhbGVudCBSZWN0IFNob3J0IFNpZGUuCisgIElNQVFfTVRfRUxPTkdBVElPTl9GQUNUT1IgPQorICAgICAgNTMsICAvLyBNYXggRmVyZXQgRGlhbWV0ZXIgZGl2aWRlZCBieSBFcXVpdmFsZW50IFJlY3QgU2hvcnQgU2lkZSAoRmVyZXQpLgorICBJTUFRX01UX0NPTVBBQ1RORVNTX0ZBQ1RPUiA9IDU0LCAgLy8gQXJlYSBkaXZpZGVkIGJ5IHRoZSBwcm9kdWN0IG9mIEJvdW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWN0IFdpZHRoIGFuZCBCb3VuZGluZyBSZWN0IEhlaWdodC4KKyAgSU1BUV9NVF9IRVlXT09EX0NJUkNVTEFSSVRZX0ZBQ1RPUiA9IDU1LCAgLy8gUGVyaW1ldGVyIGRpdmlkZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNpcmN1bWZlcmVuY2Ugb2YgYSBjaXJjbGUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBhcmVhLgorICBJTUFRX01UX1RZUEVfRkFDVE9SID0gNTYsICAvLyBGYWN0b3IgcmVsYXRpbmcgYXJlYSB0byBtb21lbnQgb2YgaW5lcnRpYS4KKyAgSU1BUV9NVF9TVU1fWCA9IDU4LCAgLy8gVGhlIHN1bSBvZiBhbGwgeC1jb29yZGluYXRlcyBpbiB0aGUgcGFydGljbGUuCisgIElNQVFfTVRfU1VNX1kgPSA1OSwgIC8vIFRoZSBzdW0gb2YgYWxsIHktY29vcmRpbmF0ZXMgaW4gdGhlIHBhcnRpY2xlLgorICBJTUFRX01UX1NVTV9YWCA9IDYwLCAgLy8gVGhlIHN1bSBvZiBhbGwgeC1jb29yZGluYXRlcyBzcXVhcmVkIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9TVU1fWFkgPQorICAgICAgNjEsICAvLyBUaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIHRpbWVzIHktY29vcmRpbmF0ZXMgaW4gdGhlIHBhcnRpY2xlLgorICBJTUFRX01UX1NVTV9ZWSA9IDYyLCAgLy8gVGhlIHN1bSBvZiBhbGwgeS1jb29yZGluYXRlcyBzcXVhcmVkIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9TVU1fWFhYID0gNjMsICAvLyBUaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIGN1YmVkIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9TVU1fWFhZID0gNjQsICAvLyBUaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIHNxdWFyZWQgdGltZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB5LWNvb3JkaW5hdGVzIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9TVU1fWFlZID0gNjUsICAvLyBUaGUgc3VtIG9mIGFsbCB4LWNvb3JkaW5hdGVzIHRpbWVzIHktY29vcmRpbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcXVhcmVkIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9TVU1fWVlZID0gNjYsICAvLyBUaGUgc3VtIG9mIGFsbCB5LWNvb3JkaW5hdGVzIGN1YmVkIGluIHRoZSBwYXJ0aWNsZS4KKyAgSU1BUV9NVF9NT01FTlRfT0ZfSU5FUlRJQV9YWCA9CisgICAgICA2OCwgIC8vIFRoZSBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeC1kaXJlY3Rpb24gdHdpY2UuCisgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWFkgPQorICAgICAgNjksICAvLyBUaGUgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHggYW5kIHkgZGlyZWN0aW9ucy4KKyAgSU1BUV9NVF9NT01FTlRfT0ZfSU5FUlRJQV9ZWSA9CisgICAgICA3MCwgIC8vIFRoZSBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeS1kaXJlY3Rpb24gdHdpY2UuCisgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWFhYID0KKyAgICAgIDcxLCAgLy8gVGhlIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LWRpcmVjdGlvbiB0aHJlZSB0aW1lcy4KKyAgSU1BUV9NVF9NT01FTlRfT0ZfSU5FUlRJQV9YWFkgPSA3MiwgIC8vIFRoZSBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHgtZGlyZWN0aW9uIHR3aWNlIGFuZCB0aGUgeS1kaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UuCisgIElNQVFfTVRfTU9NRU5UX09GX0lORVJUSUFfWFlZID0gNzMsICAvLyBUaGUgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4LWRpcmVjdGlvbiBvbmNlIGFuZCB0aGUgeS1kaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR3aWNlLgorICBJTUFRX01UX01PTUVOVF9PRl9JTkVSVElBX1lZWSA9CisgICAgICA3NCwgIC8vIFRoZSBtb21lbnQgb2YgaW5lcnRpYSBpbiB0aGUgeS1kaXJlY3Rpb24gdGhyZWUgdGltZXMuCisgIElNQVFfTVRfTk9STV9NT01FTlRfT0ZfSU5FUlRJQV9YWCA9CisgICAgICA3NSwgIC8vIFRoZSBub3JtYWxpemVkIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LWRpcmVjdGlvbiB0d2ljZS4KKyAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1hZID0KKyAgICAgIDc2LCAgLy8gVGhlIG5vcm1hbGl6ZWQgbW9tZW50IG9mIGluZXJ0aWEgaW4gdGhlIHgtIGFuZCB5LWRpcmVjdGlvbnMuCisgIElNQVFfTVRfTk9STV9NT01FTlRfT0ZfSU5FUlRJQV9ZWSA9CisgICAgICA3NywgIC8vIFRoZSBub3JtYWxpemVkIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB5LWRpcmVjdGlvbiB0d2ljZS4KKyAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1hYWCA9CisgICAgICA3OCwgIC8vIFRoZSBub3JtYWxpemVkIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB4LWRpcmVjdGlvbiB0aHJlZSB0aW1lcy4KKyAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1hYWSA9IDc5LCAgLy8gVGhlIG5vcm1hbGl6ZWQgbW9tZW50IG9mIGluZXJ0aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHgtZGlyZWN0aW9uIHR3aWNlIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geS1kaXJlY3Rpb24gb25jZS4KKyAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1hZWSA9IDgwLCAgLy8gVGhlIG5vcm1hbGl6ZWQgbW9tZW50IG9mIGluZXJ0aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHgtZGlyZWN0aW9uIG9uY2UgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB5LWRpcmVjdGlvbiB0d2ljZS4KKyAgSU1BUV9NVF9OT1JNX01PTUVOVF9PRl9JTkVSVElBX1lZWSA9CisgICAgICA4MSwgIC8vIFRoZSBub3JtYWxpemVkIG1vbWVudCBvZiBpbmVydGlhIGluIHRoZSB5LWRpcmVjdGlvbiB0aHJlZSB0aW1lcy4KKyAgSU1BUV9NVF9IVV9NT01FTlRfMSA9IDgyLCAgLy8gVGhlIGZpcnN0IEh1IG1vbWVudC4KKyAgSU1BUV9NVF9IVV9NT01FTlRfMiA9IDgzLCAgLy8gVGhlIHNlY29uZCBIdSBtb21lbnQuCisgIElNQVFfTVRfSFVfTU9NRU5UXzMgPSA4NCwgIC8vIFRoZSB0aGlyZCBIdSBtb21lbnQuCisgIElNQVFfTVRfSFVfTU9NRU5UXzQgPSA4NSwgIC8vIFRoZSBmb3VydGggSHUgbW9tZW50LgorICBJTUFRX01UX0hVX01PTUVOVF81ID0gODYsICAvLyBUaGUgZmlmdGggSHUgbW9tZW50LgorICBJTUFRX01UX0hVX01PTUVOVF82ID0gODcsICAvLyBUaGUgc2l4dGggSHUgbW9tZW50LgorICBJTUFRX01UX0hVX01PTUVOVF83ID0gODgsICAvLyBUaGUgc2V2ZW50aCBIdSBtb21lbnQuCisgIElNQVFfTUVBU1VSRU1FTlRfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBNZWFzdXJlbWVudFR5cGU7CisKK3R5cGVkZWYgZW51bSBHZW9tZXRyaWNNYXRjaGluZ01vZGVfZW51bSB7CisgIElNQVFfR0VPTUVUUklDX01BVENIX1NISUZUX0lOVkFSSUFOVCA9CisgICAgICAwLCAgLy8gU2VhcmNoZXMgZm9yIG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuIGluIHRoZSBpbWFnZSwgYXNzdW1pbmcgdGhhdAorICAgICAgICAgIC8vIHRoZSBwYXR0ZXJuIGlzIG5vdCByb3RhdGVkIG1vcmUgdGhhbiBwbHVzIG9yIG1pbnVzIDUgZGVncmVlcy4KKyAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hfUk9UQVRJT05fSU5WQVJJQU5UID0KKyAgICAgIDEsICAvLyBTZWFyY2hlcyBmb3Igb2NjdXJyZW5jZXMgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIGltYWdlIHdpdGggcmVkdWNlZAorICAgICAgICAgIC8vIHJlc3RyaWN0aW9uIG9uIHRoZSByb3RhdGlvbiBvZiB0aGUgcGF0dGVybi4KKyAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hfU0NBTEVfSU5WQVJJQU5UID0KKyAgICAgIDIsICAvLyBTZWFyY2hlcyBmb3Igb2NjdXJyZW5jZXMgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIGltYWdlIHdpdGggcmVkdWNlZAorICAgICAgICAgIC8vIHJlc3RyaWN0aW9uIG9uIHRoZSBzaXplIG9mIHRoZSBwYXR0ZXJuLgorICBJTUFRX0dFT01FVFJJQ19NQVRDSF9PQ0NMVVNJT05fSU5WQVJJQU5UID0KKyAgICAgIDQsICAvLyBTZWFyY2hlcyBmb3Igb2NjdXJyZW5jZXMgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIGltYWdlLCBhbGxvd2luZyBmb3IKKyAgICAgICAgICAvLyBhIHNwZWNpZmllZCBwZXJjZW50YWdlIG9mIHRoZSBwYXR0ZXJuIHRvIGJlIG9jY2x1ZGVkLgorICBJTUFRX0dFT01FVFJJQ19NQVRDSElOR19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEdlb21ldHJpY01hdGNoaW5nTW9kZTsKKwordHlwZWRlZiBlbnVtIEJ1dHRvbkxhYmVsX2VudW0geworICBJTUFRX0JVVFRPTl9PSyA9IDAsICAvLyBUaGUgbGFiZWwgIk9LIi4KKyAgSU1BUV9CVVRUT05fU0FWRSA9IDEsICAvLyBUaGUgbGFiZWwgIlNhdmUiLgorICBJTUFRX0JVVFRPTl9TRUxFQ1QgPSAyLCAgLy8gVGhlIGxhYmVsICJTZWxlY3QiLgorICBJTUFRX0JVVFRPTl9MT0FEID0gMywgIC8vIFRoZSBsYWJlbCAiTG9hZCIuCisgIElNQVFfQlVUVE9OX0xBQkVMX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEJ1dHRvbkxhYmVsOworCit0eXBlZGVmIGVudW0gTmVhcmVzdE5laWdoYm9yTWV0aG9kX2VudW0geworICBJTUFRX01JTklNVU1fTUVBTl9ESVNUQU5DRSA9IDAsICAvLyBUaGUgbWluaW11bSBtZWFuIGRpc3RhbmNlIG1ldGhvZC4KKyAgSU1BUV9LX05FQVJFU1RfTkVJR0hCT1IgPSAxLCAgLy8gVGhlIGstbmVhcmVzdCBuZWlnaGJvciBtZXRob2QuCisgIElNQVFfTkVBUkVTVF9QUk9UT1RZUEUgPSAyLCAgLy8gVGhlIG5lYXJlc3QgcHJvdG90eXBlIG1ldGhvZC4KKyAgSU1BUV9ORUFSRVNUX05FSUdIQk9SX01FVEhPRF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBOZWFyZXN0TmVpZ2hib3JNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBRUk1pcnJvck1vZGVfZW51bSB7CisgIElNQVFfUVJfTUlSUk9SX01PREVfQVVUT19ERVRFQ1QgPQorICAgICAgLTIsICAvLyBUaGUgZnVuY3Rpb24gc2hvdWxkIGRldGVybWluZSBpZiB0aGUgUVIgY29kZSBpcyBtaXJyb3JlZC4KKyAgSU1BUV9RUl9NSVJST1JfTU9ERV9NSVJST1JFRCA9CisgICAgICAxLCAgLy8gVGhlIGZ1bmN0aW9uIHNob3VsZCBleHBlY3QgdGhlIFFSIGNvZGUgdG8gYXBwZWFyIG1pcnJvcmVkLgorICBJTUFRX1FSX01JUlJPUl9NT0RFX05PUk1BTCA9CisgICAgICAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNob3VsZCBleHBlY3QgdGhlIFFSIGNvZGUgdG8gYXBwZWFyIG5vcm1hbC4KKyAgSU1BUV9RUl9NSVJST1JfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBRUk1pcnJvck1vZGU7CisKK3R5cGVkZWYgZW51bSBDb2x1bW5Qcm9jZXNzaW5nTW9kZV9lbnVtIHsKKyAgSU1BUV9BVkVSQUdFX0NPTFVNTlMgPSAwLCAgLy8gQXZlcmFnZXMgdGhlIGRhdGEgZXh0cmFjdGVkIGZvciBlZGdlIGRldGVjdGlvbi4KKyAgSU1BUV9NRURJQU5fQ09MVU1OUyA9CisgICAgICAxLCAgLy8gVGFrZXMgdGhlIG1lZGlhbiBvZiB0aGUgZGF0YSBleHRyYWN0ZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorICBJTUFRX0NPTFVNTl9QUk9DRVNTSU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQ29sdW1uUHJvY2Vzc2luZ01vZGU7CisKK3R5cGVkZWYgZW51bSBGaW5kUmVmZXJlbmNlRGlyZWN0aW9uX2VudW0geworICBJTUFRX0xFRlRfVE9fUklHSFRfRElSRUNUID0gMCwgIC8vIFNlYXJjaGVzIGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlYSB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2VhcmNoIGFyZWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYSBkaXJlY3QgYXhpcy4KKyAgSU1BUV9MRUZUX1RPX1JJR0hUX0lORElSRUNUID0gMSwgIC8vIFNlYXJjaGVzIGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmVhIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFuIGluZGlyZWN0IGF4aXMuCisgIElNQVFfVE9QX1RPX0JPVFRPTV9ESVJFQ1QgPSAyLCAgLy8gU2VhcmNoZXMgZnJvbSB0aGUgdG9wIG9mIHRoZSBzZWFyY2ggYXJlYSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBib3R0b20gb2YgdGhlIHNlYXJjaCBhcmVhIGZvciBhIGRpcmVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF4aXMuCisgIElNQVFfVE9QX1RPX0JPVFRPTV9JTkRJUkVDVCA9IDMsICAvLyBTZWFyY2hlcyBmcm9tIHRoZSB0b3Agb2YgdGhlIHNlYXJjaCBhcmVhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYm90dG9tIG9mIHRoZSBzZWFyY2ggYXJlYSBmb3IgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGlyZWN0IGF4aXMuCisgIElNQVFfUklHSFRfVE9fTEVGVF9ESVJFQ1QgPSA0LCAgLy8gU2VhcmNoZXMgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlYSB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzZWFyY2ggYXJlYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhIGRpcmVjdCBheGlzLgorICBJTUFRX1JJR0hUX1RPX0xFRlRfSU5ESVJFQ1QgPSA1LCAgLy8gU2VhcmNoZXMgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBhcmVhIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFyY2ggYXJlYSBmb3IgYW4gaW5kaXJlY3QgYXhpcy4KKyAgSU1BUV9CT1RUT01fVE9fVE9QX0RJUkVDVCA9IDYsICAvLyBTZWFyY2hlcyBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHNlYXJjaCBhcmVhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHRvcCBvZiB0aGUgc2VhcmNoIGFyZWEgZm9yIGEgZGlyZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXhpcy4KKyAgSU1BUV9CT1RUT01fVE9fVE9QX0lORElSRUNUID0gNywgIC8vIFNlYXJjaGVzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmVhIHRvIHRoZSB0b3Agb2YgdGhlIHNlYXJjaCBhcmVhIGZvciBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaXJlY3QgYXhpcy4KKyAgSU1BUV9GSU5EX0NPT1JEX1NZU19ESVJfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRmluZFJlZmVyZW5jZURpcmVjdGlvbjsKKwordHlwZWRlZiBlbnVtIE11bHRpY29yZU9wZXJhdGlvbl9lbnVtIHsKKyAgSU1BUV9HRVRfQ09SRVMgPQorICAgICAgMCwgIC8vIFRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGNvcmVzIE5JIFZpc2lvbiBpcyBjdXJyZW50bHkgdXNpbmcuCisgIElNQVFfU0VUX0NPUkVTID0gMSwgIC8vIFRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGNvcmVzIGZvciBOSSBWaXNpb24gdG8gdXNlLgorICBJTUFRX1VTRV9NQVhfQVZBSUxBQkxFID0KKyAgICAgIDIsICAvLyBVc2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3IgY29yZXMuCisgIElNQVFfTVVMVElDT1JFX09QRVJBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBNdWx0aWNvcmVPcGVyYXRpb247CisKK3R5cGVkZWYgZW51bSBHcm91cEJlaGF2aW9yX2VudW0geworICBJTUFRX0dST1VQX0NMRUFSID0gMCwgIC8vIFNldHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdmVybGF5IGdyb3VwIHRvIGNsZWFyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgc2V0dGluZ3Mgd2hlbiBhbiBpbWFnZSBpcyB0cmFuc2Zvcm1lZC4KKyAgSU1BUV9HUk9VUF9LRUVQID0gMSwgIC8vIFNldHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdmVybGF5IGdyb3VwIHRvIGtlZXAgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHNldHRpbmdzIHdoZW4gYW4gaW1hZ2UgaXMgdHJhbnNmb3JtZWQuCisgIElNQVFfR1JPVVBfVFJBTlNGT1JNID0KKyAgICAgIDIsICAvLyBTZXRzIHRoZSBiZWhhdmlvciBvZiB0aGUgb3ZlcmxheSBncm91cCB0byB0cmFuc2Zvcm0gd2l0aCB0aGUgaW1hZ2UuCisgIElNQVFfR1JPVVBfQkVIQVZJT1JfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gR3JvdXBCZWhhdmlvcjsKKwordHlwZWRlZiBlbnVtIFFSRGltZW5zaW9uc19lbnVtIHsKKyAgSU1BUV9RUl9ESU1FTlNJT05TX0FVVE9fREVURUNUID0gMCwgIC8vIFRoZSBmdW5jdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMXgxMSA9CisgICAgICAxMSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMSB4IDExLgorICBJTUFRX1FSX0RJTUVOU0lPTlNfMTN4MTMgPQorICAgICAgMTMsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTMgeCAxMy4KKyAgSU1BUV9RUl9ESU1FTlNJT05TXzE1eDE1ID0KKyAgICAgIDE1LCAgLy8gU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDE1IHggMTUuCisgIElNQVFfUVJfRElNRU5TSU9OU18xN3gxNyA9CisgICAgICAxNywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNyB4IDE3LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfMjF4MjEgPQorICAgICAgMjEsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMjEgeCAyMS4KKyAgSU1BUV9RUl9ESU1FTlNJT05TXzI1eDI1ID0KKyAgICAgIDI1LCAgLy8gU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDI1IHggMjUuCisgIElNQVFfUVJfRElNRU5TSU9OU18yOXgyOSA9CisgICAgICAyOSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAyOSB4IDI5LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfMzN4MzMgPQorICAgICAgMzMsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMzMgeCAzMy4KKyAgSU1BUV9RUl9ESU1FTlNJT05TXzM3eDM3ID0KKyAgICAgIDM3LCAgLy8gU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDM3IHggMzcuCisgIElNQVFfUVJfRElNRU5TSU9OU180MXg0MSA9CisgICAgICA0MSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyA0MSB4IDQxLgorICBJTUFRX1FSX0RJTUVOU0lPTlNfNDV4NDUgPQorICAgICAgNDUsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNDUgeCA0NS4KKyAgSU1BUV9RUl9ESU1FTlNJT05TXzQ5eDQ5ID0KKyAgICAgIDQ5LCAgLy8gU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDQ5IHggNDkuCisgIElNQVFfUVJfRElNRU5TSU9OU181M3g1MyA9CisgICAgICA1MywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyA1MyB4IDUzLgorICBJTUFRX1FSX0RJTUVOU0lPTlNfNTd4NTcgPQorICAgICAgNTcsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNTcgeCA1Ny4KKyAgSU1BUV9RUl9ESU1FTlNJT05TXzYxeDYxID0KKyAgICAgIDYxLCAgLy8gU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDYxIHggNjEuCisgIElNQVFfUVJfRElNRU5TSU9OU182NXg2NSA9CisgICAgICA2NSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyA2NSB4IDY1LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfNjl4NjkgPQorICAgICAgNjksICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgNjkgeCA2OS4KKyAgSU1BUV9RUl9ESU1FTlNJT05TXzczeDczID0KKyAgICAgIDczLCAgLy8gU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDczIHggNzMuCisgIElNQVFfUVJfRElNRU5TSU9OU183N3g3NyA9CisgICAgICA3NywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyA3NyB4IDc3LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfODF4ODEgPQorICAgICAgODEsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgODEgeCA4MS4KKyAgSU1BUV9RUl9ESU1FTlNJT05TXzg1eDg1ID0KKyAgICAgIDg1LCAgLy8gU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDg1IHggODUuCisgIElNQVFfUVJfRElNRU5TSU9OU184OXg4OSA9CisgICAgICA4OSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyA4OSB4IDg5LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfOTN4OTMgPQorICAgICAgOTMsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgOTMgeCA5My4KKyAgSU1BUV9RUl9ESU1FTlNJT05TXzk3eDk3ID0KKyAgICAgIDk3LCAgLy8gU3BlY2lmaWVzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBRUiBjb2RlIGFzIDk3IHggOTcuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMDF4MTAxID0KKyAgICAgIDEwMSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMDEgeCAxMDEuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMDV4MTA1ID0KKyAgICAgIDEwNSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMDUgeCAxMDUuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMDl4MTA5ID0KKyAgICAgIDEwOSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMDkgeCAxMDkuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMTN4MTEzID0KKyAgICAgIDExMywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMTMgeCAxMTMuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMTd4MTE3ID0KKyAgICAgIDExNywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMTcgeCAxMTcuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMjF4MTIxID0KKyAgICAgIDEyMSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMjEgeCAxMjEuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMjV4MTI1ID0KKyAgICAgIDEyNSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMjUgeCAxMjUuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMjl4MTI5ID0KKyAgICAgIDEyOSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMjkgeCAxMjkuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMzN4MTMzID0KKyAgICAgIDEzMywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMzMgeCAxMzMuCisgIElNQVFfUVJfRElNRU5TSU9OU18xMzd4MTM3ID0KKyAgICAgIDEzNywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxMzcgeCAxMzcuCisgIElNQVFfUVJfRElNRU5TSU9OU18xNDF4MTQxID0KKyAgICAgIDE0MSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNDEgeCAxNDEuCisgIElNQVFfUVJfRElNRU5TSU9OU18xNDV4MTQ1ID0KKyAgICAgIDE0NSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNDUgeCAxNDUuCisgIElNQVFfUVJfRElNRU5TSU9OU18xNDl4MTQ5ID0KKyAgICAgIDE0OSwgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNDkgeCAxNDkuCisgIElNQVFfUVJfRElNRU5TSU9OU18xNTN4MTUzID0KKyAgICAgIDE1MywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNTMgeCAxNTMuCisgIElNQVFfUVJfRElNRU5TSU9OU18xNTd4MTU3ID0KKyAgICAgIDE1NywgIC8vIFNwZWNpZmllcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUVIgY29kZSBhcyAxNTcgeCAxNTM3LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfMTYxeDE2MSA9CisgICAgICAxNjEsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTYxIHggMTYxLgorICBJTUFRX1FSX0RJTUVOU0lPTlNfMTY1eDE2NSA9CisgICAgICAxNjUsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTY1IHggMTY1LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfMTY5eDE2OSA9CisgICAgICAxNjksICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTY5IHggMTY5LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfMTczeDE3MyA9CisgICAgICAxNzMsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTczIHggMTczLgorICBJTUFRX1FSX0RJTUVOU0lPTlNfMTc3eDE3NyA9CisgICAgICAxNzcsICAvLyBTcGVjaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFFSIGNvZGUgYXMgMTc3IHggMTc3LgorICBJTUFRX1FSX0RJTUVOU0lPTlNfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUVJEaW1lbnNpb25zOworCit0eXBlZGVmIGVudW0gUVJDZWxsRmlsdGVyTW9kZV9lbnVtIHsKKyAgSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX0FVVE9fREVURUNUID0KKyAgICAgIC0yLCAgLy8gVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGFsbCBmaWx0ZXIgbW9kZXMgYW5kIHVzZXMgdGhlIG9uZSB0aGF0CisgICAgICAgICAgIC8vIGRlY29kZXMgdGhlIFFSIGNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQgdXRpbGl6aW5nIHRoZQorICAgICAgICAgICAvLyBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX0FWRVJBR0UgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlZCBwaXhlbHMuCisgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9NRURJQU4gPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjZWxsIHRvIHRoZSBtZWRpYW4gb2YgdGhlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbHMuCisgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9DRU5UUkFMX0FWRVJBR0UgPQorICAgICAgMiwgIC8vIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2Ugb2YKKyAgICAgICAgICAvLyB0aGUgcGl4ZWxzIGluIHRoZSBjZW50ZXIgb2YgdGhlIGNlbGwgc2FtcGxlLgorICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfSElHSF9BVkVSQUdFID0KKyAgICAgIDMsICAvLyBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBhdmVyYWdlIHZhbHVlCisgICAgICAgICAgLy8gb2YgdGhlIGhhbGYgb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGhpZ2hlc3QgcGl4ZWwgdmFsdWVzLgorICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfTE9XX0FWRVJBR0UgPQorICAgICAgNCwgIC8vIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUKKyAgICAgICAgICAvLyBvZiB0aGUgaGFsZiBvZiB0aGUgc2FtcGxlZCBwaXhlbHMgd2l0aCB0aGUgbG93ZXN0IHBpeGVsIHZhbHVlcy4KKyAgSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX1ZFUllfSElHSF9BVkVSQUdFID0KKyAgICAgIDUsICAvLyBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBhdmVyYWdlIHZhbHVlCisgICAgICAgICAgLy8gb2YgdGhlIG5pbnRoIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBoaWdoZXN0IHBpeGVsIHZhbHVlcy4KKyAgSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX1ZFUllfTE9XX0FWRVJBR0UgPQorICAgICAgNiwgIC8vIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUKKyAgICAgICAgICAvLyBvZiB0aGUgbmludGggb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGxvd2VzdCBwaXhlbCB2YWx1ZXMuCisgIElNQVFfUVJfQ0VMTF9GSUxURVJfTU9ERV9BTEwgPQorICAgICAgOCwgIC8vIFRoZSBmdW5jdGlvbiB0cmllcyBlYWNoIGZpbHRlciBtb2RlLCBzdGFydGluZyB3aXRoCisgICAgICAgICAgLy8gSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX0FWRVJBR0UgYW5kIGVuZGluZyB3aXRoCisgICAgICAgICAgLy8gSU1BUV9RUl9DRUxMX0ZJTFRFUl9NT0RFX1ZFUllfTE9XX0FWRVJBR0UsIHN0b3BwaW5nIG9uY2UgYSBmaWx0ZXIKKyAgICAgICAgICAvLyBtb2RlIGRlY29kZXMgY29ycmVjdGx5LgorICBJTUFRX1FSX0NFTExfRklMVEVSX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUVJDZWxsRmlsdGVyTW9kZTsKKwordHlwZWRlZiBlbnVtIFJvdW5kaW5nTW9kZV9lbnVtIHsKKyAgSU1BUV9ST1VORElOR19NT0RFX09QVElNSVpFID0KKyAgICAgIDAsICAvLyBSb3VuZHMgdGhlIHJlc3VsdCBvZiBhIGRpdmlzaW9uIHVzaW5nIHRoZSBiZXN0IGF2YWlsYWJsZSBtZXRob2QuCisgIElNQVFfUk9VTkRJTkdfTU9ERV9UUlVOQ0FURSA9IDEsICAvLyBUcnVuY2F0ZXMgdGhlIHJlc3VsdCBvZiBhIGRpdmlzaW9uLgorICBJTUFRX1JPVU5ESU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUm91bmRpbmdNb2RlOworCit0eXBlZGVmIGVudW0gUVJEZW1vZHVsYXRpb25Nb2RlX2VudW0geworICBJTUFRX1FSX0RFTU9EVUxBVElPTl9NT0RFX0FVVE9fREVURUNUID0KKyAgICAgIC0yLCAgLy8gVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGVhY2ggZGVtb2R1bGF0aW9uIG1vZGUgYW5kIHVzZSB0aGUgb25lIHdoaWNoCisgICAgICAgICAgIC8vIGRlY29kZXMgdGhlIFFSIGNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQgdXRpbGl6aW5nIHRoZQorICAgICAgICAgICAvLyBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9ISVNUT0dSQU0gPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBoaXN0b2dyYW0gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG9mIHRoZSBRUiBjZWxscyB0byBjYWxjdWxhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSB0aHJlc2hvbGQuCisgIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfTE9DQUxfQ09OVFJBU1QgPQorICAgICAgMSwgIC8vIFRoZSBmdW5jdGlvbiBleGFtaW5lcyBlYWNoIG9mIHRoZSBjZWxsJ3MgbmVpZ2hib3JzIHRvIGRldGVybWluZSBpZgorICAgICAgICAgIC8vIHRoZSBjZWxsIGlzIG9uIG9yIG9mZi4KKyAgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9DT01CSU5FRCA9IDIsICAvLyBUaGUgZnVuY3Rpb24gdXNlcyB0aGUgaGlzdG9ncmFtIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFFSIGNvZGUgdG8gY2FsY3VsYXRlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlc2hvbGQuCisgIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfQUxMID0KKyAgICAgIDMsICAvLyBUaGUgZnVuY3Rpb24gdHJpZXMgSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9ISVNUT0dSQU0sIHRoZW4KKyAgICAgICAgICAvLyBJTUFRX1FSX0RFTU9EVUxBVElPTl9NT0RFX0xPQ0FMX0NPTlRSQVNUIGFuZCB0aGVuCisgICAgICAgICAgLy8gSU1BUV9RUl9ERU1PRFVMQVRJT05fTU9ERV9DT01CSU5FRCwgc3RvcHBpbmcgb25jZSBvbmUgbW9kZSBpcworICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwuCisgIElNQVFfUVJfREVNT0RVTEFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUVJEZW1vZHVsYXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gQ29udHJhc3RNb2RlX2VudW0geworICBJTUFRX09SSUdJTkFMX0NPTlRSQVNUID0gMCwgIC8vIEluc3RydWN0cyB0aGUgZ2VvbWV0cmljIG1hdGNoaW5nIGFsZ29yaXRobSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbWF0Y2hlcyB3aXRoIHRoZSBzYW1lIGNvbnRyYXN0IGFzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbXBsYXRlLgorICBJTUFRX1JFVkVSU0VEX0NPTlRSQVNUID0gMSwgIC8vIEluc3RydWN0cyB0aGUgZ2VvbWV0cmljIG1hdGNoaW5nIGFsZ29yaXRobSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbWF0Y2hlcyB3aXRoIHRoZSBpbnZlcnRlZCBjb250cmFzdCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZS4KKyAgSU1BUV9CT1RIX0NPTlRSQVNUUyA9IDIsICAvLyBJbnN0cnVjdHMgdGhlIGdlb21ldHJpYyBtYXRjaGluZyBhbGdvcml0aG0gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG1hdGNoZXMgd2l0aCB0aGUgc2FtZSBhbmQgaW52ZXJ0ZWQgY29udHJhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgdGVtcGxhdGUuCit9IENvbnRyYXN0TW9kZTsKKwordHlwZWRlZiBlbnVtIFFSUG9sYXJpdGllc19lbnVtIHsKKyAgSU1BUV9RUl9QT0xBUklUWV9BVVRPX0RFVEVDVCA9CisgICAgICAtMiwgIC8vIFRoZSBmdW5jdGlvbiBzaG91bGQgZGV0ZXJtaW5lIHRoZSBwb2xhcml0eSBvZiB0aGUgUVIgY29kZS4KKyAgSU1BUV9RUl9QT0xBUklUWV9CTEFDS19PTl9XSElURSA9IDAsICAvLyBUaGUgZnVuY3Rpb24gc2hvdWxkIHNlYXJjaCBmb3IgYSBRUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgd2l0aCBkYXJrIGRhdGEgb24gYSBicmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLgorICBJTUFRX1FSX1BPTEFSSVRZX1dISVRFX09OX0JMQUNLID0gMSwgIC8vIFRoZSBmdW5jdGlvbiBzaG91bGQgc2VhcmNoIGZvciBhIFFSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSB3aXRoIGJyaWdodCBkYXRhIG9uIGEgZGFyaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQuCisgIElNQVFfUVJfUE9MQVJJVFlfTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBRUlBvbGFyaXRpZXM7CisKK3R5cGVkZWYgZW51bSBRUlJvdGF0aW9uTW9kZV9lbnVtIHsKKyAgSU1BUV9RUl9ST1RBVElPTl9NT0RFX1VOTElNSVRFRCA9CisgICAgICAwLCAgLy8gVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgdW5saW1pdGVkIHJvdGF0aW9uLgorICBJTUFRX1FSX1JPVEFUSU9OX01PREVfMF9ERUdSRUVTID0KKyAgICAgIDEsICAvLyBUaGUgZnVuY3Rpb24gYWxsb3dzIGZvciA/Pz8gNSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICBJTUFRX1FSX1JPVEFUSU9OX01PREVfOTBfREVHUkVFUyA9CisgICAgICAyLCAgLy8gVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiA4NSBhbmQgOTUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgSU1BUV9RUl9ST1RBVElPTl9NT0RFXzE4MF9ERUdSRUVTID0KKyAgICAgIDMsICAvLyBUaGUgZnVuY3Rpb24gYWxsb3dzIGZvciBiZXR3ZWVuIDE3NSBhbmQgMTg1IGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgIElNQVFfUVJfUk9UQVRJT05fTU9ERV8yNzBfREVHUkVFUyA9CisgICAgICA0LCAgLy8gVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiAyNjUgYW5kIDI3NSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICBJTUFRX1FSX1JPVEFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUVJSb3RhdGlvbk1vZGU7CisKK3R5cGVkZWYgZW51bSBRUkdyYWRpbmdNb2RlX2VudW0geworICBJTUFRX1FSX05PX0dSQURJTkcgPQorICAgICAgMCwgIC8vIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBtYWtlIGFueSBwcmVwYXJhdG9yeSBjYWxjdWxhdGlvbnMuCisgIElNQVFfUVJfR1JBRElOR19NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFFSR3JhZGluZ01vZGU7CisKK3R5cGVkZWYgZW51bSBTdHJhaWdodEVkZ2VTZWFyY2hNb2RlX2VudW0geworICBJTUFRX1VTRV9GSVJTVF9SQUtFX0VER0VTID0KKyAgICAgIDAsICAvLyBGaXRzIGEgc3RyYWlnaHQgZWRnZSBvbiB0aGUgZmlyc3QgcG9pbnRzIGRldGVjdGVkIHVzaW5nIGEgcmFrZS4KKyAgSU1BUV9VU0VfQkVTVF9SQUtFX0VER0VTID0KKyAgICAgIDEsICAvLyBGaXRzIGEgc3RyYWlnaHQgZWRnZSBvbiB0aGUgYmVzdCBwb2ludHMgZGV0ZWN0ZWQgdXNpbmcgYSByYWtlLgorICBJTUFRX1VTRV9CRVNUX0hPVUdIX0xJTkUgPSAyLCAgLy8gRmluZHMgdGhlIHN0cm9uZ2VzdCBzdHJhaWdodCBlZGdlIHVzaW5nIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnRzIGRldGVjdGVkIG9uIGEgcmFrZS4KKyAgSU1BUV9VU0VfRklSU1RfUFJPSkVDVElPTl9FREdFID0KKyAgICAgIDMsICAvLyBVc2VzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgcHJvamVjdGVkIGVkZ2UgYXMgdGhlIHN0cmFpZ2h0IGVkZ2UuCisgIElNQVFfVVNFX0JFU1RfUFJPSkVDVElPTl9FREdFID0gNCwgIC8vIEZpbmRzIHRoZSBzdHJvbmdlc3QgcHJvamVjdGVkIGVkZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBzdHJhaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZGdlLgorICBJTUFRX1NUUkFJR0hUX0VER0VfU0VBUkNIX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFN0cmFpZ2h0RWRnZVNlYXJjaE1vZGU7CisKK3R5cGVkZWYgZW51bSBTZWFyY2hEaXJlY3Rpb25fZW51bSB7CisgIElNQVFfU0VBUkNIX0RJUkVDVElPTl9MRUZUX1RPX1JJR0hUID0gMCwgIC8vIFNlYXJjaGVzIGZyb20gdGhlIGxlZnQgc2lkZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGFyZWEgdG8gdGhlIHJpZ2h0IHNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHNlYXJjaCBhcmVhLgorICBJTUFRX1NFQVJDSF9ESVJFQ1RJT05fUklHSFRfVE9fTEVGVCA9IDEsICAvLyBTZWFyY2hlcyBmcm9tIHRoZSByaWdodCBzaWRlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgbGVmdCBzaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzZWFyY2ggYXJlYS4KKyAgSU1BUV9TRUFSQ0hfRElSRUNUSU9OX1RPUF9UT19CT1RUT00gPSAyLCAgLy8gU2VhcmNoZXMgZnJvbSB0aGUgdG9wIHNpZGUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBhcmVhIHRvIHRoZSBib3R0b20gc2lkZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGFyZWEuCisgIElNQVFfU0VBUkNIX0RJUkVDVElPTl9CT1RUT01fVE9fVE9QID0gMywgIC8vIFNlYXJjaGVzIGZyb20gdGhlIGJvdHRvbSBzaWRlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWFyY2ggYXJlYSB0byB0aGUgdG9wIHNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHNlYXJjaCBhcmVhLgorICBJTUFRX1NFQVJDSF9ESVJFQ1RJT05fU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gU2VhcmNoRGlyZWN0aW9uOworCit0eXBlZGVmIGVudW0gUVJTdHJlYW1Nb2RlX2VudW0geworICBJTUFRX1FSX01PREVfTlVNRVJJQyA9CisgICAgICAwLCAgLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGRhdGEgd2FzIGVuY29kZWQgdXNpbmcgbnVtZXJpYyBtb2RlLgorICBJTUFRX1FSX01PREVfQUxQSEFOVU1FUklDID0KKyAgICAgIDEsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSB3YXMgZW5jb2RlZCB1c2luZyBhbHBoYS1udW1lcmljIG1vZGUuCisgIElNQVFfUVJfTU9ERV9SQVdfQllURSA9IDIsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSB3YXMgbm90IGVuY29kZWQgYnV0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHJhdyBiaW5hcnkgYnl0ZXMsIG9yIGVuY29kZWQgaW4gSklTLTguCisgIElNQVFfUVJfTU9ERV9FQU4xMjhfVE9LRU4gPSAzLCAgLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGRhdGEgaGFzIGEgc3BlY2lhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYW5pbmcgcmVwcmVzZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIElELgorICBJTUFRX1FSX01PREVfRUFOMTI4X0RBVEEgPSA0LCAgLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGRhdGEgaGFzIGEgc3BlY2lhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhbmluZyByZXByZXNlbnRlZCBieSB0aGUgYXBwbGljYXRpb24gSUQuCisgIElNQVFfUVJfTU9ERV9FQ0kgPSA1LCAgLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGRhdGEgd2FzIG1lYW50IHRvIGJlIHJlYWQgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGFuZ3VhZ2UgcmVwcmVzZW50ZWQgaW4gdGhlIGxhbmd1YWdlIElELgorICBJTUFRX1FSX01PREVfS0FOSkkgPQorICAgICAgNiwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBkYXRhIHdhcyBlbmNvZGVkIGluIFNoaWZ0LUpJUzE2IEphcGFuZXNlLgorICBJTUFRX1FSX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUVJTdHJlYW1Nb2RlOworCit0eXBlZGVmIGVudW0gUGFydGljbGVDbGFzc2lmaWVyVHlwZV9lbnVtIHsKKyAgSU1BUV9QQVJUSUNMRV9MQVJHRVNUID0gMCwgIC8vIFVzZSBvbmx5IHRoZSBsYXJnZXN0IHBhcnRpY2xlIGluIHRoZSBpbWFnZS4KKyAgSU1BUV9QQVJUSUNMRV9BTEwgPSAxLCAgLy8gVXNlIGFsbCBwYXJ0aWNsZXMgaW4gdGhlIGltYWdlLgorICBJTUFRX1BBUlRJQ0xFX0NMQVNTSUZJRVJfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBQYXJ0aWNsZUNsYXNzaWZpZXJUeXBlOworCit0eXBlZGVmIGVudW0gUVJDZWxsU2FtcGxlU2l6ZV9lbnVtIHsKKyAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFX0FVVE9fREVURUNUID0KKyAgICAgIC0yLCAgLy8gVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGVhY2ggc2FtcGxlIHNpemUgYW5kIHVzZSB0aGUgb25lIHdoaWNoCisgICAgICAgICAgIC8vIGRlY29kZXMgdGhlIFFSIGNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQgdXRpbGl6aW5nIHRoZQorICAgICAgICAgICAvLyBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFMVgxID0KKyAgICAgIDEsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSAxeDEgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRX1FSX0NFTExfU0FNUExFX1NJWkUyWDIgPQorICAgICAgMiwgIC8vIFRoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDJ4MiBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgIElNQVFfUVJfQ0VMTF9TQU1QTEVfU0laRTNYMyA9CisgICAgICAzLCAgLy8gVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgM3gzIHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFNFg0ID0KKyAgICAgIDQsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA0eDQgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRX1FSX0NFTExfU0FNUExFX1NJWkU1WDUgPQorICAgICAgNSwgIC8vIFRoZSBmdW5jdGlvbiB3aWxsIHVzZSBhIDV4NSBzaXplZCBzYW1wbGUgZnJvbSBlYWNoIGNlbGwuCisgIElNQVFfUVJfQ0VMTF9TQU1QTEVfU0laRTZYNiA9CisgICAgICA2LCAgLy8gVGhlIGZ1bmN0aW9uIHdpbGwgdXNlIGEgNng2IHNpemVkIHNhbXBsZSBmcm9tIGVhY2ggY2VsbC4KKyAgSU1BUV9RUl9DRUxMX1NBTVBMRV9TSVpFN1g3ID0KKyAgICAgIDcsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA3eDcgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRX1FSX0NFTExfU0FNUExFX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUVJDZWxsU2FtcGxlU2l6ZTsKKwordHlwZWRlZiBlbnVtIFJha2VQcm9jZXNzVHlwZV9lbnVtIHsKKyAgSU1BUV9HRVRfRklSU1RfRURHRVMgPSAwLAorICBJTUFRX0dFVF9GSVJTVF9BTkRfTEFTVF9FREdFUyA9IDEsCisgIElNQVFfR0VUX0FMTF9FREdFUyA9IDIsCisgIElNQVFfR0VUX0JFU1RfRURHRVMgPSAzLAorICBJTUFRX1JBS0VfUFJPQ0VTU19UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFJha2VQcm9jZXNzVHlwZTsKKwordHlwZWRlZiBlbnVtIEdlb21ldHJpY1NldHVwRGF0YUl0ZW1fZW51bSB7CisgIElNQVFfQ1VSVkVfRVhUUkFDVElPTl9NT0RFID0KKyAgICAgIDAsICAvLyBTcGVjaWZpZXMgaG93IHRoZSBmdW5jdGlvbiBpZGVudGlmaWVzIGN1cnZlcyBpbiB0aGUgaW1hZ2UuCisgIElNQVFfQ1VSVkVfRURHRV9USFJTSE9MRCA9IDEsICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gY29udHJhc3QgYW4gZWRnZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VydmUuCisgIElNQVFfQ1VSVkVfRURHRV9GSUxURVIgPSAyLCAgLy8gU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgZWRnZSBmaWx0ZXIgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGlkZW50aWZ5IGN1cnZlcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgSU1BUV9NSU5JTVVNX0NVUlZFX0xFTkdUSCA9IDMsICAvLyBTcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gcGl4ZWxzLCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbWFsbGVzdCBjdXJ2ZSB0aGF0IHlvdSB3YW50IHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGlkZW50aWZ5LgorICBJTUFRX0NVUlZFX1JPV19TRUFSQ0hfU1RFUF9TSVpFID0KKyAgICAgIDQsICAvLyBTcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiB0aGUgeSBkaXJlY3Rpb24sIGJldHdlZW4gdGhlIGltYWdlIHJvd3MKKyAgICAgICAgICAvLyB0aGF0IHRoZSBhbGdvcml0aG0gaW5zcGVjdHMgZm9yIGN1cnZlIHNlZWQgcG9pbnRzLgorICBJTUFRX0NVUlZFX0NPTF9TRUFSQ0hfU1RFUF9TSVpFID0KKyAgICAgIDUsICAvLyBTcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiB0aGUgeCBkaXJlY3Rpb24sIGJldHdlZW4gdGhlIGltYWdlCisgICAgICAgICAgLy8gY29sdW1ucyB0aGF0IHRoZSBhbGdvcml0aG0gaW5zcGVjdHMgZm9yIGN1cnZlIHNlZWQgcG9pbnRzLgorICBJTUFRX0NVUlZFX01BWF9FTkRfUE9JTlRfR0FQID0KKyAgICAgIDYsICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gZ2FwLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIGVuZHBvaW50cyBvZiBhCisgICAgICAgICAgLy8gY3VydmUgdGhhdCB0aGUgZnVuY3Rpb24gaWRlbnRpZmllcyBhcyBhIGNsb3NlZCBjdXJ2ZS4KKyAgSU1BUV9FWFRSQUNUX0NMT1NFRF9DVVJWRVMgPQorICAgICAgNywgIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRvIGlkZW50aWZ5IG9ubHkgY2xvc2VkIGN1cnZlcyBpbiB0aGUgaW1hZ2UuCisgIElNQVFfRU5BQkxFX1NVQlBJWEVMX0NVUlZFX0VYVFJBQ1RJT04gPQorICAgICAgOCwgIC8vIFRoZSBmdW5jdGlvbiBpZ25vcmVzIHRoaXMgb3B0aW9uLgorICBJTUFRX0VOQUJMRV9DT1JSRUxBVElPTl9TQ09SRSA9IDksICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgQ29ycmVsYXRpb24gU2NvcmUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpdCBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgIElNQVFfRU5BQkxFX1NVQlBJWEVMX0FDQ1VSQUNZID0gMTAsICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZSBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0cyB3aXRoIHN1YnBpeGVsIGFjY3VyYWN5LgorICBJTUFRX1NVQlBJWEVMX0lURVJBVElPTlMgPSAxMSwgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5jcmVtZW50YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXByb3ZlbWVudHMgdXNlZCB0byByZWZpbmUgbWF0Y2hlcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnBpeGVsIGluZm9ybWF0aW9uLgorICBJTUFRX1NVQlBJWEVMX1RPTEVSQU5DRSA9CisgICAgICAxMiwgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2hhbmdlLCBpbiBwaXhlbHMsIGJldHdlZW4KKyAgICAgICAgICAgLy8gY29uc2VjdXRpdmUgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIGluIHRoZSBtYXRjaCBwb3NpdGlvbiBiZWZvcmUKKyAgICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIHN0b3BzIHJlZmluaW5nIHRoZSBtYXRjaCBwb3NpdGlvbi4KKyAgSU1BUV9JTklUSUFMX01BVENIX0xJU1RfTEVOR1RIID0KKyAgICAgIDEzLCAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hdGNoIGxpc3QuCisgIElNQVFfRU5BQkxFX1RBUkdFVF9URU1QTEFURV9DVVJWRVNDT1JFID0KKyAgICAgIDE0LCAgLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHNob3VsZCBjYWxjdWxhdGUgdGhlIG1hdGNoIGN1cnZlIHRvCisgICAgICAgICAgIC8vIHRlbXBsYXRlIGN1cnZlIHNjb3JlIGFuZCByZXR1cm4gaXQgZm9yIGVhY2ggbWF0Y2ggcmVzdWx0LgorICBJTUFRX01JTklNVU1fTUFUQ0hfU0VQQVJBVElPTl9ESVNUQU5DRSA9CisgICAgICAxNSwgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBzZXBhcmF0aW9uIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlCisgICAgICAgICAgIC8vIG9yaWdpbnMgb2YgdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZSBwb3NpdGlvbnMuCisgIElNQVFfTUlOSU1VTV9NQVRDSF9TRVBBUkFUSU9OX0FOR0xFID0KKyAgICAgIDE2LCAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGFuZ3VsYXIgZGlmZmVyZW5jZSwgaW4gZGVncmVlcywgYmV0d2VlbiB0d28KKyAgICAgICAgICAgLy8gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIGFuZ2xlcy4KKyAgSU1BUV9NSU5JTVVNX01BVENIX1NFUEFSQVRJT05fU0NBTEUgPQorICAgICAgMTcsICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gZGlmZmVyZW5jZSBpbiBzY2FsZSwgZXhwcmVzc2VkIGFzIGEKKyAgICAgICAgICAgLy8gcGVyY2VudGFnZSwgYmV0d2VlbiB0d28gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIHNjYWxlcy4KKyAgSU1BUV9NQVhJTVVNX01BVENIX09WRVJMQVAgPSAxOCwgIC8vIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBhbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHNwZW5kIGxlc3MgdGltZSBhY2N1cmF0ZWx5IGVzdGltYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2NhdGlvbiBvZiBhIG1hdGNoLgorICBJTUFRX0VOQUJMRV9DT0FSU0VfUkVTVUxUID0gMTksICAvLyBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHNwZW5kIGxlc3MgdGltZSBhY2N1cmF0ZWx5IGVzdGltYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2F0aW9uIG9mIGEgbWF0Y2guCisgIElNQVFfRU5BQkxFX0NBTElCUkFUSU9OX1NVUFBPUlQgPSAyMCwgIC8vIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxnb3JpdGhtIHRyZWF0IHRoZSBpbnNwZWN0aW9uIGltYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgY2FsaWJyYXRlZCBpbWFnZS4KKyAgSU1BUV9FTkFCTEVfQ09OVFJBU1RfUkVWRVJTQUwgPQorICAgICAgMjEsICAvLyBTcGVjaWZpZXMgdGhlIGNvbnRyYXN0IG9mIHRoZSBtYXRjaGVzIHRvIHNlYXJjaCBmb3IuCisgIElNQVFfU0VBUkNIX1NUUkFURUdZID0gMjIsICAvLyBTcGVjaWZpZXMgdGhlIGFnZ3Jlc3NpdmVuZXNzIG9mIHRoZSBzdHJhdGVneQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBmaW5kIG1hdGNoZXMgaW4gdGhlIGltYWdlLgorICBJTUFRX1JFRklORU1FTlRfTUFUQ0hfRkFDVE9SID0KKyAgICAgIDIzLCAgLy8gU3BlY2lmaWVzIHRoZSBmYWN0b3IgYXBwbGllZCB0byB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgcmVxdWVzdGVkIHRvCisgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgbWFueSBtYXRjaGVzIGFyZSByZWZpbmVkIGluIHRoZSBweXJhbWlkIHN0YWdlLgorICBJTUFRX1NVQlBJWEVMX01BVENIX0ZBQ1RPUiA9IDI0LCAgLy8gU3BlY2lmaWVzIHRoZSBmYWN0b3IgYXBwbGllZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBmb3IgbWF0Y2hlcyByZXF1ZXN0ZWQgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBob3cgbWFueSBtYXRjaGVzIGFyZSB1c2VkIGZvciB0aGUgZmluYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChzdWJwaXhlbCkgc3RhZ2UuCisgIElNQVFfTUFYX1JFRklORU1FTlRfSVRFUkFUSU9OUyA9CisgICAgICAyNSwgIC8vIFNwZWNpZmllcyBtYXhpbXVtIHJlZmluZW1lbnQgaXRlcmF0aW9uLgorfSBHZW9tZXRyaWNTZXR1cERhdGFJdGVtOworCit0eXBlZGVmIGVudW0gRGlzdG9ydGlvbk1vZGVsX2VudW0geworICBJTUFRX1BPTFlOT01JQUxfTU9ERUwgPSAwLCAgLy8gUG9seW5vbWlhbCBtb2RlbC4KKyAgSU1BUV9ESVZJU0lPTl9NT0RFTCA9IDEsICAvLyBEaXZpc2lvbiBNb2RlbC4KKyAgSU1BUV9OT19ESVNUT1JUSU9OX01PREVMID0gLTEsICAvLyBOb3QgYSBkaXN0b3J0aW9uIG1vZGVsLgorfSBEaXN0b3J0aW9uTW9kZWw7CisKK3R5cGVkZWYgZW51bSBDYWxpYnJhdGlvblRodW1ibmFpbFR5cGVfZW51bSB7CisgIElNQVFfQ0FNQVJBX01PREVMX1RZUEUgPSAwLCAgLy8gQ2FtYXJhIG1vZGVsIHRodW1ibmFpbCB0eXBlLgorICBJTUFRX1BFUlNQRUNUSVZFX1RZUEUgPSAxLCAgLy8gUGVyc3BlY3RpdmUgdGh1bWJuYWlsIHR5cGUuCisgIElNQVFfTUlDUk9fUExBTkVfVFlQRSA9IDIsICAvLyBNaWNybyBQbGFuZSB0aHVtYm5haWwgdHlwZS4KKyAgSU1BUV9DQUxJQlJBVElPTl9USFVNQk5BSUxfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBDYWxpYnJhdGlvblRodW1ibmFpbFR5cGU7CisKK3R5cGVkZWYgZW51bSBTZXR0aW5nVHlwZV9lbnVtIHsKKyAgSU1BUV9ST1RBVElPTl9BTkdMRV9SQU5HRSA9IDAsICAvLyBTZXQgYSByYW5nZSBmb3IgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZXMgYXQgd2hpY2ggeW91IGV4cGVjdCB0aGUgRnVuY3Rpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRlbXBsYXRlIG1hdGNoZXMgaW4gdGhlIGluc3BlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgSU1BUV9TQ0FMRV9SQU5HRSA9IDEsICAvLyBTZXQgYSByYW5nZSBmb3IgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgc2l6ZXMgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB5b3UgZXhwZWN0IHRoZSBGdW5jdGlvbiB0byBmaW5kIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyBpbiB0aGUgaW5zcGVjdGlvbiBpbWFnZS4KKyAgSU1BUV9PQ0NMVVNJT05fUkFOR0UgPSAyLCAgLy8gU2V0IGEgcmFuZ2UgZm9yIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFtb3VudCBvZiBvY2NsdXNpb24geW91IGV4cGVjdCBmb3IgYSBtYXRjaCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zcGVjdGlvbiBpbWFnZS4KKyAgSU1BUV9TRVRUSU5HX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gU2V0dGluZ1R5cGU7CisKK3R5cGVkZWYgZW51bSBTZWdtZW50YXRpb25EaXN0YW5jZUxldmVsX2VudW0geworICBJTUFRX1NFR01FTlRBVElPTl9MRVZFTF9DT05TRVJWQVRJVkUgPQorICAgICAgMCwgIC8vIFVzZXMgZXh0ZW5zaXZlIGNyaXRlcmlhIHRvIGRldGVybWluZSB0aGUgTWF4aW11bSBEaXN0YW5jZS4KKyAgSU1BUV9TRUdNRU5UQVRJT05fTEVWRUxfQUdHUkVTU0lWRSA9CisgICAgICAxLCAgLy8gVXNlcyBmZXcgY3JpdGVyaWEgdG8gZGV0ZXJtaW5lIHRoZSBNYXhpbXVtIERpc3RhbmNlLgorICBJTUFRX1NFR01FTlRBVElPTl9MRVZFTF9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBTZWdtZW50YXRpb25EaXN0YW5jZUxldmVsOworCit0eXBlZGVmIGVudW0gRXh0cmFjdENvbnRvdXJTZWxlY3Rpb25fZW51bSB7CisgIElNQVFfQ0xPU0VTVCA9IDAsICAvLyBTZWxlY3RzIHRoZSBjdXJ2ZSBjbG9zZXN0IHRvIHRoZSBST0kuCisgIElNQVFfTE9OR0VTVCA9IDEsICAvLyBTZWxlY3RzIHRoZSBsb25nZXN0IGN1cnZlLgorICBJTUFRX1NUUk9OR0VTVCA9IDIsICAvLyBTZWxlY3RzIHRoZSBjdXJ2ZSB3aXRoIHRoZSBoaWdoZXN0IGVkZ2Ugc3RyZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZlcmFnZWQgZnJvbSBlYWNoIHBvaW50IG9uIHRoZSBjdXJ2ZS4KKyAgSU1BUV9FWFRSQUNUX0NPTlRPVVJfU0VMRUNUSU9OX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEV4dHJhY3RDb250b3VyU2VsZWN0aW9uOworCit0eXBlZGVmIGVudW0gRmluZFRyYW5zZm9ybU1vZGVfZW51bSB7CisgIElNQVFfRklORF9SRUZFUkVOQ0UgPSAwLCAgLy8gVXBkYXRlIGJvdGggcGFydHMgb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLgorICBJTUFRX1VQREFURV9UUkFOU0ZPUk0gPSAxLCAgLy8gVXBkYXRlIG9ubHkgdGhlIG5ldyByZWZlcmVuY2Ugc3lzdGVtLgorICBJTUFRX0ZJTkRfVFJBTlNGT1JNX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRmluZFRyYW5zZm9ybU1vZGU7CisKK3R5cGVkZWYgZW51bSBFeHRyYWN0Q29udG91ckRpcmVjdGlvbl9lbnVtIHsKKyAgSU1BUV9SRUNUX0xFRlRfUklHSFQgPSAwLCAgLy8gU2VhcmNoZXMgdGhlIFJPSSBmcm9tIGxlZnQgdG8gcmlnaHQuCisgIElNQVFfUkVDVF9SSUdIVF9MRUZUID0gMSwgIC8vIFNlYXJjaGVzIHRoZSBST0kgZnJvbSByaWdodCB0byBsZWZ0LgorICBJTUFRX1JFQ1RfVE9QX0JPVFRPTSA9IDIsICAvLyBTZWFyY2hlcyB0aGUgUk9JIGZyb20gdG9wIHRvIGJvdHRvbS4KKyAgSU1BUV9SRUNUX0JPVFRPTV9UT1AgPSAzLCAgLy8gU2VhcmNoZXMgdGhlIFJPSSBmcm9tIGJvdHRvbSB0byB0b3AuCisgIElNQVFfQU5OVUxVU19JTk5FUl9PVVRFUiA9CisgICAgICA0LCAgLy8gU2VhcmNoZXMgdGhlIFJPSSBmcm9tIHRoZSBpbm5lciByYWRpdXMgdG8gdGhlIG91dGVyIHJhZGl1cy4KKyAgSU1BUV9BTk5VTFVTX09VVEVSX0lOTkVSID0KKyAgICAgIDUsICAvLyBTZWFyY2hlcyB0aGUgUk9JIGZyb20gdGhlIG91dGVyIHJhZGl1cyB0byB0aGUgaW5uZXIgcmFkaXVzLgorICBJTUFRX0FOTlVMVVNfU1RBUlRfU1RPUCA9CisgICAgICA2LCAgLy8gU2VhcmNoZXMgdGhlIFJPSSBmcm9tIHN0YXJ0IGFuZ2xlIHRvIGVuZCBhbmdsZS4KKyAgSU1BUV9BTk5VTFVTX1NUT1BfU1RBUlQgPQorICAgICAgNywgIC8vIFNlYXJjaGVzIHRoZSBST0kgZnJvbSBlbmQgYW5nbGUgdG8gc3RhcnQgYW5nbGUuCisgIElNQVFfRVhUUkFDVF9DT05UT1VSX0RJUkVDVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBFeHRyYWN0Q29udG91ckRpcmVjdGlvbjsKKwordHlwZWRlZiBlbnVtIEVkZ2VQb2xhcml0eVNlYXJjaE1vZGVfZW51bSB7CisgIElNQVFfU0VBUkNIX0ZPUl9BTExfRURHRVMgPSAwLCAgLy8gU2VhcmNoZXMgZm9yIGFsbCBlZGdlcy4KKyAgSU1BUV9TRUFSQ0hfRk9SX1JJU0lOR19FREdFUyA9IDEsICAvLyBTZWFyY2hlcyBmb3IgcmlzaW5nIGVkZ2VzIG9ubHkuCisgIElNQVFfU0VBUkNIX0ZPUl9GQUxMSU5HX0VER0VTID0gMiwgIC8vIFNlYXJjaGVzIGZvciBmYWxsaW5nIGVkZ2VzIG9ubHkuCisgIElNQVFfRURHRV9QT0xBUklUWV9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEVkZ2VQb2xhcml0eVNlYXJjaE1vZGU7CisKK3R5cGVkZWYgZW51bSBDb25uZWN0aXZpdHlfZW51bSB7CisgIElNQVFfRk9VUl9DT05ORUNURUQgPQorICAgICAgMCwgIC8vIE1vcnBob2xvZ2ljYWwgcmVjb25zdHJ1Y3Rpb24gaXMgcGVyZm9ybWVkIGluIGNvbm5lY3Rpdml0eSBtb2RlIDQuCisgIElNQVFfRUlHSFRfQ09OTkVDVEVEID0KKyAgICAgIDEsICAvLyBNb3JwaG9sb2dpY2FsIHJlY29uc3RydWN0aW9uIGlzIHBlcmZvcm1lZCBpbiBjb25uZWN0aXZpdHkgbW9kZSA4LgorICBJTUFRX0NPTk5FQ1RJVklUWV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBDb25uZWN0aXZpdHk7CisKK3R5cGVkZWYgZW51bSBNb3JwaG9sb2d5UmVjb25zdHJ1Y3RPcGVyYXRpb25fZW51bSB7CisgIElNQVFfRElMQVRFX1JFQ09OU1RSVUNUID0gMCwgIC8vIFBlcmZvcm1zIFJlY29uc3RydWN0aW9uIGJ5IGRpbGF0aW9uLgorICBJTUFRX0VST0RFX1JFQ09OU1RSVUNUID0gMSwgIC8vIFBlcmZvcm1zIFJlY29uc3RydWN0aW9uIGJ5IGVyb3Npb24uCisgIElNQVFfTU9SUEhPTE9HWV9SRUNPTlNUUlVDVF9PUEVSQVRJT05fU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gTW9ycGhvbG9neVJlY29uc3RydWN0T3BlcmF0aW9uOworCit0eXBlZGVmIGVudW0gV2F2ZWxldFR5cGVfZW51bSB7CisgIElNQVFfREIwMiA9IDAsCisgIElNQVFfREIwMyA9IDEsCisgIElNQVFfREIwNCA9IDIsICAvLyBTcGVjaWZpZXMgdGhlIFdhdmVsZXQgVHlwZSBhcyBEQjAyLgorICBJTUFRX0RCMDUgPSAzLAorICBJTUFRX0RCMDYgPSA0LAorICBJTUFRX0RCMDcgPSA1LAorICBJTUFRX0RCMDggPSA2LAorICBJTUFRX0RCMDkgPSA3LAorICBJTUFRX0RCMTAgPSA4LAorICBJTUFRX0RCMTEgPSA5LAorICBJTUFRX0RCMTIgPSAxMCwKKyAgSU1BUV9EQjEzID0gMTEsCisgIElNQVFfREIxNCA9IDEyLAorICBJTUFRX0hBQVIgPSAxMywKKyAgSU1BUV9CSU9SMV8zID0gMTQsCisgIElNQVFfQklPUjFfNSA9IDE1LAorICBJTUFRX0JJT1IyXzIgPSAxNiwKKyAgSU1BUV9CSU9SMl80ID0gMTcsCisgIElNQVFfQklPUjJfNiA9IDE4LAorICBJTUFRX0JJT1IyXzggPSAxOSwKKyAgSU1BUV9CSU9SM18xID0gMjAsCisgIElNQVFfQklPUjNfMyA9IDIxLAorICBJTUFRX0JJT1IzXzUgPSAyMiwKKyAgSU1BUV9CSU9SM183ID0gMjMsCisgIElNQVFfQklPUjNfOSA9IDI0LAorICBJTUFRX0JJT1I0XzQgPSAyNSwKKyAgSU1BUV9DT0lGMSA9IDI2LAorICBJTUFRX0NPSUYyID0gMjcsCisgIElNQVFfQ09JRjMgPSAyOCwKKyAgSU1BUV9DT0lGNCA9IDI5LAorICBJTUFRX0NPSUY1ID0gMzAsCisgIElNQVFfU1lNMiA9IDMxLAorICBJTUFRX1NZTTMgPSAzMiwKKyAgSU1BUV9TWU00ID0gMzMsCisgIElNQVFfU1lNNSA9IDM0LAorICBJTUFRX1NZTTYgPSAzNSwKKyAgSU1BUV9TWU03ID0gMzYsCisgIElNQVFfU1lNOCA9IDM3LAorICBJTUFRX0JJT1I1XzUgPSAzOCwKKyAgSU1BUV9CSU9SNl84ID0gMzksCisgIElNQVFfV0FWRV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFdhdmVsZXRUeXBlOworCit0eXBlZGVmIGVudW0gUGFydGljbGVDbGFzc2lmaWVyVGhyZXNob2xkVHlwZV9lbnVtIHsKKyAgSU1BUV9USFJFU0hPTERfTUFOVUFMID0gMCwgIC8vIFRoZSBjbGFzc2lmaWVyIHBlcmZvcm1zIGEgbWFudWFsIHRocmVzaG9sZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGltYWdlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorICBJTUFRX1RIUkVTSE9MRF9BVVRPID0gMSwgIC8vIFRoZSBjbGFzc2lmaWVyIHBlcmZvcm1zIGFuIGF1dG8gdGhyZXNob2xkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorICBJTUFRX1RIUkVTSE9MRF9MT0NBTCA9IDIsICAvLyBUaGUgY2xhc3NpZmllciBwZXJmb3JtcyBhIGxvY2FsIHRocmVzaG9sZCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgZHVyaW5nIHByZXByb2Nlc3NpbmcuCit9IFBhcnRpY2xlQ2xhc3NpZmllclRocmVzaG9sZFR5cGU7CisKK3R5cGVkZWYgZW51bSBNZWFzdXJlUGFydGljbGVzQ2FsaWJyYXRpb25Nb2RlX2VudW0geworICBJTUFRX0NBTElCUkFUSU9OX01PREVfUElYRUwgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHRha2VzIG9ubHkgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYXN1cmVtZW50cyBvbiB0aGUgcGFydGljbGVzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UuCisgIElNQVFfQ0FMSUJSQVRJT05fTU9ERV9DQUxJQlJBVEVEID0gMSwgIC8vIFRoZSBmdW5jdGlvbiB0YWtlcyBvbmx5IGNhbGlicmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnRzIG9uIHRoZSBwYXJ0aWNsZXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBJTUFRX0NBTElCUkFUSU9OX01PREVfQk9USCA9IDIsICAvLyBUaGUgZnVuY3Rpb24gdGFrZXMgYm90aCBwaXhlbCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsaWJyYXRlZCBtZWFzdXJlbWVudHMgb24gdGhlIHBhcnRpY2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgaW1hZ2UuCisgIElNQVFfTUVBU1VSRV9QQVJUSUNMRVNfQ0FMSUJSQVRJT05fTU9ERV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBNZWFzdXJlUGFydGljbGVzQ2FsaWJyYXRpb25Nb2RlOworCit0eXBlZGVmIGVudW0gR2VvbWV0cmljTWF0Y2hpbmdTZWFyY2hTdHJhdGVneV9lbnVtIHsKKyAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hJTkdfQ09OU0VSVkFUSVZFID0KKyAgICAgIDAsICAvLyBJbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIHVzZSB0aGUgbGFyZ2VzdAorICAgICAgICAgIC8vIHBvc3NpYmxlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSBhdCB0aGUgZXhwZW5zZSBvZgorICAgICAgICAgIC8vIHNsb3dpbmcgZG93biB0aGUgc3BlZWQgb2YgdGhlIGFsZ29yaXRobS4KKyAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hJTkdfQkFMQU5DRUQgPQorICAgICAgMSwgIC8vIEluc3RydWN0cyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gdG8gYmFsYW5jZSB0aGUgYW1vdW50IG9mCisgICAgICAgICAgLy8gaW5mb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UgaXQgdXNlcyB3aXRoIHRoZSBzcGVlZCBvZiB0aGUgYWxnb3JpdGhtLgorICBJTUFRX0dFT01FVFJJQ19NQVRDSElOR19BR0dSRVNTSVZFID0KKyAgICAgIDIsICAvLyBJbnN0cnVjdHMgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYWxnb3JpdGhtIHRvIHVzZSBhIGxvd2VyIGFtb3VudCBvZgorICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGZyb20gdGhlIGltYWdlLCB3aGljaCBhbGxvd3MgdGhlIGFsZ29yaXRobSB0byBydW4KKyAgICAgICAgICAvLyBxdWlja2x5IGJ1dCBhdCB0aGUgZXhwZW5zZSBvZiBhY2N1cmFjeS4KKyAgSU1BUV9HRU9NRVRSSUNfTUFUQ0hJTkdfU0VBUkNIX1NUUkFURUdZX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEdlb21ldHJpY01hdGNoaW5nU2VhcmNoU3RyYXRlZ3k7CisKK3R5cGVkZWYgZW51bSBDb2xvckNsYXNzaWZpY2F0aW9uUmVzb2x1dGlvbl9lbnVtIHsKKyAgSU1BUV9DTEFTU0lGSUVSX0xPV19SRVNPTFVUSU9OID0KKyAgICAgIDAsICAvLyBMb3cgcmVzb2x1dGlvbiB2ZXJzaW9uIG9mIHRoZSBjb2xvciBjbGFzc2lmaWVyLgorICBJTUFRX0NMQVNTSUZJRVJfTUVESVVNX1JFU09MVVRJT04gPQorICAgICAgMSwgIC8vIE1lZGl1bSByZXNvbHV0aW9uIHZlcnNpb24gb2YgdGhlIGNvbG9yIGNsYXNzaWZpZXIuCisgIElNQVFfQ0xBU1NJRklFUl9ISUdIX1JFU09MVVRJT04gPQorICAgICAgMiwgIC8vIEhpZ2ggcmVzb2x1dGlvbiB2ZXJzaW9uIG9mIHRoZSBjb2xvciBjbGFzc2lmaWVyLgorICBJTUFRX0NMQVNTSUZJRVJfUkVTT0xVVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBDb2xvckNsYXNzaWZpY2F0aW9uUmVzb2x1dGlvbjsKKwordHlwZWRlZiBlbnVtIENvbm5lY3Rpb25Db25zdHJhaW50VHlwZV9lbnVtIHsKKyAgSU1BUV9ESVNUQU5DRV9DT05TVFJBSU5UID0gMCwgIC8vIFNwZWNpZmllcyB0aGUgZGlzdGFuY2UsIGluIHBpeGVscywgd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aGUgZW5kIHBvaW50cyBvZiB0d28gY3VydmVzIG11c3QgbGllCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBjb250b3VyLgorICBJTUFRX0FOR0xFX0NPTlNUUkFJTlQgPQorICAgICAgMSwgIC8vIFNwZWNpZmllcyB0aGUgcmFuZ2UsIGluIGRlZ3JlZXMsIHdpdGhpbiB3aGljaCB0aGUgZGlmZmVyZW5jZQorICAgICAgICAgIC8vIGJldHdlZW4gdGhlIGFuZ2xlIG9mIHR3byBjdXJ2ZXMsIG1lYXN1cmVkIGF0IHRoZSBlbmQgcG9pbnRzLCBtdXN0CisgICAgICAgICAgLy8gbGllIGluIG9yZGVyIGZvciB0aGUgdHdvIGN1cnZlcyB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBjb250b3VyLgorICBJTUFRX0NPTk5FQ1RJVklUWV9DT05TVFJBSU5UID0KKyAgICAgIDIsICAvLyBTcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHdpdGhpbiB3aGljaCBhIGxpbmUgZXh0ZW5kZWQKKyAgICAgICAgICAvLyBmcm9tIHRoZSBlbmQgcG9pbnQgb2YgYSBjdXJ2ZSBtdXN0IHBhc3MgdGhlIGVuZCBwb2ludCBvZiBhbm90aGVyCisgICAgICAgICAgLy8gY3VydmUgaW4gb3JkZXIgZm9yIHRoZSB0d28gY3VydmVzIHRvIGJlIGNvbnNpZGVyZWQgcGFydCBvZiBhCisgICAgICAgICAgLy8gY29udG91ci4KKyAgSU1BUV9HUkFESUVOVF9DT05TVFJBSU5UID0KKyAgICAgIDMsICAvLyBTcGVjaWZpZXMgdGhlIHJhbmdlLCBpbiBkZWdyZWVzLCB3aXRoaW4gd2hpY2ggdGhlIGdyYWRpZW50IGFuZ2xlcworICAgICAgICAgIC8vIG9mIHR3byBjdXJ2ZXMsIG1lYXN1cmVkIGF0IHRoZSBlbmQgcG9pbnRzLCBtdXN0IGxpZSBpbiBvcmRlciBmb3IKKyAgICAgICAgICAvLyB0aGUgdHdvIGN1cnZlcyB0byBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBjb250b3VyLgorICBJTUFRX05VTV9DT05ORUNUSU9OX0NPTlNUUkFJTlRfVFlQRVMgPSA0LCAgLy8uCisgIElNQVFfQ09OTkVDVElPTl9DT05TVFJBSU5UX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IENvbm5lY3Rpb25Db25zdHJhaW50VHlwZTsKKwordHlwZWRlZiBlbnVtIEJhcmNvZGUyRENvbnRyYXN0X2VudW0geworICBJTUFRX0FMTF9CQVJDT0RFXzJEX0NPTlRSQVNUUyA9CisgICAgICAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBiYXJjb2RlcyBvZiBlYWNoIGNvbnRyYXN0IHR5cGUuCisgIElNQVFfQkxBQ0tfT05fV0hJVEVfQkFSQ09ERV8yRCA9IDEsICAvLyBUaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIDJEIGJhcmNvZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250YWluaW5nIGJsYWNrIGRhdGEgb24gYSB3aGl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZC4KKyAgSU1BUV9XSElURV9PTl9CTEFDS19CQVJDT0RFXzJEID0gMiwgIC8vIFRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgMkQgYmFyY29kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5pbmcgd2hpdGUgZGF0YSBvbiBhIGJsYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLgorICBJTUFRX0JBUkNPREVfMkRfQ09OVFJBU1RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQmFyY29kZTJEQ29udHJhc3Q7CisKK3R5cGVkZWYgZW51bSBRUk1vZGVsVHlwZV9lbnVtIHsKKyAgSU1BUV9RUl9NT0RFTFRZUEVfQVVUT19ERVRFQ1QgPQorICAgICAgMCwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGF1dG8tZGV0ZWN0IHRoZSB0eXBlIG9mIFFSIGNvZGUuCisgIElNQVFfUVJfTU9ERUxUWVBFX01JQ1JPID0gMSwgIC8vIFNwZWNpZmllcyB0aGUgUVIgY29kZSBpcyBvZiBhIG1pY3JvIHR5cGUuCisgIElNQVFfUVJfTU9ERUxUWVBFX01PREVMMSA9IDIsICAvLyBTcGVjaWZpZXMgdGhlIFFSIGNvZGUgaXMgb2YgYSBtb2RlbDEgdHlwZS4KKyAgSU1BUV9RUl9NT0RFTFRZUEVfTU9ERUwyID0gMywgIC8vIFNwZWNpZmllcyB0aGUgUVIgY29kZSBpcyBvZiBhIG1vZGVsMiB0eXBlLgorICBJTUFRX1FSX01PREVMX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gUVJNb2RlbFR5cGU7CisKK3R5cGVkZWYgZW51bSBXaW5kb3dCYWNrZ3JvdW5kRmlsbFN0eWxlX2VudW0geworICBJTUFRX0ZJTExfU1RZTEVfU09MSUQgPSAwLCAgLy8gRmlsbCB0aGUgZGlzcGxheSB3aW5kb3cgd2l0aCBhIHNvbGlkIGNvbG9yLgorICBJTUFRX0ZJTExfU1RZTEVfSEFUQ0ggPSAyLCAgLy8gRmlsbCB0aGUgZGlzcGxheSB3aW5kb3cgd2l0aCBhIHBhdHRlcm4gZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgV2luZG93QmFja2dyb3VuZEhhdGNoU3R5bGUuCisgIElNQVFfRklMTF9TVFlMRV9ERUZBVUxUID0KKyAgICAgIDMsICAvLyBGaWxsIHRoZSBkaXNwbGF5IHdpbmRvdyB3aXRoIHRoZSBOSSBWaXNpb24gZGVmYXVsdCBwYXR0ZXJuLgorICBJTUFRX0ZJTExfU1RZTEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gV2luZG93QmFja2dyb3VuZEZpbGxTdHlsZTsKKwordHlwZWRlZiBlbnVtIEV4dHJhY3Rpb25Nb2RlX2VudW0geworICBJTUFRX05PUk1BTF9JTUFHRSA9IDAsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gbWFrZXMgbm8gYXNzdW1wdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdXQgdGhlIHVuaWZvcm1pdHkgb2Ygb2JqZWN0cyBpbiB0aGUgaW1hZ2Ugb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIGJhY2tncm91bmQuCisgIElNQVFfVU5JRk9STV9SRUdJT05TID0gMSwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvYmplY3RzIGluIHRoZSBpbWFnZSBvciB0aGUgaW1hZ2UgYmFja2dyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zaXN0cyBvZiB1bmlmb3JtIHBpeGVsIHZhbHVlcy4KKyAgSU1BUV9FWFRSQUNUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRXh0cmFjdGlvbk1vZGU7CisKK3R5cGVkZWYgZW51bSBFZGdlRmlsdGVyU2l6ZV9lbnVtIHsKKyAgSU1BUV9GSU5FID0KKyAgICAgIDAsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gdXNlcyBhIGZpbmUgKG5hcnJvdykgZWRnZSBmaWx0ZXIuCisgIElNQVFfTk9STUFMID0gMSwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzIGEgbm9ybWFsIGVkZ2UgZmlsdGVyLgorICBJTUFRX0NPTlRPVVJfVFJBQ0lORyA9IDIsICAvLyBTZXRzIHRoZSBFZGdlIEZpbHRlciBTaXplIHRvIGNvbnRvdXIgdHJhY2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggcHJvdmlkZXMgdGhlIGJlc3QgcmVzdWx0cyBmb3IgY29udG91cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0aW9uIGJ1dCBpbmNyZWFzZXMgdGhlIHRpbWUgcmVxdWlyZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaW1hZ2UuCisgIElNQVFfRURHRV9GSUxURVJfU0laRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBFZGdlRmlsdGVyU2l6ZTsKKwordHlwZWRlZiBlbnVtIEJhcmNvZGUyRFNlYXJjaE1vZGVfZW51bSB7CisgIElNQVFfU0VBUkNIX01VTFRJUExFID0gMCwgIC8vIFRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgbXVsdGlwbGUgMkQgYmFyY29kZXMuCisgIElNQVFfU0VBUkNIX1NJTkdMRV9DT05TRVJWQVRJVkUgPQorICAgICAgMSwgIC8vIFRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgMkQgYmFyY29kZXMgdXNpbmcgdGhlIHNhbWUgc2VhcmNoaW5nCisgICAgICAgICAgLy8gYWxnb3JpdGhtIGFzIElNQVFfU0VBUkNIX01VTFRJUExFIGJ1dCBzdG9wcyBzZWFyY2hpbmcgYWZ0ZXIKKyAgICAgICAgICAvLyBsb2NhdGluZyBvbmUgdmFsaWQgYmFyY29kZS4KKyAgSU1BUV9TRUFSQ0hfU0lOR0xFX0FHR1JFU1NJVkUgPQorICAgICAgMiwgIC8vIFRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYSBzaW5nbGUgMkQgYmFyY29kZSB1c2luZyBhIG1ldGhvZCB0aGF0CisgICAgICAgICAgLy8gYXNzdW1lcyB0aGUgYmFyY29kZSBvY2N1cGllcyBhIG1ham9yaXR5IG9mIHRoZSBzZWFyY2ggcmVnaW9uLgorICBJTUFRX0JBUkNPREVfMkRfU0VBUkNIX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQmFyY29kZTJEU2VhcmNoTW9kZTsKKwordHlwZWRlZiBlbnVtIERhdGFNYXRyaXhTdWJ0eXBlX2VudW0geworICBJTUFRX0FMTF9EQVRBX01BVFJJWF9TVUJUWVBFUyA9CisgICAgICAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBhbGwgc3VidHlwZXMuCisgIElNQVFfREFUQV9NQVRSSVhfU1VCVFlQRVNfRUNDXzAwMF9FQ0NfMTQwID0KKyAgICAgIDEsICAvLyBUaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIHN1YnR5cGVzIEVDQyAwMDAsCisgICAgICAgICAgLy8gRUNDIDA1MCwgRUNDIDA4MCwgRUNDIDEwMCBhbmQgRUNDIDE0MC4KKyAgSU1BUV9EQVRBX01BVFJJWF9TVUJUWVBFX0VDQ18yMDAgPQorICAgICAgMiwgIC8vIFRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgRGF0YSBNYXRyaXggRUNDIDIwMCBiYXJjb2Rlcy4KKyAgSU1BUV9EQVRBX01BVFJJWF9TVUJUWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IERhdGFNYXRyaXhTdWJ0eXBlOworCit0eXBlZGVmIGVudW0gRmVhdHVyZVR5cGVfZW51bSB7CisgIElNQVFfTk9UX0ZPVU5EX0ZFQVRVUkUgPSAwLCAgLy8gU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIG5vdCBmb3VuZC4KKyAgSU1BUV9DSVJDTEVfRkVBVFVSRSA9IDEsICAvLyBTcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBjaXJjbGUuCisgIElNQVFfRUxMSVBTRV9GRUFUVVJFID0gMiwgIC8vIFNwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhbiBlbGxpcHNlLgorICBJTUFRX0NPTlNUX0NVUlZFX0ZFQVRVUkUgPSAzLCAgLy8gU3BlY2lmaWVzIHRoZSBmZWF0dXJlcyBpcyBhIGNvbnN0YW50IGN1cnZlLgorICBJTUFRX1JFQ1RBTkdMRV9GRUFUVVJFID0gNCwgIC8vIFNwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhIHJlY3RhbmdsZS4KKyAgSU1BUV9MRUdfRkVBVFVSRSA9IDUsICAvLyBTcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBsZWcuCisgIElNQVFfQ09STkVSX0ZFQVRVUkUgPSA2LCAgLy8gU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIGEgY29ybmVyLgorICBJTUFRX1BBUkFMTEVMX0xJTkVfUEFJUl9GRUFUVVJFID0KKyAgICAgIDcsICAvLyBTcGVjaWZpZXMgdGhlIGZlYXR1cmUgaXMgYSBwYXJhbGxlbCBsaW5lIHBhaXIuCisgIElNQVFfUEFJUl9PRl9QQVJBTExFTF9MSU5FX1BBSVJTX0ZFQVRVUkUgPQorICAgICAgOCwgIC8vIFNwZWNpZmllcyB0aGUgZmVhdHVyZSBpcyBhIHBhaXIgb2YgcGFyYWxsZWwgbGluZSBwYWlycy4KKyAgSU1BUV9MSU5FX0ZFQVRVUkUgPSA5LCAgLy8gU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIGEgbGluZS4KKyAgSU1BUV9DTE9TRURfQ1VSVkVfRkVBVFVSRSA9IDEwLCAgLy8gU3BlY2lmaWVzIHRoZSBmZWF0dXJlIGlzIGEgY2xvc2VkIGN1cnZlLgorICBJTUFRX0ZFQVRVUkVfVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBGZWF0dXJlVHlwZTsKKwordHlwZWRlZiBlbnVtIEJhcmNvZGUyRENlbGxTaGFwZV9lbnVtIHsKKyAgSU1BUV9TUVVBUkVfQ0VMTFMgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYW4gYWxnb3JpdGhtIGZvciBkZWNvZGluZyB0aGUgMkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFyY29kZSB0aGF0IHdvcmtzIHdpdGggc3F1YXJlIGRhdGEgY2VsbHMuCisgIElNQVFfUk9VTkRfQ0VMTFMgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYW4gYWxnb3JpdGhtIGZvciBkZWNvZGluZyB0aGUgMkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJjb2RlIHRoYXQgd29ya3Mgd2l0aCByb3VuZCBkYXRhIGNlbGxzLgorICBJTUFRX0JBUkNPREVfMkRfQ0VMTF9TSEFQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBCYXJjb2RlMkRDZWxsU2hhcGU7CisKK3R5cGVkZWYgZW51bSBMb2NhbFRocmVzaG9sZE1ldGhvZF9lbnVtIHsKKyAgSU1BUV9OSUJMQUNLID0gMCwgIC8vIFRoZSBmdW5jdGlvbiBjb21wdXRlcyB0aHJlc2hvbGRzIGZvciBlYWNoIHBpeGVsIGJhc2VkIG9uCisgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgbG9jYWwgc3RhdGlzdGljcyB1c2luZyB0aGUgTmlibGFjayBsb2NhbAorICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZXNob2xkaW5nIGFsZ29yaXRobS4KKyAgSU1BUV9CQUNLR1JPVU5EX0NPUlJFQ1RJT04gPQorICAgICAgMSwgIC8vIFRoZSBmdW5jdGlvbiBwZXJmb3JtcyBiYWNrZ3JvdW5kIGNvcnJlY3Rpb24gZmlyc3QgdG8gZWxpbWluYXRlCisgICAgICAgICAgLy8gbm9uLXVuaWZvcm0gbGlnaHRpbmcgZWZmZWN0cywgdGhlbiBwZXJmb3JtcyB0aHJlc2hvbGRpbmcgdXNpbmcgdGhlCisgICAgICAgICAgLy8gT3RzdSB0aHJlc2hvbGRpbmcgYWxnb3JpdGhtLgorICBJTUFRX0xPQ0FMX1RIUkVTSE9MRF9NRVRIT0RfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gTG9jYWxUaHJlc2hvbGRNZXRob2Q7CisKK3R5cGVkZWYgZW51bSBCYXJjb2RlMkRUeXBlX2VudW0geworICBJTUFRX1BERjQxNyA9IDAsICAvLyBUaGUgMkQgYmFyY29kZSBpcyBvZiB0eXBlIFBERjQxNy4KKyAgSU1BUV9EQVRBX01BVFJJWF9FQ0NfMDAwID0KKyAgICAgIDEsICAvLyBUaGUgMkQgYmFyY29kZSBpcyBvZiB0eXBlIERhdGEgTWF0cml4IEVDQyAwMDAuCisgIElNQVFfREFUQV9NQVRSSVhfRUNDXzA1MCA9CisgICAgICAyLCAgLy8gVGhlIDJEIGJhcmNvZGUgaXMgb2YgdHlwZSBEYXRhIE1hdHJpeCBFQ0MgMDUwLgorICBJTUFRX0RBVEFfTUFUUklYX0VDQ18wODAgPQorICAgICAgMywgIC8vIFRoZSAyRCBiYXJjb2RlIGlzIG9mIHR5cGUgRGF0YSBNYXRyaXggRUNDIDA4MC4KKyAgSU1BUV9EQVRBX01BVFJJWF9FQ0NfMTAwID0KKyAgICAgIDQsICAvLyBUaGUgMkQgYmFyY29kZSBpcyBvZiB0eXBlIERhdGEgTWF0cml4IEVDQyAxMDAuCisgIElNQVFfREFUQV9NQVRSSVhfRUNDXzE0MCA9CisgICAgICA1LCAgLy8gVGhlIDJEIGJhcmNvZGUgaXMgb2YgdHlwZSBEYXRhIE1hdHJpeCBFQ0MgMTQwLgorICBJTUFRX0RBVEFfTUFUUklYX0VDQ18yMDAgPQorICAgICAgNiwgIC8vIFRoZSAyRCBiYXJjb2RlIGlzIG9mIHR5cGUgRGF0YSBNYXRyaXggRUNDIDIwMC4KKyAgSU1BUV9CQVJDT0RFXzJEX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQmFyY29kZTJEVHlwZTsKKwordHlwZWRlZiBlbnVtIENsYXNzaWZpZXJFbmdpbmVUeXBlX2VudW0geworICBJTUFRX0VOR0lORV9OT05FID0gMCwgIC8vIE5vIGVuZ2luZSBoYXMgYmVlbiBzZXQgb24gdGhpcyBjbGFzc2lmaWVyIHNlc3Npb24uCisgIElNQVFfRU5HSU5FX05FQVJFU1RfTkVJR0hCT1IgPSAxLCAgLy8gTmVhcmVzdCBuZWlnaGJvciBlbmdpbmUuCisgIElNQVFfRU5HSU5FX1NVUFBPUlRfVkVDVE9SX01BQ0hJTkUgPSAyLAorICBJTUFRX0NMQVNTSUZJRVJfRU5HSU5FX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQ2xhc3NpZmllckVuZ2luZVR5cGU7CisKK3R5cGVkZWYgZW51bSBDbGFzc2lmaWVyVHlwZV9lbnVtIHsKKyAgSU1BUV9DTEFTU0lGSUVSX0NVU1RPTSA9CisgICAgICAwLCAgLy8gVGhlIGNsYXNzaWZpZXIgc2Vzc2lvbiBjbGFzc2lmaWVzIHZlY3RvcnMgb2YgZG91Ymxlcy4KKyAgSU1BUV9DTEFTU0lGSUVSX1BBUlRJQ0xFID0KKyAgICAgIDEsICAvLyBUaGUgY2xhc3NpZmllciBzZXNzaW9uIGNsYXNzaWZpZXMgcGFydGljbGVzIGluIGJpbmFyeSBpbWFnZXMuCisgIElNQVFfQ0xBU1NJRklFUl9DT0xPUiA9CisgICAgICAyLCAgLy8gVGhlIGNsYXNzaWZpZXIgc2Vzc2lvbiBjbGFzc2lmaWVzIGFuIGltYWdlIGJhc2VkIG9uIGl0cyBjb2xvci4KKyAgSU1BUV9DTEFTU0lGSUVSX1RFWFRVUkUgPQorICAgICAgMywgIC8vIFRoZSBjbGFzc2lmaWVyIHNlc3Npb24gY2xhc3NpZmllcyBhbiBpbWFnZSBiYXNlZCBvbiBpdHMgdGV4dHVyZS4KKyAgSU1BUV9DTEFTU0lGSUVSX1RZUEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gQ2xhc3NpZmllclR5cGU7CisKK3R5cGVkZWYgZW51bSBQYXJ0aWNsZVR5cGVfZW51bSB7CisgIElNQVFfUEFSVElDTEVfQlJJR0hUID0gMCwgIC8vIEJyaWdodCBwYXJ0aWNsZXMuCisgIElNQVFfUEFSVElDTEVfREFSSyA9IDEsICAvLyBEYXJrIHBhcnRpY2xlcy4KKyAgSU1BUV9QQVJUSUNMRV9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFBhcnRpY2xlVHlwZTsKKwordHlwZWRlZiBlbnVtIFZpc2lvbkluZm9UeXBlMl9lbnVtIHsKKyAgSU1BUV9WSVNJT05JTkZPX0NBTElCUkFUSU9OID0gMHgwMSwgIC8vIFVzZWQgdG8gaW5kaWNhdGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGlicmF0aW9uIGluZm9ybWF0aW9uIGluIGFuIGltYWdlLgorICBJTUFRX1ZJU0lPTklORk9fT1ZFUkxBWSA9IDB4MDIsICAvLyBVc2VkIHRvIGluZGljYXRlIGludGVyYWN0aW9uIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJsYXkgaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCisgIElNQVFfVklTSU9OSU5GT19HUkFZVEVNUExBVEUgPSAweDA0LCAgLy8gVXNlZCB0byBpbmRpY2F0ZSBpbnRlcmFjdGlvbiB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYXlzY2FsZSB0ZW1wbGF0ZSBpbmZvcm1hdGlvbiBpbiBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBJTUFRX1ZJU0lPTklORk9fQ09MT1JURU1QTEFURSA9IDB4MDgsICAvLyBVc2VkIHRvIGluZGljYXRlIGludGVyYWN0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbG9yIHRlbXBsYXRlIGluZm9ybWF0aW9uIGluIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBJTUFRX1ZJU0lPTklORk9fR0VPTUVUUklDVEVNUExBVEUgPSAweDEwLCAgLy8gVXNlZCB0byBpbmRpY2F0ZSBpbnRlcmFjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZ2VvbWV0cmljIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBpbiBhbiBpbWFnZS4KKyAgSU1BUV9WSVNJT05JTkZPX0NVU1RPTURBVEEgPSAweDIwLCAgLy8gVXNlZCB0byBpbmRpY2F0ZSBpbnRlcmFjdGlvbiB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW5hcnkgb3IgdGV4dCBDdXN0b20gRGF0YSBpbiBhbiBpbWFnZS4KKyAgSU1BUV9WSVNJT05JTkZPX0dPTERFTlRFTVBMQVRFID0gMHg0MCwgIC8vIFVzZWQgdG8gaW5kaWNhdGUgaW50ZXJhY3Rpb24gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGdvbGRlbiB0ZW1wbGF0ZSBpbmZvcm1hdGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gaW1hZ2UuCisgIElNQVFfVklTSU9OSU5GT19HRU9NRVRSSUNURU1QTEFURTIgPSAweDgwLCAgLy8gVXNlZCB0byBpbmRpY2F0ZSBpbnRlcmFjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGdlb21ldHJpYyB0ZW1wbGF0ZSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gaW4gYW4gaW1hZ2UuCisgIElNQVFfVklTSU9OSU5GT19BTEwgPSAweEZGRkZGRkZGLCAgLy8gUmVtb3ZlcywgY2hlY2tzIGZvciwgb3IgaW5kaWNhdGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXNlbmNlIG9mIGFsbCB0eXBlcyBvZiBleHRyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGluIGFuIGltYWdlLgorfSBWaXNpb25JbmZvVHlwZTI7CisKK3R5cGVkZWYgZW51bSBSZWFkQ2xhc3NpZmllckZpbGVNb2RlX2VudW0geworICBJTUFRX0NMQVNTSUZJRVJfUkVBRF9BTEwgPQorICAgICAgMCwgIC8vIFJlYWQgYWxsIGluZm9ybWF0aW9uIGZyb20gdGhlIGNsYXNzaWZpZXIgZmlsZS4KKyAgSU1BUV9DTEFTU0lGSUVSX1JFQURfU0FNUExFUyA9CisgICAgICAxLCAgLy8gUmVhZCBvbmx5IHRoZSBzYW1wbGVzIGZyb20gdGhlIGNsYXNzaWZpZXIgZmlsZS4KKyAgSU1BUV9DTEFTU0lGSUVSX1JFQURfUFJPUEVSVElFUyA9CisgICAgICAyLCAgLy8gUmVhZCBvbmx5IHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGNsYXNzaWZpZXIgZmlsZS4KKyAgSU1BUV9SRUFEX0NMQVNTSUZJRVJfRklMRV9NT0RFU19TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBSZWFkQ2xhc3NpZmllckZpbGVNb2RlOworCit0eXBlZGVmIGVudW0gV3JpdGVDbGFzc2lmaWVyRmlsZU1vZGVfZW51bSB7CisgIElNQVFfQ0xBU1NJRklFUl9XUklURV9BTEwgPQorICAgICAgMCwgIC8vIFdyaXRlcyBhbGwgaW5mb3JtYXRpb24gdG8gdGhlIGNsYXNzaWZpZXIgZmlsZS4KKyAgSU1BUV9DTEFTU0lGSUVSX1dSSVRFX0NMQVNTSUZZX09OTFkgPSAxLCAgLy8gV3JpdGUgb25seSB0aGUgaW5mb3JtYXRpb24gbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNsYXNzaWZ5IHRvIHRoZSBjbGFzc2lmaWVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUuCisgIElNQVFfV1JJVEVfQ0xBU1NJRklFUl9GSUxFX01PREVTX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IFdyaXRlQ2xhc3NpZmllckZpbGVNb2RlOworCit0eXBlZGVmIGVudW0gQmFyY29kZTJEU2hhcGVfZW51bSB7CisgIElNQVFfU1FVQVJFX0JBUkNPREVfMkQgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBzcXVhcmUgMkQgYmFyY29kZXMuCisgIElNQVFfUkVDVEFOR1VMQVJfQkFSQ09ERV8yRCA9CisgICAgICAxLCAgLy8gVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciByZWN0YW5ndWxhciAyRCBiYXJjb2Rlcy4KKyAgSU1BUV9CQVJDT0RFXzJEX1NIQVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEJhcmNvZGUyRFNoYXBlOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeFJvdGF0aW9uTW9kZV9lbnVtIHsKKyAgSU1BUV9VTkxJTUlURURfUk9UQVRJT04gPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgdW5saW1pdGVkIHJvdGF0aW9uLgorICBJTUFRXzBfREVHUkVFUyA9CisgICAgICAxLCAgLy8gVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiAtNSBhbmQgNSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICBJTUFRXzkwX0RFR1JFRVMgPQorICAgICAgMiwgIC8vIFRoZSBmdW5jdGlvbiBhbGxvd3MgZm9yIGJldHdlZW4gODUgYW5kIDk1IGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgIElNQVFfMTgwX0RFR1JFRVMgPQorICAgICAgMywgIC8vIFRoZSBmdW5jdGlvbiBhbGxvd3MgZm9yIGJldHdlZW4gMTc1IGFuZCAxODUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgSU1BUV8yNzBfREVHUkVFUyA9CisgICAgICA0LCAgLy8gVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiAyNjUgYW5kIDI3NSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICBJTUFRX0RBVEFfTUFUUklYX1JPVEFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRGF0YU1hdHJpeFJvdGF0aW9uTW9kZTsKKwordHlwZWRlZiBlbnVtIEFJTUdyYWRlX2VudW0geworICBJTUFRX0FJTV9HUkFERV9GID0gMCwgIC8vIFRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHJlY2VpdmVkIGEgZ3JhZGUgb2YgRi4KKyAgSU1BUV9BSU1fR1JBREVfRCA9IDEsICAvLyBUaGUgRGF0YSBNYXRyaXggYmFyY29kZSByZWNlaXZlZCBhIGdyYWRlIG9mIEQuCisgIElNQVFfQUlNX0dSQURFX0MgPSAyLCAgLy8gVGhlIERhdGEgTWF0cml4IGJhcmNvZGUgcmVjZWl2ZWQgYSBncmFkZSBvZiBDLgorICBJTUFRX0FJTV9HUkFERV9CID0gMywgIC8vIFRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHJlY2VpdmVkIGEgZ3JhZGUgb2YgQi4KKyAgSU1BUV9BSU1fR1JBREVfQSA9IDQsICAvLyBUaGUgRGF0YSBNYXRyaXggYmFyY29kZSByZWNlaXZlZCBhIGdyYWRlIG9mIEEuCisgIElNQVFfREFUQV9NQVRSSVhfQUlNX0dSQURFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEFJTUdyYWRlOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeENlbGxGaWxsTW9kZV9lbnVtIHsKKyAgSU1BUV9BVVRPX0RFVEVDVF9DRUxMX0ZJTExfTU9ERSA9IC0yLCAgLy8gU2V0cyB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIE1hdHJpeCBiYXJjb2RlIGNlbGwgZmlsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJjZW50YWdlIGF1dG9tYXRpY2FsbHkuCisgIElNQVFfTE9XX0ZJTEwgPSAwLCAgLy8gU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyB3aXRoIGEKKyAgICAgICAgICAgICAgICAgICAgICAvLyBjZWxsIGZpbGwgcGVyY2VudGFnZSBvZiBsZXNzIHRoYW4gMzAgcGVyY2VudC4KKyAgSU1BUV9OT1JNQUxfRklMTCA9IDEsICAvLyBTZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGNlbGwgZmlsbCBwZXJjZW50YWdlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAzMAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmNlbnQuCisgIElNQVFfREFUQV9NQVRSSVhfQ0VMTF9GSUxMX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRGF0YU1hdHJpeENlbGxGaWxsTW9kZTsKKwordHlwZWRlZiBlbnVtIERhdGFNYXRyaXhEZW1vZHVsYXRpb25Nb2RlX2VudW0geworICBJTUFRX0FVVE9fREVURUNUX0RFTU9EVUxBVElPTl9NT0RFID0KKyAgICAgIC0yLCAgLy8gVGhlIGZ1bmN0aW9uIHdpbGwgdHJ5IGVhY2ggZGVtb2R1bGF0aW9uIG1vZGUgYW5kIHVzZSB0aGUgb25lIHdoaWNoCisgICAgICAgICAgIC8vIGRlY29kZXMgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgd2l0aGluIHRoZSBmZXdlc3QgaXRlcmF0aW9ucyBhbmQKKyAgICAgICAgICAgLy8gdXRpbGl6aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgZXJyb3IgY29ycmVjdGlvbi4KKyAgSU1BUV9ISVNUT0dSQU0gPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgYSBoaXN0b2dyYW0gb2YgYWxsIG9mIHRoZSBEYXRhCisgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdHJpeCBjZWxscyB0byBjYWxjdWxhdGUgYSB0aHJlc2hvbGQuCisgIElNQVFfTE9DQUxfQ09OVFJBU1QgPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIGV4YW1pbmVzIGVhY2ggb2YgdGhlIGNlbGwncworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5laWdoYm9ycyB0byBkZXRlcm1pbmUgaWYgdGhlIGNlbGwgaXMgb24gb3Igb2ZmLgorICBJTUFRX0NPTUJJTkVEID0gMiwgIC8vIFRoZSBmdW5jdGlvbiB1c2VzIHRoZSBoaXN0b2dyYW0gb2YgdGhlIERhdGEgTWF0cml4CisgICAgICAgICAgICAgICAgICAgICAgLy8gYmFyY29kZSB0byBjYWxjdWxhdGUgYSB0aHJlc2hvbGQuCisgIElNQVFfQUxMX0RFTU9EVUxBVElPTl9NT0RFUyA9CisgICAgICAzLCAgLy8gVGhlIGZ1bmN0aW9uIHRyaWVzIElNQVFfSElTVE9HUkFNLCB0aGVuIElNQVFfTE9DQUxfQ09OVFJBU1QgYW5kCisgICAgICAgICAgLy8gdGhlbiBJTUFRX0NPTUJJTkFUSU9OLCBzdG9wcGluZyBvbmNlIG9uZSBtb2RlIGlzIHN1Y2Nlc3NmdWwuCisgIElNQVFfREFUQV9NQVRSSVhfREVNT0RVTEFUSU9OX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRGF0YU1hdHJpeERlbW9kdWxhdGlvbk1vZGU7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4RUNDX2VudW0geworICBJTUFRX0FVVE9fREVURUNUX0VDQyA9IC0yLCAgLy8gU2V0cyB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBEYXRhIE1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFyY29kZSBFQ0MgYXV0b21hdGljYWxseS4KKyAgSU1BUV9FQ0NfMDAwID0KKyAgICAgIDAsICAvLyBTZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIEVDQyAwMDAgb25seS4KKyAgSU1BUV9FQ0NfMDUwID0KKyAgICAgIDUwLCAgLy8gU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBFQ0MgMDUwIG9ubHkuCisgIElNQVFfRUNDXzA4MCA9CisgICAgICA4MCwgIC8vIFNldHMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgRGF0YSBNYXRyaXggYmFyY29kZXMgb2YgRUNDIDA4MCBvbmx5LgorICBJTUFRX0VDQ18xMDAgPQorICAgICAgMTAwLCAgLy8gU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBFQ0MgMTAwIG9ubHkuCisgIElNQVFfRUNDXzE0MCA9CisgICAgICAxNDAsICAvLyBTZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEgTWF0cml4IGJhcmNvZGVzIG9mIEVDQyAxNDAgb25seS4KKyAgSU1BUV9FQ0NfMDAwXzE0MCA9IDE5MCwgIC8vIFNldHMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgRGF0YSBNYXRyaXggYmFyY29kZXMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVDQyAwMDAsIEVDQyAwNTAsIEVDQyAwODAsIEVDQyAxMDAsIGFuZCBFQ0MgMTQwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5LgorICBJTUFRX0VDQ18yMDAgPQorICAgICAgMjAwLCAgLy8gU2V0cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBEYXRhIE1hdHJpeCBiYXJjb2RlcyBvZiBFQ0MgMjAwIG9ubHkuCisgIElNQVFfREFUQV9NQVRSSVhfRUNDX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IERhdGFNYXRyaXhFQ0M7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4UG9sYXJpdHlfZW51bSB7CisgIElNQVFfQVVUT19ERVRFQ1RfUE9MQVJJVFkgPSAtMiwgIC8vIFNldHMgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRyaXggYmFyY29kZSBwb2xhcml0eSBhdXRvbWF0aWNhbGx5LgorICBJTUFRX0JMQUNLX0RBVEFfT05fV0hJVEVfQkFDS0dST1VORCA9IDAsICAvLyBTZXRzIHRoZSBmdW5jdGlvbiB0byByZWFkIERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0cml4IGJhcmNvZGVzIHdpdGggZGFyayBkYXRhIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgYnJpZ2h0IGJhY2tncm91bmQuCisgIElNQVFfV0hJVEVfREFUQV9PTl9CTEFDS19CQUNLR1JPVU5EID0gMSwgIC8vIFNldHMgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRyaXggYmFyY29kZXMgd2l0aCBicmlnaHQgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBhIGRhcmsgYmFja2dyb3VuZC4KKyAgSU1BUV9EQVRBX01BVFJJWF9QT0xBUklUWV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBEYXRhTWF0cml4UG9sYXJpdHk7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4Q2VsbEZpbHRlck1vZGVfZW51bSB7CisgIElNQVFfQVVUT19ERVRFQ1RfQ0VMTF9GSUxURVJfTU9ERSA9CisgICAgICAtMiwgIC8vIFRoZSBmdW5jdGlvbiB3aWxsIHRyeSBhbGwgZmlsdGVyIG1vZGVzIGFuZCB1c2VzIHRoZSBvbmUgdGhhdAorICAgICAgICAgICAvLyBkZWNvZGVzIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIHdpdGhpbiB0aGUgZmV3ZXN0IGl0ZXJhdGlvbnMgYW5kCisgICAgICAgICAgIC8vIHV0aWxpemluZyB0aGUgbGVhc3QgYW1vdW50IG9mIGVycm9yIGNvcnJlY3Rpb24uCisgIElNQVFfQVZFUkFHRV9GSUxURVIgPSAwLCAgLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhdmVyYWdlIG9mIHRoZSBzYW1wbGVkIHBpeGVscy4KKyAgSU1BUV9NRURJQU5fRklMVEVSID0gMSwgIC8vIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZWRpYW4gb2YgdGhlIHNhbXBsZWQgcGl4ZWxzLgorICBJTUFRX0NFTlRSQUxfQVZFUkFHRV9GSUxURVIgPSAyLCAgLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlbGwgdG8gdGhlIGF2ZXJhZ2Ugb2YgdGhlIHBpeGVscyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlbnRlciBvZiB0aGUgY2VsbCBzYW1wbGUuCisgIElNQVFfSElHSF9BVkVSQUdFX0ZJTFRFUiA9CisgICAgICAzLCAgLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgY2VsbCB0byB0aGUgYXZlcmFnZSB2YWx1ZQorICAgICAgICAgIC8vIG9mIHRoZSBoYWxmIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBoaWdoZXN0IHBpeGVsIHZhbHVlcy4KKyAgSU1BUV9MT1dfQVZFUkFHRV9GSUxURVIgPSA0LCAgLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2VsbCB0byB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgaGFsZiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlZCBwaXhlbHMgd2l0aCB0aGUgbG93ZXN0IHBpeGVsIHZhbHVlcy4KKyAgSU1BUV9WRVJZX0hJR0hfQVZFUkFHRV9GSUxURVIgPQorICAgICAgNSwgIC8vIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwaXhlbCB2YWx1ZSBmb3IgdGhlIGNlbGwgdG8gdGhlIGF2ZXJhZ2UgdmFsdWUKKyAgICAgICAgICAvLyBvZiB0aGUgbmludGggb2YgdGhlIHNhbXBsZWQgcGl4ZWxzIHdpdGggdGhlIGhpZ2hlc3QgcGl4ZWwgdmFsdWVzLgorICBJTUFRX1ZFUllfTE9XX0FWRVJBR0VfRklMVEVSID0KKyAgICAgIDYsICAvLyBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBjZWxsIHRvIHRoZSBhdmVyYWdlIHZhbHVlCisgICAgICAgICAgLy8gb2YgdGhlIG5pbnRoIG9mIHRoZSBzYW1wbGVkIHBpeGVscyB3aXRoIHRoZSBsb3dlc3QgcGl4ZWwgdmFsdWVzLgorICBJTUFRX0FMTF9DRUxMX0ZJTFRFUlMgPSA4LCAgLy8gVGhlIGZ1bmN0aW9uIHRyaWVzIGVhY2ggZmlsdGVyIG1vZGUsIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIElNQVFfQVZFUkFHRV9GSUxURVIgYW5kIGVuZGluZyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJTUFRX1ZFUllfTE9XX0FWRVJBR0VfRklMVEVSLCBzdG9wcGluZyBvbmNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlciBtb2RlIGRlY29kZXMgY29ycmVjdGx5LgorICBJTUFRX0RBVEFfTUFUUklYX0NFTExfRklMVEVSX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRGF0YU1hdHJpeENlbGxGaWx0ZXJNb2RlOworCit0eXBlZGVmIGVudW0gV2luZG93QmFja2dyb3VuZEhhdGNoU3R5bGVfZW51bSB7CisgIElNQVFfSEFUQ0hfU1RZTEVfSE9SSVpPTlRBTCA9CisgICAgICAwLCAgLy8gVGhlIGJhY2tncm91bmQgb2YgdGhlIGRpc3BsYXkgd2luZG93IHdpbGwgYmUgaG9yaXpvbnRhbCBiYXJzLgorICBJTUFRX0hBVENIX1NUWUxFX1ZFUlRJQ0FMID0KKyAgICAgIDEsICAvLyBUaGUgYmFja2dyb3VuZCBvZiB0aGUgZGlzcGxheSB3aW5kb3cgd2lsbCBiZSB2ZXJ0aWNhbCBiYXJzLgorICBJTUFRX0hBVENIX1NUWUxFX0ZPUldBUkRfRElBR09OQUwgPQorICAgICAgMiwgIC8vIFRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB3aWxsIGJlIGRpYWdvbmFsIGJhcnMuCisgIElNQVFfSEFUQ0hfU1RZTEVfQkFDS1dBUkRfRElBR09OQUwgPQorICAgICAgMywgIC8vIFRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBkaXNwbGF5IHdpbmRvdyB3aWxsIGJlIGRpYWdvbmFsIGJhcnMuCisgIElNQVFfSEFUQ0hfU1RZTEVfQ1JPU1MgPSA0LCAgLy8gVGhlIGJhY2tncm91bmQgb2YgdGhlIGRpc3BsYXkgd2luZG93IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcnNlY3RpbmcgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYmFycy4KKyAgSU1BUV9IQVRDSF9TVFlMRV9DUk9TU19IQVRDSCA9IDUsICAvLyBUaGUgYmFja2dyb3VuZCBvZiB0aGUgZGlzcGxheSB3aW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGludGVyc2VjdGluZyBmb3J3YXJkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkIGRpYWdvbmFsIGJhcnMuCisgIElNQVFfSEFUQ0hfU1RZTEVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gV2luZG93QmFja2dyb3VuZEhhdGNoU3R5bGU7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4TWlycm9yTW9kZV9lbnVtIHsKKyAgSU1BUV9BVVRPX0RFVEVDVF9NSVJST1IgPSAtMiwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgZGV0ZXJtaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBpcyBtaXJyb3JlZC4KKyAgSU1BUV9BUFBFQVJTX05PUk1BTCA9IDAsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGV4cGVjdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIE1hdHJpeCBiYXJjb2RlIHRvIGFwcGVhciBub3JtYWwuCisgIElNQVFfQVBQRUFSU19NSVJST1JFRCA9IDEsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGV4cGVjdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgTWF0cml4IGJhcmNvZGUgdG8gYXBwZWFyIG1pcnJvcmVkLgorICBJTUFRX0RBVEFfTUFUUklYX01JUlJPUl9NT0RFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IERhdGFNYXRyaXhNaXJyb3JNb2RlOworCit0eXBlZGVmIGVudW0gQ2FsaWJyYXRpb25Nb2RlMl9lbnVtIHsKKyAgSU1BUV9QRVJTUEVDVElWRV9NT0RFID0gMCwgIC8vIEZ1bmN0aW9ucyBjb3JyZWN0IGZvciBkaXN0b3J0aW9uIGNhdXNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbWVyYSdzIHBlcnNwZWN0aXZlLgorICBJTUFRX01JQ1JPUExBTkVfTU9ERSA9CisgICAgICAxLCAgLy8gRnVuY3Rpb25zIGNvcnJlY3QgZm9yIGRpc3RvcnRpb24gY2F1c2VkIGJ5IHRoZSBjYW1lcmEncyBsZW5zLgorICBJTUFRX1NJTVBMRV9DQUxJQlJBVElPTl9NT0RFID0gMiwgIC8vIEZ1bmN0aW9ucyBkbyBub3QgY29ycmVjdCBmb3IgZGlzdG9ydGlvbi4KKyAgSU1BUV9DT1JSRUNURURfSU1BR0VfTU9ERSA9IDMsICAvLyBUaGUgaW1hZ2UgaXMgYWxyZWFkeSBjb3JyZWN0ZWQuCisgIElNQVFfTk9fQ0FMSUJSQVRJT05fTU9ERSA9IDQsICAvLyBJbWFnZSB3aXRoIE5vIGNhbGlicmF0aW9uLgorICBJTUFRX0NBTElCUkFUSU9OX01PREUyX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IENhbGlicmF0aW9uTW9kZTI7CisKK3R5cGVkZWYgZW51bSBEYXRhTWF0cml4R3JhZGluZ01vZGVfZW51bSB7CisgIElNQVFfTk9fR1JBRElORyA9CisgICAgICAwLCAgLy8gVGhlIGZ1bmN0aW9uIGRvZXMgbm90IG1ha2UgYW55IHByZXBhcmF0b3J5IGNhbGN1bGF0aW9ucy4KKyAgSU1BUV9QUkVQQVJFX0ZPUl9BSU0gPSAxLCAgLy8gVGhlIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBpbWFnZSBmb3IgZ3JhZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2luZyB0aGUgQUlNIFByaW50IFF1YWxpdHkgbWV0cmljcy4KKyAgSU1BUV9EQVRBX01BVFJJWF9HUkFESU5HX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRGF0YU1hdHJpeEdyYWRpbmdNb2RlOworCit0eXBlZGVmIGVudW0gV2F2ZWxldFRyYW5zZm9ybU1vZGVfZW51bSB7CisgIElNQVFfV0FWRUxFVF9UUkFOU0ZPUk1fSU5URUdFUiA9CisgICAgICAwLCAgLy8gVXNlcyBhIDUtMyByZXZlcnNpYmxlIGludGVnZXIgdHJhbnNmb3JtLgorICBJTUFRX1dBVkVMRVRfVFJBTlNGT1JNX0ZMT0FUSU5HX1BPSU5UID0KKyAgICAgIDEsICAvLyBQZXJmb3JtcyBhIDktNyBpcnJldmVyc2libGUgZmxvYXRpbmctcG9pbnQgdHJhbnNmb3JtLgorICBJTUFRX1dBVkVMRVRfVFJBTlNGT1JNX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gV2F2ZWxldFRyYW5zZm9ybU1vZGU7CisKK3R5cGVkZWYgZW51bSBOb3JtYWxpemF0aW9uTWV0aG9kX2VudW0geworICBJTUFRX05PUk1BTElaQVRJT05fTk9ORSA9IDAsICAvLyBObyBub3JtYWxpemF0aW9uLgorICBJTUFRX05PUk1BTElaQVRJT05fSElTVE9HUkFNX01BVENISU5HID0gMSwgIC8vIEFkanVzdCBpbWFnZSBzbyBpdHMgaGlzdG9ncmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc2ltaWxhciB0byB0aGUgZ29sZGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUncyBoaXN0b2dyYW0uCisgIElNQVFfTk9STUFMSVpBVElPTl9BVkVSQUdFX01BVENISU5HID0gMiwgIC8vIEFkanVzdCBpbWFnZSBzbyBpdHMgbWVhbiBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBlcXVhbHMgdGhlIGdvbGRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSdzIG1lYW4gcGl4ZWwgdmFsdWUuCisgIElNQVFfTk9STUFMSVpBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBOb3JtYWxpemF0aW9uTWV0aG9kOworCit0eXBlZGVmIGVudW0gUmVnaXN0cmF0aW9uTWV0aG9kX2VudW0geworICBJTUFRX1JFR0lTVFJBVElPTl9OT05FID0gMCwgIC8vIE5vIHJlZ2lzdHJhdGlvbi4KKyAgSU1BUV9SRUdJU1RSQVRJT05fUEVSU1BFQ1RJVkUgPSAxLCAgLy8gQWRqdXN0IGltYWdlIHRvIGNvcnJlY3QgZm9yIG1pbm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbnMgaW4gYWxpZ25tZW50IG9yIHBlcnNwZWN0aXZlLgorICBJTUFRX1JFR0lTVFJBVElPTl9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBSZWdpc3RyYXRpb25NZXRob2Q7CisKK3R5cGVkZWYgZW51bSBMaW5lYXJBdmVyYWdlc01vZGVfZW51bSB7CisgIElNQVFfQ09MVU1OX0FWRVJBR0VTID0gMSwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBtZWFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVsIHZhbHVlIG9mIGVhY2ggY29sdW1uLgorICBJTUFRX1JPV19BVkVSQUdFUyA9IDIsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbWVhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbCB2YWx1ZSBvZiBlYWNoIHJvdy4KKyAgSU1BUV9SSVNJTkdfRElBR09OQUxfQVZFUkFHRVMgPQorICAgICAgNCwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2gKKyAgICAgICAgICAvLyBkaWFnb25hbCBydW5uaW5nIGZyb20gdGhlIGxvd2VyIGxlZnQgdG8gdGhlIHVwcGVyIHJpZ2h0IG9mIHRoZQorICAgICAgICAgIC8vIGluc3BlY3RlZCBhcmVhIG9mIHRoZSBpbWFnZS4KKyAgSU1BUV9GQUxMSU5HX0RJQUdPTkFMX0FWRVJBR0VTID0KKyAgICAgIDgsICAvLyBTcGVjaWZpZXMgdGhhdCB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbWVhbiBwaXhlbCB2YWx1ZSBvZiBlYWNoCisgICAgICAgICAgLy8gZGlhZ29uYWwgcnVubmluZyBmcm9tIHRoZSB1cHBlciBsZWZ0IHRvIHRoZSBsb3dlciByaWdodCBvZiB0aGUKKyAgICAgICAgICAvLyBpbnNwZWN0ZWQgYXJlYSBvZiB0aGUgaW1hZ2UuCisgIElNQVFfQUxMX0xJTkVBUl9BVkVSQUdFUyA9IDE1LCAgLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91ciBsaW5lYXIgbWVhbiBwaXhlbCB2YWx1ZXMuCisgIElNQVFfTElORUFSX0FWRVJBR0VTX01PREVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gTGluZWFyQXZlcmFnZXNNb2RlOworCit0eXBlZGVmIGVudW0gQ29tcHJlc3Npb25UeXBlX2VudW0geworICBJTUFRX0NPTVBSRVNTSU9OX05PTkUgPQorICAgICAgMCwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgbm90IGNvbXByZXNzIHRoZSBpbWFnZS4KKyAgSU1BUV9DT01QUkVTU0lPTl9KUEVHID0gMSwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgdXNlIGxvc3N5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKUEVHIGNvbXByZXNzaW9uIG9uIHRoZSBpbWFnZS4KKyAgSU1BUV9DT01QUkVTU0lPTl9QQUNLRURfQklOQVJZID0gMiwgIC8vIFNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3NzbGVzcyBiaW5hcnkgcGFja2luZyBvbiB0aGUgaW1hZ2UuCisgIElNQVFfQ09NUFJFU1NJT05fVFlQRV9TSVpFX0dVQVJEID0gMHhGRkZGRkZGRgorfSBDb21wcmVzc2lvblR5cGU7CisKK3R5cGVkZWYgZW51bSBGbGF0dGVuVHlwZV9lbnVtIHsKKyAgSU1BUV9GTEFUVEVOX0lNQUdFID0gMCwgIC8vIEZsYXR0ZW5zIGp1c3QgdGhlIGltYWdlIGRhdGEuCisgIElNQVFfRkxBVFRFTl9JTUFHRV9BTkRfVklTSU9OX0lORk8gPSAxLCAgLy8gRmxhdHRlbnMgdGhlIGltYWdlIGRhdGEgYW5kIGFueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZpc2lvbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW1hZ2UuCisgIElNQVFfRkxBVFRFTl9UWVBFX1NJWkVfR1VBUkQgPSAweEZGRkZGRkZGCit9IEZsYXR0ZW5UeXBlOworCit0eXBlZGVmIGVudW0gRGF0YU1hdHJpeENlbGxTYW1wbGVTaXplX2VudW0geworICBJTUFRX0FVVE9fREVURUNUX0NFTExfU0FNUExFX1NJWkUgPQorICAgICAgLTIsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB0cnkgZWFjaCBzYW1wbGUgc2l6ZSBhbmQgdXNlIHRoZSBvbmUgd2hpY2gKKyAgICAgICAgICAgLy8gZGVjb2RlcyB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSB3aXRoaW4gdGhlIGZld2VzdCBpdGVyYXRpb25zIGFuZAorICAgICAgICAgICAvLyB1dGlsaXppbmcgdGhlIGxlYXN0IGFtb3VudCBvZiBlcnJvciBjb3JyZWN0aW9uLgorICBJTUFRXzF4MSA9IDEsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSAxeDEgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRXzJ4MiA9IDIsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSAyeDIgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRXzN4MyA9IDMsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSAzeDMgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRXzR4NCA9IDQsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA0eDQgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRXzV4NSA9IDUsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA1eDUgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRXzZ4NiA9IDYsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA2eDYgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRXzd4NyA9IDcsICAvLyBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYSA3eDcgc2l6ZWQgc2FtcGxlIGZyb20gZWFjaCBjZWxsLgorICBJTUFRX0RBVEFfTUFUUklYX0NFTExfU0FNUExFX1NJWkVfU0laRV9HVUFSRCA9IDB4RkZGRkZGRkYKK30gRGF0YU1hdHJpeENlbGxTYW1wbGVTaXplOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBGb3J3YXJkIERlY2xhcmUgRGF0YSBTdHJ1Y3R1cmVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgc3RydWN0IEltYWdlX3N0cnVjdCBJbWFnZTsKK3R5cGVkZWYgc3RydWN0IFJPSV9zdHJ1Y3QgUk9JOwordHlwZWRlZiBzdHJ1Y3QgT3ZlcmxheV9zdHJ1Y3QgT3ZlcmxheTsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJTZXNzaW9uX3N0cnVjdCBDbGFzc2lmaWVyU2Vzc2lvbjsKK3R5cGVkZWYgc3RydWN0IE11bHRpcGxlR2VvbWV0cmljUGF0dGVybl9zdHJ1Y3QgTXVsdGlwbGVHZW9tZXRyaWNQYXR0ZXJuOwordHlwZWRlZiBpbnQgQ29udG91cklEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFNFU1NJT05fSUQ7Cit0eXBlZGVmIGludCBBVklTZXNzaW9uOwordHlwZWRlZiBjaGFyKiBGaWx0ZXJOYW1lOwordHlwZWRlZiBjaGFyIFN0cmluZzI1NVsyNTZdOwordHlwZWRlZiBzdHJ1Y3QgQ2hhclNldF9zdHJ1Y3QgQ2hhclNldDsKK3R5cGVkZWYgc3RydWN0IE9DUlNwYWNpbmdPcHRpb25zX3N0cnVjdCBPQ1JTcGFjaW5nT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IE9DUlByb2Nlc3NpbmdPcHRpb25zX3N0cnVjdCBPQ1JQcm9jZXNzaW5nT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0T3B0aW9uc19zdHJ1Y3QgUmVhZFRleHRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ2hhckluZm9fc3RydWN0IENoYXJJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQ2hhclJlcG9ydF9zdHJ1Y3QgQ2hhclJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0X3N0cnVjdCBSZWFkVGV4dFJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IERpdmlzaW9uTW9kZWxfc3RydWN0IERpdmlzaW9uTW9kZWw7Cit0eXBlZGVmIHN0cnVjdCBGb2NhbExlbmd0aF9zdHJ1Y3QgRm9jYWxMZW5ndGg7Cit0eXBlZGVmIHN0cnVjdCBQb2x5TW9kZWxfc3RydWN0IFBvbHlNb2RlbDsKK3R5cGVkZWYgc3RydWN0IERpc3RvcnRpb25Nb2RlbFBhcmFtc19zdHJ1Y3QgRGlzdG9ydGlvbk1vZGVsUGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgUG9pbnRGbG9hdF9zdHJ1Y3QgUG9pbnRGbG9hdDsKK3R5cGVkZWYgc3RydWN0IEludGVybmFsUGFyYW1ldGVyc19zdHJ1Y3QgSW50ZXJuYWxQYXJhbWV0ZXJzOwordHlwZWRlZiBzdHJ1Y3QgTWF4R3JpZFNpemVfc3RydWN0IE1heEdyaWRTaXplOwordHlwZWRlZiBzdHJ1Y3QgSW1hZ2VTaXplX3N0cnVjdCBJbWFnZVNpemU7Cit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvblJlZmVyZW5jZVBvaW50c19zdHJ1Y3QgQ2FsaWJyYXRpb25SZWZlcmVuY2VQb2ludHM7Cit0eXBlZGVmIHN0cnVjdCBHZXRDYW1lcmFQYXJhbWV0ZXJzUmVwb3J0X3N0cnVjdCBHZXRDYW1lcmFQYXJhbWV0ZXJzUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQ2FsaWJyYXRpb25BeGlzSW5mb19zdHJ1Y3QgQ2FsaWJyYXRpb25BeGlzSW5mbzsKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uTGVhcm5TZXR1cEluZm9fc3RydWN0IENhbGlicmF0aW9uTGVhcm5TZXR1cEluZm87Cit0eXBlZGVmIHN0cnVjdCBHcmlkRGVzY3JpcHRvcl9zdHJ1Y3QgR3JpZERlc2NyaXB0b3I7Cit0eXBlZGVmIHN0cnVjdCBFcnJvclN0YXRpc3RpY3Nfc3RydWN0IEVycm9yU3RhdGlzdGljczsKK3R5cGVkZWYgc3RydWN0IEdldENhbGlicmF0aW9uSW5mb1JlcG9ydF9zdHJ1Y3QgR2V0Q2FsaWJyYXRpb25JbmZvUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRWRnZVBvbGFyaXR5X3N0cnVjdCBFZGdlUG9sYXJpdHk7Cit0eXBlZGVmIHN0cnVjdCBDbGFtcFNldHRpbmdzX3N0cnVjdCBDbGFtcFNldHRpbmdzOwordHlwZWRlZiBzdHJ1Y3QgUG9pbnREb3VibGVfc3RydWN0IFBvaW50RG91YmxlOwordHlwZWRlZiBzdHJ1Y3QgUG9pbnREb3VibGVQYWlyX3N0cnVjdCBQb2ludERvdWJsZVBhaXI7Cit0eXBlZGVmIHN0cnVjdCBDbGFtcFJlc3VsdHNfc3RydWN0IENsYW1wUmVzdWx0czsKK3R5cGVkZWYgc3RydWN0IENsYW1wUG9pbnRzX3N0cnVjdCBDbGFtcFBvaW50czsKK3R5cGVkZWYgc3RydWN0IFJHQlZhbHVlX3N0cnVjdCBSR0JWYWx1ZTsKK3R5cGVkZWYgc3RydWN0IENsYW1wT3ZlcmxheVNldHRpbmdzX3N0cnVjdCBDbGFtcE92ZXJsYXlTZXR0aW5nczsKK3R5cGVkZWYgc3RydWN0IENsYW1wTWF4MlJlcG9ydF9zdHJ1Y3QgQ2xhbXBNYXgyUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckZpdFNwbGluZVJlcG9ydF9zdHJ1Y3QgQ29udG91ckZpdFNwbGluZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IExpbmVGbG9hdF9zdHJ1Y3QgTGluZUZsb2F0OwordHlwZWRlZiBzdHJ1Y3QgTGluZUVxdWF0aW9uX3N0cnVjdCBMaW5lRXF1YXRpb247Cit0eXBlZGVmIHN0cnVjdCBDb250b3VyRml0TGluZVJlcG9ydF9zdHJ1Y3QgQ29udG91ckZpdExpbmVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb250b3VyRml0UG9seW5vbWlhbFJlcG9ydF9zdHJ1Y3QgQ29udG91ckZpdFBvbHlub21pYWxSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWFsQ2lyY2xlX3N0cnVjdCBQYXJ0aWFsQ2lyY2xlOwordHlwZWRlZiBzdHJ1Y3QgUGFydGlhbEVsbGlwc2Vfc3RydWN0IFBhcnRpYWxFbGxpcHNlOwordHlwZWRlZiBzdHJ1Y3QgU2V0dXBNYXRjaFBhdHRlcm5EYXRhX3N0cnVjdCBTZXR1cE1hdGNoUGF0dGVybkRhdGE7Cit0eXBlZGVmIHN0cnVjdCBSYW5nZVNldHRpbmdEb3VibGVfc3RydWN0IFJhbmdlU2V0dGluZ0RvdWJsZTsKK3R5cGVkZWYgc3RydWN0IEdlb21ldHJpY0FkdmFuY2VkU2V0dXBEYXRhT3B0aW9uX3N0cnVjdAorICAgIEdlb21ldHJpY0FkdmFuY2VkU2V0dXBEYXRhT3B0aW9uOwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckluZm9SZXBvcnRfc3RydWN0IENvbnRvdXJJbmZvUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgUk9JTGFiZWxfc3RydWN0IFJPSUxhYmVsOwordHlwZWRlZiBzdHJ1Y3QgU3VwZXJ2aXNlZENvbG9yU2VnbWVudGF0aW9uUmVwb3J0X3N0cnVjdAorICAgIFN1cGVydmlzZWRDb2xvclNlZ21lbnRhdGlvblJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IExhYmVsVG9ST0lSZXBvcnRfc3RydWN0IExhYmVsVG9ST0lSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb2xvclNlZ21lbmF0aW9uT3B0aW9uc19zdHJ1Y3QgQ29sb3JTZWdtZW5hdGlvbk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVkQ3VydmVfc3RydWN0IENsYXNzaWZpZWRDdXJ2ZTsKK3R5cGVkZWYgc3RydWN0IFJhbmdlRG91YmxlX3N0cnVjdCBSYW5nZURvdWJsZTsKK3R5cGVkZWYgc3RydWN0IFJhbmdlTGFiZWxfc3RydWN0IFJhbmdlTGFiZWw7Cit0eXBlZGVmIHN0cnVjdCBDdXJ2YXR1cmVBbmFseXNpc1JlcG9ydF9zdHJ1Y3QgQ3VydmF0dXJlQW5hbHlzaXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBEaXNwYXJpdHlfc3RydWN0IERpc3Bhcml0eTsKK3R5cGVkZWYgc3RydWN0IENvbXB1dGVEaXN0YW5jZXNSZXBvcnRfc3RydWN0IENvbXB1dGVEaXN0YW5jZXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaE1vZGVfc3RydWN0IE1hdGNoTW9kZTsKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZWREaXNwYXJpdHlfc3RydWN0IENsYXNzaWZpZWREaXNwYXJpdHk7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmeURpc3RhbmNlc1JlcG9ydF9zdHJ1Y3QgQ2xhc3NpZnlEaXN0YW5jZXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb250b3VyQ29tcHV0ZUN1cnZhdHVyZVJlcG9ydF9zdHJ1Y3QKKyAgICBDb250b3VyQ29tcHV0ZUN1cnZhdHVyZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJPdmVybGF5U2V0dGluZ3Nfc3RydWN0IENvbnRvdXJPdmVybGF5U2V0dGluZ3M7Cit0eXBlZGVmIHN0cnVjdCBDdXJ2ZVBhcmFtZXRlcnNfc3RydWN0IEN1cnZlUGFyYW1ldGVyczsKK3R5cGVkZWYgc3RydWN0IEV4dHJhY3RDb250b3VyUmVwb3J0X3N0cnVjdCBFeHRyYWN0Q29udG91clJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENvbm5lY3Rpb25Db25zdHJhaW50X3N0cnVjdCBDb25uZWN0aW9uQ29uc3RyYWludDsKK3R5cGVkZWYgc3RydWN0IEV4dHJhY3RUZXh0dXJlRmVhdHVyZXNSZXBvcnRfc3RydWN0IEV4dHJhY3RUZXh0dXJlRmVhdHVyZXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBXYXZlbGV0QmFuZHNSZXBvcnRfc3RydWN0IFdhdmVsZXRCYW5kc1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IENpcmNsZUZpdE9wdGlvbnNfc3RydWN0IENpcmNsZUZpdE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBFZGdlT3B0aW9uczJfc3RydWN0IEVkZ2VPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IEZpbmRDaXJjdWxhckVkZ2VPcHRpb25zX3N0cnVjdCBGaW5kQ2lyY3VsYXJFZGdlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEZpbmRDb25jZW50cmljRWRnZU9wdGlvbnNfc3RydWN0IEZpbmRDb25jZW50cmljRWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDb25jZW50cmljRWRnZUZpdE9wdGlvbnNfc3RydWN0IENvbmNlbnRyaWNFZGdlRml0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEZpbmRDb25jZW50cmljRWRnZVJlcG9ydF9zdHJ1Y3QgRmluZENvbmNlbnRyaWNFZGdlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRmluZENpcmN1bGFyRWRnZVJlcG9ydF9zdHJ1Y3QgRmluZENpcmN1bGFyRWRnZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFdpbmRvd1NpemVfc3RydWN0IFdpbmRvd1NpemU7Cit0eXBlZGVmIHN0cnVjdCBEaXNwbGFjZW1lbnRWZWN0b3Jfc3RydWN0IERpc3BsYWNlbWVudFZlY3RvcjsKK3R5cGVkZWYgc3RydWN0IFdhdmVsZXRPcHRpb25zX3N0cnVjdCBXYXZlbGV0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENvb2NjdXJyZW5jZU9wdGlvbnNfc3RydWN0IENvb2NjdXJyZW5jZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJMb2NhbFRocmVzaG9sZE9wdGlvbnNfc3RydWN0CisgICAgUGFydGljbGVDbGFzc2lmaWVyTG9jYWxUaHJlc2hvbGRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VGbG9hdF9zdHJ1Y3QgUmFuZ2VGbG9hdDsKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllckF1dG9UaHJlc2hvbGRPcHRpb25zX3N0cnVjdAorICAgIFBhcnRpY2xlQ2xhc3NpZmllckF1dG9UaHJlc2hvbGRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnMyX3N0cnVjdAorICAgIFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IE1lYXN1cmVQYXJ0aWNsZXNSZXBvcnRfc3RydWN0IE1lYXN1cmVQYXJ0aWNsZXNSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gzX3N0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gzOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zM19zdHJ1Y3QKKyAgICBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMzOwordHlwZWRlZiBzdHJ1Y3QgQ29sb3JPcHRpb25zX3N0cnVjdCBDb2xvck9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBTYW1wbGVTY29yZV9zdHJ1Y3QgU2FtcGxlU2NvcmU7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVyUmVwb3J0QWR2YW5jZWRfc3RydWN0IENsYXNzaWZpZXJSZXBvcnRBZHZhbmNlZDsKK3R5cGVkZWYgc3RydWN0IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczJfc3RydWN0CisgICAgTGVhcm5HZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uczJfc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uczI7Cit0eXBlZGVmIHN0cnVjdCBGaW5kRWRnZU9wdGlvbnMyX3N0cnVjdCBGaW5kRWRnZU9wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgRmluZEVkZ2VSZXBvcnRfc3RydWN0IEZpbmRFZGdlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRmluZFRyYW5zZm9ybVJlY3RPcHRpb25zMl9zdHJ1Y3QgRmluZFRyYW5zZm9ybVJlY3RPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IEZpbmRUcmFuc2Zvcm1SZWN0c09wdGlvbnMyX3N0cnVjdCBGaW5kVHJhbnNmb3JtUmVjdHNPcHRpb25zMjsKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0M19zdHJ1Y3QgUmVhZFRleHRSZXBvcnQzOwordHlwZWRlZiBzdHJ1Y3QgQ2hhcmFjdGVyU3RhdGlzdGljc19zdHJ1Y3QgQ2hhcmFjdGVyU3RhdGlzdGljczsKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnQzX3N0cnVjdCBDaGFyUmVwb3J0MzsKK3R5cGVkZWYgc3RydWN0IEFyY0luZm8yX3N0cnVjdCBBcmNJbmZvMjsKK3R5cGVkZWYgc3RydWN0IEVkZ2VSZXBvcnQyX3N0cnVjdCBFZGdlUmVwb3J0MjsKK3R5cGVkZWYgc3RydWN0IFNlYXJjaEFyY0luZm9fc3RydWN0IFNlYXJjaEFyY0luZm87Cit0eXBlZGVmIHN0cnVjdCBDb25jZW50cmljUmFrZVJlcG9ydDJfc3RydWN0IENvbmNlbnRyaWNSYWtlUmVwb3J0MjsKK3R5cGVkZWYgc3RydWN0IFNwb2tlUmVwb3J0Ml9zdHJ1Y3QgU3Bva2VSZXBvcnQyOwordHlwZWRlZiBzdHJ1Y3QgRWRnZUluZm9fc3RydWN0IEVkZ2VJbmZvOwordHlwZWRlZiBzdHJ1Y3QgU2VhcmNoTGluZUluZm9fc3RydWN0IFNlYXJjaExpbmVJbmZvOwordHlwZWRlZiBzdHJ1Y3QgUmFrZVJlcG9ydDJfc3RydWN0IFJha2VSZXBvcnQyOwordHlwZWRlZiBzdHJ1Y3QgVHJhbnNmb3JtQmVoYXZpb3JzX3N0cnVjdCBUcmFuc2Zvcm1CZWhhdmlvcnM7Cit0eXBlZGVmIHN0cnVjdCBRUkNvZGVEYXRhVG9rZW5fc3RydWN0IFFSQ29kZURhdGFUb2tlbjsKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uc19zdHJ1Y3QgUGFydGljbGVGaWx0ZXJPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgU3RyYWlnaHRFZGdlUmVwb3J0Ml9zdHJ1Y3QgU3RyYWlnaHRFZGdlUmVwb3J0MjsKK3R5cGVkZWYgc3RydWN0IFN0cmFpZ2h0RWRnZU9wdGlvbnNfc3RydWN0IFN0cmFpZ2h0RWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBTdHJhaWdodEVkZ2Vfc3RydWN0IFN0cmFpZ2h0RWRnZTsKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVNlYXJjaE9wdGlvbnNfc3RydWN0IFFSQ29kZVNlYXJjaE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBRUkNvZGVTaXplT3B0aW9uc19zdHJ1Y3QgUVJDb2RlU2l6ZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBRUkNvZGVEZXNjcmlwdGlvbk9wdGlvbnNfc3RydWN0IFFSQ29kZURlc2NyaXB0aW9uT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVJlcG9ydF9zdHJ1Y3QgUVJDb2RlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQUlNR3JhZGVSZXBvcnRfc3RydWN0IEFJTUdyYWRlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeFNpemVPcHRpb25zX3N0cnVjdCBEYXRhTWF0cml4U2l6ZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4RGVzY3JpcHRpb25PcHRpb25zX3N0cnVjdCBEYXRhTWF0cml4RGVzY3JpcHRpb25PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeFNlYXJjaE9wdGlvbnNfc3RydWN0IERhdGFNYXRyaXhTZWFyY2hPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeFJlcG9ydF9zdHJ1Y3QgRGF0YU1hdHJpeFJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEpQRUcyMDAwRmlsZUFkdmFuY2VkT3B0aW9uc19zdHJ1Y3QgSlBFRzIwMDBGaWxlQWR2YW5jZWRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zMl9zdHJ1Y3QKKyAgICBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgSW5zcGVjdGlvbkFsaWdubWVudF9zdHJ1Y3QgSW5zcGVjdGlvbkFsaWdubWVudDsKK3R5cGVkZWYgc3RydWN0IEluc3BlY3Rpb25PcHRpb25zX3N0cnVjdCBJbnNwZWN0aW9uT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnQyX3N0cnVjdCBDaGFyUmVwb3J0MjsKK3R5cGVkZWYgc3RydWN0IENoYXJJbmZvMl9zdHJ1Y3QgQ2hhckluZm8yOwordHlwZWRlZiBzdHJ1Y3QgUmVhZFRleHRSZXBvcnQyX3N0cnVjdCBSZWFkVGV4dFJlcG9ydDI7Cit0eXBlZGVmIHN0cnVjdCBFbGxpcHNlRmVhdHVyZV9zdHJ1Y3QgRWxsaXBzZUZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBDaXJjbGVGZWF0dXJlX3N0cnVjdCBDaXJjbGVGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RDdXJ2ZUZlYXR1cmVfc3RydWN0IENvbnN0Q3VydmVGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgUmVjdGFuZ2xlRmVhdHVyZV9zdHJ1Y3QgUmVjdGFuZ2xlRmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IExlZ0ZlYXR1cmVfc3RydWN0IExlZ0ZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBDb3JuZXJGZWF0dXJlX3N0cnVjdCBDb3JuZXJGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgTGluZUZlYXR1cmVfc3RydWN0IExpbmVGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgUGFyYWxsZWxMaW5lUGFpckZlYXR1cmVfc3RydWN0IFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgUGFpck9mUGFyYWxsZWxMaW5lUGFpcnNGZWF0dXJlX3N0cnVjdAorICAgIFBhaXJPZlBhcmFsbGVsTGluZVBhaXJzRmVhdHVyZTsKK3R5cGVkZWYgdW5pb24gR2VvbWV0cmljRmVhdHVyZV91bmlvbiBHZW9tZXRyaWNGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgRmVhdHVyZURhdGFfc3RydWN0IEZlYXR1cmVEYXRhOwordHlwZWRlZiBzdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoMl9zdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoMjsKK3R5cGVkZWYgc3RydWN0IENsb3NlZEN1cnZlRmVhdHVyZV9zdHJ1Y3QgQ2xvc2VkQ3VydmVGZWF0dXJlOwordHlwZWRlZiBzdHJ1Y3QgTGluZU1hdGNoX3N0cnVjdCBMaW5lTWF0Y2g7Cit0eXBlZGVmIHN0cnVjdCBMaW5lRGVzY3JpcHRvcl9zdHJ1Y3QgTGluZURlc2NyaXB0b3I7Cit0eXBlZGVmIHN0cnVjdCBSZWN0YW5nbGVEZXNjcmlwdG9yX3N0cnVjdCBSZWN0YW5nbGVEZXNjcmlwdG9yOwordHlwZWRlZiBzdHJ1Y3QgUmVjdGFuZ2xlTWF0Y2hfc3RydWN0IFJlY3RhbmdsZU1hdGNoOwordHlwZWRlZiBzdHJ1Y3QgRWxsaXBzZURlc2NyaXB0b3Jfc3RydWN0IEVsbGlwc2VEZXNjcmlwdG9yOwordHlwZWRlZiBzdHJ1Y3QgRWxsaXBzZU1hdGNoX3N0cnVjdCBFbGxpcHNlTWF0Y2g7Cit0eXBlZGVmIHN0cnVjdCBDaXJjbGVNYXRjaF9zdHJ1Y3QgQ2lyY2xlTWF0Y2g7Cit0eXBlZGVmIHN0cnVjdCBDaXJjbGVEZXNjcmlwdG9yX3N0cnVjdCBDaXJjbGVEZXNjcmlwdG9yOwordHlwZWRlZiBzdHJ1Y3QgU2hhcGVEZXRlY3Rpb25PcHRpb25zX3N0cnVjdCBTaGFwZURldGVjdGlvbk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDdXJ2ZV9zdHJ1Y3QgQ3VydmU7Cit0eXBlZGVmIHN0cnVjdCBDdXJ2ZU9wdGlvbnNfc3RydWN0IEN1cnZlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEJhcmNvZGUyREluZm9fc3RydWN0IEJhcmNvZGUyREluZm87Cit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4T3B0aW9uc19zdHJ1Y3QgRGF0YU1hdHJpeE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVyQWNjdXJhY3lSZXBvcnRfc3RydWN0IENsYXNzaWZpZXJBY2N1cmFjeVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IE5lYXJlc3ROZWlnaGJvckNsYXNzUmVzdWx0X3N0cnVjdCBOZWFyZXN0TmVpZ2hib3JDbGFzc1Jlc3VsdDsKK3R5cGVkZWYgc3RydWN0IE5lYXJlc3ROZWlnaGJvclRyYWluaW5nUmVwb3J0X3N0cnVjdAorICAgIE5lYXJlc3ROZWlnaGJvclRyYWluaW5nUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnNfc3RydWN0CisgICAgUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVyU2FtcGxlSW5mb19zdHJ1Y3QgQ2xhc3NpZmllclNhbXBsZUluZm87Cit0eXBlZGVmIHN0cnVjdCBDbGFzc1Njb3JlX3N0cnVjdCBDbGFzc1Njb3JlOwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllclJlcG9ydF9zdHJ1Y3QgQ2xhc3NpZmllclJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IE5lYXJlc3ROZWlnaGJvck9wdGlvbnNfc3RydWN0IE5lYXJlc3ROZWlnaGJvck9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zX3N0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUkdCVTY0VmFsdWVfc3RydWN0IFJHQlU2NFZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgR2VvbWV0cmljUGF0dGVybk1hdGNoX3N0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2g7Cit0eXBlZGVmIHN0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0CisgICAgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuT3B0aW9uc19zdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uc19zdHJ1Y3QKKyAgICBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBGaXRFbGxpcHNlT3B0aW9uc19zdHJ1Y3QgRml0RWxsaXBzZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBGaXRDaXJjbGVPcHRpb25zX3N0cnVjdCBGaXRDaXJjbGVPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RydWN0Uk9JT3B0aW9uczJfc3RydWN0IENvbnN0cnVjdFJPSU9wdGlvbnMyOwordHlwZWRlZiBzdHJ1Y3QgSFNMVmFsdWVfc3RydWN0IEhTTFZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgSFNWVmFsdWVfc3RydWN0IEhTVlZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgSFNJVmFsdWVfc3RydWN0IEhTSVZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgQ0lFTGFiVmFsdWVfc3RydWN0IENJRUxhYlZhbHVlOwordHlwZWRlZiBzdHJ1Y3QgQ0lFWFlaVmFsdWVfc3RydWN0IENJRVhZWlZhbHVlOwordHlwZWRlZiB1bmlvbiBDb2xvcjJfdW5pb24gQ29sb3IyOwordHlwZWRlZiBzdHJ1Y3QgQmVzdEVsbGlwc2UyX3N0cnVjdCBCZXN0RWxsaXBzZTI7Cit0eXBlZGVmIHN0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEFWSUluZm9fc3RydWN0IEFWSUluZm87Cit0eXBlZGVmIHN0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZFNoaWZ0T3B0aW9uc19zdHJ1Y3QKKyAgICBMZWFyblBhdHRlcm5BZHZhbmNlZFNoaWZ0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkUm90YXRpb25PcHRpb25zX3N0cnVjdAorICAgIExlYXJuUGF0dGVybkFkdmFuY2VkUm90YXRpb25PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zX3N0cnVjdCBNYXRjaFBhdHRlcm5BZHZhbmNlZE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMl9zdHJ1Y3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTI7Cit0eXBlZGVmIHN0cnVjdCBCZXN0Q2lyY2xlMl9zdHJ1Y3QgQmVzdENpcmNsZTI7Cit0eXBlZGVmIHN0cnVjdCBPQ1JTcGFjaW5nT3B0aW9uc19zdHJ1Y3QgT0NSU3BhY2luZ09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBPQ1JQcm9jZXNzaW5nT3B0aW9uc19zdHJ1Y3QgT0NSUHJvY2Vzc2luZ09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBSZWFkVGV4dE9wdGlvbnNfc3RydWN0IFJlYWRUZXh0T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IENoYXJJbmZvX3N0cnVjdCBDaGFySW5mbzsKKyNpZiAhZGVmaW5lZChVU0VSSU5UX0hFQURFUikgJiYgIWRlZmluZWQoX0NWSV9SRUNUX0RFRklORUQpCit0eXBlZGVmIHN0cnVjdCBSZWN0X3N0cnVjdCBSZWN0OworI2VuZGlmCit0eXBlZGVmIHN0cnVjdCBDaGFyUmVwb3J0X3N0cnVjdCBDaGFyUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgUmVhZFRleHRSZXBvcnRfc3RydWN0IFJlYWRUZXh0UmVwb3J0OworI2lmICFkZWZpbmVkKFVTRVJJTlRfSEVBREVSKSAmJiAhZGVmaW5lZChfQ1ZJX1BPSU5UX0RFRklORUQpCit0eXBlZGVmIHN0cnVjdCBQb2ludF9zdHJ1Y3QgUG9pbnQ7CisjZW5kaWYKK3R5cGVkZWYgc3RydWN0IEFubnVsdXNfc3RydWN0IEFubnVsdXM7Cit0eXBlZGVmIHN0cnVjdCBFZGdlTG9jYXRpb25SZXBvcnRfc3RydWN0IEVkZ2VMb2NhdGlvblJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEVkZ2VPcHRpb25zX3N0cnVjdCBFZGdlT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IEVkZ2VSZXBvcnRfc3RydWN0IEVkZ2VSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBFeHRyZW1lUmVwb3J0X3N0cnVjdCBFeHRyZW1lUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgRml0TGluZU9wdGlvbnNfc3RydWN0IEZpdExpbmVPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgRGlzcGxheU1hcHBpbmdfc3RydWN0IERpc3BsYXlNYXBwaW5nOwordHlwZWRlZiBzdHJ1Y3QgRGV0ZWN0RXh0cmVtZXNPcHRpb25zX3N0cnVjdCBEZXRlY3RFeHRyZW1lc09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBJbWFnZUluZm9fc3RydWN0IEltYWdlSW5mbzsKK3R5cGVkZWYgc3RydWN0IExDRE9wdGlvbnNfc3RydWN0IExDRE9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBMQ0RSZXBvcnRfc3RydWN0IExDRFJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IExDRFNlZ21lbnRzX3N0cnVjdCBMQ0RTZWdtZW50czsKK3R5cGVkZWYgc3RydWN0IExlYXJuQ2FsaWJyYXRpb25PcHRpb25zX3N0cnVjdCBMZWFybkNhbGlicmF0aW9uT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IExlYXJuQ29sb3JQYXR0ZXJuT3B0aW9uc19zdHJ1Y3QgTGVhcm5Db2xvclBhdHRlcm5PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgTGluZV9zdHJ1Y3QgTGluZTsKK3R5cGVkZWYgc3RydWN0IExpbmVhckF2ZXJhZ2VzX3N0cnVjdCBMaW5lYXJBdmVyYWdlczsKK3R5cGVkZWYgc3RydWN0IExpbmVQcm9maWxlX3N0cnVjdCBMaW5lUHJvZmlsZTsKK3R5cGVkZWYgc3RydWN0IE1hdGNoQ29sb3JQYXR0ZXJuT3B0aW9uc19zdHJ1Y3QgTWF0Y2hDb2xvclBhdHRlcm5PcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgSGlzdG9ncmFtUmVwb3J0X3N0cnVjdCBIaXN0b2dyYW1SZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBBcmNJbmZvX3N0cnVjdCBBcmNJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQXhpc1JlcG9ydF9zdHJ1Y3QgQXhpc1JlcG9ydDsKK3R5cGVkZWYgc3RydWN0IEJhcmNvZGVJbmZvX3N0cnVjdCBCYXJjb2RlSW5mbzsKK3R5cGVkZWYgc3RydWN0IEJDR09wdGlvbnNfc3RydWN0IEJDR09wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBCZXN0Q2lyY2xlX3N0cnVjdCBCZXN0Q2lyY2xlOwordHlwZWRlZiBzdHJ1Y3QgQmVzdEVsbGlwc2Vfc3RydWN0IEJlc3RFbGxpcHNlOwordHlwZWRlZiBzdHJ1Y3QgQmVzdExpbmVfc3RydWN0IEJlc3RMaW5lOwordHlwZWRlZiBzdHJ1Y3QgQnJvd3Nlck9wdGlvbnNfc3RydWN0IEJyb3dzZXJPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ29vcmRpbmF0ZVN5c3RlbV9zdHJ1Y3QgQ29vcmRpbmF0ZVN5c3RlbTsKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uSW5mb19zdHJ1Y3QgQ2FsaWJyYXRpb25JbmZvOwordHlwZWRlZiBzdHJ1Y3QgQ2FsaWJyYXRpb25Qb2ludHNfc3RydWN0IENhbGlicmF0aW9uUG9pbnRzOwordHlwZWRlZiBzdHJ1Y3QgQ2FsaXBlck9wdGlvbnNfc3RydWN0IENhbGlwZXJPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ2FsaXBlclJlcG9ydF9zdHJ1Y3QgQ2FsaXBlclJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IERyYXdUZXh0T3B0aW9uc19zdHJ1Y3QgRHJhd1RleHRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ2lyY2xlUmVwb3J0X3N0cnVjdCBDaXJjbGVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDbG9zZWRDb250b3VyX3N0cnVjdCBDbG9zZWRDb250b3VyOwordHlwZWRlZiBzdHJ1Y3QgQ29sb3JIaXN0b2dyYW1SZXBvcnRfc3RydWN0IENvbG9ySGlzdG9ncmFtUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgQ29sb3JJbmZvcm1hdGlvbl9zdHJ1Y3QgQ29sb3JJbmZvcm1hdGlvbjsKK3R5cGVkZWYgc3RydWN0IENvbXBsZXhfc3RydWN0IENvbXBsZXg7Cit0eXBlZGVmIHN0cnVjdCBDb25jZW50cmljUmFrZVJlcG9ydF9zdHJ1Y3QgQ29uY2VudHJpY1Jha2VSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBDb25zdHJ1Y3RST0lPcHRpb25zX3N0cnVjdCBDb25zdHJ1Y3RST0lPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckluZm9fc3RydWN0IENvbnRvdXJJbmZvOwordHlwZWRlZiB1bmlvbiBDb250b3VyVW5pb25fdW5pb24gQ29udG91clVuaW9uOwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckluZm8yX3N0cnVjdCBDb250b3VySW5mbzI7Cit0eXBlZGVmIHN0cnVjdCBDb250b3VyUG9pbnRfc3RydWN0IENvbnRvdXJQb2ludDsKK3R5cGVkZWYgc3RydWN0IENvb3JkaW5hdGVUcmFuc2Zvcm1fc3RydWN0IENvb3JkaW5hdGVUcmFuc2Zvcm07Cit0eXBlZGVmIHN0cnVjdCBDb29yZGluYXRlVHJhbnNmb3JtMl9zdHJ1Y3QgQ29vcmRpbmF0ZVRyYW5zZm9ybTI7Cit0eXBlZGVmIHN0cnVjdCBDYW5ueU9wdGlvbnNfc3RydWN0IENhbm55T3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFJhbmdlX3N0cnVjdCBSYW5nZTsKK3R5cGVkZWYgc3RydWN0IFVzZXJQb2ludFN5bWJvbF9zdHJ1Y3QgVXNlclBvaW50U3ltYm9sOwordHlwZWRlZiBzdHJ1Y3QgVmlldzNET3B0aW9uc19zdHJ1Y3QgVmlldzNET3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IE1hdGNoUGF0dGVybk9wdGlvbnNfc3RydWN0IE1hdGNoUGF0dGVybk9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBUSUZGRmlsZU9wdGlvbnNfc3RydWN0IFRJRkZGaWxlT3B0aW9uczsKK3R5cGVkZWYgdW5pb24gQ29sb3JfdW5pb24gQ29sb3I7Cit0eXBlZGVmIHVuaW9uIFBpeGVsVmFsdWVfdW5pb24gUGl4ZWxWYWx1ZTsKK3R5cGVkZWYgc3RydWN0IE9wZW5Db250b3VyX3N0cnVjdCBPcGVuQ29udG91cjsKK3R5cGVkZWYgc3RydWN0IE92ZXJsYXlUZXh0T3B0aW9uc19zdHJ1Y3QgT3ZlcmxheVRleHRPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYV9zdHJ1Y3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTsKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlUmVwb3J0X3N0cnVjdCBQYXJ0aWNsZVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IFBhdHRlcm5NYXRjaF9zdHJ1Y3QgUGF0dGVybk1hdGNoOwordHlwZWRlZiBzdHJ1Y3QgUXVhbnRpZnlEYXRhX3N0cnVjdCBRdWFudGlmeURhdGE7Cit0eXBlZGVmIHN0cnVjdCBRdWFudGlmeVJlcG9ydF9zdHJ1Y3QgUXVhbnRpZnlSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBSYWtlT3B0aW9uc19zdHJ1Y3QgUmFrZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBSYWtlUmVwb3J0X3N0cnVjdCBSYWtlUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgVHJhbnNmb3JtUmVwb3J0X3N0cnVjdCBUcmFuc2Zvcm1SZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBTaGFwZVJlcG9ydF9zdHJ1Y3QgU2hhcGVSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBNZXRlckFyY19zdHJ1Y3QgTWV0ZXJBcmM7Cit0eXBlZGVmIHN0cnVjdCBUaHJlc2hvbGREYXRhX3N0cnVjdCBUaHJlc2hvbGREYXRhOwordHlwZWRlZiBzdHJ1Y3QgU3RydWN0dXJpbmdFbGVtZW50X3N0cnVjdCBTdHJ1Y3R1cmluZ0VsZW1lbnQ7Cit0eXBlZGVmIHN0cnVjdCBTcG9rZVJlcG9ydF9zdHJ1Y3QgU3Bva2VSZXBvcnQ7Cit0eXBlZGVmIHN0cnVjdCBTaW1wbGVFZGdlT3B0aW9uc19zdHJ1Y3QgU2ltcGxlRWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBTZWxlY3RQYXJ0aWNsZUNyaXRlcmlhX3N0cnVjdCBTZWxlY3RQYXJ0aWNsZUNyaXRlcmlhOwordHlwZWRlZiBzdHJ1Y3QgU2VnbWVudEluZm9fc3RydWN0IFNlZ21lbnRJbmZvOwordHlwZWRlZiBzdHJ1Y3QgUm90YXRpb25BbmdsZVJhbmdlX3N0cnVjdCBSb3RhdGlvbkFuZ2xlUmFuZ2U7Cit0eXBlZGVmIHN0cnVjdCBSb3RhdGVkUmVjdF9zdHJ1Y3QgUm90YXRlZFJlY3Q7Cit0eXBlZGVmIHN0cnVjdCBST0lQcm9maWxlX3N0cnVjdCBST0lQcm9maWxlOwordHlwZWRlZiBzdHJ1Y3QgVG9vbFdpbmRvd09wdGlvbnNfc3RydWN0IFRvb2xXaW5kb3dPcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgU3Bva2VPcHRpb25zX3N0cnVjdCBTcG9rZU9wdGlvbnM7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRGF0YSBTdHJ1Y3R1cmVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZiAhZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfTV9YNjQKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorI2VuZGlmCit0eXBlZGVmIHN0cnVjdCBEaXZpc2lvbk1vZGVsX3N0cnVjdCB7CisgIGZsb2F0IGthcHBhOyAgLy8gVGhlIGxlYXJuZWQga2FwcGEgY29lZmZpY2llbnQgb2YgZGl2aXNpb24gbW9kZWwuCit9IERpdmlzaW9uTW9kZWw7CisKK3R5cGVkZWYgc3RydWN0IEZvY2FsTGVuZ3RoX3N0cnVjdCB7CisgIGZsb2F0IGZ4OyAgLy8gRm9jYWwgbGVuZ3RoIGluIFggZGlyZWN0aW9uLgorICBmbG9hdCBmeTsgIC8vIEZvY2FsIGxlbmd0aCBpbiBZIGRpcmVjdGlvbi4KK30gRm9jYWxMZW5ndGg7CisKK3R5cGVkZWYgc3RydWN0IFBvbHlNb2RlbF9zdHJ1Y3QgeworICBmbG9hdCoga0NvZWZmczsgIC8vIFRoZSBsZWFybmVkIHJhZGlhbCBjb2VmZmljaWVudHMgb2YgcG9seW5vbWlhbCBtb2RlbC4KKyAgdW5zaWduZWQgaW50IG51bUtDb2VmZnM7ICAvLyBOdW1iZXIgb2YgSyBjb2VmZmljaWVudHMuCisgIGZsb2F0IHAxOyAgLy8gVGhlIFAxKGxlYXJuZWQgdGFuZ2VudGlhbCBjb2VmZmljaWVudHMgb2YgcG9seW5vbWlhbCBtb2RlbCkuCisgIGZsb2F0IHAyOyAgLy8gVGhlIFAyKGxlYXJuZWQgdGFuZ2VudGlhbCBjb2VmZmljaWVudHMgb2YgcG9seW5vbWlhbCBtb2RlbCkuCit9IFBvbHlNb2RlbDsKKwordHlwZWRlZiBzdHJ1Y3QgRGlzdG9ydGlvbk1vZGVsUGFyYW1zX3N0cnVjdCB7CisgIERpc3RvcnRpb25Nb2RlbCBkaXN0b3J0aW9uTW9kZWw7ICAvLyBUeXBlIG9mIGxlYXJuZWQgZGlzdG9ydGlvbiBtb2RlbC4KKyAgUG9seU1vZGVsIHBvbHlNb2RlbDsgIC8vIFRoZSBsZWFybmVkIGNvZWZmaWNpZW50cyBvZiBwb2x5bm9taWFsIG1vZGVsLgorICBEaXZpc2lvbk1vZGVsIGRpdmlzaW9uTW9kZWw7ICAvLyBUaGUgbGVhcm5lZCBjb2VmZmljaWVudCBvZiBkaXZpc2lvbiBtb2RlbC4KK30gRGlzdG9ydGlvbk1vZGVsUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCBQb2ludEZsb2F0X3N0cnVjdCB7CisgIGZsb2F0IHg7ICAvLyBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKyAgZmxvYXQgeTsgIC8vIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorfSBQb2ludEZsb2F0OworCit0eXBlZGVmIHN0cnVjdCBJbnRlcm5hbFBhcmFtZXRlcnNfc3RydWN0IHsKKyAgY2hhciBpc0luc3VmZmljaWVudERhdGE7CisgIEZvY2FsTGVuZ3RoIGZvY2FsTGVuZ3RoOworICBQb2ludEZsb2F0IG9wdGljYWxDZW50ZXI7Cit9IEludGVybmFsUGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgTWF4R3JpZFNpemVfc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHhNYXg7ICAvLyBNYXhpbXVtIHggbGltaXQgZm9yIHRoZSBncmlkIHNpemUuCisgIHVuc2lnbmVkIGludCB5TWF4OyAgLy8gTWF4aW11bSB5IGxpbWl0IGZvciB0aGUgZ3JpZCBzaXplLgorfSBNYXhHcmlkU2l6ZTsKKwordHlwZWRlZiBzdHJ1Y3QgSW1hZ2VTaXplX3N0cnVjdCB7CisgIHVuc2lnbmVkIGludCB4UmVzOyAgLy8gWCByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZS4KKyAgdW5zaWduZWQgaW50IHlSZXM7ICAvLyBZIHJlc29sdXRpb24gb2YgdGhlIGltYWdlLgorfSBJbWFnZVNpemU7CisKK3R5cGVkZWYgc3RydWN0IENhbGlicmF0aW9uUmVmZXJlbmNlUG9pbnRzX3N0cnVjdCB7CisgIFBvaW50RG91YmxlKgorICAgICAgcGl4ZWxDb29yZHM7ICAvLyBTcGVjaWZpZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwaXhlbCByZWZlcmVuY2UgcG9pbnRzLgorICB1bnNpZ25lZCBpbnQgbnVtUGl4ZWxDb29yZHM7ICAvLyBOdW1iZXIgb2YgcGl4ZWwgY29vcmRpbmF0ZXMuCisgIFBvaW50RG91YmxlKgorICAgICAgcmVhbENvb3JkczsgIC8vIFNwZWNpZmllcyB0aGUgbWVhc3VyaW5nIHVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZS4KKyAgdW5zaWduZWQgaW50IG51bVJlYWxDb29yZHM7ICAvLyBOdW1iZXIgb2YgcmVhbCBjb29yZGluYXRlcy4KKyAgQ2FsaWJyYXRpb25Vbml0IHVuaXRzOyAgLy8gU3BlY2lmaWVzIHRoZSB1bml0cyBvZiBYIFN0ZXAgYW5kIFkgU3RlcC4KKyAgSW1hZ2VTaXplIGltYWdlU2l6ZTsgIC8vIFNwZWNpZmllcyB0aGUgc2l6ZSBvZiBjYWxpYnJhdGlvbiB0ZW1wbGF0ZSBpbWFnZS4KK30gQ2FsaWJyYXRpb25SZWZlcmVuY2VQb2ludHM7CisKK3R5cGVkZWYgc3RydWN0IEdldENhbWVyYVBhcmFtZXRlcnNSZXBvcnRfc3RydWN0IHsKKyAgZG91YmxlKgorICAgICAgcHJvamVjdGlvbk1hdHJpeDsgIC8vIFRoZSBwcm9qZWN0aW9uKGhvbW9ncmFwaHkpIG1hdHJpeCBvZiB3b3JraW5nIHBsYW5lLgorICB1bnNpZ25lZCBpbnQgcHJvamVjdGlvbk1hdHJpeFJvd3M7ICAvLyBOdW1iZXIgb2Ygcm93cyBpbiBwcm9qZWN0aW9uIG1hdHJpeC4KKyAgdW5zaWduZWQgaW50IHByb2plY3Rpb25NYXRyaXhDb2xzOyAgLy8gTnVtYmVyIG9mIGNvbHVtbnMgaW4gcHJvamVjdGlvbiBtYXRyaXguCisgIERpc3RvcnRpb25Nb2RlbFBhcmFtcyBkaXN0b3J0aW9uOyAgLy8gRGlzdG9ydGlvbiBtb2RlbCBDb2VmZmljaWVudHMuCisgIEludGVybmFsUGFyYW1ldGVycyBpbnRlcm5hbFBhcmFtczsgIC8vIFRoZSBsZWFybmVkIGludGVybmFsIHBhcmFtdGVycyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW1lcmEgbW9kZWwgc3VjaCBhcyBmb2NhbCBsZW5ndGggYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGljYWwgY2VudGVyLgorfSBHZXRDYW1lcmFQYXJhbWV0ZXJzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvbkF4aXNJbmZvX3N0cnVjdCB7CisgIFBvaW50RmxvYXQgY2VudGVyOyAgLy8gVGhlIG9yaWdpbiBvZiB0aGUgcmVmZXJlbmNlIGNvb3JkaW5hdGUgc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3NlZCBpbiBwaXhlbCB1bml0cy4KKyAgZmxvYXQgcm90YXRpb25BbmdsZTsgIC8vIFRoZSBhbmdsZSBvZiB0aGUgeC1heGlzIG9mIHRoZSByZWFsLXdvcmxkIGNvb3JkaW5hdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5c3RlbSwgaW4gcmVsYXRpb24gdG8gdGhlIGhvcml6b250YWwuCisgIEF4aXNPcmllbnRhdGlvbiBheGlzRGlyZWN0aW9uOyAgLy8gU3BlY2lmaWVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGNhbGlicmFpdG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXhpcyB3aGljaCBpcyBlaXRoZXIgRGlyZWN0IG9yIEluZGlyZWN0LgorfSBDYWxpYnJhdGlvbkF4aXNJbmZvOworCit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvbkxlYXJuU2V0dXBJbmZvX3N0cnVjdCB7CisgIENhbGlicmF0aW9uTW9kZTIgY2FsaWJyYXRpb25NZXRob2Q7ICAvLyBUeXBlIG9mIGNhbGlicmF0aW9uIG1ldGhvZCB1c2VkLgorICBEaXN0b3J0aW9uTW9kZWwgZGlzdG9ydGlvbk1vZGVsOyAgLy8gVHlwZSBvZiBsZWFybmVkIGRpc3RvcnRpb24gbW9kZWwuCisgIFNjYWxpbmdNZXRob2QKKyAgICAgIHNjYWxlTW9kZTsgIC8vIFRoZSBhc3BlY3Qgc2NhbGluZyB0byB1c2Ugd2hlbiBjb3JyZWN0aW5nIGFuIGltYWdlLgorICBDYWxpYnJhdGlvblJPSSByb2lNb2RlOyAgLy8gVGhlIFJPSSB0byB1c2Ugd2hlbiBjb3JyZWN0aW5nIGFuIGltYWdlLgorICBjaGFyIGxlYXJuQ29ycmVjdGlvblRhYmxlOyAgLy8gU2V0IHRoaXMgaW5wdXQgdG8gdHJ1ZSB2YWx1ZSBpZiB5b3Ugd2FudCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Rpb24gdGFibGUgdG8gYmUgZGV0ZXJtaW5lZCBhbmQgc3RvcmVkLgorfSBDYWxpYnJhdGlvbkxlYXJuU2V0dXBJbmZvOworCit0eXBlZGVmIHN0cnVjdCBHcmlkRGVzY3JpcHRvcl9zdHJ1Y3QgeworICBmbG9hdCB4U3RlcDsgIC8vIFRoZSBkaXN0YW5jZSBpbiB0aGUgeCBkaXJlY3Rpb24gYmV0d2VlbiB0d28gYWRqYWNlbnQgcGl4ZWxzCisgICAgICAgICAgICAgICAgLy8gaW4gdW5pdHMgc3BlY2lmaWVkIGJ5IHVuaXQuCisgIGZsb2F0IHlTdGVwOyAgLy8gVGhlIGRpc3RhbmNlIGluIHRoZSB5IGRpcmVjdGlvbiBiZXR3ZWVuIHR3byBhZGphY2VudCBwaXhlbHMKKyAgICAgICAgICAgICAgICAvLyBpbiB1bml0cyBzcGVjaWZpZWQgYnkgdW5pdC4KKyAgQ2FsaWJyYXRpb25Vbml0IHVuaXQ7ICAvLyBUaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgaW1hZ2UuCit9IEdyaWREZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBFcnJvclN0YXRpc3RpY3Nfc3RydWN0IHsKKyAgZG91YmxlIG1lYW47ICAvLyBNZWFuIGVycm9yIHN0YXRpc3RpY3MgdmFsdWUuCisgIGRvdWJsZSBtYXhpbXVtOyAgLy8gTWF4aW11bSB2YWx1ZSBvZiBlcnJvci4KKyAgZG91YmxlIHN0YW5kYXJkRGV2aWF0aW9uOyAgLy8gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBlcnJvciBzdGF0aXN0aXNjcyB2YWx1ZS4KKyAgZG91YmxlIGRpc3RvcnRpb247ICAvLyBUaGUgZGlzdG9ydGlvbiBlcnJvciBzdGF0aXN0aWNzIHZhbHVlLgorfSBFcnJvclN0YXRpc3RpY3M7CisKK3R5cGVkZWYgc3RydWN0IEdldENhbGlicmF0aW9uSW5mb1JlcG9ydF9zdHJ1Y3QgeworICBST0kqIHVzZXJSb2k7ICAvLyBTcGVjaWZpZXMgdGhlIFJPSSB0aGUgdXNlciBwcm92aWRlZCB3aGVuIGxlYXJuaW5nIHRoZQorICAgICAgICAgICAgICAgICAvLyBjYWxpYnJhdGlvbi4KKyAgUk9JKiBjYWxpYnJhdGlvblJvaTsgIC8vIFNwZWNpZmllcyB0aGUgUk9JIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHJlZ2lvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGltYWdlIHdoZXJlIHRoZSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdXJhdGUuCisgIENhbGlicmF0aW9uQXhpc0luZm8KKyAgICAgIGF4aXNJbmZvOyAgLy8gUmVmZXJlbmNlIENvb3JkaW5hdGUgU3lzdGVtIGZvciB0aGUgcmVhbC13b3JsZCBjb29yZGluYXRlcy4KKyAgQ2FsaWJyYXRpb25MZWFyblNldHVwSW5mbworICAgICAgbGVhcm5TZXR1cEluZm87ICAvLyBDYWxpYnJhdGlvbiBsZWFybiBzZXR1cCBpbmZvcm1hdGlvbi4KKyAgR3JpZERlc2NyaXB0b3IgZ3JpZERlc2NyaXB0b3I7ICAvLyBTcGVjaWZpZXMgc2NhbGluZyBjb25zdGFudHMgdXNlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGlicmF0ZSB0aGUgaW1hZ2UuCisgIGZsb2F0KiBlcnJvck1hcDsgIC8vIFRoZSB0aGUgZXJyb3IgbWFwIG9mIGNhbGlicmF0aW9uIHRlbXBsYXRlIGltYWdlLgorICB1bnNpZ25lZCBpbnQgZXJyb3JNYXBSb3dzOyAgLy8gTnVtYmVyIG9mIHJvd3MgaW4gZXJyb3IgbWFwLgorICB1bnNpZ25lZCBpbnQgZXJyb3JNYXBDb2xzOyAgLy8gTnVtYmVyIG9mIENvbHVtbnMgaW4gZXJyb3IgbWFwLgorICBFcnJvclN0YXRpc3RpY3MgZXJyb3JTdGF0aXN0aWNzOyAgLy8gRXJyb3Igc3RhdGlzdGljcyBvZiB0aGUgY2FsaWJyYXRpb24uCit9IEdldENhbGlicmF0aW9uSW5mb1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRWRnZVBvbGFyaXR5X3N0cnVjdCB7CisgIEVkZ2VQb2xhcml0eVNlYXJjaE1vZGUgc3RhcnQ7CisgIEVkZ2VQb2xhcml0eVNlYXJjaE1vZGUgZW5kOworfSBFZGdlUG9sYXJpdHk7CisKK3R5cGVkZWYgc3RydWN0IENsYW1wU2V0dGluZ3Nfc3RydWN0IHsKKyAgZG91YmxlIGFuZ2xlUmFuZ2U7ICAvLyBTcGVjaWZpZXMgdGhlIGFuZ2xlIHJhbmdlLgorICBFZGdlUG9sYXJpdHkgZWRnZVBvbGFyaXR5OyAgLy8gU3BlY2lmaWVzIHRoZSBlZGdlIHBvbGFyaXR5LgorfSBDbGFtcFNldHRpbmdzOworCit0eXBlZGVmIHN0cnVjdCBQb2ludERvdWJsZV9zdHJ1Y3QgeworICBkb3VibGUgeDsgIC8vIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICBkb3VibGUgeTsgIC8vIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorfSBQb2ludERvdWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgUG9pbnREb3VibGVQYWlyX3N0cnVjdCB7CisgIFBvaW50RG91YmxlIHN0YXJ0OyAgLy8gVGhlIFN0YXJ0IGNvLW9yZGluYXRlIG9mIHRoZSBwYWlyLgorICBQb2ludERvdWJsZSBlbmQ7ICAvLyBUaGUgRW5kIGNvLW9yZGluYXRlIG9mIHRoZSBwYWlyLgorfSBQb2ludERvdWJsZVBhaXI7CisKK3R5cGVkZWYgc3RydWN0IENsYW1wUmVzdWx0c19zdHJ1Y3QgeworICBkb3VibGUgZGlzdGFuY2VQaXg7ICAvLyBEZWZpbmVzIHRoZSBQaXhlbCB3b3JsZCBkaXN0YW5jZS4KKyAgZG91YmxlIGRpc3RhbmNlUmVhbFdvcmxkOyAgLy8gRGVmaW5lcyB0aGUgcmVhbCB3b3JsZCBkaXN0YW5jZS4KKyAgZG91YmxlIGFuZ2xlQWJzOyAgLy8gRGVmaW5lcyB0aGUgYWJzb2x1dGUgYW5nbGUuCisgIGRvdWJsZSBhbmdsZVJlbGF0aXZlOyAgLy8gRGVmaW5lcyB0aGUgcmVsYXRpdmUgYW5nbGUuCit9IENsYW1wUmVzdWx0czsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhbXBQb2ludHNfc3RydWN0IHsKKyAgUG9pbnREb3VibGVQYWlyIHBpeGVsOyAgLy8gU3BlY2lmaWVzIHRoZSBwaXhlbCB3b3JsZCBwb2ludCBwYWlyIGZvciBjbGFtcC4KKyAgUG9pbnREb3VibGVQYWlyIHJlYWxXb3JsZDsgIC8vIFNwZWNpZmllcyB0aGUgcmVhbCB3b3JsZCBwb2ludCBwYWlyIGZvciBjbGFtcC4KK30gQ2xhbXBQb2ludHM7CisKK3R5cGVkZWYgc3RydWN0IFJHQlZhbHVlX3N0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIgQjsgIC8vIFRoZSBibHVlIHZhbHVlIG9mIHRoZSBjb2xvci4KKyAgdW5zaWduZWQgY2hhciBHOyAgLy8gVGhlIGdyZWVuIHZhbHVlIG9mIHRoZSBjb2xvci4KKyAgdW5zaWduZWQgY2hhciBSOyAgLy8gVGhlIHJlZCB2YWx1ZSBvZiB0aGUgY29sb3IuCisgIHVuc2lnbmVkIGNoYXIgYWxwaGE7ICAvLyBUaGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbG9yLCB3aGljaCByZXByZXNlbnRzIGV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0aW9uLgorfSBSR0JWYWx1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhbXBPdmVybGF5U2V0dGluZ3Nfc3RydWN0IHsKKyAgaW50IHNob3dTZWFyY2hBcmVhOyAgLy8gSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggYXJlYSBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UuCisgIGludCBzaG93Q3VydmVzOyAgLy8gSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBjdXJ2ZXMgb24gdGhlIGltYWdlLgorICBpbnQgc2hvd0NsYW1wTG9jYXRpb247ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGNsYW1wIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBpbWFnZS4KKyAgaW50IHNob3dSZXN1bHQ7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGhpdCBsaW5lcyB0byB0aGUgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBlZGdlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpdCBsaW5lIG9uIHRoZSByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgUkdCVmFsdWUgc2VhcmNoQXJlYUNvbG9yOyAgLy8gU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlYXJjaCBhcmVhLgorICBSR0JWYWx1ZSBjdXJ2ZXNDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnZlcy4KKyAgUkdCVmFsdWUgY2xhbXBMb2NhdGlvbnNDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcmxheSB0aGUgY2xhbXAgbG9jYXRpb25zLgorICBSR0JWYWx1ZSByZXN1bHRDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdHMuCisgIGNoYXIqIG92ZXJsYXlHcm91cE5hbWU7ICAvLyBTcGVjaWZpZXMgdGhlIGdyb3VwIG92ZXJsYXkgbmFtZSBmb3IgdGhlIHN0ZXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJsYXlzLgorfSBDbGFtcE92ZXJsYXlTZXR0aW5nczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhbXBNYXgyUmVwb3J0X3N0cnVjdCB7CisgIENsYW1wUmVzdWx0cyBjbGFtcFJlc3VsdHM7ICAvLyBTcGVjaWZpZXMgdGhlIENsYW1wIHJlc3VsdHMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgQ2xhbXBQb2ludHMgY2xhbXBQb2ludHM7ICAvLyBTcGVjaWZpZXMgdGhlIGNsYW1wIHBvaW50cyBpbmZvcm1hdGlvbiByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBmdW5jdGlvbi4KKyAgdW5zaWduZWQgaW50IGNhbGlicmF0aW9uVmFsaWQ7ICAvLyBTcGVjaWZpZXMgaWYgdGhlIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWQgb3Igbm90LgorfSBDbGFtcE1heDJSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJGaXRTcGxpbmVSZXBvcnRfc3RydWN0IHsKKyAgUG9pbnREb3VibGUqIHBvaW50czsgIC8vIEl0IHJldHVybnMgdGhlIHBvaW50cyBvZiB0aGUgYmVzdC1maXQgQi1zcGxpbmUgY3VydmUuCisgIGludCBudW1iZXJPZlBvaW50czsgIC8vIE51bWJlciBvZiBCZXN0IGZpdCBwb2ludHMgcmV0dXJuZWQuCit9IENvbnRvdXJGaXRTcGxpbmVSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IExpbmVGbG9hdF9zdHJ1Y3QgeworICBQb2ludEZsb2F0IHN0YXJ0OyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorICBQb2ludEZsb2F0IGVuZDsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGxpbmUuCit9IExpbmVGbG9hdDsKKwordHlwZWRlZiBzdHJ1Y3QgTGluZUVxdWF0aW9uX3N0cnVjdCB7CisgIGRvdWJsZSBhOyAgLy8gVGhlIGEgY29lZmZpY2llbnQgb2YgdGhlIGxpbmUgZXF1YXRpb24uCisgIGRvdWJsZSBiOyAgLy8gVGhlIGIgY29lZmZpY2llbnQgb2YgdGhlIGxpbmUgZXF1YXRpb24uCisgIGRvdWJsZSBjOyAgLy8gVGhlIGMgY29lZmZpY2llbnQgb2YgdGhlIGxpbmUgZXF1YXRpb24uCit9IExpbmVFcXVhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckZpdExpbmVSZXBvcnRfc3RydWN0IHsKKyAgTGluZUZsb2F0IGxpbmVTZWdtZW50OyAgLy8gTGluZSBTZWdtZW50IHJlcHJlc2VudHMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZSBlcXVhdGlvbiBhbmQgdGhlIGNvbnRvdXIuCisgIExpbmVFcXVhdGlvbiBsaW5lRXF1YXRpb247ICAvLyBMaW5lIEVxdWF0aW9uIGlzIGEgc3RydWN0dXJlIG9mIHRocmVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2VmZmljaWVudHMgQSwgQiwgYW5kIEMgb2YgdGhlIGVxdWF0aW9uIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIGZvcm0gKEF4ICsgQnkgKyBDPTApIG9mIHRoZSBiZXN0IGZpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZS4KK30gQ29udG91ckZpdExpbmVSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJGaXRQb2x5bm9taWFsUmVwb3J0X3N0cnVjdCB7CisgIFBvaW50RG91YmxlKiBiZXN0Rml0OyAgLy8gSXQgcmV0dXJucyB0aGUgcG9pbnRzIG9mIHRoZSBiZXN0LWZpdCBwb2x5bm9taWFsLgorICBpbnQgbnVtYmVyT2ZQb2ludHM7ICAvLyBOdW1iZXIgb2YgQmVzdCBmaXQgcG9pbnRzIHJldHVybmVkLgorICBkb3VibGUqIHBvbHlub21pYWxDb2VmZmljaWVudHM7ICAvLyBQb2x5bm9taWFsIENvZWZmaWNpZW50cyByZXR1cm5zIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2VmZmljaWVudHMgb2YgdGhlIHBvbHlub21pYWwgZXF1YXRpb24uCisgIGludCBudW1iZXJPZkNvZWZmaWNpZW50czsgIC8vIE51bWJlciBvZiBDb2VmZmljaWVudHMgcmV0dXJuZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvbHlub21pYWwgY29lZmZpY2llbnRzIGFycmF5LgorfSBDb250b3VyRml0UG9seW5vbWlhbFJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGlhbENpcmNsZV9zdHJ1Y3QgeworICBQb2ludEZsb2F0IGNlbnRlcjsgIC8vIENlbnRlciBvZiB0aGUgY2lyY2xlLgorICBkb3VibGUgcmFkaXVzOyAgLy8gUmFkaXVzIG9mIHRoZSBjaXJjbGUuCisgIGRvdWJsZSBzdGFydEFuZ2xlOyAgLy8gU3RhcnQgYW5nbGUgb2YgdGhlIGZpdHRlZCBzdHJ1Y3R1cmUuCisgIGRvdWJsZSBlbmRBbmdsZTsgIC8vIEVuZCBhbmdsZSBvZiB0aGUgZml0dGVkIHN0cnVjdHVyZS4KK30gUGFydGlhbENpcmNsZTsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGlhbEVsbGlwc2Vfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBjZW50ZXI7ICAvLyBDZW50ZXIgb2YgdGhlIEVsbGlwc2UuCisgIGRvdWJsZSBhbmdsZTsgIC8vIEFuZ2xlIG9mIHRoZSBlbGxpcHNlLgorICBkb3VibGUgbWFqb3JSYWRpdXM7ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBzZW1pLW1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgIGRvdWJsZSBtaW5vclJhZGl1czsgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHNlbWktbWlub3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgZG91YmxlIHN0YXJ0QW5nbGU7ICAvLyBTdGFydCBhbmdsZSBvZiB0aGUgZml0dGVkIHN0cnVjdHVyZS4KKyAgZG91YmxlIGVuZEFuZ2xlOyAgLy8gRW5kIGFuZ2xlIG9mIHRoZSBmaXR0ZWQgc3RydWN0dXJlLgorfSBQYXJ0aWFsRWxsaXBzZTsKKwordHlwZWRlZiBzdHJ1Y3QgU2V0dXBNYXRjaFBhdHRlcm5EYXRhX3N0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIqIG1hdGNoU2V0dXBEYXRhOyAgLy8gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1hdGNoIHNldHVwIGRhdGEuCisgIGludCBudW1NYXRjaFNldHVwRGF0YTsgIC8vIE51bWJlciBvZiBtYXRjaCBzZXR1cCBkYXRhLgorfSBTZXR1cE1hdGNoUGF0dGVybkRhdGE7CisKK3R5cGVkZWYgc3RydWN0IFJhbmdlU2V0dGluZ0RvdWJsZV9zdHJ1Y3QgeworICBTZXR0aW5nVHlwZSBzZXR0aW5nVHlwZTsgIC8vIE1hdGNoIENvbnN0cmFpbnRzIHNwZWNpZmllcyB0aGUgbWF0Y2ggb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hvc2UgdmFsdWVzIHlvdSB3YW50IHRvIGNvbnN0cmFpbiBieSB0aGUgZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYW5nZS4KKyAgZG91YmxlIG1pbjsgIC8vIE1pbiBpcyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UgZm9yIGEgZ2l2ZW4gTWF0Y2gKKyAgICAgICAgICAgICAgIC8vIENvbnN0cmFpbnQuCisgIGRvdWJsZSBtYXg7ICAvLyBNYXggaXMgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlIGZvciBhIGdpdmVuIE1hdGNoCisgICAgICAgICAgICAgICAvLyBDb25zdHJhaW50LgorfSBSYW5nZVNldHRpbmdEb3VibGU7CisKK3R5cGVkZWYgc3RydWN0IEdlb21ldHJpY0FkdmFuY2VkU2V0dXBEYXRhT3B0aW9uX3N0cnVjdCB7CisgIEdlb21ldHJpY1NldHVwRGF0YUl0ZW0gdHlwZTsgIC8vIEl0IGRldGVybWluZXMgdGhlIG9wdGlvbiB5b3Ugd2FudCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyaW5nIHRoZSBtYXRjaGluZyBwaGFzZS4KKyAgZG91YmxlIHZhbHVlOyAgLy8gVmFsdWUgaXMgdGhlIHZhbHVlIGZvciB0aGUgb3B0aW9uIHlvdSB3YW50IHRvIHVzZSBkdXJpbmcgdGhlCisgICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHBoYXNlLgorfSBHZW9tZXRyaWNBZHZhbmNlZFNldHVwRGF0YU9wdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckluZm9SZXBvcnRfc3RydWN0IHsKKyAgUG9pbnREb3VibGUqIHBvaW50c1BpeGVsOyAgLy8gUG9pbnRzIChwaXhlbCkgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBldmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCBkZXRlY3RlZCBvbiB0aGUgY3VydmUsIGluIHBpeGVscy4KKyAgdW5zaWduZWQgaW50IG51bVBvaW50c1BpeGVsOyAgLy8gTnVtYmVyIG9mIHBvaW50cyBwaXhlbCBlbGVtZW50cy4KKyAgUG9pbnREb3VibGUqIHBvaW50c1JlYWw7ICAvLyBQb2ludHMgKHJlYWwpIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgZXZlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCBkZXRlY3RlZCBvbiB0aGUgY3VydmUsIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgIHVuc2lnbmVkIGludCBudW1Qb2ludHNSZWFsOyAgLy8gTnVtYmVyIG9mIHBvaW50cyByZWFsIGVsZW1lbnRzLgorICBkb3VibGUqIGN1cnZhdHVyZVBpeGVsOyAgLy8gQ3VydmF0dXJlIFBpeGVsIGRpc3BsYXlzIHRoZSBjdXJ2YXR1cmUgcHJvZmlsZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWxlY3RlZCBjb250b3VyLCBpbiBwaXhlbHMuCisgIHVuc2lnbmVkIGludCBudW1DdXJ2YXR1cmVQaXhlbDsgIC8vIE51bWJlciBvZiBjdXJ2YXR1cmUgcGl4ZWxzLgorICBkb3VibGUqIGN1cnZhdHVyZVJlYWw7ICAvLyBDdXJ2YXR1cmUgUmVhbCBkaXNwbGF5cyB0aGUgY3VydmF0dXJlIHByb2ZpbGUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWxlY3RlZCBjb250b3VyLCBpbiBjYWxpYnJhdGVkIHVuaXRzLgorICB1bnNpZ25lZCBpbnQgbnVtQ3VydmF0dXJlUmVhbDsgIC8vIE51bWJlciBvZiBjdXJ2YXR1cmUgUmVhbCBlbGVtZW50cy4KKyAgZG91YmxlIGxlbmd0aDsgIC8vIExlbmd0aCAocGl4ZWwpIHNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZQorICAgICAgICAgICAgICAgICAgLy8gY3VydmVzIGluIHRoZSBpbWFnZS4KKyAgZG91YmxlIGxlbmd0aFJlYWw7ICAvLyBMZW5ndGggKHJlYWwpIHNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBjYWxpYnJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pdHMsIG9mIHRoZSBjdXJ2ZXMgd2l0aGluIHRoZSBjdXJ2YXR1cmUgcmFuZ2UuCisgIHVuc2lnbmVkIGludCBoYXNFcXVhdGlvbjsgIC8vIEhhcyBFcXVhdGlvbiBzcGVjaWZpZXMgd2hldGhlciB0aGUgY29udG91ciBoYXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXR0ZWQgZXF1YXRpb24uCit9IENvbnRvdXJJbmZvUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBST0lMYWJlbF9zdHJ1Y3QgeworICBjaGFyKiBjbGFzc05hbWU7ICAvLyBTcGVjaWZpZXMgdGhlIGNsYXNzbmFtZSB5b3Ugd2FudCB0byBzZWdtZW50LgorICB1bnNpZ25lZCBpbnQKKyAgICAgIGxhYmVsOyAgLy8gTGFiZWwgaXMgdGhlIGxhYmVsIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIENsYXNzIE5hbWUuCit9IFJPSUxhYmVsOworCit0eXBlZGVmIHN0cnVjdCBTdXBlcnZpc2VkQ29sb3JTZWdtZW50YXRpb25SZXBvcnRfc3RydWN0IHsKKyAgUk9JTGFiZWwqIGxhYmVsT3V0OyAgLy8gVGhlIFJvaSBsYWJlbHMgYXJyYXkuCisgIHVuc2lnbmVkIGludCBudW1MYWJlbE91dDsgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gbGFiZWxPdXQgYXJyYXkuCit9IFN1cGVydmlzZWRDb2xvclNlZ21lbnRhdGlvblJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTGFiZWxUb1JPSVJlcG9ydF9zdHJ1Y3QgeworICBST0kqKiByb2lBcnJheTsgIC8vIEFycmF5IG9mIFJPSXMuCisgIHVuc2lnbmVkIGludCBudW1PZlJPSXM7ICAvLyBOdW1iZXIgb2YgUk9JcyBpbiB0aGUgcm9pQXJyYXkuCisgIHVuc2lnbmVkIGludCogbGFiZWxzT3V0QXJyYXk7ICAvLyBBcnJheSBvZiBsYWJlbHMuCisgIHVuc2lnbmVkIGludCBudW1PZkxhYmVsczsgIC8vIE51bWJlciBvZiBsYWJlbHMuCisgIGludCogaXNUb29NYW55VmVjdG9yc0FycmF5OyAgLy8gaXNUb29NYW55VmVjdG9yc0FycmF5IGFycmF5LgorICB1bnNpZ25lZCBpbnQgaXNUb29NYW55VmVjdG9yc0FycmF5U2l6ZTsgIC8vIE51bWJlciBvZiBlbGVtZW50cyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzVG9vTWFueVZlY3RvcnNBcnJheS4KK30gTGFiZWxUb1JPSVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29sb3JTZWdtZW5hdGlvbk9wdGlvbnNfc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHdpbmRvd1g7ICAvLyBYIGlzIHRoZSB3aW5kb3cgc2l6ZSBpbiB4IGRpcmVjdGlvbi4KKyAgdW5zaWduZWQgaW50IHdpbmRvd1k7ICAvLyBZIGlzIHRoZSB3aW5kb3cgc2l6ZSBpbiB5IGRpcmVjdGlvbi4KKyAgdW5zaWduZWQgaW50IHN0ZXBTaXplOyAgLy8gU3RlcCBTaXplIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byB3aW5kb3dzLgorICB1bnNpZ25lZCBpbnQgbWluUGFydGljbGVBcmVhOyAgLy8gTWluIFBhcnRpY2xlIEFyZWEgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd2VkIHBpeGVscy4KKyAgdW5zaWduZWQgaW50IG1heFBhcnRpY2xlQXJlYTsgIC8vIE1heCBQYXJ0aWNsZSBBcmVhIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3dlZCBwaXhlbHMuCisgIHNob3J0IGlzRmluZVNlZ21lbnQ7ICAvLyBXaGVuIGVuYWJsZWQsIHRoZSBzdGVwIHByb2Nlc3NlcyB0aGUgYm91bmRhcnkgcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBlYWNoIHNlZ21lbnRhdGlvbiBjbHVzdGVyIHVzaW5nIGEgc3RlcCBzaXplIG9mIDEuCit9IENvbG9yU2VnbWVuYXRpb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDbGFzc2lmaWVkQ3VydmVfc3RydWN0IHsKKyAgZG91YmxlIGxlbmd0aDsgIC8vIFNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZSBjdXJ2ZXMgd2l0aGluIHRoZQorICAgICAgICAgICAgICAgICAgLy8gY3VydmF0dXJlIHJhbmdlLgorICBkb3VibGUgbGVuZ3RoUmVhbDsgIC8vIHNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBjYWxpYnJhdGVkIHVuaXRzLCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJ2ZXMgd2l0aGluIHRoZSBjdXJ2YXR1cmUgcmFuZ2UuCisgIGRvdWJsZSBtYXhDdXJ2YXR1cmU7ICAvLyBzcGVjaWZpZXMgdGhlIG1heGltdW0gY3VydmF0dXJlLCBpbiBwaXhlbHMsIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIGN1cnZhdHVyZSByYW5nZS4KKyAgZG91YmxlIG1heEN1cnZhdHVyZVJlYWw7ICAvLyBzcGVjaWZpZXMgdGhlIG1heGltdW0gY3VydmF0dXJlLCBpbiBjYWxpYnJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pdHMsIGZvciB0aGUgc2VsZWN0ZWQgY3VydmF0dXJlIHJhbmdlLgorICB1bnNpZ25lZCBpbnQgbGFiZWw7ICAvLyBzcGVjaWZpZXMgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZSB0aGUgc2FtcGxlIGJlbG9uZ3MuCisgIFBvaW50RG91YmxlKiBjdXJ2ZVBvaW50czsgIC8vIEN1cnZlIFBvaW50cyBpcyBhIHBvaW50LWNvb3JkaW5hdGUgY2x1c3RlciB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZXMgdGhlIHBvaW50cyBvZiB0aGUgY3VydmUuCisgIHVuc2lnbmVkIGludCBudW1DdXJ2ZVBvaW50czsgIC8vIE51bWJlciBvZiBjdXJ2ZSBwb2ludHMuCit9IENsYXNzaWZpZWRDdXJ2ZTsKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VEb3VibGVfc3RydWN0IHsKKyAgZG91YmxlIG1pblZhbHVlOyAgLy8gVGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLgorICBkb3VibGUgbWF4VmFsdWU7ICAvLyBUaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UuCit9IFJhbmdlRG91YmxlOworCit0eXBlZGVmIHN0cnVjdCBSYW5nZUxhYmVsX3N0cnVjdCB7CisgIFJhbmdlRG91YmxlIHJhbmdlOyAgLy8gU3BlY2lmaWVzIHRoZSByYW5nZSBvZiBjdXJ2YXR1cmUgdmFsdWVzLgorICB1bnNpZ25lZCBpbnQgbGFiZWw7ICAvLyBDbGFzcyBMYWJlbCBzcGVjaWZpZXMgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlIGJlbG9uZ3MuCit9IFJhbmdlTGFiZWw7CisKK3R5cGVkZWYgc3RydWN0IEN1cnZhdHVyZUFuYWx5c2lzUmVwb3J0X3N0cnVjdCB7CisgIENsYXNzaWZpZWRDdXJ2ZSogY3VydmVzOworICB1bnNpZ25lZCBpbnQgbnVtQ3VydmVzOworfSBDdXJ2YXR1cmVBbmFseXNpc1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRGlzcGFyaXR5X3N0cnVjdCB7CisgIFBvaW50RG91YmxlCisgICAgICBjdXJyZW50OyAgLy8gQ3VycmVudCBpcyBhIGFycmF5IG9mIHBvaW50cyB0aGF0IGRlZmluZXMgdGhlIHRhcmdldCBjb250b3VyLgorICBQb2ludERvdWJsZSByZWZlcmVuY2U7ICAvLyByZWZlcmVuY2UgaXMgYSBhcnJheSBvZiBwb2ludHMgdGhhdCBkZWZpbmVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSBjb250b3VyLgorICBkb3VibGUgZGlzdGFuY2U7ICAvLyBTcGVjaWZpZXMgdGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRvdXIgcG9pbnQgYW5kIHRoZSB0YXJnZXQgY29udG91ciBwb2ludC4KK30gRGlzcGFyaXR5OworCit0eXBlZGVmIHN0cnVjdCBDb21wdXRlRGlzdGFuY2VzUmVwb3J0X3N0cnVjdCB7CisgIERpc3Bhcml0eSoKKyAgICAgIGRpc3RhbmNlczsgIC8vIERpc3RhbmNlcyBpcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb21wdXRlZCBkaXN0YW5jZXMuCisgIHVuc2lnbmVkIGludCBudW1EaXN0YW5jZXM7ICAvLyBOdW1iZXIgZWxlbWVudHMgaW4gdGhlIGRpc3RhbmNlcyBhcnJheS4KKyAgRGlzcGFyaXR5KiBkaXN0YW5jZXNSZWFsOyAgLy8gRGlzdGFuY2VzIFJlYWwgaXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgZGlzdGFuY2VzIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgIHVuc2lnbmVkIGludCBudW1EaXN0YW5jZXNSZWFsOyAgLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJlYWwgZGlzdGFuY2VzIGFycmF5LgorfSBDb21wdXRlRGlzdGFuY2VzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBNYXRjaE1vZGVfc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJvdGF0aW9uOyAgLy8gUm90YXRpb24gV2hlbiBlbmFibGVkLCB0aGUgRnVuY3Rpb24gc2VhcmNoZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9jY3VycmVuY2VzIG9mIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgaW5zcGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZSwgYWxsb3dpbmcgZm9yIHRlbXBsYXRlIG1hdGNoZXMgdG8gYmUgcm90YXRlZC4KKyAgdW5zaWduZWQgaW50IHNjYWxlOyAgLy8gUm90YXRpb24gV2hlbiBlbmFibGVkLCB0aGUgRnVuY3Rpb24gc2VhcmNoZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgIC8vIG9jY3VycmVuY2VzIG9mIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgaW5zcGVjdGlvbiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3dpbmcgZm9yIHRlbXBsYXRlIG1hdGNoZXMgdG8gYmUgcm90YXRlZC4KKyAgdW5zaWduZWQgaW50IG9jY2x1c2lvbjsgIC8vIE9jY2x1c2lvbiBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2VhcmNoIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2NjbHVkZWQgdmVyc2lvbnMgb2YgdGhlIHNoYXBlLgorfSBNYXRjaE1vZGU7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZWREaXNwYXJpdHlfc3RydWN0IHsKKyAgZG91YmxlIGxlbmd0aDsgIC8vIExlbmd0aCAocGl4ZWwpIHNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZQorICAgICAgICAgICAgICAgICAgLy8gY3VydmVzIHdpdGhpbiB0aGUgY3VydmF0dXJlIHJhbmdlLgorICBkb3VibGUgbGVuZ3RoUmVhbDsgIC8vIExlbmd0aCAocmVhbCkgc3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIGNhbGlicmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAvLyB1bml0cywgb2YgdGhlIGN1cnZlcyB3aXRoaW4gdGhlIGN1cnZhdHVyZSByYW5nZS4KKyAgZG91YmxlIG1heERpc3RhbmNlOyAgLy8gTWF4aW11bSBEaXN0YW5jZSAocGl4ZWwpIHNwZWNpZmllcyB0aGUgbWF4aW11bQorICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHBvaW50cyBhbG9uZyB0aGUgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udG91ciBhbmQgdGhlIHRlbXBsYXRlIGNvbnRvdXIuCisgIGRvdWJsZSBtYXhEaXN0YW5jZVJlYWw7ICAvLyBNYXhpbXVtIERpc3RhbmNlIChyZWFsKSBzcGVjaWZpZXMgdGhlIG1heGltdW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3RhbmNlLCBpbiBjYWxpYnJhdGVkIHVuaXRzLCBiZXR3ZWVuIHBvaW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxvbmcgdGhlIHNlbGVjdGVkIGNvbnRvdXIgYW5kIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udG91ci4KKyAgdW5zaWduZWQgaW50IGxhYmVsOyAgLy8gQ2xhc3MgTGFiZWwgc3BlY2lmaWVzIHRoZSBjbGFzcyB0byB3aGljaCB0aGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbXBsZSBiZWxvbmdzLgorICBQb2ludERvdWJsZSogdGVtcGxhdGVTdWJzZWN0aW9uOyAgLy8gVGVtcGxhdGUgc3Vic2VjdGlvbiBwb2ludHMgaXMgYW4gYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50cyB0aGF0IGRlZmluZXMgdGhlIGJvdW5kYXJ5IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUuCisgIHVuc2lnbmVkIGludCBudW1UZW1wbGF0ZVN1YnNlY3Rpb247ICAvLyBOdW1iZXIgb2YgcmVmZXJlbmNlIHBvaW50cy4KKyAgUG9pbnREb3VibGUqIHRhcmdldFN1YnNlY3Rpb247ICAvLyBDdXJyZW50IFBvaW50cyhUYXJnZXQgc3Vic2VjdGlvbiBwb2ludHMpIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gYXJyYXkgb2YgcG9pbnRzIHRoYXQgZGVmaW5lcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZGFyeSBvZiB0aGUgdGFyZ2V0LgorICB1bnNpZ25lZCBpbnQgbnVtVGFyZ2V0U3Vic2VjdGlvbjsgIC8vIE51bWJlciBvZiBjdXJyZW50IHBvaW50cy4KK30gQ2xhc3NpZmllZERpc3Bhcml0eTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZnlEaXN0YW5jZXNSZXBvcnRfc3RydWN0IHsKKyAgQ2xhc3NpZmllZERpc3Bhcml0eSogY2xhc3NpZmllZERpc3RhbmNlczsgIC8vIERpc3Bhcml0eSBhcnJheSBjb250YWluaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NpZmllZCBkaXN0YW5jZXMuCisgIHVuc2lnbmVkIGludAorICAgICAgbnVtQ2xhc3NpZmllZERpc3RhbmNlczsgIC8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZGlzcGFyaXR5IGFycmF5LgorfSBDbGFzc2lmeURpc3RhbmNlc1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91ckNvbXB1dGVDdXJ2YXR1cmVSZXBvcnRfc3RydWN0IHsKKyAgZG91YmxlKiBjdXJ2YXR1cmVQaXhlbDsgIC8vIEN1cnZhdHVyZSBQaXhlbCBkaXNwbGF5cyB0aGUgY3VydmF0dXJlIHByb2ZpbGUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VsZWN0ZWQgY29udG91ciwgaW4gcGl4ZWxzLgorICB1bnNpZ25lZCBpbnQgbnVtQ3VydmF0dXJlUGl4ZWw7ICAvLyBOdW1iZXIgb2YgY3VydmF0dXJlIHBpeGVscy4KKyAgZG91YmxlKiBjdXJ2YXR1cmVSZWFsOyAgLy8gQ3VydmF0dXJlIFJlYWwgZGlzcGxheXMgdGhlIGN1cnZhdHVyZSBwcm9maWxlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VsZWN0ZWQgY29udG91ciwgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAgdW5zaWduZWQgaW50IG51bUN1cnZhdHVyZVJlYWw7ICAvLyBOdW1iZXIgb2YgY3VydmF0dXJlIFJlYWwgZWxlbWVudHMuCit9IENvbnRvdXJDb21wdXRlQ3VydmF0dXJlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDb250b3VyT3ZlcmxheVNldHRpbmdzX3N0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvdmVybGF5OyAgLy8gT3ZlcmxheSBzcGVjaWZpZXMgd2hldGhlciB0byBkaXNwbGF5IHRoZSBvdmVybGF5IG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGltYWdlLgorICBSR0JWYWx1ZSBjb2xvcjsgIC8vIENvbG9yIGlzIHRoZSBjb2xvciBvZiB0aGUgb3ZlcmxheS4KKyAgdW5zaWduZWQgaW50IHdpZHRoOyAgLy8gV2lkdGggc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgb3ZlcmxheSBpbiBwaXhlbHMuCisgIHVuc2lnbmVkIGludCBtYWludGFpbldpZHRoOyAgLy8gTWFpbnRhaW4gV2lkdGg/IHNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJsYXkgbWVhc3VyZWQgaW4gc2NyZWVuIHBpeGVscyBvciBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVscy4KK30gQ29udG91ck92ZXJsYXlTZXR0aW5nczsKKwordHlwZWRlZiBzdHJ1Y3QgQ3VydmVQYXJhbWV0ZXJzX3N0cnVjdCB7CisgIEV4dHJhY3Rpb25Nb2RlIGV4dHJhY3Rpb25Nb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBtZXRob2QgdGhlIGZ1bmN0aW9uIHVzZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZGVudGlmeSBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICBpbnQgdGhyZXNob2xkOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGEgc2VlZCBwb2ludCBtdXN0IGhhdmUgaW4KKyAgICAgICAgICAgICAgICAgIC8vIG9yZGVyIHRvIGJlZ2luIGEgY3VydmUuCisgIEVkZ2VGaWx0ZXJTaXplIGZpbHRlclNpemU7ICAvLyBTcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBlZGdlIGZpbHRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHVzZXMgdG8gaWRlbnRpZnkgY3VydmVzIGluIHRoZSBpbWFnZS4KKyAgaW50IG1pbkxlbmd0aDsgIC8vIFNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZSBzbWFsbGVzdCBjdXJ2ZSB0aGUKKyAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdC4KKyAgaW50IHNlYXJjaFN0ZXA7ICAvLyBTZWFyY2ggU3RlcCBTaXplIHNwZWNpZmllcyB0aGUgZGlzdGFuY2UsIGluIHRoZSB5CisgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0aW9uLCBiZXR3ZWVuIHRoZSBpbWFnZSByb3dzIHRoYXQgdGhlIGFsZ29yaXRobQorICAgICAgICAgICAgICAgICAgIC8vIGluc3BlY3RzIGZvciBjdXJ2ZSBzZWVkIHBvaW50cy4KKyAgaW50IG1heEVuZFBvaW50R2FwOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGdhcCwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludHMgb2YgYSBjdXJ2ZSB0aGF0IHRoZSBmdW5jdGlvbiBpZGVudGlmaWVzIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2VkIGN1cnZlLgorICBpbnQgc3VicGl4ZWw7ICAvLyBTdWJwaXhlbCBzcGVjaWZpZXMgd2hldGhlciB0byBkZXRlY3QgY3VydmUgcG9pbnRzIHdpdGgKKyAgICAgICAgICAgICAgICAgLy8gc3VicGl4ZWwgYWNjdXJhY3kuCit9IEN1cnZlUGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgRXh0cmFjdENvbnRvdXJSZXBvcnRfc3RydWN0IHsKKyAgUG9pbnREb3VibGUqIGNvbnRvdXJQb2ludHM7ICAvLyBDb250b3VyIFBvaW50cyBzcGVjaWZpZXMgZXZlcnkgcG9pbnQgZm91bmQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29udG91ci4KKyAgaW50IG51bUNvbnRvdXJQb2ludHM7ICAvLyBOdW1iZXIgb2YgY29udG91ciBwb2ludHMuCisgIFBvaW50RG91YmxlKiBzb3VyY2VQb2ludHM7ICAvLyBTb3VyY2UgSW1hZ2UgUG9pbnRzIHNwZWNpZmllcyBldmVyeSBwb2ludCBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIGNvbnRvdXIgaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgaW50IG51bVNvdXJjZVBvaW50czsgIC8vIE51bWJlciBvZiBzb3VyY2UgcG9pbnRzLgorfSBFeHRyYWN0Q29udG91clJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ29ubmVjdGlvbkNvbnN0cmFpbnRfc3RydWN0IHsKKyAgQ29ubmVjdGlvbkNvbnN0cmFpbnRUeXBlIGNvbnN0cmFpbnRUeXBlOyAgLy8gQ29uc3RyYWludCBUeXBlIHNwZWNpZmllcyB3aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhIHRvIHVzZSB0byBjb25zaWRlciB0d28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VydmVzIHBhcnQgb2YgYSBjb250b3VyLgorICBSYW5nZURvdWJsZSByYW5nZTsgIC8vIFNwZWNpZmllcyByYW5nZSBmb3IgYSBnaXZlbiBNYXRjaCBDb25zdHJhaW50LgorfSBDb25uZWN0aW9uQ29uc3RyYWludDsKKwordHlwZWRlZiBzdHJ1Y3QgRXh0cmFjdFRleHR1cmVGZWF0dXJlc1JlcG9ydF9zdHJ1Y3QgeworICBpbnQqIHdhdmVsZXRCYW5kczsgIC8vIFRoZSBhcnJheSBoYXZpbmcgYWxsIHRoZSBXYXZlbGV0IEJhbmtzIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdGlvbi4KKyAgaW50IG51bVdhdmVsZXRCYW5kczsgIC8vIE51bWJlciBvZiB3YXZlbGV0IGJhbmtzIGluIHRoZSBBcnJheS4KKyAgZG91YmxlKiogdGV4dHVyZUZlYXR1cmVzOyAgLy8gMi1EIGFycmF5IHRvIHN0b3JlIGFsbCB0aGUgVGV4dHVyZSBmZWF0dXJlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0ZWQuCisgIGludCB0ZXh0dXJlRmVhdHVyZXNSb3dzOyAgLy8gTnVtYmVyIG9mIFJvd3MgaW4gdGhlIFRleHR1cmUgRmVhdHVyZXMgYXJyYXkuCisgIGludCB0ZXh0dXJlRmVhdHVyZXNDb2xzOyAgLy8gTnVtYmVyIG9mIENvbHMgaW4gVGV4dHVyZSBGZWF0dXJlcyBhcnJheS4KK30gRXh0cmFjdFRleHR1cmVGZWF0dXJlc1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgV2F2ZWxldEJhbmRzUmVwb3J0X3N0cnVjdCB7CisgIGZsb2F0KiogTExCYW5kOyAgLy8gMi1EIGFycmF5IGZvciBMTCBCYW5kLgorICBmbG9hdCoqIExIQmFuZDsgIC8vIDItRCBhcnJheSBmb3IgTEggQmFuZC4KKyAgZmxvYXQqKiBITEJhbmQ7ICAvLyAyLUQgYXJyYXkgZm9yIEhMIEJhbmQuCisgIGZsb2F0KiogSEhCYW5kOyAgLy8gMi1EIGFycmF5IGZvciBISCBCYW5kLgorICBmbG9hdCoqIExMTEJhbmQ7ICAvLyAyLUQgYXJyYXkgZm9yIExMTCBCYW5kLgorICBmbG9hdCoqIExMSEJhbmQ7ICAvLyAyLUQgYXJyYXkgZm9yIExMSCBCYW5kLgorICBmbG9hdCBMSExCYW5kOyAgLy8gMi1EIGFycmF5IGZvciBMSEwgQmFuZC4KKyAgZmxvYXQqKiBMSEhCYW5kOyAgLy8gMi1EIGFycmF5IGZvciBMSEggQmFuZC4KKyAgaW50IHJvd3M7ICAvLyBOdW1iZXIgb2YgUm93cyBmb3IgZWFjaCBvZiB0aGUgMi1EIGFycmF5cy4KKyAgaW50IGNvbHM7ICAvLyBOdW1iZXIgb2YgQ29sdW1ucyBmb3IgZWFjaCBvZiB0aGUgMi1EIGFycmF5cy4KK30gV2F2ZWxldEJhbmRzUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDaXJjbGVGaXRPcHRpb25zX3N0cnVjdCB7CisgIGludCBtYXhSYWRpdXM7ICAvLyBTcGVjaWZpZXMgdGhlIGFjY2VwdGFibGUgZGlzdGFuY2UsIGluIHBpeGVscywgdGhhdCBhIHBvaW50CisgICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmVkIHRvIGJlbG9uZyB0byB0aGUgY2lyY2xlIGNhbiBiZSBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgLy8gcGVyaW1ldGVyIG9mIHRoZSBjaXJjbGUuCisgIGRvdWJsZSBzdGVwU2l6ZTsgIC8vIFN0ZXAgU2l6ZSBpcyB0aGUgYW5nbGUsIGluIGRlZ3JlZXMsIGJldHdlZW4gZWFjaCByYWRpYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gbGluZSBpbiB0aGUgYW5udWxhciByZWdpb24uCisgIFJha2VQcm9jZXNzVHlwZSBwcm9jZXNzVHlwZTsgIC8vIE1ldGhvZCB1c2VkIHRvIHByb2Nlc3MgdGhlIGRhdGEgZXh0cmFjdGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZGdlIGRldGVjdGlvbi4KK30gQ2lyY2xlRml0T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRWRnZU9wdGlvbnMyX3N0cnVjdCB7CisgIEVkZ2VQb2xhcml0eVNlYXJjaE1vZGUKKyAgICAgIHBvbGFyaXR5OyAgLy8gU3BlY2lmaWVzIHRoZSBwb2xhcml0eSBvZiB0aGUgZWRnZXMgdG8gYmUgZm91bmQuCisgIHVuc2lnbmVkIGludCBrZXJuZWxTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBlZGdlIGRldGVjdGlvbiBrZXJuZWwuCisgIHVuc2lnbmVkIGludCB3aWR0aDsgIC8vIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBpeGVscyBhdmVyYWdlZCBwZXJwZW5kaWN1bGFyCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBzZWFyY2ggZGlyZWN0aW9uIHRvIGNvbXB1dGUgdGhlIGVkZ2UgcHJvZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlbmd0aCBhdCBlYWNoIHBvaW50IGFsb25nIHRoZSBzZWFyY2ggUk9JLgorICBmbG9hdCBtaW5UaHJlc2hvbGQ7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gZWRnZSBzdHJlbmd0aCAoZ3JhZGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFnbml0dWRlKSByZXF1aXJlZCBmb3IgYSBkZXRlY3RlZCBlZGdlLgorICBJbnRlcnBvbGF0aW9uTWV0aG9kIGludGVycG9sYXRpb25UeXBlOyAgLy8gU3BlY2lmaWVzIHRoZSBpbnRlcnBvbGF0aW9uIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBsb2NhdGUgdGhlIGVkZ2UgcG9zaXRpb24uCisgIENvbHVtblByb2Nlc3NpbmdNb2RlIGNvbHVtblByb2Nlc3NpbmdNb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBtZXRob2QgdXNlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHN0cmFpZ2h0IGVkZ2UuCit9IEVkZ2VPcHRpb25zMjsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZENpcmN1bGFyRWRnZU9wdGlvbnNfc3RydWN0IHsKKyAgU3Bva2VEaXJlY3Rpb24KKyAgICAgIGRpcmVjdGlvbjsgIC8vIFNwZWNpZmllcyB0aGUgU3Bva2UgZGlyZWN0aW9uIHRvIHNlYXJjaCBpbiB0aGUgUk9JLgorICBpbnQgc2hvd1NlYXJjaEFyZWE7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBhcmVhIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgaW50IHNob3dTZWFyY2hMaW5lczsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGxpbmVzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGxvY2F0ZSB0aGUgZWRnZXMgb24gdGhlIGltYWdlLgorICBpbnQgc2hvd0VkZ2VzRm91bmQ7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRnZXMgZm91bmQgb24gdGhlIGltYWdlLgorICBpbnQgc2hvd1Jlc3VsdDsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgaGl0IGxpbmVzIHRvIHRoZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGVkZ2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGl0IGxpbmUgb24gdGhlIHJlc3VsdAorICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBSR0JWYWx1ZSBzZWFyY2hBcmVhQ29sb3I7ICAvLyBTcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGFyZWEuCisgIFJHQlZhbHVlIHNlYXJjaExpbmVzQ29sb3I7ICAvLyBTcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlYXJjaCBsaW5lcy4KKyAgUkdCVmFsdWUgc2VhcmNoRWRnZXNDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGVkZ2VzLgorICBSR0JWYWx1ZSByZXN1bHRDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdHMuCisgIGNoYXIqIG92ZXJsYXlHcm91cE5hbWU7ICAvLyBTcGVjaWZpZXMgdGhlIG92ZXJsYXkgZ3JvdXAgbmFtZSB0byBhc3NpZ24gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVybGF5cy4KKyAgRWRnZU9wdGlvbnMyIGVkZ2VPcHRpb25zOyAgLy8gU3BlY2lmaWVzIHRoZSBlZGdlIGRldGVjdGlvbiBvcHRpb25zIGFsb25nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIHNlYXJjaCBsaW5lLgorfSBGaW5kQ2lyY3VsYXJFZGdlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZENvbmNlbnRyaWNFZGdlT3B0aW9uc19zdHJ1Y3QgeworICBDb25jZW50cmljUmFrZURpcmVjdGlvbiBkaXJlY3Rpb247ICAvLyBTcGVjaWZpZXMgdGhlIENvbmNlbnRyaWMgUmFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Rpb24uCisgIGludCBzaG93U2VhcmNoQXJlYTsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGFyZWEgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBpbnQgc2hvd1NlYXJjaExpbmVzOyAgLy8gSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggbGluZXMgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gbG9jYXRlIHRoZSBlZGdlcyBvbiB0aGUgaW1hZ2UuCisgIGludCBzaG93RWRnZXNGb3VuZDsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgbG9jYXRpb25zIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBlZGdlcyBmb3VuZCBvbiB0aGUgaW1hZ2UuCisgIGludCBzaG93UmVzdWx0OyAgLy8gSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBoaXQgbGluZXMgdG8gdGhlIG9iamVjdAorICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgZWRnZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaXQgbGluZSBvbiB0aGUgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UuCisgIFJHQlZhbHVlIHNlYXJjaEFyZWFDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWFyY2ggYXJlYS4KKyAgUkdCVmFsdWUgc2VhcmNoTGluZXNDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGxpbmVzLgorICBSR0JWYWx1ZSBzZWFyY2hFZGdlc0NvbG9yOyAgLy8gU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWFyY2ggZWRnZXMuCisgIFJHQlZhbHVlIHJlc3VsdENvbG9yOyAgLy8gU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0cy4KKyAgY2hhciogb3ZlcmxheUdyb3VwTmFtZTsgIC8vIFNwZWNpZmllcyB0aGUgb3ZlcmxheSBncm91cCBuYW1lIHRvIGFzc2lnbiB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJsYXlzLgorICBFZGdlT3B0aW9uczIgZWRnZU9wdGlvbnM7ICAvLyBTcGVjaWZpZXMgdGhlIGVkZ2UgZGV0ZWN0aW9uIG9wdGlvbnMgYWxvbmcgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgc2VhcmNoIGxpbmUuCit9IEZpbmRDb25jZW50cmljRWRnZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENvbmNlbnRyaWNFZGdlRml0T3B0aW9uc19zdHJ1Y3QgeworICBpbnQgbWF4UmFkaXVzOyAgLy8gU3BlY2lmaWVzIHRoZSBhY2NlcHRhYmxlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHRoYXQgYSBwb2ludAorICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lZCB0byBiZWxvbmcgdG8gdGhlIGNpcmNsZSBjYW4gYmUgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgIC8vIHBlcmltZXRlciBvZiB0aGUgY2lyY2xlLgorICBkb3VibGUgc3RlcFNpemU7ICAvLyBUaGUgc2FtcGxpbmcgZmFjdG9yIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZ2FwIGJldHdlZW4gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHJha2UgbGluZXMuCisgIFJha2VQcm9jZXNzVHlwZSBwcm9jZXNzVHlwZTsgIC8vIE1ldGhvZCB1c2VkIHRvIHByb2Nlc3MgdGhlIGRhdGEgZXh0cmFjdGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZGdlIGRldGVjdGlvbi4KK30gQ29uY2VudHJpY0VkZ2VGaXRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBGaW5kQ29uY2VudHJpY0VkZ2VSZXBvcnRfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBzdGFydFB0OyAgLy8gUGl4ZWwgQ29vcmRpbmF0ZXMgZm9yIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBlZGdlLgorICBQb2ludEZsb2F0IGVuZFB0OyAgLy8gUGl4ZWwgQ29vcmRpbmF0ZXMgZm9yIGVuZCBwb2ludCBvZiB0aGUgZWRnZS4KKyAgUG9pbnRGbG9hdCBzdGFydFB0Q2FsaWJyYXRlZDsgIC8vIFJlYWwgd29ybGQgQ29vcmRpbmF0ZXMgZm9yIHN0YXJ0aW5nIHBvaW50IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZS4KKyAgUG9pbnRGbG9hdAorICAgICAgZW5kUHRDYWxpYnJhdGVkOyAgLy8gUmVhbCB3b3JsZCBDb29yZGluYXRlcyBmb3IgZW5kIHBvaW50IG9mIHRoZSBlZGdlLgorICBkb3VibGUgYW5nbGU7ICAvLyBBbmdsZSBvZiB0aGUgZWRnZSBmb3VuZC4KKyAgZG91YmxlIGFuZ2xlQ2FsaWJyYXRlZDsgIC8vIENhbGlicmF0ZWQgYW5nbGUgb2YgdGhlIGVkZ2UgZm91bmQuCisgIGRvdWJsZSBzdHJhaWdodG5lc3M7ICAvLyBUaGUgc3RyYWlnaHRuZXNzIHZhbHVlIG9mIHRoZSBkZXRlY3RlZCBzdHJhaWdodCBlZGdlLgorICBkb3VibGUgYXZnU3RyZW5ndGg7ICAvLyBBdmVyYWdlIHN0cmVuZ3RoIG9mIHRoZSBlZ2RlIGZvdW5kLgorICBkb3VibGUgYXZnU05SOyAgLy8gQXZlcmFnZSBTTlIoU2lnbmFsIHRvIE5vaXNlIFJhdGlvKSBmb3IgdGhlIGVkZ2UgZm91bmQuCisgIGludCBsaW5lRm91bmQ7ICAvLyBJZiB0aGUgZWRnZSBpcyBmb3VuZCBvciBub3QuCit9IEZpbmRDb25jZW50cmljRWRnZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZENpcmN1bGFyRWRnZVJlcG9ydF9zdHJ1Y3QgeworICBQb2ludEZsb2F0IGNlbnRlckNhbGlicmF0ZWQ7ICAvLyBSZWFsIHdvcmxkIENvb3JkaW5hdGVzIG9mIHRoZSBDZW50ZXIuCisgIGRvdWJsZSByYWRpdXNDYWxpYnJhdGVkOyAgLy8gUmVhbCB3b3JsZCByYWRpdXMgb2YgdGhlIENpcmN1bGFyIEVkZ2UgZm91bmQuCisgIFBvaW50RmxvYXQgY2VudGVyOyAgLy8gUGl4ZWwgQ29vcmRpbmF0ZXMgb2YgdGhlIENlbnRlci4KKyAgZG91YmxlIHJhZGl1czsgIC8vIFJhZGl1cyBpbiBwaXhlbHMgb2YgdGhlIENpcmN1bGFyIEVkZ2UgZm91bmQuCisgIGRvdWJsZSByb3VuZG5lc3M7ICAvLyBUaGUgcm91bmRuZXNzIG9mIHRoZSBjYWxjdWxhdGVkIGNpcmN1bGFyIGVkZ2UuCisgIGRvdWJsZSBhdmdTdHJlbmd0aDsgIC8vIEF2ZXJhZ2Ugc3RyZW5ndGggb2YgdGhlIGVnZGUgZm91bmQuCisgIGRvdWJsZSBhdmdTTlI7ICAvLyBBdmVyYWdlIFNOUihTaWduYWwgdG8gTm9pc2UgUmF0aW8pIGZvciB0aGUgZWRnZSBmb3VuZC4KKyAgaW50IGNpcmNsZUZvdW5kOyAgLy8gSWYgdGhlIGNpcmNsdWxhciBlZGdlIGlzIGZvdW5kIG9yIG5vdC4KK30gRmluZENpcmN1bGFyRWRnZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgV2luZG93U2l6ZV9zdHJ1Y3QgeworICBpbnQgeDsgIC8vIFdpbmRvdyBsZW5naHQgb24gWCBkaXJlY3Rpb24uCisgIGludCB5OyAgLy8gV2luZG93IGxlbmdodCBvbiBZIGRpcmVjdGlvbi4KKyAgaW50IHN0ZXBTaXplOyAgLy8gRGlzdGFuY2UgYmV0d2VlbiB3aW5kb3dzLgorfSBXaW5kb3dTaXplOworCit0eXBlZGVmIHN0cnVjdCBEaXNwbGFjZW1lbnRWZWN0b3Jfc3RydWN0IHsKKyAgaW50IHg7ICAvLyBsZW5ndGggb24gWCBkaXJlY3Rpb24uCisgIGludCB5OyAgLy8gbGVuZ3RoIG9uIFkgZGlyZWN0aW9uLgorfSBEaXNwbGFjZW1lbnRWZWN0b3I7CisKK3R5cGVkZWYgc3RydWN0IFdhdmVsZXRPcHRpb25zX3N0cnVjdCB7CisgIFdhdmVsZXRUeXBlIHR5cGVPZldhdmVsZXQ7ICAvLyBUeXBlIG9mIHdhdmVsZXQoZGIsIGJpb3IuCisgIGZsb2F0IG1pbkVuZXJneTsgIC8vIE1pbmltdW0gRW5lcmd5IGluIHRoZSBiYW5kcyB0byBjb25zaWRlciBmb3IgdGV4dHVyZQorICAgICAgICAgICAgICAgICAgICAvLyBkZWZlY3QgZGV0ZWN0aW9uLgorfSBXYXZlbGV0T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ29vY2N1cnJlbmNlT3B0aW9uc19zdHJ1Y3QgeworICBpbnQgbGV2ZWw7ICAvLyBMZXZlbC9zaXplIG9mIG1hdHJpeC4KKyAgRGlzcGxhY2VtZW50VmVjdG9yCisgICAgICBkaXNwbGFjZW1lbnQ7ICAvLyBEaXNwbGFjZW1uZXQgYmV0d2VlbiBwaXhlbHMgdG8gYWNjdW11bGF0ZSB0aGUgbWF0cml4LgorfSBDb29jY3VycmVuY2VPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJMb2NhbFRocmVzaG9sZE9wdGlvbnNfc3RydWN0IHsKKyAgTG9jYWxUaHJlc2hvbGRNZXRob2QKKyAgICAgIG1ldGhvZDsgIC8vIFNwZWNpZmllcyB0aGUgbG9jYWwgdGhyZXNob2xkaW5nIG1ldGhvZCB0aGUgZnVuY3Rpb24gdXNlcy4KKyAgUGFydGljbGVUeXBlIHBhcnRpY2xlVHlwZTsgIC8vIFNwZWNpZmllcyB3aGF0IGtpbmQgb2YgcGFydGljbGVzIHRvIGxvb2sgZm9yLgorICB1bnNpZ25lZCBpbnQgd2luZG93V2lkdGg7ICAvLyBUaGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIHdpbmRvdyBhcm91bmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVsIG9uIHdoaWNoIHRoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZXNob2xkLgorICB1bnNpZ25lZCBpbnQgd2luZG93SGVpZ2h0OyAgLy8gVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVsIG9uIHdoaWNoIHRoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVzaG9sZC4KKyAgZG91YmxlIGRldmlhdGlvbldlaWdodDsgIC8vIFNwZWNpZmllcyB0aGUgayBjb25zdGFudCB1c2VkIGluIHRoZSBOaWJsYWNrIGxvY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlc2hvbGRpbmcgYWxnb3JpdGhtLCB3aGljaCBkZXRlcm1pbmVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VpZ2h0IGFwcGxpZWQgdG8gdGhlIHZhcmlhbmNlIGNhbGN1bGF0aW9uLgorfSBQYXJ0aWNsZUNsYXNzaWZpZXJMb2NhbFRocmVzaG9sZE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFJhbmdlRmxvYXRfc3RydWN0IHsKKyAgZmxvYXQgbWluVmFsdWU7ICAvLyBUaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UuCisgIGZsb2F0IG1heFZhbHVlOyAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLgorfSBSYW5nZUZsb2F0OworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUNsYXNzaWZpZXJBdXRvVGhyZXNob2xkT3B0aW9uc19zdHJ1Y3QgeworICBUaHJlc2hvbGRNZXRob2QgbWV0aG9kOyAgLy8gVGhlIG1ldGhvZCBmb3IgYmluYXJ5IHRocmVzaG9sZGluZywgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllcyBob3cgdG8gY2FsY3VsYXRlIHRoZSBjbGFzc2VzLgorICBQYXJ0aWNsZVR5cGUgcGFydGljbGVUeXBlOyAgLy8gU3BlY2lmaWVzIHdoYXQga2luZCBvZiBwYXJ0aWNsZXMgdG8gbG9vayBmb3IuCisgIFJhbmdlRmxvYXQgbGltaXRzOyAgLy8gVGhlIGxpbWl0cyBvbiB0aGUgYXV0b21hdGljIHRocmVzaG9sZCByYW5nZS4KK30gUGFydGljbGVDbGFzc2lmaWVyQXV0b1RocmVzaG9sZE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zMl9zdHJ1Y3QgeworICBQYXJ0aWNsZUNsYXNzaWZpZXJUaHJlc2hvbGRUeXBlCisgICAgICB0aHJlc2hvbGRUeXBlOyAgLy8gVGhlIHR5cGUgb2YgdGhyZXNob2xkIHRvIHBlcmZvcm0gb24gdGhlIGltYWdlLgorICBSYW5nZUZsb2F0IG1hbnVhbFRocmVzaG9sZFJhbmdlOyAgLy8gVGhlIHJhbmdlIG9mIHBpeGVscyB0byBrZWVwIGlmIG1hbnVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlc2hvbGRpbmcgdGhlIGltYWdlLgorICBQYXJ0aWNsZUNsYXNzaWZpZXJBdXRvVGhyZXNob2xkT3B0aW9ucworICAgICAgYXV0b1RocmVzaG9sZE9wdGlvbnM7ICAvLyBUaGUgb3B0aW9ucyB1c2VkIHRvIGF1dG8gdGhyZXNob2xkIHRoZSBpbWFnZS4KKyAgUGFydGljbGVDbGFzc2lmaWVyTG9jYWxUaHJlc2hvbGRPcHRpb25zCisgICAgICBsb2NhbFRocmVzaG9sZE9wdGlvbnM7ICAvLyBUaGUgb3B0aW9ucyB1c2VkIHRvIGxvY2FsIHRocmVzaG9sZCB0aGUgaW1hZ2UuCisgIGludCByZWplY3RCb3JkZXI7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gcmVqZWN0IGJvcmRlciBwYXJ0aWNsZXMuCisgIGludCBudW1Fcm9zaW9uczsgIC8vIFRoZSBudW1iZXIgb2YgZXJvc2lvbnMgdG8gcGVyZm9ybS4KK30gUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBNZWFzdXJlUGFydGljbGVzUmVwb3J0X3N0cnVjdCB7CisgIGRvdWJsZSoqIHBpeGVsTWVhc3VyZW1lbnRzOyAgLy8gVGhlIG1lYXN1cmVtZW50cyBvbiB0aGUgcGFydGljbGVzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLCBpbiBwaXhlbCBjb29yZGluYXRlcy4KKyAgZG91YmxlKiogY2FsaWJyYXRlZE1lYXN1cmVtZW50czsgIC8vIFRoZSBtZWFzdXJlbWVudHMgb24gdGhlIHBhcnRpY2xlcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLCBpbiByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICBzaXplX3QgbnVtUGFydGljbGVzOyAgLy8gVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgb24gd2hpY2ggbWVhc3VyZW1lbnRzIHdlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2VuLgorICBzaXplX3QgbnVtTWVhc3VyZW1lbnRzOyAgLy8gVGhlIG51bWJlciBvZiBtZWFzdXJlbWVudHMgdGFrZW4uCit9IE1lYXN1cmVQYXJ0aWNsZXNSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IEdlb21ldHJpY1BhdHRlcm5NYXRjaDNfc3RydWN0IHsKKyAgUG9pbnRGbG9hdAorICAgICAgcG9zaXRpb247ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGVtcGxhdGUgaW4gdGhlIG1hdGNoLgorICBmbG9hdCByb3RhdGlvbjsgIC8vIFRoZSByb3RhdGlvbiBvZiB0aGUgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIHRlbXBsYXRlIGltYWdlLAorICAgICAgICAgICAgICAgICAgIC8vIGluIGRlZ3JlZXMuCisgIGZsb2F0IHNjYWxlOyAgLy8gVGhlIHNpemUgb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgIC8vIGltYWdlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLgorICBmbG9hdCBzY29yZTsgIC8vIFRoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2guCisgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAgLy8gQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Vycm91bmRpbmcgdGhlIHRlbXBsYXRlIGltYWdlLgorICBpbnQgaW52ZXJzZTsgIC8vIFRoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBtYXRjaCBpcyBhbiBpbnZlcnNlIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIHRlbXBsYXRlIGltYWdlLgorICBmbG9hdCBvY2NsdXNpb247ICAvLyBUaGUgcGVyY2VudGFnZSBvZiB0aGUgbWF0Y2ggdGhhdCBpcyBvY2NsdWRlZC4KKyAgZmxvYXQgdGVtcGxhdGVNYXRjaEN1cnZlU2NvcmU7ICAvLyBUaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyaW5nIHRoZSB0ZW1wbGF0ZSBjdXJ2ZXMgdG8gdGhlIGN1cnZlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtYXRjaCByZWdpb24uCisgIGZsb2F0IG1hdGNoVGVtcGxhdGVDdXJ2ZVNjb3JlOyAgLy8gVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyB0aGUgY3VydmVzIGluIHRoZSBtYXRjaCByZWdpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVtcGxhdGUgY3VydmVzLgorICBmbG9hdCBjb3JyZWxhdGlvblNjb3JlOyAgLy8gVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieSBjb21wYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZW1wbGF0ZSBpbWFnZSB0byB0aGUgbWF0Y2ggcmVnaW9uIHVzaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlbGF0aW9uIG1ldHJpYyB0aGF0IGNvbXBhcmVzIHRoZSB0d28gcmVnaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBmdW5jdGlvbiBvZiB0aGVpciBwaXhlbCB2YWx1ZXMuCisgIFBvaW50RmxvYXQgY2FsaWJyYXRlZFBvc2l0aW9uOyAgLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW4gb2YgdGhlIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1hdGNoLgorICBmbG9hdCBjYWxpYnJhdGVkUm90YXRpb247ICAvLyBUaGUgcm90YXRpb24gb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSBpbWFnZSwgaW4gZGVncmVlcy4KKyAgUG9pbnRGbG9hdCBjYWxpYnJhdGVkQ29ybmVyWzRdOyAgLy8gQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgZGVzY3JpYmluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KK30gR2VvbWV0cmljUGF0dGVybk1hdGNoMzsKKwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zM19zdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3VicGl4ZWxJdGVyYXRpb25zOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIHVzZWQgdG8gcmVmaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHdpdGggc3VicGl4ZWwgaW5mb3JtYXRpb24uCisgIGRvdWJsZSBzdWJwaXhlbFRvbGVyYW5jZTsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2hhbmdlLCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbHMsIGJldHdlZW4gY29uc2VjdXRpdmUgaW5jcmVtZW50YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wcm92ZW1lbnRzIGluIHRoZSBtYXRjaCBwb3NpdGlvbiBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHN0b3BzIHJlZmluaW5nIHRoZSBtYXRjaCBwb3NpdGlvbi4KKyAgdW5zaWduZWQgaW50CisgICAgICBpbml0aWFsTWF0Y2hMaXN0TGVuZ3RoOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hdGNoIGxpc3QuCisgIGludCB0YXJnZXRUZW1wbGF0ZUN1cnZlU2NvcmU7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSB0aGUgbWF0Y2ggY3VydmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbXBsYXRlIGN1cnZlIHNjb3JlIGFuZCByZXR1cm4gaXQgZm9yIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIHJlc3VsdC4KKyAgaW50IGNvcnJlbGF0aW9uU2NvcmU7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHNob3VsZCBjYWxjdWxhdGUgdGhlIGNvcnJlbGF0aW9uIHNjb3JlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpdCBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25EaXN0YW5jZTsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBzZXBhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbnMgb2YgdHdvIG1hdGNoZXMgdGhhdCBoYXZlIHVuaXF1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbnMuCisgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25BbmdsZTsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBhbmd1bGFyIGRpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGRlZ3JlZXMsIGJldHdlZW4gdHdvIG1hdGNoZXMgdGhhdCBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuaXF1ZSBhbmdsZXMuCisgIGRvdWJsZSBtaW5NYXRjaFNlcGFyYXRpb25TY2FsZTsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBkaWZmZXJlbmNlIGluIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLCBiZXR3ZWVuIHR3bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUgc2NhbGVzLgorICBkb3VibGUgbWF4TWF0Y2hPdmVybGFwOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBvdmVybGFwLCBleHByZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgcGVyY2VudGFnZSwgYWxsb3dlZCBiZXR3ZWVuIHRoZSBib3VuZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjdGFuZ2xlcyBvZiB0d28gdW5pcXVlIG1hdGNoZXMuCisgIGludCBjb2Fyc2VSZXN1bHQ7ICAvLyBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0aGUgZnVuY3Rpb24gdG8gc3BlbmQgbGVzcworICAgICAgICAgICAgICAgICAgICAgLy8gdGltZSBhY2N1cmF0ZWx5IGVzdGltYXRpbmcgdGhlIGxvY2F0aW9uIG9mIGEgbWF0Y2guCisgIGludCBlbmFibGVDYWxpYnJhdGlvblN1cHBvcnQ7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsZ29yaXRobSB0cmVhdCB0aGUgaW5zcGVjdGlvbiBpbWFnZSBhcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxpYnJhdGVkIGltYWdlLgorICBDb250cmFzdE1vZGUgZW5hYmxlQ29udHJhc3RSZXZlcnNhbDsgIC8vIFVzZSB0aGlzIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250cmFzdCBvZiB0aGUgbWF0Y2hlcyB0byBzZWFyY2ggZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGltYWdlLgorICBHZW9tZXRyaWNNYXRjaGluZ1NlYXJjaFN0cmF0ZWd5CisgICAgICBtYXRjaFN0cmF0ZWd5OyAgLy8gU3BlY2lmaWVzIHRoZSBhZ2dyZXNzaXZlbmVzcyBvZiB0aGUgc2VhcmNoIHN0cmF0ZWd5LgorICB1bnNpZ25lZCBpbnQgcmVmaW5lTWF0Y2hGYWN0b3I7ICAvLyBTcGVjaWZpZXMgdGhlIGZhY3RvciB0aGF0IGlzIGFwcGxpZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBtYXRjaGVzIHJlcXVlc3RlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBtYXRjaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgYXJlIHJlZmluZWQgYXQgdGhlIGluaXRpYWwgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhZ2UuCisgIHVuc2lnbmVkIGludCBzdWJwaXhlbE1hdGNoRmFjdG9yOyAgLy8gU3BlY2lmaWVzIHRoZSBmYWN0b3IgdGhhdCBpcyBhcHBsaWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBtYXRjaGVzIHJlcXVlc3RlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIG1hdGNoZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFyZSBldmFsdWF0ZWQgYXQgdGhlIGZpbmFsIHN1YnBpeGVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgc3RhZ2UuCit9IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczM7CisKK3R5cGVkZWYgc3RydWN0IENvbG9yT3B0aW9uc19zdHJ1Y3QgeworICBDb2xvckNsYXNzaWZpY2F0aW9uUmVzb2x1dGlvbiBjb2xvckNsYXNzaWZpY2F0aW9uUmVzb2x1dGlvbjsgIC8vIFNwZWNpZmllcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzc2lmaWVyLgorICB1bnNpZ25lZCBpbnQgdXNlTHVtaW5hbmNlOyAgLy8gU3BlY2lmaWVzIGlmIHRoZSBsdW1pbmFuY2UgYmFuZCBpcyBnb2luZyB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCisgIENvbG9yTW9kZSBjb2xvck1vZGU7ICAvLyBTcGVjaWZpZXMgdGhlIGNvbG9yIG1vZGUgb2YgdGhlIGNsYXNzaWZpZXIuCit9IENvbG9yT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgU2FtcGxlU2NvcmVfc3RydWN0IHsKKyAgY2hhciogY2xhc3NOYW1lOyAgLy8gVGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICBmbG9hdCBkaXN0YW5jZTsgIC8vIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBpdGVtIHRvIHRoaXMgY2xhc3MuCisgIHVuc2lnbmVkIGludCBpbmRleDsgIC8vIGluZGV4IG9mIHRoaXMgc2FtcGxlLgorfSBTYW1wbGVTY29yZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xhc3NpZmllclJlcG9ydEFkdmFuY2VkX3N0cnVjdCB7CisgIGNoYXIqIGJlc3RDbGFzc05hbWU7ICAvLyBUaGUgbmFtZSBvZiB0aGUgYmVzdCBjbGFzcyBmb3IgdGhlIHNhbXBsZS4KKyAgZmxvYXQgY2xhc3NpZmljYXRpb25TY29yZTsgIC8vIFRoZSBzaW1pbGFyaXR5IG9mIHRoZSBzYW1wbGUgYW5kIHRoZSB0d28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3Nlc3QgY2xhc3NlcyBpbiB0aGUgY2xhc3NpZmllci4KKyAgZmxvYXQgaWRlbnRpZmljYXRpb25TY29yZTsgIC8vIFRoZSBzaW1pbGFyaXR5IG9mIHRoZSBzYW1wbGUgYW5kIHRoZSBhc3NpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3MuCisgIENsYXNzU2NvcmUqIGFsbFNjb3JlczsgIC8vIEFsbCBjbGFzc2VzIGFuZCB0aGVpciBzY29yZXMuCisgIGludCBhbGxTY29yZXNTaXplOyAgLy8gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGFsbFNjb3Jlcy4KKyAgU2FtcGxlU2NvcmUqIHNhbXBsZVNjb3JlczsgIC8vIEFsbCBzYW1wbGVzIGFuZCB0aGVpciBzY29yZXMuCisgIGludCBzYW1wbGVTY29yZXNTaXplOyAgLy8gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHNhbXBsZVNjb3Jlcy4KK30gQ2xhc3NpZmllclJlcG9ydEFkdmFuY2VkOworCit0eXBlZGVmIHN0cnVjdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyX3N0cnVjdCB7CisgIGRvdWJsZSBtaW5TY2FsZUZhY3RvcjsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBzY2FsZSBmYWN0b3IgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUgaXMgbGVhcm5lZCBmb3IuCisgIGRvdWJsZSBtYXhTY2FsZUZhY3RvcjsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBzY2FsZSBmYWN0b3IgdGhlIHRlbXBsYXRlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlYXJuZWQgZm9yLgorICBkb3VibGUgbWluUm90YXRpb25BbmdsZVZhbHVlOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHJvdGF0aW9uIGFuZ2xlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUgaXMgbGVhcm5lZCBmb3IuCisgIGRvdWJsZSBtYXhSb3RhdGlvbkFuZ2xlVmFsdWU7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gcm90YXRpb24gYW5nbGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSBpcyBsZWFybmVkIGZvci4KKyAgdW5zaWduZWQgaW50IGltYWdlU2FtcGxpbmdGYWN0b3I7ICAvLyBTcGVjaWZpZXMgdGhlIGZhY3RvciB0aGF0IGlzIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWJzYW1wbGUgdGhlIHRlbXBsYXRlIGFuZCB0aGUgaW1hZ2UgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluaXRpYWwgbWF0Y2hpbmcgcGhhc2UuCit9IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlRmlsdGVyT3B0aW9uczJfc3RydWN0IHsKKyAgaW50IHJlamVjdE1hdGNoZXM7ICAvLyBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byB0cmFuc2ZlciBvbmx5IHRob3NlCisgICAgICAgICAgICAgICAgICAgICAgLy8gcGFydGljbGVzIHRoYXQgZG8gbm90IG1lZXQgYWxsIHRoZSBjcml0ZXJpYS4KKyAgaW50IHJlamVjdEJvcmRlcjsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byByZWplY3QgYm9yZGVyIHBhcnRpY2xlcy4KKyAgaW50IGZpbGxIb2xlczsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBmaWxsIGhvbGVzIGluIHBhcnRpY2xlcy4KKyAgaW50IGNvbm5lY3Rpdml0eTg7ICAvLyBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byB1c2UgY29ubmVjdGl2aXR5LTggdG8KKyAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBwYXJ0aWNsZXMgYXJlIHRvdWNoaW5nLgorfSBQYXJ0aWNsZUZpbHRlck9wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBGaW5kRWRnZU9wdGlvbnMyX3N0cnVjdCB7CisgIFJha2VEaXJlY3Rpb24gZGlyZWN0aW9uOyAgLy8gVGhlIGRpcmVjdGlvbiB0byBzZWFyY2ggaW4gdGhlIFJPSS4KKyAgaW50IHNob3dTZWFyY2hBcmVhOyAgLy8gSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBzZWFyY2ggYXJlYSBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UuCisgIGludCBzaG93U2VhcmNoTGluZXM7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBsaW5lcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBsb2NhdGUgdGhlIGVkZ2VzIG9uIHRoZSBpbWFnZS4KKyAgaW50IHNob3dFZGdlc0ZvdW5kOyAgLy8gSWYgVFJVRSwgdGhlIGZ1bmN0aW9uIG92ZXJsYXlzIHRoZSBsb2NhdGlvbnMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGVkZ2VzIGZvdW5kIG9uIHRoZSBpbWFnZS4KKyAgaW50IHNob3dSZXN1bHQ7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGhpdCBsaW5lcyB0byB0aGUgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBlZGdlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpdCBsaW5lIG9uIHRoZSByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgUkdCVmFsdWUgc2VhcmNoQXJlYUNvbG9yOyAgLy8gU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlYXJjaCBhcmVhLgorICBSR0JWYWx1ZSBzZWFyY2hMaW5lc0NvbG9yOyAgLy8gU3BlY2lmaWVzIHRoZSBSR0IgY29sb3IgdmFsdWUgdG8gdXNlIHRvIG92ZXJsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWFyY2ggbGluZXMuCisgIFJHQlZhbHVlIHNlYXJjaEVkZ2VzQ29sb3I7ICAvLyBTcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlYXJjaCBlZGdlcy4KKyAgUkdCVmFsdWUgcmVzdWx0Q29sb3I7ICAvLyBTcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHRzLgorICBjaGFyKiBvdmVybGF5R3JvdXBOYW1lOyAgLy8gU3BlY2lmaWVzIHRoZSBvdmVybGF5IGdyb3VwIG5hbWUgdG8gYXNzaWduIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcmxheXMuCisgIEVkZ2VPcHRpb25zMiBlZGdlT3B0aW9uczsgIC8vIFNwZWNpZmllcyB0aGUgZWRnZSBkZXRlY3Rpb24gb3B0aW9ucyBhbG9uZyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBzZWFyY2ggbGluZS4KK30gRmluZEVkZ2VPcHRpb25zMjsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZEVkZ2VSZXBvcnRfc3RydWN0IHsKKyAgU3RyYWlnaHRFZGdlKiBzdHJhaWdodEVkZ2VzOyAgLy8gQW4gYXJyYXkgb2Ygc3RyYWlnaHQgZWRnZXMgZGV0ZWN0ZWQuCisgIHVuc2lnbmVkIGludAorICAgICAgbnVtU3RyYWlnaHRFZGdlczsgIC8vIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHN0cmFpZ2h0IGVkZ2VzIGZvdW5kLgorfSBGaW5kRWRnZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZFRyYW5zZm9ybVJlY3RPcHRpb25zMl9zdHJ1Y3QgeworICBGaW5kUmVmZXJlbmNlRGlyZWN0aW9uIGRpcmVjdGlvbjsgIC8vIFNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIGFuZCBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHdoaWNoIHRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbWFyeSBheGlzLgorICBpbnQgc2hvd1NlYXJjaEFyZWE7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBhcmVhIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgaW50IHNob3dTZWFyY2hMaW5lczsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGxpbmVzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGxvY2F0ZSB0aGUgZWRnZXMgb24gdGhlIGltYWdlLgorICBpbnQgc2hvd0VkZ2VzRm91bmQ7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRnZXMgZm91bmQgb24gdGhlIGltYWdlLgorICBpbnQgc2hvd1Jlc3VsdDsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgaGl0IGxpbmVzIHRvIHRoZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGVkZ2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGl0IGxpbmUgb24gdGhlIHJlc3VsdAorICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBSR0JWYWx1ZSBzZWFyY2hBcmVhQ29sb3I7ICAvLyBTcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGFyZWEuCisgIFJHQlZhbHVlIHNlYXJjaExpbmVzQ29sb3I7ICAvLyBTcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlYXJjaCBsaW5lcy4KKyAgUkdCVmFsdWUgc2VhcmNoRWRnZXNDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGVkZ2VzLgorICBSR0JWYWx1ZSByZXN1bHRDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdHMuCisgIGNoYXIqIG92ZXJsYXlHcm91cE5hbWU7ICAvLyBTcGVjaWZpZXMgdGhlIG92ZXJsYXkgZ3JvdXAgbmFtZSB0byBhc3NpZ24gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVybGF5cy4KKyAgRWRnZU9wdGlvbnMyIGVkZ2VPcHRpb25zOyAgLy8gU3BlY2lmaWVzIHRoZSBlZGdlIGRldGVjdGlvbiBvcHRpb25zIGFsb25nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIHNlYXJjaCBsaW5lLgorfSBGaW5kVHJhbnNmb3JtUmVjdE9wdGlvbnMyOworCit0eXBlZGVmIHN0cnVjdCBGaW5kVHJhbnNmb3JtUmVjdHNPcHRpb25zMl9zdHJ1Y3QgeworICBGaW5kUmVmZXJlbmNlRGlyZWN0aW9uIGRpcmVjdGlvbjsgIC8vIFNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIGFuZCBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHdoaWNoIHRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbWFyeSBheGlzLgorICBpbnQgc2hvd1NlYXJjaEFyZWE7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIHNlYXJjaCBhcmVhIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgaW50IHNob3dTZWFyY2hMaW5lczsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgc2VhcmNoIGxpbmVzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGxvY2F0ZSB0aGUgZWRnZXMgb24gdGhlIGltYWdlLgorICBpbnQgc2hvd0VkZ2VzRm91bmQ7ICAvLyBJZiBUUlVFLCB0aGUgZnVuY3Rpb24gb3ZlcmxheXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRnZXMgZm91bmQgb24gdGhlIGltYWdlLgorICBpbnQgc2hvd1Jlc3VsdDsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBvdmVybGF5cyB0aGUgaGl0IGxpbmVzIHRvIHRoZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGVkZ2UgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGl0IGxpbmUgb24gdGhlIHJlc3VsdAorICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBSR0JWYWx1ZSBzZWFyY2hBcmVhQ29sb3I7ICAvLyBTcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGFyZWEuCisgIFJHQlZhbHVlIHNlYXJjaExpbmVzQ29sb3I7ICAvLyBTcGVjaWZpZXMgdGhlIFJHQiBjb2xvciB2YWx1ZSB0byB1c2UgdG8gb3ZlcmxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlYXJjaCBsaW5lcy4KKyAgUkdCVmFsdWUgc2VhcmNoRWRnZXNDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGVkZ2VzLgorICBSR0JWYWx1ZSByZXN1bHRDb2xvcjsgIC8vIFNwZWNpZmllcyB0aGUgUkdCIGNvbG9yIHZhbHVlIHRvIHVzZSB0byBvdmVybGF5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdHMuCisgIGNoYXIqIG92ZXJsYXlHcm91cE5hbWU7ICAvLyBTcGVjaWZpZXMgdGhlIG92ZXJsYXkgZ3JvdXAgbmFtZSB0byBhc3NpZ24gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVybGF5cy4KKyAgRWRnZU9wdGlvbnMyIHByaW1hcnlFZGdlT3B0aW9uczsgIC8vIFNwZWNpZmllcyB0aGUgcGFyYW1ldGVycyB1c2VkIHRvIGNvbXB1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlZGdlIGdyYWRpZW50IGluZm9ybWF0aW9uIGFuZCBkZXRlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlZGdlcyBmb3IgdGhlIHByaW1hcnkgUk9JLgorICBFZGdlT3B0aW9uczIgc2Vjb25kYXJ5RWRnZU9wdGlvbnM7ICAvLyBTcGVjaWZpZXMgdGhlIHBhcmFtZXRlcnMgdXNlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBlZGdlIGdyYWRpZW50IGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkZXRlY3QgdGhlIGVkZ2VzIGZvciB0aGUgc2Vjb25kYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJPSS4KK30gRmluZFRyYW5zZm9ybVJlY3RzT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0M19zdHJ1Y3QgeworICBjb25zdCBjaGFyKiByZWFkU3RyaW5nOyAgLy8gVGhlIHJlYWQgc3RyaW5nLgorICBDaGFyUmVwb3J0MyogY2hhcmFjdGVyUmVwb3J0OyAgLy8gQW4gYXJyYXkgb2YgcmVwb3J0cyBkZXNjcmliaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBvZiBlYWNoIGlkZW50aWZpZWQgY2hhcmFjdGVyLgorICBpbnQgbnVtQ2hhcmFjdGVyUmVwb3J0czsgIC8vIFRoZSBudW1iZXIgb2YgaWRlbnRpZmllZCBjaGFyYWN0ZXJzLgorICBST0kqIHJvaUJvdW5kaW5nQ2hhcmFjdGVyczsgIC8vIEFuIGFycmF5IHNwZWNpZnlpbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlciBib3VuZGluZyBST0kuCit9IFJlYWRUZXh0UmVwb3J0MzsKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhcmFjdGVyU3RhdGlzdGljc19zdHJ1Y3QgeworICBpbnQgbGVmdDsgIC8vIFRoZSBsZWZ0IG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZXMgaW4gdGhlCisgICAgICAgICAgICAgLy8gY3VycmVudCBST0kuCisgIGludCB0b3A7ICAvLyBUaGUgdG9wIG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZXMgaW4gdGhlCisgICAgICAgICAgICAvLyBjdXJyZW50IFJPSS4KKyAgaW50IHdpZHRoOyAgLy8gVGhlIHdpZHRoIG9mIGVhY2ggb2YgdGhlIGNoYXJhY3RlcnMgeW91IHRyYWluZWQgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgLy8gUk9JLgorICBpbnQgaGVpZ2h0OyAgLy8gVGhlIGhlaWdodCBvZiBlYWNoIHRyYWluZWQgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IFJPSS4KKyAgaW50IGNoYXJhY3RlclNpemU7ICAvLyBUaGUgc2l6ZSBvZiB0aGUgY2hhcmFjdGVyIGluIHBpeGVscy4KK30gQ2hhcmFjdGVyU3RhdGlzdGljczsKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhclJlcG9ydDNfc3RydWN0IHsKKyAgY29uc3QgY2hhciogY2hhcmFjdGVyOyAgLy8gVGhlIGNoYXJhY3RlciB2YWx1ZS4KKyAgaW50IGNsYXNzaWZpY2F0aW9uU2NvcmU7ICAvLyBUaGUgZGVncmVlIHRvIHdoaWNoIHRoZSBhc3NpZ25lZCBjaGFyYWN0ZXIgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXByZXNlbnRzIHRoZSBvYmplY3QgYmV0dGVyIHRoYW4gdGhlIG90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGNsYXNzZXMgaW4gdGhlIGNoYXJhY3RlciBzZXQuCisgIGludCB2ZXJpZmljYXRpb25TY29yZTsgIC8vIFRoZSBzaW1pbGFyaXR5IG9mIHRoZSBjaGFyYWN0ZXIgYW5kIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGZvciB0aGUgY2hhcmFjdGVyIGNsYXNzLgorICBpbnQgdmVyaWZpZWQ7ICAvLyBUaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiBhIHJlZmVyZW5jZSBjaGFyYWN0ZXIgd2FzIGZvdW5kIGZvcgorICAgICAgICAgICAgICAgICAvLyB0aGUgY2hhcmFjdGVyIGNsYXNzIGFuZCBGQUxTRSBpZiBhIHJlZmVyZW5jZSBjaGFyYWN0ZXIgd2FzCisgICAgICAgICAgICAgICAgIC8vIG5vdCBmb3VuZC4KKyAgaW50IGxvd1RocmVzaG9sZDsgIC8vIFRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQgcmFuZ2UgdXNlZCBmb3IgdGhpcworICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgorICBpbnQgaGlnaFRocmVzaG9sZDsgIC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQgcmFuZ2UgdXNlZCBmb3IgdGhpcworICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3Rlci4KKyAgQ2hhcmFjdGVyU3RhdGlzdGljcworICAgICAgY2hhcmFjdGVyU3RhdHM7ICAvLyBEZXNjcmliZXMgdGhlIGNoYXJhY3RlcnMgc2VnbWVudGVkIGluIHRoZSBST0kuCit9IENoYXJSZXBvcnQzOworCit0eXBlZGVmIHN0cnVjdCBBcmNJbmZvMl9zdHJ1Y3QgeworICBQb2ludEZsb2F0IGNlbnRlcjsgIC8vIFRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIGFyYy4KKyAgZG91YmxlIHJhZGl1czsgIC8vIFRoZSByYWRpdXMgb2YgdGhlIGFyYy4KKyAgZG91YmxlIHN0YXJ0QW5nbGU7ICAvLyBUaGUgc3RhcnRpbmcgYW5nbGUgb2YgdGhlIGFyYywgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnRlci1jbG9ja3dpc2UgZnJvbSB0aGUgeC1heGlzLgorICBkb3VibGUgZW5kQW5nbGU7ICAvLyBUaGUgZW5kaW5nIGFuZ2xlIG9mIHRoZSBhcmMsIHNwZWNpZmllZCBjb3VudGVyLWNsb2Nrd2lzZQorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSB4LWF4aXMuCit9IEFyY0luZm8yOworCit0eXBlZGVmIHN0cnVjdCBFZGdlUmVwb3J0Ml9zdHJ1Y3QgeworICBFZGdlSW5mbyogZWRnZXM7ICAvLyBBbiBhcnJheSBvZiBlZGdlcyBkZXRlY3RlZC4KKyAgdW5zaWduZWQgaW50IG51bUVkZ2VzOyAgLy8gSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZWRnZXMgZGV0ZWN0ZWQuCisgIGRvdWJsZSogZ3JhZGllbnRJbmZvOyAgLy8gQW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgY2FsY3VsYXRlZCBlZGdlIHN0cmVuZ3RocworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsb25nIHRoZSB1c2VyLWRlZmluZWQgc2VhcmNoIGFyZWEuCisgIHVuc2lnbmVkIGludCBudW1HcmFkaWVudEluZm87ICAvLyBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGdyYWRpZW50SW5mby4KKyAgaW50IGNhbGlicmF0aW9uVmFsaWQ7ICAvLyBJbmRpY2F0ZXMgaWYgdGhlIGNhbGlicmF0aW9uIGRhdGEgY29ycmVzcG9uZGluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWRnZXMgaXMgY29ycmVjdC4KK30gRWRnZVJlcG9ydDI7CisKK3R5cGVkZWYgc3RydWN0IFNlYXJjaEFyY0luZm9fc3RydWN0IHsKKyAgQXJjSW5mbzIgYXJjQ29vcmRpbmF0ZXM7ICAvLyBEZXNjcmliZXMgdGhlIGFyYyB1c2VkIGZvciBlZGdlIGRldGVjdGlvbi4KKyAgRWRnZVJlcG9ydDIgZWRnZVJlcG9ydDsgIC8vIERlc2NyaWJlcyB0aGUgZWRnZXMgZm91bmQgaW4gdGhpcyBzZWFyY2ggbGluZS4KK30gU2VhcmNoQXJjSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQ29uY2VudHJpY1Jha2VSZXBvcnQyX3N0cnVjdCB7CisgIEVkZ2VJbmZvKiBmaXJzdEVkZ2VzOyAgLy8gVGhlIGZpcnN0IGVkZ2UgcG9pbnQgZGV0ZWN0ZWQgYWxvbmcgZWFjaCBzZWFyY2ggbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBST0kuCisgIHVuc2lnbmVkIGludCBudW1GaXJzdEVkZ2VzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGZpcnN0RWRnZXMgYXJyYXkuCisgIEVkZ2VJbmZvKiBsYXN0RWRnZXM7ICAvLyBUaGUgbGFzdCBlZGdlIHBvaW50IGRldGVjdGVkIGFsb25nIGVhY2ggc2VhcmNoIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBST0kuCisgIHVuc2lnbmVkIGludCBudW1MYXN0RWRnZXM7ICAvLyBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbGFzdEVkZ2VzIGFycmF5LgorICBTZWFyY2hBcmNJbmZvKiBzZWFyY2hBcmNzOyAgLy8gQ29udGFpbnMgdGhlIGFyY3MgdXNlZCBmb3IgZWRnZSBkZXRlY3Rpb24gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhcmMuCisgIHVuc2lnbmVkIGludCBudW1TZWFyY2hBcmNzOyAgLy8gVGhlIG51bWJlciBvZiBhcmNzIGluIHRoZSBzZWFyY2hBcmNzIGFycmF5LgorfSBDb25jZW50cmljUmFrZVJlcG9ydDI7CisKK3R5cGVkZWYgc3RydWN0IFNwb2tlUmVwb3J0Ml9zdHJ1Y3QgeworICBFZGdlSW5mbyogZmlyc3RFZGdlczsgIC8vIFRoZSBmaXJzdCBlZGdlIHBvaW50IGRldGVjdGVkIGFsb25nIGVhY2ggc2VhcmNoIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgUk9JLgorICB1bnNpZ25lZCBpbnQgbnVtRmlyc3RFZGdlczsgIC8vIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBmaXJzdEVkZ2VzIGFycmF5LgorICBFZGdlSW5mbyogbGFzdEVkZ2VzOyAgLy8gVGhlIGxhc3QgZWRnZSBwb2ludCBkZXRlY3RlZCBhbG9uZyBlYWNoIHNlYXJjaCBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgUk9JLgorICB1bnNpZ25lZCBpbnQgbnVtTGFzdEVkZ2VzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGxhc3RFZGdlcyBhcnJheS4KKyAgU2VhcmNoTGluZUluZm8qIHNlYXJjaExpbmVzOyAgLy8gVGhlIHNlYXJjaCBsaW5lcyB1c2VkIGZvciBlZGdlIGRldGVjdGlvbi4KKyAgdW5zaWduZWQgaW50CisgICAgICBudW1TZWFyY2hMaW5lczsgIC8vIFRoZSBudW1iZXIgb2Ygc2VhcmNoIGxpbmVzIHVzZWQgaW4gdGhlIGVkZ2UgZGV0ZWN0aW9uLgorfSBTcG9rZVJlcG9ydDI7CisKK3R5cGVkZWYgc3RydWN0IEVkZ2VJbmZvX3N0cnVjdCB7CisgIFBvaW50RmxvYXQgcG9zaXRpb247ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGVkZ2UgaW4gdGhlIGltYWdlLgorICBQb2ludEZsb2F0IGNhbGlicmF0ZWRQb3NpdGlvbjsgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWRnZSBpbiB0aGUgaW1hZ2UgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICBkb3VibGUgZGlzdGFuY2U7ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGVkZ2UgZnJvbSB0aGUgZmlyc3QgcG9pbnQgYWxvbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kYXJ5IG9mIHRoZSBpbnB1dCBST0kuCisgIGRvdWJsZSBjYWxpYnJhdGVkRGlzdGFuY2U7ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGVkZ2UgZnJvbSB0aGUgZmlyc3QgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsb25nIHRoZSBib3VuZGFyeSBvZiB0aGUgaW5wdXQgUk9JIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFsLXdvcmxkIGNvb3JkaW5hdGVzLgorICBkb3VibGUgbWFnbml0dWRlOyAgLy8gVGhlIGludGVuc2l0eSBjb250cmFzdCBhdCB0aGUgZWRnZS4KKyAgZG91YmxlCisgICAgICBub2lzZVBlYWs7ICAvLyBUaGUgc3RyZW5ndGggb2YgdGhlIG5vaXNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBlZGdlLgorICBpbnQgcmlzaW5nOyAgLy8gSW5kaWNhdGVzIHRoZSBwb2xhcml0eSBvZiB0aGUgZWRnZS4KK30gRWRnZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFNlYXJjaExpbmVJbmZvX3N0cnVjdCB7CisgIExpbmVGbG9hdCBsaW5lQ29vcmRpbmF0ZXM7ICAvLyBUaGUgZW5kcG9pbnRzIG9mIHRoZSBzZWFyY2ggbGluZS4KKyAgRWRnZVJlcG9ydDIgZWRnZVJlcG9ydDsgIC8vIERlc2NyaWJlcyB0aGUgZWRnZXMgZm91bmQgaW4gdGhpcyBzZWFyY2ggbGluZS4KK30gU2VhcmNoTGluZUluZm87CisKK3R5cGVkZWYgc3RydWN0IFJha2VSZXBvcnQyX3N0cnVjdCB7CisgIEVkZ2VJbmZvKiBmaXJzdEVkZ2VzOyAgLy8gVGhlIGZpcnN0IGVkZ2UgcG9pbnQgZGV0ZWN0ZWQgYWxvbmcgZWFjaCBzZWFyY2ggbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBST0kuCisgIHVuc2lnbmVkIGludCBudW1GaXJzdEVkZ2VzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGZpcnN0RWRnZXMgYXJyYXkuCisgIEVkZ2VJbmZvKiBsYXN0RWRnZXM7ICAvLyBUaGUgbGFzdCBlZGdlIHBvaW50IGRldGVjdGVkIGFsb25nIGVhY2ggc2VhcmNoIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBST0kuCisgIHVuc2lnbmVkIGludCBudW1MYXN0RWRnZXM7ICAvLyBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbGFzdEVkZ2VzIGFycmF5LgorICBTZWFyY2hMaW5lSW5mbyogc2VhcmNoTGluZXM7ICAvLyBUaGUgc2VhcmNoIGxpbmVzIHVzZWQgZm9yIGVkZ2UgZGV0ZWN0aW9uLgorICB1bnNpZ25lZCBpbnQKKyAgICAgIG51bVNlYXJjaExpbmVzOyAgLy8gVGhlIG51bWJlciBvZiBzZWFyY2ggbGluZXMgdXNlZCBpbiB0aGUgZWRnZSBkZXRlY3Rpb24uCit9IFJha2VSZXBvcnQyOworCit0eXBlZGVmIHN0cnVjdCBUcmFuc2Zvcm1CZWhhdmlvcnNfc3RydWN0IHsKKyAgR3JvdXBCZWhhdmlvciBTaGlmdEJlaGF2aW9yOyAgLy8gU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiBhbiBvdmVybGF5IGdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYSBzaGlmdCBvcGVyYXRpb24gaXMgYXBwbGllZCB0byBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgR3JvdXBCZWhhdmlvciBTY2FsZUJlaGF2aW9yOyAgLy8gU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiBhbiBvdmVybGF5IGdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYSBzY2FsZSBvcGVyYXRpb24gaXMgYXBwbGllZCB0byBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgR3JvdXBCZWhhdmlvciBSb3RhdGVCZWhhdmlvcjsgIC8vIFNwZWNpZmllcyB0aGUgYmVoYXZpb3Igb2YgYW4gb3ZlcmxheSBncm91cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhIHJvdGF0ZSBvcGVyYXRpb24gaXMgYXBwbGllZCB0byBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UuCisgIEdyb3VwQmVoYXZpb3IgU3ltbWV0cnlCZWhhdmlvcjsgIC8vIFNwZWNpZmllcyB0aGUgYmVoYXZpb3Igb2YgYW4gb3ZlcmxheSBncm91cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGEgc3ltbWV0cnkgb3BlcmF0aW9uIGlzIGFwcGxpZWQgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UuCit9IFRyYW5zZm9ybUJlaGF2aW9yczsKKwordHlwZWRlZiBzdHJ1Y3QgUVJDb2RlRGF0YVRva2VuX3N0cnVjdCB7CisgIFFSU3RyZWFtTW9kZSBtb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBzdHJlYW0gbW9kZSBvciB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBpcyBlbmNvZGVkIGluIHRoZSBRUiBjb2RlLgorICB1bnNpZ25lZCBpbnQgbW9kZURhdGE7ICAvLyBJbmRpY2F0ZXMgc3BlY2lmaWVycyB1c2VkIGJ5IHRoZSB1c2VyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3Rwcm9jZXNzIHRoZSBkYXRhIGlmIGl0IHJlcXVpcmVzIGl0LgorICB1bnNpZ25lZCBjaGFyKiBkYXRhOyAgLy8gU2hvd3MgdGhlIGVuY29kZWQgZGF0YSBpbiB0aGUgUVIgY29kZS4KKyAgdW5zaWduZWQgaW50CisgICAgICBkYXRhTGVuZ3RoOyAgLy8gU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgZm91bmQgaW4gdGhlIFFSIGNvZGUuCit9IFFSQ29kZURhdGFUb2tlbjsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVGaWx0ZXJPcHRpb25zX3N0cnVjdCB7CisgIGludCByZWplY3RNYXRjaGVzOyAgLy8gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gdHJhbnNmZXIgb25seSB0aG9zZQorICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnRpY2xlcyB0aGF0IGRvIG5vdCBtZWV0IGFsbCB0aGUgY3JpdGVyaWEuCisgIGludCByZWplY3RCb3JkZXI7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gcmVqZWN0IGJvcmRlciBwYXJ0aWNsZXMuCisgIGludCBjb25uZWN0aXZpdHk4OyAgLy8gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gdXNlIGNvbm5lY3Rpdml0eS04IHRvCisgICAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgcGFydGljbGVzIGFyZSB0b3VjaGluZy4KK30gUGFydGljbGVGaWx0ZXJPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBTdHJhaWdodEVkZ2VSZXBvcnQyX3N0cnVjdCB7CisgIFN0cmFpZ2h0RWRnZSogc3RyYWlnaHRFZGdlczsgIC8vIENvbnRhaW5zIGFuIGFycmF5IG9mIGZvdW5kIHN0cmFpZ2h0IGVkZ2VzLgorICB1bnNpZ25lZCBpbnQKKyAgICAgIG51bVN0cmFpZ2h0RWRnZXM7ICAvLyBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBzdHJhaWdodCBlZGdlcyBmb3VuZC4KKyAgU2VhcmNoTGluZUluZm8qIHNlYXJjaExpbmVzOyAgLy8gQ29udGFpbnMgYW4gYXJyYXkgb2YgYWxsIHNlYXJjaCBsaW5lcyB1c2VkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXRlY3Rpb24uCisgIHVuc2lnbmVkIGludAorICAgICAgbnVtU2VhcmNoTGluZXM7ICAvLyBUaGUgbnVtYmVyIG9mIHNlYXJjaCBsaW5lcyB1c2VkIGluIHRoZSBlZGdlIGRldGVjdGlvbi4KK30gU3RyYWlnaHRFZGdlUmVwb3J0MjsKKwordHlwZWRlZiBzdHJ1Y3QgU3RyYWlnaHRFZGdlT3B0aW9uc19zdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbnVtTGluZXM7ICAvLyBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdHJhaWdodCBlZGdlcyB0byBmaW5kLgorICBTdHJhaWdodEVkZ2VTZWFyY2hNb2RlCisgICAgICBzZWFyY2hNb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBtZXRob2QgdXNlZCB0byBmaW5kIHRoZSBzdHJhaWdodCBlZGdlLgorICBkb3VibGUgbWluU2NvcmU7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gc2NvcmUgb2YgYSBkZXRlY3RlZCBzdHJhaWdodCBlZGdlLgorICBkb3VibGUgbWF4U2NvcmU7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2NvcmUgb2YgYSBkZXRlY3RlZCBlZGdlLgorICBkb3VibGUgb3JpZW50YXRpb247ICAvLyBTcGVjaWZpZXMgdGhlIGFuZ2xlIGF0IHdoaWNoIHRoZSBzdHJhaWdodCBlZGdlIGlzCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIHRvIGJlIGZvdW5kLgorICBkb3VibGUgYW5nbGVSYW5nZTsgIC8vIFNwZWNpZmllcyB0aGUgKy8tIHJhbmdlIGFyb3VuZCB0aGUgb3JpZW50YXRpb24gd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHN0cmFpZ2h0IGVkZ2UgaXMgZXhwZWN0ZWQgdG8gYmUgZm91bmQuCisgIGRvdWJsZSBhbmdsZVRvbGVyYW5jZTsgIC8vIFNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgYW5ndWxhciBhY2N1cmFjeSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyYWlnaHQgZWRnZS4KKyAgdW5zaWduZWQgaW50IHN0ZXBTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBnYXAgaW4gcGl4ZWxzIGJldHdlZW4gdGhlIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lcyB1c2VkIHdpdGggdGhlIHJha2UtYmFzZWQgbWV0aG9kcy4KKyAgZG91YmxlIG1pblNpZ25hbFRvTm9pc2VSYXRpbzsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBzaWduYWwgdG8gbm9pc2UgcmF0aW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChTTlIpIG9mIHRoZSBlZGdlIHBvaW50cyB1c2VkIHRvIGZpdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmFpZ2h0IGVkZ2UuCisgIGRvdWJsZSBtaW5Db3ZlcmFnZTsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBudW1iZXIgb2YgcG9pbnRzIGFzIGEgcGVyY2VudGFnZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgbnVtYmVyIG9mIHNlYXJjaCBsaW5lcyB0aGF0IG5lZWQgdG8gYmUgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGRldGVjdGVkIHN0cmFpZ2h0IGVkZ2UuCisgIHVuc2lnbmVkIGludCBob3VnaEl0ZXJhdGlvbnM7ICAvLyBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHVzZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBIb3VnaC1iYXNlZCBtZXRob2QuCit9IFN0cmFpZ2h0RWRnZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFN0cmFpZ2h0RWRnZV9zdHJ1Y3QgeworICBMaW5lRmxvYXQgc3RyYWlnaHRFZGdlQ29vcmRpbmF0ZXM7ICAvLyBFbmQgcG9pbnRzIG9mIHRoZSBkZXRlY3RlZCBzdHJhaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZGdlIGluIHBpeGVsIGNvb3JkaW5hdGVzLgorICBMaW5lRmxvYXQgY2FsaWJyYXRlZFN0cmFpZ2h0RWRnZUNvb3JkaW5hdGVzOyAgLy8gRW5kIHBvaW50cyBvZiB0aGUgZGV0ZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmFpZ2h0IGVkZ2UgaW4gcmVhbC13b3JsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZXMuCisgIGRvdWJsZSBhbmdsZTsgIC8vIEFuZ2xlIG9mIHRoZSBmb3VuZCBlZGdlIHVzaW5nIHRoZSBwaXhlbCBjb29yZGluYXRlcy4KKyAgZG91YmxlIGNhbGlicmF0ZWRBbmdsZTsgIC8vIEFuZ2xlIG9mIHRoZSBmb3VuZCBlZGdlIHVzaW5nIHRoZSByZWFsLXdvcmxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29yZGluYXRlcy4KKyAgZG91YmxlIHNjb3JlOyAgLy8gRGVzY3JpYmVzIHRoZSBzY29yZSBvZiB0aGUgZGV0ZWN0ZWQgZWRnZS4KKyAgZG91YmxlIHN0cmFpZ2h0bmVzczsgIC8vIFRoZSBzdHJhaWdodG5lc3MgdmFsdWUgb2YgdGhlIGRldGVjdGVkIHN0cmFpZ2h0IGVkZ2UuCisgIGRvdWJsZSBhdmVyYWdlU2lnbmFsVG9Ob2lzZVJhdGlvOyAgLy8gRGVzY3JpYmVzIHRoZSBhdmVyYWdlIHNpZ25hbCB0byBub2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGlvIChTTlIpIG9mIHRoZSBkZXRlY3RlZCBlZGdlLgorICBpbnQgY2FsaWJyYXRpb25WYWxpZDsgIC8vIEluZGljYXRlcyBpZiB0aGUgY2FsaWJyYXRpb24gZGF0YSBmb3IgdGhlIHN0cmFpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRnZSBpcyB2YWxpZC4KKyAgRWRnZUluZm8qIHVzZWRFZGdlczsgIC8vIEFuIGFycmF5IG9mIGVkZ2VzIHRoYXQgd2VyZSB1c2VkIHRvIGRldGVybWluZSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJhaWdodCBsaW5lLgorICB1bnNpZ25lZCBpbnQKKyAgICAgIG51bVVzZWRFZGdlczsgIC8vIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGVkZ2VzIGluIHRoZSB1c2VkRWRnZXMgYXJyYXkuCit9IFN0cmFpZ2h0RWRnZTsKKwordHlwZWRlZiBzdHJ1Y3QgUVJDb2RlU2VhcmNoT3B0aW9uc19zdHJ1Y3QgeworICBRUlJvdGF0aW9uTW9kZSByb3RhdGlvbk1vZGU7ICAvLyBTcGVjaWZpZXMgdGhlIGFtb3VudCBvZiBRUiBjb2RlIHJvdGF0aW9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBzaG91bGQgYWxsb3cgZm9yLgorICB1bnNpZ25lZCBpbnQgc2tpcExvY2F0aW9uOyAgLy8gSWYgc2V0IHRvIFRSVUUsIHNwZWNpZmllcyB0aGF0IHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBRUiBjb2RlIG9jY3VwaWVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXJlIGltYWdlIChvciB0aGUgZW50aXJlIHNlYXJjaCByZWdpb24pLgorICB1bnNpZ25lZCBpbnQgZWRnZVRocmVzaG9sZDsgIC8vIFRoZSBzdHJlbmd0aCBvZiB0aGUgd2Vha2VzdCBlZGdlIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgdG8gZmluZCB0aGUgY29hcnNlIGxvY2F0aW9uIG9mIHRoZSBRUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgaW4gdGhlIGltYWdlLgorICBRUkRlbW9kdWxhdGlvbk1vZGUgZGVtb2R1bGF0aW9uTW9kZTsgIC8vIFRoZSBkZW1vZHVsYXRpb24gbW9kZSB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VzIHRvIGxvY2F0ZSB0aGUgUVIgY29kZS4KKyAgUVJDZWxsU2FtcGxlU2l6ZSBjZWxsU2FtcGxlU2l6ZTsgIC8vIFRoZSBjZWxsIHNhbXBsZSBzaXplIHRoZSBmdW5jdGlvbiB1c2VzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIFFSIGNvZGUuCisgIFFSQ2VsbEZpbHRlck1vZGUgY2VsbEZpbHRlck1vZGU7ICAvLyBUaGUgY2VsbCBmaWx0ZXIgbW9kZSB0aGUgZnVuY3Rpb24gdXNlcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRlIHRoZSBRUiBjb2RlLgorICB1bnNpZ25lZCBpbnQgc2tld0RlZ3JlZXNBbGxvd2VkOyAgLy8gU3BlY2lmaWVzIHRoZSBhbW91bnQgb2Ygc2tldyBpbiB0aGUgUVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgdGhlIGZ1bmN0aW9uIHNob3VsZCBhbGxvdyBmb3IuCit9IFFSQ29kZVNlYXJjaE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFFSQ29kZVNpemVPcHRpb25zX3N0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtaW5TaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHNpemUgKGluIHBpeGVscykgb2YgdGhlIFFSCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSBpbiB0aGUgaW1hZ2UuCisgIHVuc2lnbmVkIGludCBtYXhTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgKGluIHBpeGVscykgb2YgdGhlIFFSCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSBpbiB0aGUgaW1hZ2UuCit9IFFSQ29kZVNpemVPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBRUkNvZGVEZXNjcmlwdGlvbk9wdGlvbnNfc3RydWN0IHsKKyAgUVJEaW1lbnNpb25zIGRpbWVuc2lvbnM7ICAvLyBUaGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgdGhhdCBhcmUgcG9wdWxhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBRUiBjb2RlLCBtZWFzdXJlZCBpbiBjZWxscy4KKyAgUVJQb2xhcml0aWVzIHBvbGFyaXR5OyAgLy8gVGhlIHBvbGFyaXR5IG9mIHRoZSBRUiBjb2RlLgorICBRUk1pcnJvck1vZGUgbWlycm9yOyAgLy8gVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIFFSIGNvZGUgYXBwZWFycyBtaXJyb3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGltYWdlIGFuZCBGQUxTRSBpZiB0aGUgUVIgY29kZSBhcHBlYXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSBpbiB0aGUgaW1hZ2UuCisgIFFSTW9kZWxUeXBlCisgICAgICBtb2RlbFR5cGU7ICAvLyBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgUVIgY29kZS4KK30gUVJDb2RlRGVzY3JpcHRpb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBRUkNvZGVSZXBvcnRfc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGZvdW5kOyAgLy8gVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGZ1bmN0aW9uIGxvY2F0ZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY29kZWQgYSBRUiBjb2RlIGFuZCBGQUxTRSBpZiB0aGUgZnVuY3Rpb24gZmFpbGVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2F0ZSBhbmQgZGVjb2RlIGEgUVIgY29kZS4KKyAgdW5zaWduZWQgY2hhciogZGF0YTsgIC8vIFRoZSBkYXRhIGVuY29kZWQgaW4gdGhlIFFSIGNvZGUuCisgIHVuc2lnbmVkIGludCBkYXRhTGVuZ3RoOyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBhcnJheS4KKyAgUG9pbnRGbG9hdCBib3VuZGluZ0JveFs0XTsgIC8vIEFuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWN0YW5nbGUgc3Vycm91bmRpbmcgdGhlIFFSIGNvZGUuCisgIFFSQ29kZURhdGFUb2tlbiogdG9rZW5pemVkRGF0YTsgIC8vIENvbnRhaW5zIHRoZSBkYXRhIHRva2VuaXplZCBpbiBleGFjdGx5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXkgaXQgd2FzIGVuY29kZWQgaW4gdGhlIGNvZGUuCisgIHVuc2lnbmVkIGludCBzaXplT2ZUb2tlbml6ZWREYXRhOyAgLy8gU2l6ZSBvZiB0aGUgdG9rZW5pemVkIGRhdGEuCisgIHVuc2lnbmVkIGludCBudW1FcnJvcnNDb3JyZWN0ZWQ7ICAvLyBUaGUgbnVtYmVyIG9mIGVycm9ycyB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3RlZCB3aGVuIGRlY29kaW5nIHRoZSBRUiBjb2RlLgorICB1bnNpZ25lZCBpbnQgZGltZW5zaW9uczsgIC8vIFRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB0aGF0IGFyZSBwb3B1bGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIFFSIGNvZGUsIG1lYXN1cmVkIGluIGNlbGxzLgorICB1bnNpZ25lZCBpbnQgdmVyc2lvbjsgIC8vIFRoZSB2ZXJzaW9uIG9mIHRoZSBRUiBjb2RlLgorICBRUk1vZGVsVHlwZSBtb2RlbFR5cGU7ICAvLyBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hhdCB0eXBlIG9mIFFSCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgdGhpcyBpcy4KKyAgUVJTdHJlYW1Nb2RlIHN0cmVhbU1vZGU7ICAvLyBUaGUgZm9ybWF0IG9mIHRoZSBkYXRhIGVuY29kZWQgaW4gdGhlIHN0cmVhbS4KKyAgUVJQb2xhcml0aWVzIG1hdHJpeFBvbGFyaXR5OyAgLy8gVGhlIHBvbGFyaXR5IG9mIHRoZSBRUiBjb2RlLgorICB1bnNpZ25lZCBpbnQgbWlycm9yZWQ7ICAvLyBUaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgUVIgY29kZSBhcHBlYXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pcnJvcmVkIGluIHRoZSBpbWFnZSBhbmQgRkFMU0UgaWYgdGhlIFFSIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZWFycyBub3JtYWxseSBpbiB0aGUgaW1hZ2UuCisgIHVuc2lnbmVkIGludCBwb3NpdGlvbkluQXBwZW5kU3RyZWFtOyAgLy8gSW5kaWNhdGVzIHdoYXQgcG9zaXRpb24gdGhlIFFSIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBpbiB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0cmVhbSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgaW4gYWxsIGNvZGVzLgorICB1bnNpZ25lZCBpbnQgc2l6ZU9mQXBwZW5kU3RyZWFtOyAgLy8gU3BlY2lmaWVzIGhvdyBtYW55IFFSIGNvZGVzIGFyZSBwYXJ0IG9mIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhcmdlciBhcnJheSBvZiBjb2Rlcy4KKyAgaW50IGZpcnN0RUFOMTI4QXBwbGljYXRpb25JRDsgIC8vIFRoZSBmaXJzdCBFQU4tMTI4IEFwcGxpY2F0aW9uIElEIGVuY291bnRlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgc3RyZWFtLgorICBpbnQgZmlyc3RFQ0lEZXNpZ25hdG9yOyAgLy8gVGhlIGZpcnN0IFJlZ2lvbmFsIExhbmd1YWdlIERlc2lnbmF0b3IgZW5jb3VudGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBzdHJlYW0uCisgIHVuc2lnbmVkIGludCBhcHBlbmRTdHJlYW1JZGVudGlmaWVyOyAgLy8gU3BlY2lmaWVzIHdoYXQgc3RyZWFtIHRoZSBRUiBjb2RlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gcmVsYXRpb24gdG8gd2hlbiB0aGUgY29kZSBpcyBwYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgYSBsYXJnZXIgYXJyYXkgb2YgY29kZXMuCisgIHVuc2lnbmVkIGludCBtaW5pbXVtRWRnZVN0cmVuZ3RoOyAgLy8gVGhlIHN0cmVuZ3RoIG9mIHRoZSB3ZWFrZXN0IGVkZ2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gdXNlZCB0byBmaW5kIHRoZSBjb2Fyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbiBvZiB0aGUgUVIgY29kZSBpbiB0aGUgaW1hZ2UuCisgIFFSRGVtb2R1bGF0aW9uTW9kZSBkZW1vZHVsYXRpb25Nb2RlOyAgLy8gVGhlIGRlbW9kdWxhdGlvbiBtb2RlIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gbG9jYXRlIHRoZSBRUiBjb2RlLgorICBRUkNlbGxTYW1wbGVTaXplIGNlbGxTYW1wbGVTaXplOyAgLy8gVGhlIGNlbGwgc2FtcGxlIHNpemUgdGhlIGZ1bmN0aW9uIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2F0ZSB0aGUgUVIgY29kZS4KKyAgUVJDZWxsRmlsdGVyTW9kZSBjZWxsRmlsdGVyTW9kZTsgIC8vIFRoZSBjZWxsIGZpbHRlciBtb2RlIHRoZSBmdW5jdGlvbiB1c2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIFFSIGNvZGUuCit9IFFSQ29kZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQUlNR3JhZGVSZXBvcnRfc3RydWN0IHsKKyAgQUlNR3JhZGUgb3ZlcmFsbEdyYWRlOyAgLy8gVGhlIG92ZXJhbGwgbGV0dGVyIGdyYWRlLCB3aGljaCBpcyBlcXVhbCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG93ZXN0IG9mIHRoZSBvdGhlciBmaXZlIGxldHRlciBncmFkZXMuCisgIEFJTUdyYWRlIGRlY29kaW5nR3JhZGU7ICAvLyBUaGUgbGV0dGVyIGdyYWRlIGFzc2lnbmVkIHRvIGEgRGF0YSBNYXRyaXggYmFyY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIHN1Y2Nlc3Mgb2YgdGhlIGZ1bmN0aW9uIGluIGRlY29kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgQUlNR3JhZGUgc3ltYm9sQ29udHJhc3RHcmFkZTsgIC8vIFRoZSBsZXR0ZXIgZ3JhZGUgYXNzaWduZWQgdG8gYSBEYXRhIE1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFyY29kZSBiYXNlZCBvbiB0aGUgc3ltYm9sIGNvbnRyYXN0IHJhdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcmUuCisgIGZsb2F0IHN5bWJvbENvbnRyYXN0OyAgLy8gVGhlIHN5bWJvbCBjb250cmFzdCByYXcgc2NvcmUgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZWFuIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmxlY3RhbmNlIG9mIHRoZSBkYXJrZXN0IDEwIHBlcmNlbnQgYW5kIGxpZ2h0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAgcGVyY2VudCBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgQUlNR3JhZGUgcHJpbnRHcm93dGhHcmFkZTsgIC8vIFRoZSBwcmludCBncm93dGggbGV0dGVyIGdyYWRlIGZvciB0aGUgRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0cml4IGJhcmNvZGUuCisgIGZsb2F0IHByaW50R3Jvd3RoOyAgLy8gVGhlIHByaW50IGdyb3d0aCByYXcgc2NvcmUgZm9yIHRoZSBiYXJjb2RlLCB3aGljaCBpcworICAgICAgICAgICAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnQgdG8gd2hpY2ggZGFyayBvciBsaWdodCBtYXJraW5ncworICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcHJvcHJpYXRlbHkgZmlsbCB0aGVpciBtb2R1bGUgYm91bmRhcmllcy4KKyAgQUlNR3JhZGUgYXhpYWxOb251bmlmb3JtaXR5R3JhZGU7ICAvLyBUaGUgYXhpYWwgbm9udW5pZm9ybWl0eSBncmFkZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgZmxvYXQgYXhpYWxOb251bmlmb3JtaXR5OyAgLy8gVGhlIGF4aWFsIG5vbnVuaWZvcm1pdHkgcmF3IHNjb3JlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFyY29kZSwgd2hpY2ggaXMgYmFzZWQgb24gaG93IG11Y2ggdGhlIHNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHNwYWNpbmcgZGlmZmVycyBmcm9tIG9uZSBheGlzIHRvIGFub3RoZXIuCisgIEFJTUdyYWRlIHVudXNlZEVycm9yQ29ycmVjdGlvbkdyYWRlOyAgLy8gVGhlIHVudXNlZCBlcnJvciBjb3JyZWN0aW9uIGxldHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYWRlIGZvciB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgZmxvYXQgdW51c2VkRXJyb3JDb3JyZWN0aW9uOyAgLy8gVGhlIHVudXNlZCBlcnJvciBjb3JyZWN0aW9uIHJhdyBzY29yZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgTWF0cml4IGJhcmNvZGUsIHdoaWNoIGlzIGJhc2VkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbnQgdG8gd2hpY2ggcmVnaW9uYWwgb3Igc3BvdCBkYW1hZ2UgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgaGFzIGVyb2RlZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZGluZyBzYWZldHkgbWFyZ2luIHByb3ZpZGVkIGJ5IHRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0aW9uLgorfSBBSU1HcmFkZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeFNpemVPcHRpb25zX3N0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtaW5TaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIHNpemUgKGluIHBpeGVscykgb2YgdGhlIERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRyaXggYmFyY29kZSBpbiB0aGUgaW1hZ2UuCisgIHVuc2lnbmVkIGludCBtYXhTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgKGluIHBpeGVscykgb2YgdGhlIERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRyaXggYmFyY29kZSBpbiB0aGUgaW1hZ2UuCisgIHVuc2lnbmVkIGludCBxdWlldFpvbmVXaWR0aDsgIC8vIFNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgbWluaW11bSBzaXplIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWlldCB6b25lLCBpbiBwaXhlbHMuCit9IERhdGFNYXRyaXhTaXplT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgRGF0YU1hdHJpeERlc2NyaXB0aW9uT3B0aW9uc19zdHJ1Y3QgeworICBmbG9hdCBhc3BlY3RSYXRpbzsgIC8vIFNwZWNpZmllcyB0aGUgcmF0aW8gb2YgdGhlIHdpZHRoIG9mIGVhY2ggRGF0YSBNYXRyaXgKKyAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJjb2RlIGNlbGwgKGluIHBpeGVscykgdG8gdGhlIGhlaWdodCBvZiB0aGUgRGF0YQorICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdHJpeCBiYXJjb2RlIChpbiBwaXhlbHMpLgorICB1bnNpZ25lZCBpbnQgcm93czsgIC8vIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIERhdGEgTWF0cml4CisgICAgICAgICAgICAgICAgICAgICAgLy8gYmFyY29kZS4KKyAgdW5zaWduZWQgaW50CisgICAgICBjb2x1bW5zOyAgLy8gU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgaW50IHJlY3RhbmdsZTsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlIERhdGEgTWF0cml4CisgICAgICAgICAgICAgICAgICAvLyBiYXJjb2RlIGlzIHJlY3Rhbmd1bGFyLgorICBEYXRhTWF0cml4RUNDIGVjYzsgIC8vIFNwZWNpZmllcyB0aGUgRUNDIHVzZWQgZm9yIHRoaXMgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgRGF0YU1hdHJpeFBvbGFyaXR5IHBvbGFyaXR5OyAgLy8gU3BlY2lmaWVzIHRoZSBkYXRhLXRvLWJhY2tncm91bmQgY29udHJhc3QgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICBEYXRhTWF0cml4Q2VsbEZpbGxNb2RlIGNlbGxGaWxsOyAgLy8gU3BlY2lmaWVzIHRoZSBmaWxsIHBlcmNlbnRhZ2UgZm9yIGEgY2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgdGhhdCBpcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJPTiIgc3RhdGUuCisgIGZsb2F0IG1pbkJvcmRlckludGVncml0eTsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBwZXJjZW50YWdlIG9mIHRoZSBib3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGxvY2F0b3IgcGF0dGVybiBhbmQgdGltaW5nIHBhdHRlcm4pIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBzaG91bGQgZXhwZWN0IGluIHRoZSBEYXRhIE1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJjb2RlLgorICBEYXRhTWF0cml4TWlycm9yTW9kZSBtaXJyb3JNb2RlOyAgLy8gU3BlY2lmaWVzIGlmIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJzIG5vcm1hbGx5IGluIHRoZSBpbWFnZSBvciBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhcmNvZGUgYXBwZWFycyBtaXJyb3JlZCBpbiB0aGUgaW1hZ2UuCit9IERhdGFNYXRyaXhEZXNjcmlwdGlvbk9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IERhdGFNYXRyaXhTZWFyY2hPcHRpb25zX3N0cnVjdCB7CisgIERhdGFNYXRyaXhSb3RhdGlvbk1vZGUgcm90YXRpb25Nb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgRGF0YSBNYXRyaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJjb2RlIHJvdGF0aW9uIHRoZSBmdW5jdGlvbiBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmb3IuCisgIGludCBza2lwTG9jYXRpb247ICAvLyBJZiBzZXQgdG8gVFJVRSwgc3BlY2lmaWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRoYXQgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgb2NjdXBpZXMgdGhlIGVudGlyZQorICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgKG9yIHRoZSBlbnRpcmUgc2VhcmNoIHJlZ2lvbikuCisgIHVuc2lnbmVkIGludCBlZGdlVGhyZXNob2xkOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGEgcGl4ZWwgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgaW4gb3JkZXIgdG8gYmUgY29uc2lkZXJlZCBwYXJ0IG9mIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRyaXggY2VsbCBlZGdlLgorICBEYXRhTWF0cml4RGVtb2R1bGF0aW9uTW9kZSBkZW1vZHVsYXRpb25Nb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBtb2RlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gc2hvdWxkIHVzZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVtb2R1bGF0ZSAoZGV0ZXJtaW5lIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjZWxscyBhcmUgb24gYW5kIHdoaWNoIGNlbGxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgb2ZmKSB0aGUgRGF0YSBNYXRyaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhcmNvZGUuCisgIERhdGFNYXRyaXhDZWxsU2FtcGxlU2l6ZSBjZWxsU2FtcGxlU2l6ZTsgIC8vIFNwZWNpZmllcyB0aGUgc2FtcGxlIHNpemUsIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVscywgdGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSBpZiBlYWNoIGNlbGwgaXMgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igb2ZmLgorICBEYXRhTWF0cml4Q2VsbEZpbHRlck1vZGUgY2VsbEZpbHRlck1vZGU7ICAvLyBTcGVjaWZpZXMgdGhlIG1vZGUgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgdG8gZGV0ZXJtaW5lIHRoZSBwaXhlbCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBjZWxsLgorICB1bnNpZ25lZCBpbnQgc2tld0RlZ3JlZXNBbGxvd2VkOyAgLy8gU3BlY2lmaWVzIHRoZSBhbW91bnQgb2Ygc2tldyBpbiB0aGUgRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0cml4IGJhcmNvZGUgdGhlIGZ1bmN0aW9uIHNob3VsZCBhbGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yLgorICB1bnNpZ25lZCBpbnQgbWF4SXRlcmF0aW9uczsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgZnVuY3Rpb24gc3RvcHMgbG9va2luZyBmb3IgdGhlIERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRyaXggYmFyY29kZS4KKyAgdW5zaWduZWQgaW50IGluaXRpYWxTZWFyY2hWZWN0b3JXaWR0aDsgIC8vIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHNob3VsZCBhdmVyYWdlIHRvZ2V0aGVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIGFuIGVkZ2UuCit9IERhdGFNYXRyaXhTZWFyY2hPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4UmVwb3J0X3N0cnVjdCB7CisgIGludCBmb3VuZDsgIC8vIFRoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBmdW5jdGlvbiBsb2NhdGVkIGFuZCBkZWNvZGVkIGEgRGF0YQorICAgICAgICAgICAgICAvLyBNYXRyaXggYmFyY29kZSBhbmQgRkFMU0UgaWYgdGhlIGZ1bmN0aW9uIGZhaWxlZCB0byBsb2NhdGUgYW5kCisgICAgICAgICAgICAgIC8vIGRlY29kZSBhIERhdGEgTWF0cml4IGJhcmNvZGUuCisgIGludCBiaW5hcnk7ICAvLyBUaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZSBjb250YWlucworICAgICAgICAgICAgICAgLy8gYmluYXJ5IGRhdGEgYW5kIEZBTFNFIGlmIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGNvbnRhaW5zIHRleHQKKyAgICAgICAgICAgICAgIC8vIGRhdGEuCisgIHVuc2lnbmVkIGNoYXIqIGRhdGE7ICAvLyBUaGUgZGF0YSBlbmNvZGVkIGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICB1bnNpZ25lZCBpbnQgZGF0YUxlbmd0aDsgIC8vIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYXJyYXkuCisgIFBvaW50RmxvYXQgYm91bmRpbmdCb3hbNF07ICAvLyBBbiBhcnJheSBvZiBmb3VyIHBvaW50cyBkZXNjcmliaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjdGFuZ2xlIHN1cnJvdW5kaW5nIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICB1bnNpZ25lZCBpbnQgbnVtRXJyb3JzQ29ycmVjdGVkOyAgLy8gVGhlIG51bWJlciBvZiBlcnJvcnMgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0ZWQgd2hlbiBkZWNvZGluZyB0aGUgRGF0YSBNYXRyaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhcmNvZGUuCisgIHVuc2lnbmVkIGludCBudW1FcmFzdXJlc0NvcnJlY3RlZDsgIC8vIFRoZSBudW1iZXIgb2YgZXJhc3VyZXMgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3RlZCB3aGVuIGRlY29kaW5nIHRoZSBEYXRhIE1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJjb2RlLgorICBmbG9hdCBhc3BlY3RSYXRpbzsgIC8vIFNwZWNpZmllcyB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlCisgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGltYWdlLCB3aGljaCBlcXVhbHMgdGhlIHJhdGlvIG9mIHRoZSB3aWR0aCBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBNYXRyaXggYmFyY29kZSBjZWxsIChpbiBwaXhlbHMpIHRvIHRoZSBoZWlnaHQgb2YgYQorICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgTWF0cml4IGJhcmNvZGUgY2VsbCAoaW4gcGl4ZWxzKS4KKyAgdW5zaWduZWQgaW50IHJvd3M7ICAvLyBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgIHVuc2lnbmVkIGludCBjb2x1bW5zOyAgLy8gVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorICBEYXRhTWF0cml4RUNDCisgICAgICBlY2M7ICAvLyBUaGUgRXJyb3IgQ29ycmVjdGlvbiBDb2RlIChFQ0MpIHVzZWQgYnkgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgIERhdGFNYXRyaXhQb2xhcml0eSBwb2xhcml0eTsgIC8vIFRoZSBwb2xhcml0eSBvZiB0aGUgRGF0YSBNYXRyaXggYmFyY29kZS4KKyAgRGF0YU1hdHJpeENlbGxGaWxsTW9kZQorICAgICAgY2VsbEZpbGw7ICAvLyBUaGUgY2VsbCBmaWxsIHBlcmNlbnRhZ2Ugb2YgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUuCisgIGZsb2F0IGJvcmRlckludGVncml0eTsgIC8vIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlIGJvcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFwcGVhcnMgY29ycmVjdGx5IGluIHRoZSBpbWFnZS4KKyAgaW50IG1pcnJvcmVkOyAgLy8gVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgYXBwZWFycworICAgICAgICAgICAgICAgICAvLyBtaXJyb3JlZCBpbiB0aGUgaW1hZ2UgYW5kIEZBTFNFIGlmIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlCisgICAgICAgICAgICAgICAgIC8vIGFwcGVhcnMgbm9ybWFsbHkgaW4gdGhlIGltYWdlLgorICB1bnNpZ25lZCBpbnQgbWluaW11bUVkZ2VTdHJlbmd0aDsgIC8vIFRoZSBzdHJlbmd0aCBvZiB0aGUgd2Vha2VzdCBlZGdlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHVzZWQgdG8gZmluZCB0aGUgY29hcnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gb2YgdGhlIERhdGEgTWF0cml4IGJhcmNvZGUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW1hZ2UuCisgIERhdGFNYXRyaXhEZW1vZHVsYXRpb25Nb2RlIGRlbW9kdWxhdGlvbk1vZGU7ICAvLyBUaGUgZGVtb2R1bGF0aW9uIG1vZGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiB1c2VkIHRvIGxvY2F0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgTWF0cml4IGJhcmNvZGUuCisgIERhdGFNYXRyaXhDZWxsU2FtcGxlU2l6ZSBjZWxsU2FtcGxlU2l6ZTsgIC8vIFRoZSBjZWxsIHNhbXBsZSBzaXplIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIGxvY2F0ZSB0aGUgRGF0YSBNYXRyaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFyY29kZS4KKyAgRGF0YU1hdHJpeENlbGxGaWx0ZXJNb2RlIGNlbGxGaWx0ZXJNb2RlOyAgLy8gVGhlIGNlbGwgZmlsdGVyIG1vZGUgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gbG9jYXRlIHRoZSBEYXRhIE1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJjb2RlLgorICB1bnNpZ25lZCBpbnQgaXRlcmF0aW9uczsgIC8vIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aGUgZnVuY3Rpb24gdG9vayBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gbG9jYXRlIHRoZSBEYXRhIE1hdHJpeCBiYXJjb2RlLgorfSBEYXRhTWF0cml4UmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBKUEVHMjAwMEZpbGVBZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgV2F2ZWxldFRyYW5zZm9ybU1vZGUgd2F2ZWxldE1vZGU7ICAvLyBEZXRlcm1pbmVzIHdoaWNoIHdhdmVsZXQgdHJhbnNmb3JtIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHdoZW4gd3JpdGluZyB0aGUgZmlsZS4KKyAgaW50IHVzZU11bHRpQ29tcG9uZW50VHJhbnNmb3JtOyAgLy8gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gdXNlIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgdHJhbnNmb3JtIG9uIFJHQiBpbWFnZXMuCisgIHVuc2lnbmVkIGludCBtYXhXYXZlbGV0VHJhbnNmb3JtTGV2ZWw7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gYWxsb3dlZCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Ygd2F2ZWxldCB0cmFuc2Zvcm0uCisgIGZsb2F0IHF1YW50aXphdGlvblN0ZXBTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBhYnNvbHV0ZSBiYXNlIHF1YW50aXphdGlvbiBzdGVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBmb3IgZGVyaXZlZCBxdWFudGl6YXRpb24gbW9kZS4KK30gSlBFRzIwMDBGaWxlQWR2YW5jZWRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyX3N0cnVjdCB7CisgIGludCBtaW5GZWF0dXJlc1VzZWQ7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlcyB3aGVuIG1hdGNoaW5nLgorICBpbnQgbWF4RmVhdHVyZXNVc2VkOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgd2hlbiBtYXRjaGluZy4KKyAgaW50IHN1YnBpeGVsSXRlcmF0aW9uczsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5jcmVtZW50YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcHJvdmVtZW50cyB1c2VkIHRvIHJlZmluZSBtYXRjaGVzIHdpdGggc3VicGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uLgorICBkb3VibGUgc3VicGl4ZWxUb2xlcmFuY2U7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNoYW5nZSwgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGl4ZWxzLCBiZXR3ZWVuIGNvbnNlY3V0aXZlIGluY3JlbWVudGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcHJvdmVtZW50cyBpbiB0aGUgbWF0Y2ggcG9zaXRpb24gYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBzdG9wcyByZWZpbmluZyB0aGUgbWF0Y2ggcG9zaXRpb24uCisgIGludCBpbml0aWFsTWF0Y2hMaXN0TGVuZ3RoOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hdGNoIGxpc3QuCisgIGZsb2F0IG1hdGNoVGVtcGxhdGVDdXJ2ZVNjb3JlOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnZlIHRvIHRlbXBsYXRlIGN1cnZlIHNjb3JlIGFuZCByZXR1cm4gaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBtYXRjaCByZXN1bHQuCisgIGludCBjb3JyZWxhdGlvblNjb3JlOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBjb3JyZWxhdGlvbiBzY29yZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gaXQgZm9yIGVhY2ggbWF0Y2ggcmVzdWx0LgorICBkb3VibGUgbWluTWF0Y2hTZXBhcmF0aW9uRGlzdGFuY2U7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gc2VwYXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5zIG9mIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb25zLgorICBkb3VibGUgbWluTWF0Y2hTZXBhcmF0aW9uQW5nbGU7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gYW5ndWxhciBkaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBkZWdyZWVzLCBiZXR3ZWVuIHR3byBtYXRjaGVzIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmlxdWUgYW5nbGVzLgorICBkb3VibGUgbWluTWF0Y2hTZXBhcmF0aW9uU2NhbGU7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gZGlmZmVyZW5jZSBpbiBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgYmV0d2VlbiB0d28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIHNjYWxlcy4KKyAgZG91YmxlIG1heE1hdGNoT3ZlcmxhcDsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygb3ZlcmxhcCwgZXhwcmVzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHBlcmNlbnRhZ2UsIGFsbG93ZWQgYmV0d2VlbiB0aGUgYm91bmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3RhbmdsZXMgb2YgdHdvIHVuaXF1ZSBtYXRjaGVzLgorICBpbnQgY29hcnNlUmVzdWx0OyAgLy8gU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdGhlIGZ1bmN0aW9uIHRvIHNwZW5kIGxlc3MKKyAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWUgYWNjdXJhdGVseSBlc3RpbWF0aW5nIHRoZSBsb2NhdGlvbiBvZiBhIG1hdGNoLgorICBpbnQgc21vb3RoQ29udG91cnM7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSBzbW9vdGhpbmcgYmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiB0aGUgY29udG91cnMgb2YgdGhlIGluc3BlY3Rpb24gaW1hZ2UgYmVmb3JlIGZlYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdGlvbi4KKyAgaW50IGVuYWJsZUNhbGlicmF0aW9uU3VwcG9ydDsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxnb3JpdGhtIHRyZWF0IHRoZSBpbnNwZWN0aW9uIGltYWdlIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGlicmF0ZWQgaW1hZ2UuCit9IE1hdGNoR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9uczI7CisKK3R5cGVkZWYgc3RydWN0IEluc3BlY3Rpb25BbGlnbm1lbnRfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBnb2xkZW4gdGVtcGxhdGUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbWFnZSB1bmRlciBpbnNwZWN0aW9uLgorICBmbG9hdCByb3RhdGlvbjsgIC8vIFRoZSByb3RhdGlvbiBvZiB0aGUgZ29sZGVuIHRlbXBsYXRlIGluIHRoZSBpbWFnZSB1bmRlcgorICAgICAgICAgICAgICAgICAgIC8vIGluc3BlY3Rpb24sIGluIGRlZ3JlZXMuCisgIGZsb2F0IHNjYWxlOyAgLy8gVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNpemUgb2YgdGhlIGFyZWEgdW5kZXIgaW5zcGVjdGlvbgorICAgICAgICAgICAgICAgIC8vIGNvbXBhcmVkIHRvIHRoZSBzaXplIG9mIHRoZSBnb2xkZW4gdGVtcGxhdGUuCit9IEluc3BlY3Rpb25BbGlnbm1lbnQ7CisKK3R5cGVkZWYgc3RydWN0IEluc3BlY3Rpb25PcHRpb25zX3N0cnVjdCB7CisgIFJlZ2lzdHJhdGlvbk1ldGhvZCByZWdpc3RyYXRpb25NZXRob2Q7ICAvLyBTcGVjaWZpZXMgaG93IHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXJzIHRoZSBnb2xkZW4gdGVtcGxhdGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGltYWdlLgorICBOb3JtYWxpemF0aW9uTWV0aG9kIG5vcm1hbGl6YXRpb25NZXRob2Q7ICAvLyBTcGVjaWZpZXMgaG93IHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxpemVzIHRoZSBnb2xkZW4gdGVtcGxhdGUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpbWFnZS4KKyAgaW50IGVkZ2VUaGlja25lc3NUb0lnbm9yZTsgIC8vIFNwZWNpZmllcyBkZXNpcmVkIHRoaWNrbmVzcyBvZiBlZGdlcyB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZC4KKyAgZmxvYXQgYnJpZ2h0VGhyZXNob2xkOyAgLy8gU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgZm9yIGFyZWFzIHdoZXJlIHRoZSB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgaXMgYnJpZ2h0ZXIgdGhhbiB0aGUgZ29sZGVuIHRlbXBsYXRlLgorICBmbG9hdCBkYXJrVGhyZXNob2xkOyAgLy8gU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgZm9yIGFyZWFzIHdoZXJlIHRoZSB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIGlzIGRhcmtlciB0aGFuIHRoZSBnb2xkZW4gdGVtcGxhdGUuCisgIGludCBiaW5hcnk7ICAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIGJpbmFyeSBpbWFnZQorICAgICAgICAgICAgICAgLy8gZ2l2aW5nIHRoZSBsb2NhdGlvbiBvZiBkZWZlY3RzLCBvciBhIGdyYXlzY2FsZSBpbWFnZSBnaXZpbmcKKyAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlbnNpdHkgb2YgZGVmZWN0cy4KK30gSW5zcGVjdGlvbk9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnQyX3N0cnVjdCB7CisgIGNvbnN0IGNoYXIqIGNoYXJhY3RlcjsgIC8vIFRoZSBjaGFyYWN0ZXIgdmFsdWUuCisgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAgLy8gQW4gYXJyYXkgb2YgZm91ciBwb2ludHMgdGhhdCBkZXNjcmliZXMgdGhlIHJlY3RhbmdsZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgc3Vycm91bmRzIHRoZSBjaGFyYWN0ZXIuCisgIGludCBsb3dUaHJlc2hvbGQ7ICAvLyBUaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkIHJhbmdlIHVzZWQgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3Rlci4KKyAgaW50IGhpZ2hUaHJlc2hvbGQ7ICAvLyBUaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkIHJhbmdlIHVzZWQgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIuCisgIGludCBjbGFzc2lmaWNhdGlvblNjb3JlOyAgLy8gVGhlIGRlZ3JlZSB0byB3aGljaCB0aGUgYXNzaWduZWQgY2hhcmFjdGVyIGNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwcmVzZW50cyB0aGUgb2JqZWN0IGJldHRlciB0aGFuIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlciBjbGFzc2VzIGluIHRoZSBjaGFyYWN0ZXIgc2V0LgorICBpbnQgdmVyaWZpY2F0aW9uU2NvcmU7ICAvLyBUaGUgc2ltaWxhcml0eSBvZiB0aGUgY2hhcmFjdGVyIGFuZCB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlciBmb3IgdGhlIGNoYXJhY3RlciBjbGFzcy4KKyAgaW50IHZlcmlmaWVkOyAgLy8gVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgYSByZWZlcmVuY2UgY2hhcmFjdGVyIHdhcyBmb3VuZCBmb3IKKyAgICAgICAgICAgICAgICAgLy8gdGhlIGNoYXJhY3RlciBjbGFzcyBhbmQgRkFMU0UgaWYgYSByZWZlcmVuY2UgY2hhcmFjdGVyIHdhcworICAgICAgICAgICAgICAgICAvLyBub3QgZm91bmQuCit9IENoYXJSZXBvcnQyOworCit0eXBlZGVmIHN0cnVjdCBDaGFySW5mbzJfc3RydWN0IHsKKyAgY29uc3QgY2hhciogY2hhclZhbHVlOyAgLy8gUmV0cmlldmVzIHRoZSBjaGFyYWN0ZXIgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGluIHRoZSBjaGFyYWN0ZXIgc2V0LgorICBjb25zdCBJbWFnZSogY2hhckltYWdlOyAgLy8gVGhlIGltYWdlIHlvdSB1c2VkIHRvIHRyYWluIHRoaXMgY2hhcmFjdGVyLgorICBjb25zdCBJbWFnZSogaW50ZXJuYWxJbWFnZTsgIC8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0IE5JIFZpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgdG8gbWF0Y2ggb2JqZWN0cyB0byB0aGlzIGNoYXJhY3Rlci4KKyAgaW50IGlzUmVmZXJlbmNlQ2hhcjsgIC8vIFRoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgaXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgY2hhcmFjdGVyIGZvciB0aGUgY2hhcmFjdGVyIGNsYXNzLgorfSBDaGFySW5mbzI7CisKK3R5cGVkZWYgc3RydWN0IFJlYWRUZXh0UmVwb3J0Ml9zdHJ1Y3QgeworICBjb25zdCBjaGFyKiByZWFkU3RyaW5nOyAgLy8gVGhlIHJlYWQgc3RyaW5nLgorICBDaGFyUmVwb3J0MiogY2hhcmFjdGVyUmVwb3J0OyAgLy8gQW4gYXJyYXkgb2YgcmVwb3J0cyBkZXNjcmliaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBvZiBlYWNoIGlkZW50aWZpZWQgY2hhcmFjdGVyLgorICBpbnQgbnVtQ2hhcmFjdGVyUmVwb3J0czsgIC8vIFRoZSBudW1iZXIgb2YgaWRlbnRpZmllZCBjaGFyYWN0ZXJzLgorfSBSZWFkVGV4dFJlcG9ydDI7CisKK3R5cGVkZWYgc3RydWN0IEVsbGlwc2VGZWF0dXJlX3N0cnVjdCB7CisgIFBvaW50RmxvYXQgcG9zaXRpb247ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS4KKyAgZG91YmxlIHJvdGF0aW9uOyAgLy8gVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzZW1pLW1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCByZXNwZWN0IHRvIHRoZSBob3Jpem9udGFsLgorICBkb3VibGUgbWlub3JSYWRpdXM7ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBzZW1pLW1pbm9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgIGRvdWJsZSBtYWpvclJhZGl1czsgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHNlbWktbWFqb3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KK30gRWxsaXBzZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZUZlYXR1cmVfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuCisgIGRvdWJsZSByYWRpdXM7ICAvLyBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuCit9IENpcmNsZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IENvbnN0Q3VydmVGZWF0dXJlX3N0cnVjdCB7CisgIFBvaW50RmxvYXQKKyAgICAgIHBvc2l0aW9uOyAgLy8gVGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlIHRoYXQgdGhpcyBjb25zdGFudCBjdXJ2ZSBsaWVzIHVwb24uCisgIGRvdWJsZSByYWRpdXM7ICAvLyBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUgdGhhdCB0aGlzIGNvbnN0YW50IGN1cnZlIGxpZXMKKyAgICAgICAgICAgICAgICAgIC8vIHVwb24uCisgIGRvdWJsZSBzdGFydEFuZ2xlOyAgLy8gV2hlbiB0cmF2ZWxpbmcgYWxvbmcgdGhlIGNvbnN0YW50IGN1cnZlIGZyb20gb25lCisgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kcG9pbnQgdG8gdGhlIG5leHQgaW4gYSBjb3VudGVyY2xvY2t3aXNlIG1hbm5lciwgdGhpcworICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBhbmd1bGFyIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIG9yaWdpbmF0aW5nIGF0CisgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNlbnRlciBvZiB0aGUgY29uc3RhbnQgY3VydmUgYW5kIHBvaW50aW5nIHRvd2FyZHMKKyAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgZW5kcG9pbnQgb2YgdGhlIGNvbnN0YW50IGN1cnZlLgorICBkb3VibGUgZW5kQW5nbGU7ICAvLyBXaGVuIHRyYXZlbGluZyBhbG9uZyB0aGUgY29uc3RhbnQgY3VydmUgZnJvbSBvbmUgZW5kcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIG5leHQgaW4gYSBjb3VudGVyY2xvY2t3aXNlIG1hbm5lciwgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5ndWxhciBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBvcmlnaW5hdGluZyBhdCB0aGUgY2VudGVyCisgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBjb25zdGFudCBjdXJ2ZSBhbmQgcG9pbnRpbmcgdG93YXJkcyB0aGUgc2Vjb25kCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZHBvaW50IG9mIHRoZSBjb25zdGFudCBjdXJ2ZS4KK30gQ29uc3RDdXJ2ZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IFJlY3RhbmdsZUZlYXR1cmVfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vIFRoZSBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZS4KKyAgUG9pbnRGbG9hdCBjb3JuZXJbNF07ICAvLyBUaGUgZm91ciBjb3JuZXJzIG9mIHRoZSByZWN0YW5nbGUuCisgIGRvdWJsZSByb3RhdGlvbjsgIC8vIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbC4KKyAgZG91YmxlIHdpZHRoOyAgLy8gVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgIGRvdWJsZSBoZWlnaHQ7ICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCit9IFJlY3RhbmdsZUZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IExlZ0ZlYXR1cmVfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGVnIGZlYXR1cmUuCisgIFBvaW50RmxvYXQgY29ybmVyWzRdOyAgLy8gVGhlIGZvdXIgY29ybmVycyBvZiB0aGUgbGVnIGZlYXR1cmUuCisgIGRvdWJsZSByb3RhdGlvbjsgIC8vIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgbGVnIHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbC4KKyAgZG91YmxlIHdpZHRoOyAgLy8gVGhlIHdpZHRoIG9mIHRoZSBsZWcuCisgIGRvdWJsZSBoZWlnaHQ7ICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBsZWcuCit9IExlZ0ZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IENvcm5lckZlYXR1cmVfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29ybmVyIGZlYXR1cmUuCisgIGRvdWJsZSByb3RhdGlvbjsgIC8vIFRoZSBhbmd1bGFyIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGJpc2VjdGluZyB0aGUgY29ybmVyCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gcG9zaXRpb24uCisgIGRvdWJsZSBlbmNsb3NlZEFuZ2xlOyAgLy8gVGhlIG1lYXN1cmUgb2YgdGhlIGVuY2xvc2VkIGFuZ2xlIG9mIHRoZSBjb3JuZXIuCisgIGludCBpc1ZpcnR1YWw7Cit9IENvcm5lckZlYXR1cmU7CisKK3R5cGVkZWYgc3RydWN0IExpbmVGZWF0dXJlX3N0cnVjdCB7CisgIFBvaW50RmxvYXQgc3RhcnRQb2ludDsgIC8vIFRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZS4KKyAgUG9pbnRGbG9hdCBlbmRQb2ludDsgIC8vIFRoZSBlbmRpbmcgcG9pbnQgb2YgdGhlIGxpbmUuCisgIGRvdWJsZSBsZW5ndGg7ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBsaW5lIG1lYXN1cmVkIGluIHBpeGVscyBmcm9tIHRoZSBzdGFydAorICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGVuZCBwb2ludC4KKyAgZG91YmxlCisgICAgICByb3RhdGlvbjsgIC8vIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgbGluZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGhvcml6b250YWwuCit9IExpbmVGZWF0dXJlOworCit0eXBlZGVmIHN0cnVjdCBQYXJhbGxlbExpbmVQYWlyRmVhdHVyZV9zdHJ1Y3QgeworICBQb2ludEZsb2F0CisgICAgICBmaXJzdFN0YXJ0UG9pbnQ7ICAvLyBUaGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHBhaXIuCisgIFBvaW50RmxvYXQgZmlyc3RFbmRQb2ludDsgIC8vIFRoZSBlbmRpbmcgcG9pbnQgb2YgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHBhaXIuCisgIFBvaW50RmxvYXQKKyAgICAgIHNlY29uZFN0YXJ0UG9pbnQ7ICAvLyBUaGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNlY29uZCBsaW5lIG9mIHRoZSBwYWlyLgorICBQb2ludEZsb2F0IHNlY29uZEVuZFBvaW50OyAgLy8gVGhlIGVuZGluZyBwb2ludCBvZiB0aGUgc2Vjb25kIGxpbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWlyLgorICBkb3VibGUgcm90YXRpb247ICAvLyBUaGUgb3JpZW50YXRpb24gb2YgdGhlIGZlYXR1cmUgd2l0aCByZXNwZWN0IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsLgorICBkb3VibGUgZGlzdGFuY2U7ICAvLyBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgZmlyc3QgbGluZSB0byB0aGUgc2Vjb25kIGxpbmUuCit9IFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlOworCit0eXBlZGVmIHN0cnVjdCBQYWlyT2ZQYXJhbGxlbExpbmVQYWlyc0ZlYXR1cmVfc3RydWN0IHsKKyAgUGFyYWxsZWxMaW5lUGFpckZlYXR1cmUKKyAgICAgIGZpcnN0UGFyYWxsZWxMaW5lUGFpcjsgIC8vIFRoZSBmaXJzdCBwYXJhbGxlbCBsaW5lIHBhaXIuCisgIFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlCisgICAgICBzZWNvbmRQYXJhbGxlbExpbmVQYWlyOyAgLy8gVGhlIHNlY29uZCBwYXJhbGxlbCBsaW5lIHBhaXIuCisgIGRvdWJsZSByb3RhdGlvbjsgIC8vIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZmVhdHVyZSB3aXRoIHJlc3BlY3QgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGhvcml6b250YWwuCisgIGRvdWJsZSBkaXN0YW5jZTsgIC8vIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBtaWRsaW5lIG9mIHRoZSBmaXJzdCBwYXJhbGxlbCBsaW5lCisgICAgICAgICAgICAgICAgICAgIC8vIHBhaXIgdG8gdGhlIG1pZGxpbmUgb2YgdGhlIHNlY29uZCBwYXJhbGxlbCBsaW5lIHBhaXIuCit9IFBhaXJPZlBhcmFsbGVsTGluZVBhaXJzRmVhdHVyZTsKKwordHlwZWRlZiB1bmlvbiBHZW9tZXRyaWNGZWF0dXJlX3VuaW9uIHsKKyAgQ2lyY2xlRmVhdHVyZSogY2lyY2xlOyAgLy8gQSBwb2ludGVyIHRvIGEgQ2lyY2xlRmVhdHVyZS4KKyAgRWxsaXBzZUZlYXR1cmUqIGVsbGlwc2U7ICAvLyBBIHBvaW50ZXIgdG8gYW4gRWxsaXBzZUZlYXR1cmUuCisgIENvbnN0Q3VydmVGZWF0dXJlKiBjb25zdEN1cnZlOyAgLy8gQSBwb2ludGVyIHRvIGEgQ29uc3RDdXJ2ZUZlYXR1cmUuCisgIFJlY3RhbmdsZUZlYXR1cmUqIHJlY3RhbmdsZTsgIC8vIEEgcG9pbnRlciB0byBhIFJlY3RhbmdsZUZlYXR1cmUuCisgIExlZ0ZlYXR1cmUqIGxlZzsgIC8vIEEgcG9pbnRlciB0byBhIExlZ0ZlYXR1cmUuCisgIENvcm5lckZlYXR1cmUqIGNvcm5lcjsgIC8vIEEgcG9pbnRlciB0byBhIENvcm5lckZlYXR1cmUuCisgIFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlKgorICAgICAgcGFyYWxsZWxMaW5lUGFpcjsgIC8vIEEgcG9pbnRlciB0byBhIFBhcmFsbGVsTGluZVBhaXJGZWF0dXJlLgorICBQYWlyT2ZQYXJhbGxlbExpbmVQYWlyc0ZlYXR1cmUqCisgICAgICBwYWlyT2ZQYXJhbGxlbExpbmVQYWlyczsgIC8vIEEgcG9pbnRlciB0byBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhaXJPZlBhcmFsbGVsTGluZVBhaXJzRmVhdHVyZS4KKyAgTGluZUZlYXR1cmUqIGxpbmU7ICAvLyBBIHBvaW50ZXIgdG8gYSBMaW5lRmVhdHVyZS4KKyAgQ2xvc2VkQ3VydmVGZWF0dXJlKiBjbG9zZWRDdXJ2ZTsgIC8vIEEgcG9pbnRlciB0byBhIENsb3NlZEN1cnZlRmVhdHVyZS4KK30gR2VvbWV0cmljRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgRmVhdHVyZURhdGFfc3RydWN0IHsKKyAgRmVhdHVyZVR5cGUgdHlwZTsgIC8vIEFuIGVudW1lcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUgZmVhdHVyZS4KKyAgUG9pbnRGbG9hdCoKKyAgICAgIGNvbnRvdXJQb2ludHM7ICAvLyBBIHNldCBvZiBwb2ludHMgZGVzY3JpYmluZyB0aGUgY29udG91ciBvZiB0aGUgZmVhdHVyZS4KKyAgaW50IG51bUNvbnRvdXJQb2ludHM7ICAvLyBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgY29udG91clBvaW50cyBhcnJheS4KKyAgR2VvbWV0cmljRmVhdHVyZQorICAgICAgZmVhdHVyZTsgIC8vIFRoZSBmZWF0dXJlIGRhdGEgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGZlYXR1cmUuCit9IEZlYXR1cmVEYXRhOworCit0eXBlZGVmIHN0cnVjdCBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gyX3N0cnVjdCB7CisgIFBvaW50RmxvYXQKKyAgICAgIHBvc2l0aW9uOyAgLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW4gb2YgdGhlIHRlbXBsYXRlIGluIHRoZSBtYXRjaC4KKyAgZmxvYXQgcm90YXRpb247ICAvLyBUaGUgcm90YXRpb24gb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSB0ZW1wbGF0ZSBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAvLyBpbiBkZWdyZWVzLgorICBmbG9hdCBzY2FsZTsgIC8vIFRoZSBzaXplIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdGVtcGxhdGUKKyAgICAgICAgICAgICAgICAvLyBpbWFnZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZS4KKyAgZmxvYXQgc2NvcmU7ICAvLyBUaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoLgorICBQb2ludEZsb2F0IGNvcm5lcls0XTsgIC8vIEFuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cnJvdW5kaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KKyAgaW50IGludmVyc2U7ICAvLyBUaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgbWF0Y2ggaXMgYW4gaW52ZXJzZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSBpbWFnZS4KKyAgZmxvYXQgb2NjbHVzaW9uOyAgLy8gVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIG1hdGNoIHRoYXQgaXMgb2NjbHVkZWQuCisgIGZsb2F0IHRlbXBsYXRlTWF0Y2hDdXJ2ZVNjb3JlOyAgLy8gVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaCBvYnRhaW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyB0aGUgdGVtcGxhdGUgY3VydmVzIHRvIHRoZSBjdXJ2ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWF0Y2ggcmVnaW9uLgorICBmbG9hdCBtYXRjaFRlbXBsYXRlQ3VydmVTY29yZTsgIC8vIFRoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJpbmcgdGhlIGN1cnZlcyBpbiB0aGUgbWF0Y2ggcmVnaW9uIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlbXBsYXRlIGN1cnZlcy4KKyAgZmxvYXQgY29ycmVsYXRpb25TY29yZTsgIC8vIFRoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkgY29tcGFyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVtcGxhdGUgaW1hZ2UgdG8gdGhlIG1hdGNoIHJlZ2lvbiB1c2luZyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWxhdGlvbiBtZXRyaWMgdGhhdCBjb21wYXJlcyB0aGUgdHdvIHJlZ2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZnVuY3Rpb24gb2YgdGhlaXIgcGl4ZWwgdmFsdWVzLgorICBTdHJpbmcyNTUgbGFiZWw7ICAvLyBUaGUgbGFiZWwgY29ycmVzcG9uZGluZyB0byB0aGlzIG1hdGNoIHdoZW4gdGhlIG1hdGNoIGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IGltYXFNYXRjaE11bHRpcGxlR2VvbWV0cmljUGF0dGVybnMoKS4KKyAgRmVhdHVyZURhdGEqIGZlYXR1cmVEYXRhOyAgLy8gVGhlIGZlYXR1cmVzIHVzZWQgaW4gdGhpcyBtYXRjaC4KKyAgaW50IG51bUZlYXR1cmVEYXRhOyAgLy8gVGhlIHNpemUgb2YgdGhlIGZlYXR1cmVEYXRhIGFycmF5LgorICBQb2ludEZsb2F0IGNhbGlicmF0ZWRQb3NpdGlvbjsgIC8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtYXRjaC4KKyAgZmxvYXQgY2FsaWJyYXRlZFJvdGF0aW9uOyAgLy8gVGhlIHJvdGF0aW9uIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUgaW1hZ2UsIGluIGRlZ3JlZXMuCisgIFBvaW50RmxvYXQgY2FsaWJyYXRlZENvcm5lcls0XTsgIC8vIEFuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3RhbmdsZSBzdXJyb3VuZGluZyB0aGUgdGVtcGxhdGUgaW1hZ2UuCit9IEdlb21ldHJpY1BhdHRlcm5NYXRjaDI7CisKK3R5cGVkZWYgc3RydWN0IENsb3NlZEN1cnZlRmVhdHVyZV9zdHJ1Y3QgeworICBQb2ludEZsb2F0IHBvc2l0aW9uOyAgLy8gVGhlIGNlbnRlciBvZiB0aGUgY2xvc2VkIGN1cnZlIGZlYXR1cmUuCisgIGRvdWJsZSBhcmNMZW5ndGg7ICAvLyBUaGUgYXJjIGxlbmd0aCBvZiB0aGUgY2xvc2VkIGN1cnZlIGZlYXR1cmUuCit9IENsb3NlZEN1cnZlRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgTGluZU1hdGNoX3N0cnVjdCB7CisgIFBvaW50RmxvYXQgc3RhcnRQb2ludDsgIC8vIFRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbWF0Y2hlZCBsaW5lLgorICBQb2ludEZsb2F0IGVuZFBvaW50OyAgLy8gVGhlIGVuZGluZyBwb2ludCBvZiB0aGUgbWF0Y2hlZCBsaW5lLgorICBkb3VibGUgbGVuZ3RoOyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgbGluZSBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbSB0aGUgc3RhcnQKKyAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIHRoZSBlbmQgcG9pbnQuCisgIGRvdWJsZSByb3RhdGlvbjsgIC8vIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgbWF0Y2hlZCBsaW5lLgorICBkb3VibGUgc2NvcmU7ICAvLyBUaGUgc2NvcmUgb2YgdGhlIG1hdGNoZWQgbGluZS4KK30gTGluZU1hdGNoOworCit0eXBlZGVmIHN0cnVjdCBMaW5lRGVzY3JpcHRvcl9zdHJ1Y3QgeworICBkb3VibGUgbWluTGVuZ3RoOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhIGxpbmUgdGhlIGZ1bmN0aW9uIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybi4KKyAgZG91YmxlIG1heExlbmd0aDsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5lIHRoZSBmdW5jdGlvbiB3aWxsCisgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4uCit9IExpbmVEZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBSZWN0YW5nbGVEZXNjcmlwdG9yX3N0cnVjdCB7CisgIGRvdWJsZSBtaW5XaWR0aDsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSB3aWR0aCBvZiBhIHJlY3RhbmdsZSB0aGUgYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcmV0dXJuLgorICBkb3VibGUgbWF4V2lkdGg7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gd2lkdGggb2YgYSByZWN0YW5nbGUgdGhlIGFsZ29yaXRobQorICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHJldHVybi4KKyAgZG91YmxlIG1pbkhlaWdodDsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBoZWlnaHQgb2YgYSByZWN0YW5nbGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAvLyBhbGdvcml0aG0gd2lsbCByZXR1cm4uCisgIGRvdWJsZSBtYXhIZWlnaHQ7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gaGVpZ2h0IG9mIGEgcmVjdGFuZ2xlIHRoZQorICAgICAgICAgICAgICAgICAgICAgLy8gYWxnb3JpdGhtIHdpbGwgcmV0dXJuLgorfSBSZWN0YW5nbGVEZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBSZWN0YW5nbGVNYXRjaF9zdHJ1Y3QgeworICBQb2ludEZsb2F0IGNvcm5lcls0XTsgIC8vIFRoZSBjb3JuZXJzIG9mIHRoZSBtYXRjaGVkIHJlY3RhbmdsZS4KKyAgZG91YmxlIHJvdGF0aW9uOyAgLy8gVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBtYXRjaGVkIHJlY3RhbmdsZS4KKyAgZG91YmxlIHdpZHRoOyAgLy8gVGhlIHdpZHRoIG9mIHRoZSBtYXRjaGVkIHJlY3RhbmdsZS4KKyAgZG91YmxlIGhlaWdodDsgIC8vIFRoZSBoZWlnaHQgb2YgdGhlIG1hdGNoZWQgcmVjdGFuZ2xlLgorICBkb3VibGUgc2NvcmU7ICAvLyBUaGUgc2NvcmUgb2YgdGhlIG1hdGNoZWQgcmVjdGFuZ2xlLgorfSBSZWN0YW5nbGVNYXRjaDsKKwordHlwZWRlZiBzdHJ1Y3QgRWxsaXBzZURlc2NyaXB0b3Jfc3RydWN0IHsKKyAgZG91YmxlIG1pbk1ham9yUmFkaXVzOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgc2VtaS1tYWpvciBheGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGFuIGVsbGlwc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuLgorICBkb3VibGUgbWF4TWFqb3JSYWRpdXM7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzZW1pLW1ham9yIGF4aXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgYW4gZWxsaXBzZSB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4uCisgIGRvdWJsZSBtaW5NaW5vclJhZGl1czsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBsZW5ndGggb2YgdGhlIHNlbWktbWlub3IgYXhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBhbiBlbGxpcHNlIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybi4KKyAgZG91YmxlIG1heE1pbm9yUmFkaXVzOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2VtaS1taW5vciBheGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGFuIGVsbGlwc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuLgorfSBFbGxpcHNlRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgRWxsaXBzZU1hdGNoX3N0cnVjdCB7CisgIFBvaW50RmxvYXQgcG9zaXRpb247ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbWF0Y2hlZCBlbGxpcHNlLgorICBkb3VibGUgcm90YXRpb247ICAvLyBUaGUgb3JpZW50YXRpb24gb2YgdGhlIG1hdGNoZWQgZWxsaXBzZS4KKyAgZG91YmxlCisgICAgICBtYWpvclJhZGl1czsgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHNlbWktbWFqb3IgYXhpcyBvZiB0aGUgbWF0Y2hlZCBlbGxpcHNlLgorICBkb3VibGUKKyAgICAgIG1pbm9yUmFkaXVzOyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgc2VtaS1taW5vciBheGlzIG9mIHRoZSBtYXRjaGVkIGVsbGlwc2UuCisgIGRvdWJsZSBzY29yZTsgIC8vIFRoZSBzY29yZSBvZiB0aGUgbWF0Y2hlZCBlbGxpcHNlLgorfSBFbGxpcHNlTWF0Y2g7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZU1hdGNoX3N0cnVjdCB7CisgIFBvaW50RmxvYXQgcG9zaXRpb247ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbWF0Y2hlZCBjaXJjbGUuCisgIGRvdWJsZSByYWRpdXM7ICAvLyBUaGUgcmFkaXVzIG9mIHRoZSBtYXRjaGVkIGNpcmNsZS4KKyAgZG91YmxlIHNjb3JlOyAgLy8gVGhlIHNjb3JlIG9mIHRoZSBtYXRjaGVkIGNpcmNsZS4KK30gQ2lyY2xlTWF0Y2g7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZURlc2NyaXB0b3Jfc3RydWN0IHsKKyAgZG91YmxlIG1pblJhZGl1czsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSByYWRpdXMgb2YgYSBjaXJjbGUgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHJldHVybi4KKyAgZG91YmxlIG1heFJhZGl1czsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSByYWRpdXMgb2YgYSBjaXJjbGUgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHJldHVybi4KK30gQ2lyY2xlRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgU2hhcGVEZXRlY3Rpb25PcHRpb25zX3N0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBtZXRob2QgdXNlZCB3aGVuIGxvb2tpbmcgZm9yIHRoZSBzaGFwZSBpbgorICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbWFnZS4KKyAgUmFuZ2VGbG9hdCogYW5nbGVSYW5nZXM7ICAvLyBBbiBhcnJheSBvZiBhbmdsZSByYW5nZXMsIGluIGRlZ3JlZXMsIHdoZXJlIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYW5nZSBzcGVjaWZpZXMgaG93IG11Y2ggeW91IGV4cGVjdCB0aGUgc2hhcGUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSByb3RhdGVkIGluIHRoZSBpbWFnZS4KKyAgaW50IG51bUFuZ2xlUmFuZ2VzOyAgLy8gVGhlIHNpemUgb2YgdGhlIG9yaWVudGF0aW9uUmFuZ2VzIGFycmF5LgorICBSYW5nZUZsb2F0IHNjYWxlUmFuZ2U7ICAvLyBBIHJhbmdlIHRoYXQgc3BlY2lmaWVzIHRoZSBzaXplcyBvZiB0aGUgc2hhcGVzIHlvdQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3QgdG8gYmUgaW4gdGhlIGltYWdlLCBleHByZXNzZWQgYXMgYSByYXRpbworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJjZW50YWdlIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBvZiB0aGUgcGF0dGVybiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW1hZ2UgZGl2aWRlZCBieSBzaXplIG9mIHRoZSBvcmlnaW5hbCBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxpZWQgYnkgMTAwLgorICBkb3VibGUgbWluTWF0Y2hTY29yZTsKK30gU2hhcGVEZXRlY3Rpb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDdXJ2ZV9zdHJ1Y3QgeworICBQb2ludEZsb2F0KiBwb2ludHM7ICAvLyBUaGUgcG9pbnRzIG9uIHRoZSBjdXJ2ZS4KKyAgdW5zaWduZWQgaW50IG51bVBvaW50czsgIC8vIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBjdXJ2ZS4KKyAgaW50IGNsb3NlZDsgIC8vIFRoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQgYW5kIEZBTFNFIGlmIHRoZQorICAgICAgICAgICAgICAgLy8gY3VydmUgaXMgb3Blbi4KKyAgZG91YmxlIGN1cnZlTGVuZ3RoOyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgY3VydmUuCisgIGRvdWJsZSBtaW5FZGdlU3RyZW5ndGg7ICAvLyBUaGUgbG93ZXN0IGVkZ2Ugc3RyZW5ndGggZGV0ZWN0ZWQgb24gdGhlIGN1cnZlLgorICBkb3VibGUgbWF4RWRnZVN0cmVuZ3RoOyAgLy8gVGhlIGhpZ2hlc3QgZWRnZSBzdHJlbmd0aCBkZXRlY3RlZCBvbiB0aGUgY3VydmUuCisgIGRvdWJsZSBhdmVyYWdlRWRnZVN0cmVuZ3RoOyAgLy8gVGhlIGF2ZXJhZ2Ugb2YgYWxsIGVkZ2Ugc3RyZW5ndGhzIGRldGVjdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnZlLgorfSBDdXJ2ZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3VydmVPcHRpb25zX3N0cnVjdCB7CisgIEV4dHJhY3Rpb25Nb2RlIGV4dHJhY3Rpb25Nb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBtZXRob2QgdGhlIGZ1bmN0aW9uIHVzZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZGVudGlmeSBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICBpbnQgdGhyZXNob2xkOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGEgc2VlZCBwb2ludCBtdXN0IGhhdmUgaW4KKyAgICAgICAgICAgICAgICAgIC8vIG9yZGVyIHRvIGJlZ2luIGEgY3VydmUuCisgIEVkZ2VGaWx0ZXJTaXplIGZpbHRlclNpemU7ICAvLyBTcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBlZGdlIGZpbHRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHVzZXMgdG8gaWRlbnRpZnkgY3VydmVzIGluIHRoZSBpbWFnZS4KKyAgaW50IG1pbkxlbmd0aDsgIC8vIFNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBwaXhlbHMsIG9mIHRoZSBzbWFsbGVzdCBjdXJ2ZSB0aGUKKyAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdC4KKyAgaW50IHJvd1N0ZXBTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBkaXN0YW5jZSwgaW4gdGhlIHkgZGlyZWN0aW9uLCBiZXR3ZWVuIGxpbmVzCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBpbnNwZWN0cyBmb3IgY3VydmUgc2VlZCBwb2ludHMuCisgIGludCBjb2x1bW5TdGVwU2l6ZTsgIC8vIFNwZWNpZmllcyB0aGUgZGlzdGFuY2UsIGluIHRoZSB4IGRpcmVjdGlvbiwgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW5zIHRoZSBmdW5jdGlvbiBpbnNwZWN0cyBmb3IgY3VydmUgc2VlZCBwb2ludHMuCisgIGludCBtYXhFbmRQb2ludEdhcDsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBnYXAsIGluIHBpeGVscywgYmV0d2VlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kcG9pbnRzIG9mIGEgY3VydmUgdGhhdCB0aGUgZnVuY3Rpb24gaWRlbnRpZmllcyBhcyBhCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlZCBjdXJ2ZS4KKyAgaW50IG9ubHlDbG9zZWQ7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBvbmx5IGlkZW50aWZ5IGNsb3NlZCBjdXJ2ZXMgaW4gdGhlIGltYWdlLgorICBpbnQgc3VicGl4ZWxBY2N1cmFjeTsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgY3VydmVzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWJwaXhlbCBhY2N1cmFjeSBieSBpbnRlcnBvbGF0aW5nIGJldHdlZW4gcG9pbnRzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgY3Jvc3Npbmcgb2YgdGhyZXNob2xkLgorfSBDdXJ2ZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEJhcmNvZGUyREluZm9fc3RydWN0IHsKKyAgQmFyY29kZTJEVHlwZSB0eXBlOyAgLy8gVGhlIHR5cGUgb2YgdGhlIDJEIGJhcmNvZGUuCisgIGludCBiaW5hcnk7ICAvLyBUaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgMkQgYmFyY29kZSBjb250YWlucyBiaW5hcnkgZGF0YQorICAgICAgICAgICAgICAgLy8gYW5kIEZBTFNFIGlmIHRoZSAyRCBiYXJjb2RlIGNvbnRhaW5zIHRleHQgZGF0YS4KKyAgdW5zaWduZWQgY2hhciogZGF0YTsgIC8vIFRoZSBkYXRhIGVuY29kZWQgaW4gdGhlIDJEIGJhcmNvZGUuCisgIHVuc2lnbmVkIGludCBkYXRhTGVuZ3RoOyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBhcnJheS4KKyAgUG9pbnRGbG9hdCBib3VuZGluZ0JveFs0XTsgIC8vIEFuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWN0YW5nbGUgc3Vycm91bmRpbmcgdGhlIDJEIGJhcmNvZGUuCisgIHVuc2lnbmVkIGludCBudW1FcnJvcnNDb3JyZWN0ZWQ7ICAvLyBUaGUgbnVtYmVyIG9mIGVycm9ycyB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3RlZCB3aGVuIGRlY29kaW5nIHRoZSAyRCBiYXJjb2RlLgorICB1bnNpZ25lZCBpbnQgbnVtRXJhc3VyZXNDb3JyZWN0ZWQ7ICAvLyBUaGUgbnVtYmVyIG9mIGVyYXN1cmVzIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0ZWQgd2hlbiBkZWNvZGluZyB0aGUgMkQgYmFyY29kZS4KKyAgdW5zaWduZWQgaW50IHJvd3M7ICAvLyBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIDJEIGJhcmNvZGUuCisgIHVuc2lnbmVkIGludCBjb2x1bW5zOyAgLy8gVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSAyRCBiYXJjb2RlLgorfSBCYXJjb2RlMkRJbmZvOworCit0eXBlZGVmIHN0cnVjdCBEYXRhTWF0cml4T3B0aW9uc19zdHJ1Y3QgeworICBCYXJjb2RlMkRTZWFyY2hNb2RlIHNlYXJjaE1vZGU7ICAvLyBTcGVjaWZpZXMgdGhlIG1vZGUgdGhlIGZ1bmN0aW9uIHVzZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvciBiYXJjb2Rlcy4KKyAgQmFyY29kZTJEQ29udHJhc3QgY29udHJhc3Q7ICAvLyBTcGVjaWZpZXMgdGhlIGNvbnRyYXN0IG9mIHRoZSBiYXJjb2RlcyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvci4KKyAgQmFyY29kZTJEQ2VsbFNoYXBlIGNlbGxTaGFwZTsgIC8vIFNwZWNpZmllcyB0aGUgc2hhcGUgb2YgdGhlIGJhcmNvZGUgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2VsbHMsIHdoaWNoIGFmZmVjdHMgaG93IHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjb2RlcyB0aGUgYmFyY29kZS4KKyAgQmFyY29kZTJEU2hhcGUgYmFyY29kZVNoYXBlOyAgLy8gU3BlY2lmaWVzIHRoZSBzaGFwZSBvZiB0aGUgYmFyY29kZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gc2VhcmNoZXMgZm9yLgorICBEYXRhTWF0cml4U3VidHlwZSBzdWJ0eXBlOyAgLy8gU3BlY2lmaWVzIHRoZSBEYXRhIE1hdHJpeCBzdWJ0eXBlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhcmNvZGVzIHRoYXQgdGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvci4KK30gRGF0YU1hdHJpeE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJBY2N1cmFjeVJlcG9ydF9zdHJ1Y3QgeworICBpbnQgc2l6ZTsgIC8vIFRoZSBzaXplIG9mIHRoZSBhcnJheXMgaW4gdGhpcyBzdHJ1Y3R1cmUuCisgIGZsb2F0IGFjY3VyYWN5OyAgLy8gVGhlIG92ZXJhbGwgYWNjdXJhY3kgb2YgdGhlIGNsYXNzaWZpZXIsIGZyb20gMCB0byAxMDAwLgorICBjaGFyKiogY2xhc3NOYW1lczsgIC8vIFRoZSBuYW1lcyBvZiB0aGUgY2xhc3NlcyBvZiB0aGlzIGNsYXNzaWZpZXIuCisgIGRvdWJsZSogY2xhc3NBY2N1cmFjeTsgIC8vIEFuIGFycmF5IG9mIHNpemUgZWxlbWVudHMgdGhhdCBjb250YWlucyBhY2N1cmFjeQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjbGFzcy4KKyAgZG91YmxlKiBjbGFzc1ByZWRpY3RpdmVWYWx1ZTsgIC8vIEFuIGFycmF5IGNvbnRhaW5pbmcgc2l6ZSBlbGVtZW50cyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250YWlucyB0aGUgcHJlZGljdGl2ZSB2YWx1ZXMgb2YgZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3MuCisgIGludCoqIGNsYXNzaWZpY2F0aW9uRGlzdHJpYnV0aW9uOyAgLy8gQSB0d28tZGltZW5zaW9uYWwgYXJyYXkgY29udGFpbmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgY2xhc3NpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzaWZpZXMgaXRzIHNhbXBsZXMuCit9IENsYXNzaWZpZXJBY2N1cmFjeVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTmVhcmVzdE5laWdoYm9yQ2xhc3NSZXN1bHRfc3RydWN0IHsKKyAgY2hhciogY2xhc3NOYW1lOyAgLy8gVGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICBmbG9hdCBzdGFuZGFyZERldmlhdGlvbjsgIC8vIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lbWJlcnMgb2YgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzLgorICBpbnQgY291bnQ7ICAvLyBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhpcyBjbGFzcy4KK30gTmVhcmVzdE5laWdoYm9yQ2xhc3NSZXN1bHQ7CisKK3R5cGVkZWYgc3RydWN0IE5lYXJlc3ROZWlnaGJvclRyYWluaW5nUmVwb3J0X3N0cnVjdCB7CisgIGZsb2F0KiogY2xhc3NEaXN0YW5jZXNUYWJsZTsgIC8vIFRoZSBjb25maWRlbmNlIGluIHRoZSB0cmFpbmluZy4KKyAgTmVhcmVzdE5laWdoYm9yQ2xhc3NSZXN1bHQqIGFsbFNjb3JlczsgIC8vIEFsbCBjbGFzc2VzIGFuZCB0aGVpciBzY29yZXMuCisgIGludCBhbGxTY29yZXNTaXplOyAgLy8gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGFsbFNjb3Jlcy4KK30gTmVhcmVzdE5laWdoYm9yVHJhaW5pbmdSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zX3N0cnVjdCB7CisgIGludCBtYW51YWxUaHJlc2hvbGQ7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gc3BlY2lmeSB0aGUgdGhyZXNob2xkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByYW5nZSBtYW51YWxseS4KKyAgUmFuZ2VGbG9hdCBtYW51YWxUaHJlc2hvbGRSYW5nZTsgIC8vIElmIGEgbWFudWFsIHRocmVzaG9sZCBpcyBiZWluZyBkb25lLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlIG9mIHBpeGVscyB0byBrZWVwLgorICBUaHJlc2hvbGRNZXRob2QgYXV0b1RocmVzaG9sZE1ldGhvZDsgIC8vIElmIGFuIGF1dG9tYXRpYyB0aHJlc2hvbGQgaXMgYmVpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lLCB0aGUgbWV0aG9kIHVzZWQgdG8gY2FsY3VsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRocmVzaG9sZCByYW5nZS4KKyAgUmFuZ2VGbG9hdCBsaW1pdHM7ICAvLyBUaGUgbGltaXRzIG9uIHRoZSBhdXRvbWF0aWMgdGhyZXNob2xkIHJhbmdlLgorICBQYXJ0aWNsZVR5cGUgcGFydGljbGVUeXBlOyAgLy8gU3BlY2lmaWVzIHdoYXQga2luZCBvZiBwYXJ0aWNsZXMgdG8gbG9vayBmb3IuCisgIGludCByZWplY3RCb3JkZXI7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gcmVqZWN0IGJvcmRlciBwYXJ0aWNsZXMuCisgIGludCBudW1Fcm9zaW9uczsgIC8vIFRoZSBudW1iZXIgb2YgZXJvc2lvbnMgdG8gcGVyZm9ybS4KK30gUGFydGljbGVDbGFzc2lmaWVyUHJlcHJvY2Vzc2luZ09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJTYW1wbGVJbmZvX3N0cnVjdCB7CisgIGNoYXIqIGNsYXNzTmFtZTsgIC8vIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGlzIHNhbXBsZSBpcyBpbi4KKyAgZG91YmxlKiBmZWF0dXJlVmVjdG9yOyAgLy8gVGhlIGZlYXR1cmUgdmVjdG9yIG9mIHRoaXMgc2FtcGxlLCBvciBOVUxMIGlmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IGEgY3VzdG9tIGNsYXNzaWZpZXIgc2Vzc2lvbi4KKyAgaW50IGZlYXR1cmVWZWN0b3JTaXplOyAgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZmVhdHVyZSB2ZWN0b3IuCisgIEltYWdlKiB0aHVtYm5haWw7ICAvLyBBIHRodW1ibmFpbCBpbWFnZSBvZiB0aGlzIHNhbXBsZSwgb3IgTlVMTCBpZiBubyBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHNwZWNpZmllZC4KK30gQ2xhc3NpZmllclNhbXBsZUluZm87CisKK3R5cGVkZWYgc3RydWN0IENsYXNzU2NvcmVfc3RydWN0IHsKKyAgY2hhciogY2xhc3NOYW1lOyAgLy8gVGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICBmbG9hdCBkaXN0YW5jZTsgIC8vIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBpdGVtIHRvIHRoaXMgY2xhc3MuCit9IENsYXNzU2NvcmU7CisKK3R5cGVkZWYgc3RydWN0IENsYXNzaWZpZXJSZXBvcnRfc3RydWN0IHsKKyAgY2hhciogYmVzdENsYXNzTmFtZTsgIC8vIFRoZSBuYW1lIG9mIHRoZSBiZXN0IGNsYXNzIGZvciB0aGUgc2FtcGxlLgorICBmbG9hdCBjbGFzc2lmaWNhdGlvblNjb3JlOyAgLy8gVGhlIHNpbWlsYXJpdHkgb2YgdGhlIHNhbXBsZSBhbmQgdGhlIHR3bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2VzdCBjbGFzc2VzIGluIHRoZSBjbGFzc2lmaWVyLgorICBmbG9hdCBpZGVudGlmaWNhdGlvblNjb3JlOyAgLy8gVGhlIHNpbWlsYXJpdHkgb2YgdGhlIHNhbXBsZSBhbmQgdGhlIGFzc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcy4KKyAgQ2xhc3NTY29yZSogYWxsU2NvcmVzOyAgLy8gQWxsIGNsYXNzZXMgYW5kIHRoZWlyIHNjb3Jlcy4KKyAgaW50IGFsbFNjb3Jlc1NpemU7ICAvLyBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYWxsU2NvcmVzLgorfSBDbGFzc2lmaWVyUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBOZWFyZXN0TmVpZ2hib3JPcHRpb25zX3N0cnVjdCB7CisgIE5lYXJlc3ROZWlnaGJvck1ldGhvZCBtZXRob2Q7ICAvLyBUaGUgbWV0aG9kIHRvIHVzZS4KKyAgTmVhcmVzdE5laWdoYm9yTWV0cmljIG1ldHJpYzsgIC8vIFRoZSBtZXRyaWMgdG8gdXNlLgorICBpbnQgazsgIC8vIFRoZSB2YWx1ZSBvZiBrLCBpZiB0aGUgSU1BUV9LX05FQVJFU1RfTkVJR0hCT1IgbWV0aG9kIGlzIHVzZWQuCit9IE5lYXJlc3ROZWlnaGJvck9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnNfc3RydWN0IHsKKyAgZmxvYXQgc2NhbGVEZXBlbmRlbmNlOyAgLy8gVGhlIHJlbGF0aXZlIGltcG9ydGFuY2Ugb2Ygc2NhbGUgd2hlbiBjbGFzc2lmeWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWNsZXMuCisgIGZsb2F0IG1pcnJvckRlcGVuZGVuY2U7ICAvLyBUaGUgcmVsYXRpdmUgaW1wb3J0YW5jZSBvZiBtaXJyb3Igc3ltbWV0cnkgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NpZnlpbmcgcGFydGljbGVzLgorfSBQYXJ0aWNsZUNsYXNzaWZpZXJPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBSR0JVNjRWYWx1ZV9zdHJ1Y3QgeworICB1bnNpZ25lZCBzaG9ydCBCOyAgLy8gVGhlIGJsdWUgdmFsdWUgb2YgdGhlIGNvbG9yLgorICB1bnNpZ25lZCBzaG9ydCBHOyAgLy8gVGhlIGdyZWVuIHZhbHVlIG9mIHRoZSBjb2xvci4KKyAgdW5zaWduZWQgc2hvcnQgUjsgIC8vIFRoZSByZWQgdmFsdWUgb2YgdGhlIGNvbG9yLgorICB1bnNpZ25lZCBzaG9ydCBhbHBoYTsgIC8vIFRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3IsIHdoaWNoIHJlcHJlc2VudHMgZXh0cmEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdGlvbi4KK30gUkdCVTY0VmFsdWU7CisKK3R5cGVkZWYgc3RydWN0IEdlb21ldHJpY1BhdHRlcm5NYXRjaF9zdHJ1Y3QgeworICBQb2ludEZsb2F0CisgICAgICBwb3NpdGlvbjsgIC8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgbWF0Y2guCisgIGZsb2F0IHJvdGF0aW9uOyAgLy8gVGhlIHJvdGF0aW9uIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgdGVtcGxhdGUgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgLy8gaW4gZGVncmVlcy4KKyAgZmxvYXQgc2NhbGU7ICAvLyBUaGUgc2l6ZSBvZiB0aGUgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgLy8gaW1hZ2UsIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UuCisgIGZsb2F0IHNjb3JlOyAgLy8gVGhlIGFjY3VyYWN5IG9mIHRoZSBtYXRjaC4KKyAgUG9pbnRGbG9hdCBjb3JuZXJbNF07ICAvLyBBbiBhcnJheSBvZiBmb3VyIHBvaW50cyBkZXNjcmliaW5nIHRoZSByZWN0YW5nbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXJyb3VuZGluZyB0aGUgdGVtcGxhdGUgaW1hZ2UuCisgIGludCBpbnZlcnNlOyAgLy8gVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIG1hdGNoIGlzIGFuIGludmVyc2Ugb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUgaW1hZ2UuCisgIGZsb2F0IG9jY2x1c2lvbjsgIC8vIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBtYXRjaCB0aGF0IGlzIG9jY2x1ZGVkLgorICBmbG9hdCB0ZW1wbGF0ZU1hdGNoQ3VydmVTY29yZTsgIC8vIFRoZSBhY2N1cmFjeSBvZiB0aGUgbWF0Y2ggb2J0YWluZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJpbmcgdGhlIHRlbXBsYXRlIGN1cnZlcyB0byB0aGUgY3VydmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1hdGNoIHJlZ2lvbi4KKyAgZmxvYXQgbWF0Y2hUZW1wbGF0ZUN1cnZlU2NvcmU7ICAvLyBUaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBjdXJ2ZXMgaW4gdGhlIG1hdGNoIHJlZ2lvbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZW1wbGF0ZSBjdXJ2ZXMuCisgIGZsb2F0IGNvcnJlbGF0aW9uU2NvcmU7ICAvLyBUaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoIG9idGFpbmVkIGJ5IGNvbXBhcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlbXBsYXRlIGltYWdlIHRvIHRoZSBtYXRjaCByZWdpb24gdXNpbmcgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVsYXRpb24gbWV0cmljIHRoYXQgY29tcGFyZXMgdGhlIHR3byByZWdpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGZ1bmN0aW9uIG9mIHRoZWlyIHBpeGVsIHZhbHVlcy4KK30gR2VvbWV0cmljUGF0dGVybk1hdGNoOworCit0eXBlZGVmIHN0cnVjdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgaW50IG1pbkZlYXR1cmVzVXNlZDsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VzIHdoZW4gbWF0Y2hpbmcuCisgIGludCBtYXhGZWF0dXJlc1VzZWQ7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlcyB3aGVuIG1hdGNoaW5nLgorICBpbnQgc3VicGl4ZWxJdGVyYXRpb25zOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmNyZW1lbnRhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wcm92ZW1lbnRzIHVzZWQgdG8gcmVmaW5lIG1hdGNoZXMgd2l0aCBzdWJwaXhlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24uCisgIGRvdWJsZSBzdWJwaXhlbFRvbGVyYW5jZTsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2hhbmdlLCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbHMsIGJldHdlZW4gY29uc2VjdXRpdmUgaW5jcmVtZW50YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wcm92ZW1lbnRzIGluIHRoZSBtYXRjaCBwb3NpdGlvbiBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHN0b3BzIHJlZmluaW5nIHRoZSBtYXRjaCBwb3NpdGlvbi4KKyAgaW50IGluaXRpYWxNYXRjaExpc3RMZW5ndGg7ICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggbGlzdC4KKyAgaW50IG1hdGNoVGVtcGxhdGVDdXJ2ZVNjb3JlOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSB0aGUgbWF0Y2ggY3VydmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUgY3VydmUgc2NvcmUgYW5kIHJldHVybiBpdCBmb3IgZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCByZXN1bHQuCisgIGludCBjb3JyZWxhdGlvblNjb3JlOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHNwZWNpZnkgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBzaG91bGQgY2FsY3VsYXRlIHRoZSBjb3JyZWxhdGlvbiBzY29yZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gaXQgZm9yIGVhY2ggbWF0Y2ggcmVzdWx0LgorICBkb3VibGUgbWluTWF0Y2hTZXBhcmF0aW9uRGlzdGFuY2U7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gc2VwYXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5zIG9mIHR3byBtYXRjaGVzIHRoYXQgaGF2ZSB1bmlxdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb25zLgorICBkb3VibGUgbWluTWF0Y2hTZXBhcmF0aW9uQW5nbGU7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gYW5ndWxhciBkaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBkZWdyZWVzLCBiZXR3ZWVuIHR3byBtYXRjaGVzIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmlxdWUgYW5nbGVzLgorICBkb3VibGUgbWluTWF0Y2hTZXBhcmF0aW9uU2NhbGU7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gZGlmZmVyZW5jZSBpbiBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSwgYmV0d2VlbiB0d28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyB0aGF0IGhhdmUgdW5pcXVlIHNjYWxlcy4KKyAgZG91YmxlIG1heE1hdGNoT3ZlcmxhcDsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygb3ZlcmxhcCwgZXhwcmVzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIHBlcmNlbnRhZ2UsIGFsbG93ZWQgYmV0d2VlbiB0aGUgYm91bmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3RhbmdsZXMgb2YgdHdvIHVuaXF1ZSBtYXRjaGVzLgorICBpbnQgY29hcnNlUmVzdWx0OyAgLy8gU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdGhlIGZ1bmN0aW9uIHRvIHNwZW5kIGxlc3MKKyAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWUgYWNjdXJhdGVseSBlc3RpbWF0aW5nIHRoZSBsb2NhdGlvbiBvZiBhIG1hdGNoLgorfSBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnNfc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1vZGU7ICAvLyBTcGVjaWZpZXMgdGhlIG1ldGhvZCBpbWFxTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuKCkgdXNlcworICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gbG9va2luZyBmb3IgdGhlIHBhdHRlcm4gaW4gdGhlIGltYWdlLgorICBpbnQgc3VicGl4ZWxBY2N1cmFjeTsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzcGVjaWZ5IHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gc2hvdWxkIGNhbGN1bGF0ZSBtYXRjaCBsb2NhdGlvbnMgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnBpeGVsIGFjY3VyYWN5LgorICBSYW5nZUZsb2F0KiBhbmdsZVJhbmdlczsgIC8vIEFuIGFycmF5IG9mIGFuZ2xlIHJhbmdlcywgaW4gZGVncmVlcywgd2hlcmUgZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlIHNwZWNpZmllcyBob3cgbXVjaCB5b3UgZXhwZWN0IHRoZSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHJvdGF0ZWQgaW4gdGhlIGltYWdlLgorICBpbnQgbnVtQW5nbGVSYW5nZXM7ICAvLyBOdW1iZXIgb2YgYW5nbGUgcmFuZ2VzIGluIHRoZSBhbmdsZVJhbmdlcyBhcnJheS4KKyAgUmFuZ2VGbG9hdCBzY2FsZVJhbmdlOyAgLy8gQSByYW5nZSB0aGF0IHNwZWNpZmllcyB0aGUgc2l6ZXMgb2YgdGhlIHBhdHRlcm4geW91CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdCB0byBiZSBpbiB0aGUgaW1hZ2UsIGV4cHJlc3NlZCBhcyBhIHJhdGlvCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmNlbnRhZ2UgcmVwcmVzZW50aW5nIHRoZSBzaXplIG9mIHRoZSBwYXR0ZXJuIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbWFnZSBkaXZpZGVkIGJ5IHNpemUgb2YgdGhlIG9yaWdpbmFsIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGllZCBieSAxMDAuCisgIFJhbmdlRmxvYXQgb2NjbHVzaW9uUmFuZ2U7ICAvLyBBIHJhbmdlIHRoYXQgc3BlY2lmaWVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0dGVybiB5b3UgZXhwZWN0IHRvIGJlIG9jY2x1ZGVkIGluIHRoZSBpbWFnZS4KKyAgaW50IG51bU1hdGNoZXNSZXF1ZXN0ZWQ7ICAvLyBOdW1iZXIgb2YgdmFsaWQgbWF0Y2hlcyBleHBlY3RlZC4KKyAgZmxvYXQgbWluTWF0Y2hTY29yZTsgIC8vIFRoZSBtaW5pbXVtIHNjb3JlIGEgbWF0Y2ggY2FuIGhhdmUgZm9yIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29uc2lkZXIgdGhlIG1hdGNoIHZhbGlkLgorfSBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgaW50IG1pblJlY3RMZW5ndGg7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gbGVuZ3RoIGZvciBlYWNoIHNpZGUgb2YgYQorICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3Rhbmd1bGFyIGZlYXR1cmUuCisgIGRvdWJsZSBtaW5SZWN0QXNwZWN0UmF0aW87ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gYXNwZWN0IHJhdGlvIG9mIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3Rhbmd1bGFyIGZlYXR1cmUuCisgIGludCBtaW5SYWRpdXM7ICAvLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gcmFkaXVzIGZvciBhIGNpcmN1bGFyIGZlYXR1cmUuCisgIGludCBtaW5MaW5lTGVuZ3RoOyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGxlbmd0aCBmb3IgYSBsaW5lYXIgZmVhdHVyZS4KKyAgZG91YmxlIG1pbkZlYXR1cmVTdHJlbmd0aDsgIC8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBzdHJlbmd0aCBmb3IgYSBmZWF0dXJlLgorICBpbnQgbWF4RmVhdHVyZXNVc2VkOyAgLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgd2hlbiBsZWFybmluZy4KKyAgaW50IG1heFBpeGVsRGlzdGFuY2VGcm9tTGluZTsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIGFuIGVkZ2UgcGl4ZWwgYW5kIGEgbGluZWFyIGZlYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgZnVuY3Rpb24gdG8gY29uc2lkZXIgdGhhdCBlZGdlIHBpeGVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBsaW5lYXIgZmVhdHVyZS4KK30gTGVhcm5HZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBGaXRFbGxpcHNlT3B0aW9uc19zdHJ1Y3QgeworICBpbnQgcmVqZWN0T3V0bGllcnM7ICAvLyBXaGV0aGVyIHRvIHVzZSBldmVyeSBnaXZlbiBwb2ludCBvciBvbmx5IGEgc3Vic2V0IG9mCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb2ludHMgdG8gZml0IHRoZSBlbGxpcHNlLgorICBkb3VibGUgbWluU2NvcmU7ICAvLyBTcGVjaWZpZXMgdGhlIHJlcXVpcmVkIHF1YWxpdHkgb2YgdGhlIGZpdHRlZCBlbGxpcHNlLgorICBkb3VibGUgcGl4ZWxSYWRpdXM7ICAvLyBUaGUgYWNjZXB0YWJsZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCB0aGF0IGEgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lZCB0byBiZWxvbmcgdG8gdGhlIGVsbGlwc2UgY2FuIGJlIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGVsbGlwc2UuCisgIGludCBtYXhJdGVyYXRpb25zOyAgLy8gU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmVmaW5lbWVudCBpdGVyYXRpb25zIHlvdSBhbGxvdworICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBpbml0aWFsIHN1YnNldCBvZgorICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50cy4KK30gRml0RWxsaXBzZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEZpdENpcmNsZU9wdGlvbnNfc3RydWN0IHsKKyAgaW50IHJlamVjdE91dGxpZXJzOyAgLy8gV2hldGhlciB0byB1c2UgZXZlcnkgZ2l2ZW4gcG9pbnQgb3Igb25seSBhIHN1YnNldCBvZgorICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9pbnRzIHRvIGZpdCB0aGUgY2lyY2xlLgorICBkb3VibGUgbWluU2NvcmU7ICAvLyBTcGVjaWZpZXMgdGhlIHJlcXVpcmVkIHF1YWxpdHkgb2YgdGhlIGZpdHRlZCBjaXJjbGUuCisgIGRvdWJsZSBwaXhlbFJhZGl1czsgIC8vIFRoZSBhY2NlcHRhYmxlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHRoYXQgYSBwb2ludAorICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmVkIHRvIGJlbG9uZyB0byB0aGUgY2lyY2xlIGNhbiBiZSBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjaXJjbGUuCisgIGludCBtYXhJdGVyYXRpb25zOyAgLy8gU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmVmaW5lbWVudCBpdGVyYXRpb25zIHlvdSBhbGxvdworICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBpbml0aWFsIHN1YnNldCBvZgorICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50cy4KK30gRml0Q2lyY2xlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ29uc3RydWN0Uk9JT3B0aW9uczJfc3RydWN0IHsKKyAgaW50IHdpbmRvd051bWJlcjsgIC8vIFRoZSB3aW5kb3cgbnVtYmVyIG9mIHRoZSBpbWFnZSB3aW5kb3cuCisgIGNvbnN0IGNoYXIqIHdpbmRvd1RpdGxlOyAgLy8gU3BlY2lmaWVzIHRoZSBtZXNzYWdlIHN0cmluZyB0aGF0IHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXlzIGluIHRoZSB0aXRsZSBiYXIgb2YgdGhlIHdpbmRvdy4KKyAgUGFsZXR0ZVR5cGUgdHlwZTsgIC8vIFRoZSBwYWxldHRlIHR5cGUgdG8gdXNlLgorICBSR0JWYWx1ZSogcGFsZXR0ZTsgIC8vIElmIHR5cGUgaXMgSU1BUV9QQUxFVFRFX1VTRVIsIHRoaXMgYXJyYXkgaXMgdGhlIHBhbGV0dGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBjb2xvcnMgdG8gdXNlIHdpdGggdGhlIHdpbmRvdy4KKyAgaW50IG51bUNvbG9yczsgIC8vIElmIHR5cGUgaXMgSU1BUV9QQUxFVFRFX1VTRVIsIHRoaXMgZWxlbWVudCBpcyB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICAvLyBjb2xvcnMgaW4gdGhlIHBhbGV0dGUgYXJyYXkuCisgIHVuc2lnbmVkIGludCBtYXhDb250b3VyczsgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyB0aGUgdXNlciB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFibGUgdG8gc2VsZWN0LgorfSBDb25zdHJ1Y3RST0lPcHRpb25zMjsKKwordHlwZWRlZiBzdHJ1Y3QgSFNMVmFsdWVfc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBMOyAgLy8gVGhlIGNvbG9yIGx1bWluYW5jZS4KKyAgdW5zaWduZWQgY2hhciBTOyAgLy8gVGhlIGNvbG9yIHNhdHVyYXRpb24uCisgIHVuc2lnbmVkIGNoYXIgSDsgIC8vIFRoZSBjb2xvciBodWUuCisgIHVuc2lnbmVkIGNoYXIgYWxwaGE7ICAvLyBUaGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbG9yLCB3aGljaCByZXByZXNlbnRzIGV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0aW9uLgorfSBIU0xWYWx1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgSFNWVmFsdWVfc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBWOyAgLy8gVGhlIGNvbG9yIHZhbHVlLgorICB1bnNpZ25lZCBjaGFyIFM7ICAvLyBUaGUgY29sb3Igc2F0dXJhdGlvbi4KKyAgdW5zaWduZWQgY2hhciBIOyAgLy8gVGhlIGNvbG9yIGh1ZS4KKyAgdW5zaWduZWQgY2hhciBhbHBoYTsgIC8vIFRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3IsIHdoaWNoIHJlcHJlc2VudHMgZXh0cmEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IGEgY29sb3IgaW1hZ2UsIHN1Y2ggYXMgZ2FtbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Rpb24uCit9IEhTVlZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBIU0lWYWx1ZV9zdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyIEk7ICAvLyBUaGUgY29sb3IgaW50ZW5zaXR5LgorICB1bnNpZ25lZCBjaGFyIFM7ICAvLyBUaGUgY29sb3Igc2F0dXJhdGlvbi4KKyAgdW5zaWduZWQgY2hhciBIOyAgLy8gVGhlIGNvbG9yIGh1ZS4KKyAgdW5zaWduZWQgY2hhciBhbHBoYTsgIC8vIFRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3IsIHdoaWNoIHJlcHJlc2VudHMgZXh0cmEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IGEgY29sb3IgaW1hZ2UsIHN1Y2ggYXMgZ2FtbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Rpb24uCit9IEhTSVZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBDSUVMYWJWYWx1ZV9zdHJ1Y3QgeworICBkb3VibGUgYjsgIC8vIFRoZSB5ZWxsb3cvYmx1ZSBpbmZvcm1hdGlvbiBvZiB0aGUgY29sb3IuCisgIGRvdWJsZSBhOyAgLy8gVGhlIHJlZC9ncmVlbiBpbmZvcm1hdGlvbiBvZiB0aGUgY29sb3IuCisgIGRvdWJsZSBMOyAgLy8gVGhlIGNvbG9yIGxpZ2h0bmVzcy4KKyAgdW5zaWduZWQgY2hhciBhbHBoYTsgIC8vIFRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3IsIHdoaWNoIHJlcHJlc2VudHMgZXh0cmEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IGEgY29sb3IgaW1hZ2UsIHN1Y2ggYXMgZ2FtbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Rpb24uCit9IENJRUxhYlZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBDSUVYWVpWYWx1ZV9zdHJ1Y3QgeworICBkb3VibGUgWjsgIC8vIFRoZSBaIGNvbG9yIGluZm9ybWF0aW9uLgorICBkb3VibGUgWTsgIC8vIFRoZSBjb2xvciBsdW1pbmFuY2UuCisgIGRvdWJsZSBYOyAgLy8gVGhlIFggY29sb3IgaW5mb3JtYXRpb24uCisgIHVuc2lnbmVkIGNoYXIgYWxwaGE7ICAvLyBUaGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbG9yLCB3aGljaCByZXByZXNlbnRzIGV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbG9yIGltYWdlLCBzdWNoIGFzIGdhbW1hCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0aW9uLgorfSBDSUVYWVpWYWx1ZTsKKwordHlwZWRlZiB1bmlvbiBDb2xvcjJfdW5pb24geworICBSR0JWYWx1ZSByZ2I7ICAvLyBUaGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlc2NyaWJlIGEgY29sb3IgaW4gdGhlIFJHQiAoUmVkLAorICAgICAgICAgICAgICAgICAvLyBHcmVlbiwgYW5kIEJsdWUpIGNvbG9yIHNwYWNlLgorICBIU0xWYWx1ZSBoc2w7ICAvLyBUaGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlc2NyaWJlIGEgY29sb3IgaW4gdGhlIEhTTCAoSHVlLAorICAgICAgICAgICAgICAgICAvLyBTYXR1cmF0aW9uLCBhbmQgTHVtaW5hbmNlKSBjb2xvciBzcGFjZS4KKyAgSFNWVmFsdWUgaHN2OyAgLy8gVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBIU0kgKEh1ZSwKKyAgICAgICAgICAgICAgICAgLy8gU2F0dXJhdGlvbiwgYW5kIFZhbHVlKSBjb2xvciBzcGFjZS4KKyAgSFNJVmFsdWUgaHNpOyAgLy8gVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBIU0kgKEh1ZSwKKyAgICAgICAgICAgICAgICAgLy8gU2F0dXJhdGlvbiwgYW5kIEludGVuc2l0eSkgY29sb3Igc3BhY2UuCisgIENJRUxhYlZhbHVlIGNpZUxhYjsgIC8vIFRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgQ0lFCisgICAgICAgICAgICAgICAgICAgICAgIC8vIEwqYSpiKiAoTCwgYSwgYikgY29sb3Igc3BhY2UuCisgIENJRVhZWlZhbHVlIGNpZVhZWjsgIC8vIFRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgQ0lFCisgICAgICAgICAgICAgICAgICAgICAgIC8vIFhZWiAoWCwgWSwgWikgY29sb3Igc3BhY2UuCisgIGludCByYXdWYWx1ZTsgIC8vIFRoZSBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgZGF0YSBpbiB0aGUgY29sb3IgdW5pb24uCit9IENvbG9yMjsKKwordHlwZWRlZiBzdHJ1Y3QgQmVzdEVsbGlwc2UyX3N0cnVjdCB7CisgIFBvaW50RmxvYXQgY2VudGVyOyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS4KKyAgUG9pbnRGbG9hdCBtYWpvckF4aXNTdGFydDsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ham9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgIFBvaW50RmxvYXQgbWFqb3JBeGlzRW5kOyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbWFqb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBheGlzIG9mIHRoZSBlbGxpcHNlLgorICBQb2ludEZsb2F0IG1pbm9yQXhpc1N0YXJ0OyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlub3IgYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgUG9pbnRGbG9hdCBtaW5vckF4aXNFbmQ7ICAvLyBUaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBtaW5vcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgIGRvdWJsZSBhcmVhOyAgLy8gVGhlIGFyZWEgb2YgdGhlIGVsbGlwc2UuCisgIGRvdWJsZSBwZXJpbWV0ZXI7ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIGVsbGlwc2UuCisgIGRvdWJsZSBlcnJvcjsgIC8vIFJlcHJlc2VudHMgdGhlIGxlYXN0IHNxdWFyZSBlcnJvciBvZiB0aGUgZml0dGVkIGVsbGlwc2UgdG8KKyAgICAgICAgICAgICAgICAgLy8gdGhlIGVudGlyZSBzZXQgb2YgcG9pbnRzLgorICBpbnQgdmFsaWQ7ICAvLyBUaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgZnVuY3Rpb24gYWNoaWV2ZWQgdGhlIG1pbmltdW0gc2NvcmUKKyAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBudW1iZXIgb2YgYWxsb3dlZCByZWZpbmVtZW50IGl0ZXJhdGlvbnMgYW5kIEZBTFNFIGlmCisgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBkaWQgbm90IGFjaGlldmUgdGhlIG1pbmltdW0gc2NvcmUuCisgIGludCogcG9pbnRzVXNlZDsgIC8vIEFuIGFycmF5IG9mIHRoZSBpbmRleGVzIGZvciB0aGUgcG9pbnRzIGFycmF5IGluZGljYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggcG9pbnRzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGZpdCB0aGUgZWxsaXBzZS4KKyAgaW50IG51bVBvaW50c1VzZWQ7ICAvLyBUaGUgbnVtYmVyIG9mIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgLy8gZWxsaXBzZS4KK30gQmVzdEVsbGlwc2UyOworCit0eXBlZGVmIHN0cnVjdCBMZWFyblBhdHRlcm5BZHZhbmNlZE9wdGlvbnNfc3RydWN0IHsKKyAgTGVhcm5QYXR0ZXJuQWR2YW5jZWRTaGlmdE9wdGlvbnMqIHNoaWZ0T3B0aW9uczsgIC8vIFVzZSB0aGlzIGVsZW1lbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFxTGVhcm5QYXR0ZXJuMigpIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNoaWZ0LWludmFyaWFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVhcm5pbmcgcGhhc2UuCisgIExlYXJuUGF0dGVybkFkdmFuY2VkUm90YXRpb25PcHRpb25zKgorICAgICAgcm90YXRpb25PcHRpb25zOyAgLy8gVXNlIHRoaXMgZWxlbWVudCB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hcUxlYXJuUGF0dGVybjIoKWR1cmluZyB0aGUgcm90YXRpb24taW52YXJpYW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWFybmluZyBwaGFzZS4KK30gTGVhcm5QYXR0ZXJuQWR2YW5jZWRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBBVklJbmZvX3N0cnVjdCB7CisgIHVuc2lnbmVkIGludCB3aWR0aDsgIC8vIFRoZSB3aWR0aCBvZiBlYWNoIGZyYW1lLgorICB1bnNpZ25lZCBpbnQgaGVpZ2h0OyAgLy8gVGhlIGhlaWdodCBvZiBlYWNoIGZyYW1lLgorICBJbWFnZVR5cGUgaW1hZ2VUeXBlOyAgLy8gVGhlIHR5cGUgb2YgaW1hZ2VzIHRoaXMgQVZJIGNvbnRhaW5zLgorICB1bnNpZ25lZCBpbnQgbnVtRnJhbWVzOyAgLy8gVGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIEFWSS4KKyAgdW5zaWduZWQgaW50IGZyYW1lc1BlclNlY29uZDsgIC8vIFRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQgdGhpcyBBVkkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBzaG93biBhdC4KKyAgY2hhciogZmlsdGVyTmFtZTsgIC8vIFRoZSBuYW1lIG9mIHRoZSBjb21wcmVzc2lvbiBmaWx0ZXIgdXNlZCB0byBjcmVhdGUgdGhpcworICAgICAgICAgICAgICAgICAgICAgLy8gQVZJLgorICBpbnQgaGFzRGF0YTsgIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgQVZJIGhhcyBkYXRhIGF0dGFjaGVkIHRvIGVhY2ggZnJhbWUgb3IKKyAgICAgICAgICAgICAgICAvLyBub3QuCisgIHVuc2lnbmVkIGludCBtYXhEYXRhU2l6ZTsgIC8vIElmIHRoaXMgQVZJIGhhcyBkYXRhLCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGluIGVhY2ggZnJhbWUuCit9IEFWSUluZm87CisKK3R5cGVkZWYgc3RydWN0IExlYXJuUGF0dGVybkFkdmFuY2VkU2hpZnRPcHRpb25zX3N0cnVjdCB7CisgIGludCBpbml0aWFsU3RlcFNpemU7ICAvLyBUaGUgbGFyZ2VzdCBudW1iZXIgb2YgaW1hZ2UgcGl4ZWxzIHRvIHNoaWZ0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlIGFjcm9zcyB0aGUgaW5zcGVjdGlvbiBpbWFnZSBkdXJpbmcgdGhlIGluaXRpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlIG9mIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyAgaW50IGluaXRpYWxTYW1wbGVTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgcGl4ZWxzIHRoYXQgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gaW5jbHVkZSBpbiBhIHNhbXBsZSBmb3IgdGhlIGluaXRpYWwgcGhhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Ygc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nLgorICBkb3VibGUgaW5pdGlhbFNhbXBsZVNpemVGYWN0b3I7ICAvLyBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHNhbXBsZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWwgcGhhc2Ugb2Ygc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgcGVyY2VudCBvZiB0aGUgdGVtcGxhdGUgc2l6ZSwgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGl4ZWxzLgorICBpbnQgZmluYWxTYW1wbGVTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgcGl4ZWxzIHlvdSB3YW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdG8gaW5pdGlhbFNhbXBsZVNpemUgZm9yIHRoZSBmaW5hbCBwaGFzZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nLgorICBkb3VibGUgZmluYWxTYW1wbGVTaXplRmFjdG9yOyAgLy8gU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWwgcGhhc2Ugb2Ygc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmNlbnQgb2YgdGhlIGVkZ2UgcG9pbnRzIGluIHRoZSB0ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHBpeGVscy4KKyAgaW50IHN1YnBpeGVsU2FtcGxlU2l6ZTsgIC8vIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHBpeGVscyB0aGF0IHlvdQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FudCB0byBpbmNsdWRlIGluIGEgc2FtcGxlIGZvciB0aGUgc3VicGl4ZWwgcGhhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHNoaWZ0LWludmFyaWFudCBtYXRjaGluZy4KKyAgZG91YmxlIHN1YnBpeGVsU2FtcGxlU2l6ZUZhY3RvcjsgIC8vIFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnBpeGVsIHBoYXNlIG9mIHNoaWZ0LWludmFyaWFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgYXMgYSBwZXJjZW50IG9mIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSwgaW4gcGl4ZWxzLgorfSBMZWFyblBhdHRlcm5BZHZhbmNlZFNoaWZ0T3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTGVhcm5QYXR0ZXJuQWR2YW5jZWRSb3RhdGlvbk9wdGlvbnNfc3RydWN0IHsKKyAgU2VhcmNoU3RyYXRlZ3kgc2VhcmNoU3RyYXRlZ3lTdXBwb3J0OyAgLy8gU3BlY2lmaWVzIHRoZSBhZ2dyZXNzaXZlbmVzcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm90YXRpb24gc2VhcmNoIHN0cmF0ZWd5IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhlIG1hdGNoaW5nIHBoYXNlLgorICBpbnQgaW5pdGlhbFN0ZXBTaXplOyAgLy8gVGhlIGxhcmdlc3QgbnVtYmVyIG9mIGltYWdlIHBpeGVscyB0byBzaGlmdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbXBsZSBhY3Jvc3MgdGhlIGluc3BlY3Rpb24gaW1hZ2UgZHVyaW5nIHRoZSBpbml0aWFsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZSBvZiBtYXRjaGluZy4KKyAgaW50IGluaXRpYWxTYW1wbGVTaXplOyAgLy8gU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgcGl4ZWxzIHRoYXQgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gaW5jbHVkZSBpbiBhIHNhbXBsZSBmb3IgdGhlIGluaXRpYWwgcGhhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Ygcm90YXRpb24taW52YXJpYW50IG1hdGNoaW5nLgorICBkb3VibGUgaW5pdGlhbFNhbXBsZVNpemVGYWN0b3I7ICAvLyBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHNhbXBsZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWwgcGhhc2Ugb2Ygcm90YXRpb24taW52YXJpYW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFzIGEgcGVyY2VudCBvZiB0aGUgdGVtcGxhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSwgaW4gcGl4ZWxzLgorICBpbnQgaW5pdGlhbEFuZ3VsYXJBY2N1cmFjeTsgIC8vIFNldHMgdGhlIGFuZ2xlIGFjY3VyYWN5LCBpbiBkZWdyZWVzLCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhlIGluaXRpYWwgcGhhc2Ugb2Ygcm90YXRpb24taW52YXJpYW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcuCisgIGludCBmaW5hbFNhbXBsZVNpemU7ICAvLyBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBwaXhlbHMgeW91IHdhbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byBpbml0aWFsU2FtcGxlU2l6ZSBmb3IgdGhlIGZpbmFsIHBoYXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcuCisgIGRvdWJsZSBmaW5hbFNhbXBsZVNpemVGYWN0b3I7ICAvLyBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHNhbXBsZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBwaGFzZSBvZiByb3RhdGlvbi1pbnZhcmlhbnQgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgcGVyY2VudCBvZiB0aGUgZWRnZSBwb2ludHMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSwgaW4gcGl4ZWxzLgorICBpbnQgZmluYWxBbmd1bGFyQWNjdXJhY3k7ICAvLyBTZXRzIHRoZSBhbmdsZSBhY2N1cmFjeSwgaW4gZGVncmVlcywgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyB0aGUgZmluYWwgcGhhc2Ugb2YgdGhlIHJvdGF0aW9uLWludmFyaWFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGluZy4KKyAgaW50IHN1YnBpeGVsU2FtcGxlU2l6ZTsgIC8vIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHBpeGVscyB0aGF0IHlvdQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FudCB0byBpbmNsdWRlIGluIGEgc2FtcGxlIGZvciB0aGUgc3VicGl4ZWwgcGhhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHJvdGF0aW9uLWludmFyaWFudCBtYXRjaGluZy4KKyAgZG91YmxlIHN1YnBpeGVsU2FtcGxlU2l6ZUZhY3RvcjsgIC8vIFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnBpeGVsIHBoYXNlIG9mIHJvdGF0aW9uLWludmFyaWFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgYXMgYSBwZXJjZW50IG9mIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSwgaW4gcGl4ZWxzLgorfSBMZWFyblBhdHRlcm5BZHZhbmNlZFJvdGF0aW9uT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zX3N0cnVjdCB7CisgIGludCBzdWJwaXhlbEl0ZXJhdGlvbnM7ICAvLyBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmNyZW1lbnRhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wcm92ZW1lbnRzIHVzZWQgdG8gcmVmaW5lIG1hdGNoaW5nIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWJwaXhlbCBpbmZvcm1hdGlvbi4KKyAgZG91YmxlIHN1YnBpeGVsVG9sZXJhbmNlOyAgLy8gRGVmaW5lcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY2hhbmdlLCBpbiBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gY29uc2VjdXRpdmUgaW5jcmVtZW50YWwgaW1wcm92ZW1lbnRzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtYXRjaCBwb3NpdGlvbiB0aGF0IHlvdSB3YW50IHRvIHRyaWdnZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgcmVmaW5lbWVudCBwcm9jZXNzLgorICBpbnQgaW5pdGlhbE1hdGNoTGlzdExlbmd0aDsgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBtYXRjaCBsaXN0LgorICBpbnQgbWF0Y2hMaXN0UmVkdWN0aW9uRmFjdG9yOyAgLy8gU3BlY2lmaWVzIHRoZSByZWR1Y3Rpb24gb2YgdGhlIG1hdGNoIGxpc3QgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZXMgYXJlIHJlZmluZWQuCisgIGludCBpbml0aWFsU3RlcFNpemU7ICAvLyBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwaXhlbHMgdG8gc2hpZnQgdGhlIHNhbXBsZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNyb3NzIHRoZSBpbnNwZWN0aW9uIGltYWdlIGR1cmluZyB0aGUgaW5pdGlhbCBwaGFzZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Ygc2hpZnQtaW52YXJpYW50IG1hdGNoaW5nLgorICBTZWFyY2hTdHJhdGVneSBzZWFyY2hTdHJhdGVneTsgIC8vIFNwZWNpZmllcyB0aGUgYWdncmVzc2l2ZW5lc3Mgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm90YXRpb24gc2VhcmNoIHN0cmF0ZWd5LgorICBpbnQgaW50ZXJtZWRpYXRlQW5ndWxhckFjY3VyYWN5OyAgLy8gU3BlY2lmaWVzIHRoZSBhY2N1cmFjeSB0byB1c2UgZHVyaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJtZWRpYXRlIHBoYXNlIG9mIHJvdGF0aW9uLWludmFyaWFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcuCit9IE1hdGNoUGF0dGVybkFkdmFuY2VkT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTJfc3RydWN0IHsKKyAgTWVhc3VyZW1lbnRUeXBlIHBhcmFtZXRlcjsgIC8vIFRoZSBtb3JwaG9sb2dpY2FsIG1lYXN1cmVtZW50IHRoYXQgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VzIGZvciBmaWx0ZXJpbmcuCisgIGZsb2F0IGxvd2VyOyAgLy8gVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBjcml0ZXJpYSByYW5nZS4KKyAgZmxvYXQgdXBwZXI7ICAvLyBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIGNyaXRlcmlhIHJhbmdlLgorICBpbnQgY2FsaWJyYXRlZDsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byB0YWtlIGNhbGlicmF0ZWQgbWVhc3VyZW1lbnRzLgorICBpbnQgZXhjbHVkZTsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBpbmRpY2F0ZSB0aGF0IGEgbWF0Y2ggb2NjdXJzIHdoZW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgbWVhc3VyZW1lbnQgaXMgb3V0c2lkZSB0aGUgY3JpdGVyaWEgcmFuZ2UuCit9IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyOworCit0eXBlZGVmIHN0cnVjdCBCZXN0Q2lyY2xlMl9zdHJ1Y3QgeworICBQb2ludEZsb2F0IGNlbnRlcjsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgZG91YmxlIHJhZGl1czsgIC8vIFRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZS4KKyAgZG91YmxlIGFyZWE7ICAvLyBUaGUgYXJlYSBvZiB0aGUgY2lyY2xlLgorICBkb3VibGUgcGVyaW1ldGVyOyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcGVyaW1ldGVyIG9mIHRoZSBjaXJjbGUuCisgIGRvdWJsZSBlcnJvcjsgIC8vIFJlcHJlc2VudHMgdGhlIGxlYXN0IHNxdWFyZSBlcnJvciBvZiB0aGUgZml0dGVkIGNpcmNsZSB0bworICAgICAgICAgICAgICAgICAvLyB0aGUgZW50aXJlIHNldCBvZiBwb2ludHMuCisgIGludCB2YWxpZDsgIC8vIFRoaXMgZWxlbWVudCBpcyBUUlVFIGlmIHRoZSBmdW5jdGlvbiBhY2hpZXZlZCB0aGUgbWluaW11bSBzY29yZQorICAgICAgICAgICAgICAvLyB3aXRoaW4gdGhlIG51bWJlciBvZiBhbGxvd2VkIHJlZmluZW1lbnQgaXRlcmF0aW9ucyBhbmQgRkFMU0UgaWYKKyAgICAgICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIGRpZCBub3QgYWNoaWV2ZSB0aGUgbWluaW11bSBzY29yZS4KKyAgaW50KiBwb2ludHNVc2VkOyAgLy8gQW4gYXJyYXkgb2YgdGhlIGluZGV4ZXMgZm9yIHRoZSBwb2ludHMgYXJyYXkgaW5kaWNhdGluZworICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBwb2ludHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZml0IHRoZSBjaXJjbGUuCisgIGludCBudW1Qb2ludHNVc2VkOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZml0IHRoZQorICAgICAgICAgICAgICAgICAgICAgIC8vIGNpcmNsZS4KK30gQmVzdENpcmNsZTI7CisKK3R5cGVkZWYgc3RydWN0IE9DUlNwYWNpbmdPcHRpb25zX3N0cnVjdCB7CisgIGludCBtaW5DaGFyU3BhY2luZzsgIC8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiBwaXhlbHMgdGhhdCBtdXN0IGJlIGJldHdlZW4gdHdvCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgZm9yIE5JIFZpc2lvbiB0byB0cmFpbiBvciByZWFkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIHNlcGFyYXRlbHkuCisgIGludCBtaW5DaGFyU2l6ZTsgIC8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiBwaXhlbHMgcmVxdWlyZWQgZm9yIGFuIG9iamVjdCB0byBiZQorICAgICAgICAgICAgICAgICAgICAvLyBhIHBvdGVudGlhbGx5IGlkZW50aWZpYWJsZSBjaGFyYWN0ZXIuCisgIGludCBtYXhDaGFyU2l6ZTsgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwaXhlbHMgcmVxdWlyZWQgZm9yIGFuIG9iamVjdCB0byBiZQorICAgICAgICAgICAgICAgICAgICAvLyBhIHBvdGVudGlhbGx5IGlkZW50aWZpYWJsZSBjaGFyYWN0ZXIuCisgIGludCBtYXhIb3Jpem9udGFsRWxlbWVudFNwYWNpbmc7ICAvLyBUaGUgbWF4aW11bSBob3Jpem9udGFsIHNwYWNpbmcsIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbHMsIGFsbG93ZWQgYmV0d2VlbiBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRvIHRyYWluIG9yIHJlYWQgdGhlIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXMgYSBzaW5nbGUgY2hhcmFjdGVyLgorICBpbnQgbWF4VmVydGljYWxFbGVtZW50U3BhY2luZzsgIC8vIFRoZSBtYXhpbXVtIHZlcnRpY2FsIGVsZW1lbnQgc3BhY2luZyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVscy4KKyAgaW50IG1pbkJvdW5kaW5nUmVjdFdpZHRoOyAgLy8gVGhlIG1pbmltdW0gcG9zc2libGUgd2lkdGgsIGluIHBpeGVscywgZm9yIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgaW50IG1heEJvdW5kaW5nUmVjdFdpZHRoOyAgLy8gVGhlIG1heGltdW0gcG9zc2libGUgd2lkdGgsIGluIHBpeGVscywgZm9yIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgaW50IG1pbkJvdW5kaW5nUmVjdEhlaWdodDsgIC8vIFRoZSBtaW5pbXVtIHBvc3NpYmxlIGhlaWdodCwgaW4gcGl4ZWxzLCBmb3IgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgaW50IG1heEJvdW5kaW5nUmVjdEhlaWdodDsgIC8vIFRoZSBtYXhpbXVtIHBvc3NpYmxlIGhlaWdodCwgaW4gcGl4ZWxzLCBmb3IgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgaW50IGF1dG9TcGxpdDsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUKKyAgICAgICAgICAgICAgICAgIC8vIGxvY2F0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYm91bmRpbmcgcmVjdGFuZ2xlIHdoZW4KKyAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgb3ZlcmxhcCB2ZXJ0aWNhbGx5LgorfSBPQ1JTcGFjaW5nT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgT0NSUHJvY2Vzc2luZ09wdGlvbnNfc3RydWN0IHsKKyAgVGhyZXNob2xkTW9kZSBtb2RlOyAgLy8gVGhlIHRocmVzaG9sZGluZyBtb2RlLgorICBpbnQgbG93VGhyZXNob2xkOyAgLy8gVGhlIGxvdyB0aHJlc2hvbGQgdmFsdWUgd2hlbiB5b3Ugc2V0IG1vZGUgdG8KKyAgICAgICAgICAgICAgICAgICAgIC8vIElNQVFfRklYRURfUkFOR0UuCisgIGludCBoaWdoVGhyZXNob2xkOyAgLy8gVGhlIGhpZ2ggdGhyZXNob2xkIHZhbHVlIHdoZW4geW91IHNldCBtb2RlIHRvCisgICAgICAgICAgICAgICAgICAgICAgLy8gSU1BUV9GSVhFRF9SQU5HRS4KKyAgaW50IGJsb2NrQ291bnQ7ICAvLyBUaGUgbnVtYmVyIG9mIGJsb2NrcyBmb3IgdGhyZXNob2xkIGNhbGN1bGF0aW9uIGFsZ29yaXRobXMKKyAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHJlcXVpcmUgYmxvY2tzLgorICBpbnQgZmFzdFRocmVzaG9sZDsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byB1c2UgYSBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlc2hvbGQgY2FsY3VsYXRpb24gYWxnb3JpdGhtLgorICBpbnQgYmlNb2RhbENhbGN1bGF0aW9uOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIGNhbGN1bGF0ZSBib3RoIHRoZSBsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBoaWdoIHRocmVzaG9sZCB2YWx1ZXMgd2hlbiB1c2luZyB0aGUgZmFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZXNob2xkaW5nIG1ldGhvZC4KKyAgaW50IGRhcmtDaGFyYWN0ZXJzOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHJlYWQgb3IgdHJhaW4gZGFyaworICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIG9uIGEgbGlnaHQgYmFja2dyb3VuZC4KKyAgaW50IHJlbW92ZVBhcnRpY2xlc1RvdWNoaW5nUk9JOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHJlbW92ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFydGljbGVzIHRvdWNoaW5nIHRoZSBST0kuCisgIGludCBlcm9zaW9uQ291bnQ7ICAvLyBUaGUgbnVtYmVyIG9mIGVyb3Npb25zIHRvIHBlcmZvcm0uCit9IE9DUlByb2Nlc3NpbmdPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBSZWFkVGV4dE9wdGlvbnNfc3RydWN0IHsKKyAgU3RyaW5nMjU1IHZhbGlkQ2hhcnNbMjU1XTsgIC8vIEFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBzcGVjaWZpZXMgdGhlIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzLgorICBpbnQgbnVtVmFsaWRDaGFyczsgIC8vIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgdmFsaWRDaGFycyBhcnJheSB0aGF0IHlvdQorICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgaW5pdGlhbGl6ZWQuCisgIGNoYXIgc3Vic3RpdHV0aW9uQ2hhcjsgIC8vIFRoZSBjaGFyYWN0ZXIgdG8gc3Vic3RpdHV0ZSBmb3Igb2JqZWN0cyB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBjYW5ub3QgbWF0Y2ggd2l0aCBhbnkgb2YgdGhlIHRyYWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycy4KKyAgUmVhZFN0cmF0ZWd5IHJlYWRTdHJhdGVneTsgIC8vIFRoZSByZWFkIHN0cmF0ZWd5LCB3aGljaCBkZXRlcm1pbmVzIGhvdyBjbG9zZWx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZnVuY3Rpb24gYW5hbHl6ZXMgaW1hZ2VzIGluIHRoZSByZWFkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHRvIG1hdGNoIG9iamVjdHMgd2l0aCB0cmFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzLgorICBpbnQgYWNjZXB0YW5jZUxldmVsOyAgLy8gVGhlIG1pbmltdW0gYWNjZXB0YW5jZSBsZXZlbCBhdCB3aGljaCBhbiBvYmplY3QgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyZWQgYSB0cmFpbmVkIGNoYXJhY3Rlci4KKyAgaW50IGFzcGVjdFJhdGlvOyAgLy8gVGhlIG1heGltdW0gYXNwZWN0IHJhdGlvIHZhcmlhbmNlIHBlcmNlbnRhZ2UgZm9yIHZhbGlkCisgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMuCisgIFJlYWRSZXNvbHV0aW9uIHJlYWRSZXNvbHV0aW9uOyAgLy8gVGhlIHJlYWQgcmVzb2x1dGlvbiwgd2hpY2ggZGV0ZXJtaW5lcyBob3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWNoIG9mIHRoZSB0cmFpbmVkIGNoYXJhY3RlciBkYXRhIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHVzZXMgdG8gbWF0Y2ggb2JqZWN0cyB0byB0cmFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycy4KK30gUmVhZFRleHRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDaGFySW5mb19zdHJ1Y3QgeworICBjb25zdCBjaGFyKiBjaGFyVmFsdWU7ICAvLyBSZXRyaWV2ZXMgdGhlIGNoYXJhY3RlciB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIgaW4gdGhlIGNoYXJhY3RlciBzZXQuCisgIGNvbnN0IEltYWdlKiBjaGFySW1hZ2U7ICAvLyBUaGUgaW1hZ2UgeW91IHVzZWQgdG8gdHJhaW4gdGhpcyBjaGFyYWN0ZXIuCisgIGNvbnN0IEltYWdlKiBpbnRlcm5hbEltYWdlOyAgLy8gVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHRoYXQgTkkgVmlzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlcyB0byBtYXRjaCBvYmplY3RzIHRvIHRoaXMgY2hhcmFjdGVyLgorfSBDaGFySW5mbzsKKworI2lmICFkZWZpbmVkKFVTRVJJTlRfSEVBREVSKSAmJiAhZGVmaW5lZChfQ1ZJX1JFQ1RfREVGSU5FRCkKK3R5cGVkZWYgc3RydWN0IFJlY3Rfc3RydWN0IHsKKyAgaW50IHRvcDsgIC8vIExvY2F0aW9uIG9mIHRoZSB0b3AgZWRnZSBvZiB0aGUgcmVjdGFuZ2xlLgorICBpbnQgbGVmdDsgIC8vIExvY2F0aW9uIG9mIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHJlY3RhbmdsZS4KKyAgaW50IGhlaWdodDsgIC8vIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICBpbnQgd2lkdGg7ICAvLyBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorfSBSZWN0OworI2RlZmluZSBfQ1ZJX1JFQ1RfREVGSU5FRAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IENoYXJSZXBvcnRfc3RydWN0IHsKKyAgY29uc3QgY2hhciogY2hhcmFjdGVyOyAgLy8gVGhlIGNoYXJhY3RlciB2YWx1ZS4KKyAgUG9pbnRGbG9hdCBjb3JuZXJbNF07ICAvLyBBbiBhcnJheSBvZiBmb3VyIHBvaW50cyB0aGF0IGRlc2NyaWJlcyB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBzdXJyb3VuZHMgdGhlIGNoYXJhY3Rlci4KKyAgaW50IHJlc2VydmVkOyAgLy8gVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkLgorICBpbnQgbG93VGhyZXNob2xkOyAgLy8gVGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHRocmVzaG9sZCByYW5nZSB1c2VkIGZvciB0aGlzCisgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIuCisgIGludCBoaWdoVGhyZXNob2xkOyAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHRocmVzaG9sZCByYW5nZSB1c2VkIGZvciB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgorfSBDaGFyUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBSZWFkVGV4dFJlcG9ydF9zdHJ1Y3QgeworICBjb25zdCBjaGFyKiByZWFkU3RyaW5nOyAgLy8gVGhlIHJlYWQgc3RyaW5nLgorICBjb25zdCBDaGFyUmVwb3J0KiBjaGFyYWN0ZXJSZXBvcnQ7ICAvLyBBbiBhcnJheSBvZiByZXBvcnRzIGRlc2NyaWJpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgb2YgZWFjaCBpZGVudGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3Rlci4KKyAgaW50IG51bUNoYXJhY3RlclJlcG9ydHM7ICAvLyBUaGUgbnVtYmVyIG9mIGlkZW50aWZpZWQgY2hhcmFjdGVycy4KK30gUmVhZFRleHRSZXBvcnQ7CisKKyNpZiAhZGVmaW5lZChVU0VSSU5UX0hFQURFUikgJiYgIWRlZmluZWQoX0NWSV9QT0lOVF9ERUZJTkVEKQordHlwZWRlZiBzdHJ1Y3QgUG9pbnRfc3RydWN0IHsKKyAgaW50IHg7ICAvLyBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKyAgaW50IHk7ICAvLyBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KK30gUG9pbnQ7CisjZGVmaW5lIF9DVklfUE9JTlRfREVGSU5FRAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEFubnVsdXNfc3RydWN0IHsKKyAgUG9pbnQgY2VudGVyOyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgYW5udWx1cy4KKyAgaW50IGlubmVyUmFkaXVzOyAgLy8gVGhlIGludGVybmFsIHJhZGl1cyBvZiB0aGUgYW5udWx1cy4KKyAgaW50IG91dGVyUmFkaXVzOyAgLy8gVGhlIGV4dGVybmFsIHJhZGl1cyBvZiB0aGUgYW5udWx1cy4KKyAgZG91YmxlIHN0YXJ0QW5nbGU7ICAvLyBUaGUgc3RhcnQgYW5nbGUsIGluIGRlZ3JlZXMsIG9mIHRoZSBhbm51bHVzLgorICBkb3VibGUgZW5kQW5nbGU7ICAvLyBUaGUgZW5kIGFuZ2xlLCBpbiBkZWdyZWVzLCBvZiB0aGUgYW5udWx1cy4KK30gQW5udWx1czsKKwordHlwZWRlZiBzdHJ1Y3QgRWRnZUxvY2F0aW9uUmVwb3J0X3N0cnVjdCB7CisgIFBvaW50RmxvYXQqIGVkZ2VzOyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgYWxsIGVkZ2VzIGRldGVjdGVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBsaW5lLgorICBpbnQgbnVtRWRnZXM7ICAvLyBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZWRnZXMgYXJyYXkuCit9IEVkZ2VMb2NhdGlvblJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRWRnZU9wdGlvbnNfc3RydWN0IHsKKyAgdW5zaWduZWQKKyAgICAgIHRocmVzaG9sZDsgIC8vIFNwZWNpZmllcyB0aGUgdGhyZXNob2xkIHZhbHVlIGZvciB0aGUgY29udHJhc3Qgb2YgdGhlIGVkZ2UuCisgIHVuc2lnbmVkIHdpZHRoOyAgLy8gVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gYXZlcmFnZXMgdG8gZmluZAorICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb250cmFzdCBhdCBlaXRoZXIgc2lkZSBvZiB0aGUgZWRnZS4KKyAgdW5zaWduZWQgc3RlZXBuZXNzOyAgLy8gVGhlIHNwYW4sIGluIHBpeGVscywgb2YgdGhlIHNsb3BlIG9mIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2plY3RlZCBhbG9uZyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50cy4KKyAgSW50ZXJwb2xhdGlvbk1ldGhvZCBzdWJwaXhlbFR5cGU7ICAvLyBUaGUgbWV0aG9kIGZvciBpbnRlcnBvbGF0aW5nLgorICB1bnNpZ25lZCBzdWJwaXhlbERpdmlzaW9uczsgIC8vIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGUgZnVuY3Rpb24gb2J0YWlucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gYSBwaXhlbC4KK30gRWRnZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEVkZ2VSZXBvcnRfc3RydWN0IHsKKyAgZmxvYXQgbG9jYXRpb247ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGVkZ2UgZnJvbSB0aGUgZmlyc3QgcG9pbnQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgLy8gcG9pbnRzIGFycmF5LgorICBmbG9hdCBjb250cmFzdDsgIC8vIFRoZSBjb250cmFzdCBhdCB0aGUgZWRnZS4KKyAgUG9sYXJpdHlUeXBlIHBvbGFyaXR5OyAgLy8gVGhlIHBvbGFyaXR5IG9mIHRoZSBlZGdlLgorICBmbG9hdCByZXNlcnZlZDsgIC8vIFRoaXMgZWxlbWVudCBpcyByZXNlcnZlZC4KKyAgUG9pbnRGbG9hdCBjb29yZGluYXRlOyAgLy8gVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBlZGdlLgorfSBFZGdlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBFeHRyZW1lUmVwb3J0X3N0cnVjdCB7CisgIGRvdWJsZSBsb2NhdGlvbjsgIC8vIFRoZSBsb2NhdGlvbnMgb2YgdGhlIGV4dHJlbWUuCisgIGRvdWJsZSBhbXBsaXR1ZGU7ICAvLyBUaGUgYW1wbGl0dWRlIG9mIHRoZSBleHRyZW1lLgorICBkb3VibGUgc2Vjb25kRGVyaXZhdGl2ZTsgIC8vIFRoZSBzZWNvbmQgZGVyaXZhdGl2ZSBvZiB0aGUgZXh0cmVtZS4KK30gRXh0cmVtZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRml0TGluZU9wdGlvbnNfc3RydWN0IHsKKyAgZmxvYXQgbWluU2NvcmU7ICAvLyBTcGVjaWZpZXMgdGhlIHJlcXVpcmVkIHF1YWxpdHkgb2YgdGhlIGZpdHRlZCBsaW5lLgorICBmbG9hdCBwaXhlbFJhZGl1czsgIC8vIFNwZWNpZmllcyB0aGUgbmVpZ2hib3Job29kIHBpeGVsIHJlbGF0aW9uc2hpcCBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbCBzdWJzZXQgb2YgcG9pbnRzIGJlaW5nIHVzZWQuCisgIGludCBudW1SZWZpbmVtZW50czsgIC8vIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJlZmluZW1lbnQgaXRlcmF0aW9ucyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgdGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIGluaXRpYWwgc3Vic2V0IG9mCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50cy4KK30gRml0TGluZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IERpc3BsYXlNYXBwaW5nX3N0cnVjdCB7CisgIE1hcHBpbmdNZXRob2QgbWV0aG9kOyAgLy8gRGVzY3JpYmVzIHRoZSBtZXRob2QgZm9yIGNvbnZlcnRpbmcgMTYtYml0IHBpeGVscyB0bworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDgtYml0IHBpeGVscy4KKyAgaW50IG1pbmltdW1WYWx1ZTsgIC8vIFdoZW4gbWV0aG9kIGlzIElNQVFfUkFOR0UsIG1pbmltdW1WYWx1ZSByZXByZXNlbnRzIHRoZQorICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdGhhdCBpcyBtYXBwZWQgdG8gMC4KKyAgaW50IG1heGltdW1WYWx1ZTsgIC8vIFdoZW4gbWV0aG9kIGlzIElNQVFfUkFOR0UsIG1heGltdW1WYWx1ZSByZXByZXNlbnRzIHRoZQorICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdGhhdCBpcyBtYXBwZWQgdG8gMjU1LgorICBpbnQgc2hpZnRDb3VudDsgIC8vIFdoZW4gbWV0aG9kIGlzIElNQVFfRE9XTlNISUZULCBzaGlmdENvdW50IHJlcHJlc2VudHMgdGhlCisgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJpdHMgdGhlIGZ1bmN0aW9uIHJpZ2h0LXNoaWZ0cyB0aGUgMTYtYml0IHBpeGVsCisgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzLgorfSBEaXNwbGF5TWFwcGluZzsKKwordHlwZWRlZiBzdHJ1Y3QgRGV0ZWN0RXh0cmVtZXNPcHRpb25zX3N0cnVjdCB7CisgIGRvdWJsZSB0aHJlc2hvbGQ7ICAvLyBEZWZpbmVzIHdoaWNoIGV4dHJlbWVzIGFyZSB0b28gc21hbGwuCisgIGludCB3aWR0aDsgIC8vIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRhdGEgcG9pbnRzIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAvLyB1c2VzIGluIHRoZSBxdWFkcmF0aWMgbGVhc3Qtc3F1YXJlcyBmaXQuCit9IERldGVjdEV4dHJlbWVzT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgSW1hZ2VJbmZvX3N0cnVjdCB7CisgIENhbGlicmF0aW9uVW5pdCBpbWFnZVVuaXQ7ICAvLyBJZiB5b3Ugc2V0IGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYXFTZXRTaW1wbGVDYWxpYnJhdGlvbkluZm8oKSwgaW1hZ2VVbml0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2FsaWJyYXRpb24gdW5pdC4KKyAgZmxvYXQgc3RlcFg7ICAvLyBJZiB5b3Ugc2V0IGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBpbWFxU2V0Q2FsaWJyYXRpb25JbmZvKCksIHN0ZXBYIGlzIHRoZSBkaXN0YW5jZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAvLyBjYWxpYnJhdGlvbiB1bml0IGJldHdlZW4gdHdvIHBpeGVscyBpbiB0aGUgeCBkaXJlY3Rpb24uCisgIGZsb2F0IHN0ZXBZOyAgLy8gSWYgeW91IHNldCBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgLy8gaW1hcVNldENhbGlicmF0aW9uSW5mbygpLCBzdGVwWSBpcyB0aGUgZGlzdGFuY2UgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gY2FsaWJyYXRpb24gdW5pdCBiZXR3ZWVuIHR3byBwaXhlbHMgaW4gdGhlIHkgZGlyZWN0aW9uLgorICBJbWFnZVR5cGUgaW1hZ2VUeXBlOyAgLy8gVGhlIHR5cGUgb2YgdGhlIGltYWdlLgorICBpbnQgeFJlczsgIC8vIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgaW1hZ2UuCisgIGludCB5UmVzOyAgLy8gVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBpbWFnZS4KKyAgaW50IHhPZmZzZXQ7ICAvLyBJZiB5b3Ugc2V0IG1hc2sgb2Zmc2V0IGluZm9ybWF0aW9uIHdpdGggaW1hcVNldE1hc2tPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAvLyB4T2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIG1hc2sgb3JpZ2luIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgaW50IHlPZmZzZXQ7ICAvLyBJZiB5b3Ugc2V0IG1hc2sgb2Zmc2V0IGluZm9ybWF0aW9uIHdpdGggaW1hcVNldE1hc2tPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAvLyB5T2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIG1hc2sgb3JpZ2luIGluIHRoZSB5IGRpcmVjdGlvbi4KKyAgaW50IGJvcmRlcjsgIC8vIFRoZSBudW1iZXIgb2YgYm9yZGVyIHBpeGVscyBhcm91bmQgdGhlIGltYWdlLgorICBpbnQgcGl4ZWxzUGVyTGluZTsgIC8vIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHN0b3JlZCBmb3IgZWFjaCBsaW5lIG9mIHRoZSBpbWFnZS4KKyAgdm9pZCogcmVzZXJ2ZWQwOyAgLy8gVGhpcyBlbGVtZW50IGlzIHJlc2VydmVkLgorICB2b2lkKiByZXNlcnZlZDE7ICAvLyBUaGlzIGVsZW1lbnQgaXMgcmVzZXJ2ZWQuCisgIHZvaWQqIGltYWdlU3RhcnQ7ICAvLyBBIHBvaW50ZXIgdG8gcGl4ZWwgKDAsMCkuCit9IEltYWdlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgTENET3B0aW9uc19zdHJ1Y3QgeworICBpbnQgbGl0U2VnbWVudHM7ICAvLyBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSBpZiB0aGUgc2VnbWVudHMgYXJlIGJyaWdodGVyCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gdGhlIGJhY2tncm91bmQuCisgIGZsb2F0IHRocmVzaG9sZDsgIC8vIERldGVybWluZXMgd2hldGhlciBhIHNlZ21lbnQgaXMgT04gb3IgT0ZGLgorICBpbnQgc2lnbjsgIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBtdXN0IHJlYWQgdGhlIHNpZ24gb2YgdGhlCisgICAgICAgICAgICAgLy8gaW5kaWNhdG9yLgorICBpbnQgZGVjaW1hbFBvaW50OyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGxvb2sgZm9yIGEgZGVjaW1hbCBzZXBhcmF0b3IgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggZGlnaXQuCit9IExDRE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IExDRFJlcG9ydF9zdHJ1Y3QgeworICBjb25zdCBjaGFyKiB0ZXh0OyAgLy8gQSBzdHJpbmcgb2YgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIExDRC4KKyAgTENEU2VnbWVudHMqIHNlZ21lbnRJbmZvOyAgLy8gQW4gYXJyYXkgb2YgTENEU2VnbWVudCBzdHJ1Y3R1cmVzIGRlc2NyaWJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggc2VnbWVudHMgb2YgZWFjaCBkaWdpdCBhcmUgb24uCisgIGludCBudW1DaGFyYWN0ZXJzOyAgLy8gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIGZ1bmN0aW9uIHJlYWRzLgorICBpbnQgcmVzZXJ2ZWQ7ICAvLyBUaGlzIGVsZW1lbnQgaXMgcmVzZXJ2ZWQuCit9IExDRFJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTENEU2VnbWVudHNfc3RydWN0IHsKKyAgdW5zaWduZWQgYSA6IDE7ICAvLyBUcnVlIGlmIHRoZSBhIHNlZ21lbnQgaXMgb24uCisgIHVuc2lnbmVkIGIgOiAxOyAgLy8gVHJ1ZSBpZiB0aGUgYiBzZWdtZW50IGlzIG9uLgorICB1bnNpZ25lZCBjIDogMTsgIC8vIFRydWUgaWYgdGhlIGMgc2VnbWVudCBpcyBvbi4KKyAgdW5zaWduZWQgZCA6IDE7ICAvLyBUcnVlIGlmIHRoZSBkIHNlZ21lbnQgaXMgb24uCisgIHVuc2lnbmVkIGUgOiAxOyAgLy8gVHJ1ZSBpZiB0aGUgZSBzZWdtZW50IGlzIG9uLgorICB1bnNpZ25lZCBmIDogMTsgIC8vIFRydWUgaWYgdGhlIGYgc2VnbWVudCBpcyBvbi4KKyAgdW5zaWduZWQgZyA6IDE7ICAvLyBUcnVlIGlmIHRoZSBnIHNlZ21lbnQgaXMgb24uCisgIHVuc2lnbmVkIHJlc2VydmVkIDogMjU7ICAvLyBUaGlzIGVsZW1lbnQgaXMgcmVzZXJ2ZWQuCit9IExDRFNlZ21lbnRzOworCit0eXBlZGVmIHN0cnVjdCBMZWFybkNhbGlicmF0aW9uT3B0aW9uc19zdHJ1Y3QgeworICBDYWxpYnJhdGlvbk1vZGUgbW9kZTsgIC8vIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBhbGdvcml0aG0geW91IHdhbnQgdG8gdXNlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkdWNlIGRpc3RvcnRpb24gaW4geW91ciBpbWFnZS4KKyAgU2NhbGluZ01ldGhvZCBtZXRob2Q7ICAvLyBEZWZpbmVzIHRoZSBzY2FsaW5nIG1ldGhvZCBjb3JyZWN0aW9uIGZ1bmN0aW9ucyB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjb3JyZWN0IHRoZSBpbWFnZS4KKyAgQ2FsaWJyYXRpb25ST0kgcm9pOyAgLy8gU3BlY2lmaWVzIHRoZSBST0kgY29ycmVjdGlvbiBmdW5jdGlvbnMgdXNlIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdGluZyBhbiBpbWFnZS4KKyAgaW50IGxlYXJuTWFwOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIGlmIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0bworICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgYW5kIHN0b3JlIGFuIGVycm9yIG1hcCBkdXJpbmcgdGhlIGxlYXJuaW5nCisgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MuCisgIGludCBsZWFyblRhYmxlOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIGlmIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0bworICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhbmQgc3RvcmUgdGhlIGNvcnJlY3Rpb24gdGFibGUuCit9IExlYXJuQ2FsaWJyYXRpb25PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBMZWFybkNvbG9yUGF0dGVybk9wdGlvbnNfc3RydWN0IHsKKyAgTGVhcm5pbmdNb2RlIGxlYXJuTW9kZTsgIC8vIFNwZWNpZmllcyB0aGUgaW52YXJpYW5jZSBtb2RlIHRoZSBmdW5jdGlvbiB1c2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGxlYXJuaW5nIHRoZSBwYXR0ZXJuLgorICBJbWFnZUZlYXR1cmVNb2RlIGZlYXR1cmVNb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBmZWF0dXJlcyB0aGUgZnVuY3Rpb24gdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBsZWFybmluZyB0aGUgY29sb3IgcGF0dGVybi4KKyAgaW50IHRocmVzaG9sZDsgIC8vIFNwZWNpZmllcyB0aGUgc2F0dXJhdGlvbiB0aHJlc2hvbGQgdGhlIGZ1bmN0aW9uIHVzZXMgdG8KKyAgICAgICAgICAgICAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gdHdvIGNvbG9ycyB0aGF0IGhhdmUgdGhlIHNhbWUgaHVlCisgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMuCisgIENvbG9ySWdub3JlTW9kZSBpZ25vcmVNb2RlOyAgLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGV4Y2x1ZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2VydGFpbiBjb2xvcnMgZnJvbSB0aGUgY29sb3IgZmVhdHVyZXMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUgaW1hZ2UuCisgIENvbG9ySW5mb3JtYXRpb24qIGNvbG9yc1RvSWdub3JlOyAgLy8gQW4gYXJyYXkgb2YgQ29sb3JJbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkaW5nIGEgc2V0IG9mIGNvbG9ycyB0byBleGNsdWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgY29sb3IgZmVhdHVyZXMgb2YgdGhlIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UuCisgIGludCBudW1Db2xvcnNUb0lnbm9yZTsgIC8vIFRoZSBudW1iZXIgb2YgQ29sb3JJbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvcnNUb0lnbm9yZSBhcnJheS4KK30gTGVhcm5Db2xvclBhdHRlcm5PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBMaW5lX3N0cnVjdCB7CisgIFBvaW50IHN0YXJ0OyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorICBQb2ludCBlbmQ7ICAvLyBUaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBsaW5lLgorfSBMaW5lOworCit0eXBlZGVmIHN0cnVjdCBMaW5lYXJBdmVyYWdlc19zdHJ1Y3QgeworICBmbG9hdCogY29sdW1uQXZlcmFnZXM7ICAvLyBBbiBhcnJheSBjb250YWluaW5nIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sdW1uLgorICBpbnQgY29sdW1uQ291bnQ7ICAvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2x1bW5BdmVyYWdlcyBhcnJheS4KKyAgZmxvYXQqIHJvd0F2ZXJhZ2VzOyAgLy8gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgbWVhbiBwaXhlbCB2YWx1ZSBvZiBlYWNoIHJvdy4KKyAgaW50IHJvd0NvdW50OyAgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcm93QXZlcmFnZXMgYXJyYXkuCisgIGZsb2F0KiByaXNpbmdEaWFnQXZlcmFnZXM7ICAvLyBBbiBhcnJheSBjb250YWluaW5nIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIGRpYWdvbmFsIHJ1bm5pbmcgZnJvbSB0aGUgbG93ZXIgbGVmdCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVwcGVyIHJpZ2h0IG9mIHRoZSBpbnNwZWN0ZWQgYXJlYSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBpbnQgcmlzaW5nRGlhZ0NvdW50OyAgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcmlzaW5nRGlhZ0F2ZXJhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheS4KKyAgZmxvYXQqIGZhbGxpbmdEaWFnQXZlcmFnZXM7ICAvLyBBbiBhcnJheSBjb250YWluaW5nIHRoZSBtZWFuIHBpeGVsIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaCBkaWFnb25hbCBydW5uaW5nIGZyb20gdGhlIHVwcGVyIGxlZnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG93ZXIgcmlnaHQgb2YgdGhlIGluc3BlY3RlZCBhcmVhIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlLgorICBpbnQgZmFsbGluZ0RpYWdDb3VudDsgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGZhbGxpbmdEaWFnQXZlcmFnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheS4KK30gTGluZWFyQXZlcmFnZXM7CisKK3R5cGVkZWYgc3RydWN0IExpbmVQcm9maWxlX3N0cnVjdCB7CisgIGZsb2F0KgorICAgICAgcHJvZmlsZURhdGE7ICAvLyBBbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiBlYWNoIHBpeGVsIGluIHRoZSBsaW5lLgorICBSZWN0IGJvdW5kaW5nQm94OyAgLy8gVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgbGluZS4KKyAgZmxvYXQgbWluOyAgLy8gVGhlIHNtYWxsZXN0IHBpeGVsIHZhbHVlIGluIHRoZSBsaW5lIHByb2ZpbGUuCisgIGZsb2F0IG1heDsgIC8vIFRoZSBsYXJnZXN0IHBpeGVsIHZhbHVlIGluIHRoZSBsaW5lIHByb2ZpbGUuCisgIGZsb2F0IG1lYW47ICAvLyBUaGUgbWVhbiB2YWx1ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSBsaW5lIHByb2ZpbGUuCisgIGZsb2F0IHN0ZERldjsgIC8vIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGxpbmUgcHJvZmlsZS4KKyAgaW50IGRhdGFDb3VudDsgIC8vIFRoZSBzaXplIG9mIHRoZSBwcm9maWxlRGF0YSBhcnJheS4KK30gTGluZVByb2ZpbGU7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoQ29sb3JQYXR0ZXJuT3B0aW9uc19zdHJ1Y3QgeworICBNYXRjaGluZ01vZGUgbWF0Y2hNb2RlOyAgLy8gU3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBwYXR0ZXJuIGluIHRoZSBpbWFnZS4KKyAgSW1hZ2VGZWF0dXJlTW9kZSBmZWF0dXJlTW9kZTsgIC8vIFNwZWNpZmllcyB0aGUgZmVhdHVyZXMgdG8gdXNlIHdoZW4gbG9va2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBjb2xvciBwYXR0ZXJuIGluIHRoZSBpbWFnZS4KKyAgaW50IG1pbkNvbnRyYXN0OyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGV4cGVjdGVkIGluIHRoZSBpbWFnZS4KKyAgaW50IHN1YnBpeGVsQWNjdXJhY3k7ICAvLyBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byByZXR1cm4gYXJlYXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiBhcmVhIHdpdGggc3VicGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2N1cmFjeS4KKyAgUm90YXRpb25BbmdsZVJhbmdlKiBhbmdsZVJhbmdlczsgIC8vIEFuIGFycmF5IG9mIGFuZ2xlIHJhbmdlcywgaW4gZGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIGVhY2ggcmFuZ2Ugc3BlY2lmaWVzIGhvdyBtdWNoIHlvdQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IHRoZSBwYXR0ZXJuIHRvIGJlIHJvdGF0ZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZS4KKyAgaW50IG51bVJhbmdlczsgIC8vIE51bWJlciBvZiBhbmdsZSByYW5nZXMgaW4gdGhlIGFuZ2xlUmFuZ2VzIGFycmF5LgorICBkb3VibGUgY29sb3JXZWlnaHQ7ICAvLyBEZXRlcm1pbmVzIHRoZSBwZXJjZW50IGNvbnRyaWJ1dGlvbiBvZiB0aGUgY29sb3Igc2NvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGZpbmFsIGNvbG9yIHBhdHRlcm4gbWF0Y2hpbmcgc2NvcmUuCisgIENvbG9yU2Vuc2l0aXZpdHkgc2Vuc2l0aXZpdHk7ICAvLyBTcGVjaWZpZXMgdGhlIHNlbnNpdGl2aXR5IG9mIHRoZSBjb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gaW4gdGhlIGltYWdlLgorICBTZWFyY2hTdHJhdGVneSBzdHJhdGVneTsgIC8vIFNwZWNpZmllcyBob3cgdGhlIGNvbG9yIGZlYXR1cmVzIG9mIHRoZSBpbWFnZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIGR1cmluZyB0aGUgc2VhcmNoIHBoYXNlLgorICBpbnQgbnVtTWF0Y2hlc1JlcXVlc3RlZDsgIC8vIE51bWJlciBvZiB2YWxpZCBtYXRjaGVzIGV4cGVjdGVkLgorICBmbG9hdCBtaW5NYXRjaFNjb3JlOyAgLy8gVGhlIG1pbmltdW0gc2NvcmUgYSBtYXRjaCBjYW4gaGF2ZSBmb3IgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjb25zaWRlciB0aGUgbWF0Y2ggdmFsaWQuCit9IE1hdGNoQ29sb3JQYXR0ZXJuT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgSGlzdG9ncmFtUmVwb3J0X3N0cnVjdCB7CisgIGludCogaGlzdG9ncmFtOyAgLy8gQW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IGZlbGwgaW50bworICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggY2xhc3MuCisgIGludCBoaXN0b2dyYW1Db3VudDsgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhpc3RvZ3JhbSBhcnJheS4KKyAgZmxvYXQgbWluOyAgLy8gVGhlIHNtYWxsZXN0IHBpeGVsIHZhbHVlIHRoYXQgdGhlIGZ1bmN0aW9uIGNsYXNzaWZpZWQuCisgIGZsb2F0IG1heDsgIC8vIFRoZSBsYXJnZXN0IHBpeGVsIHZhbHVlIHRoYXQgdGhlIGZ1bmN0aW9uIGNsYXNzaWZpZWQuCisgIGZsb2F0IHN0YXJ0OyAgLy8gVGhlIHNtYWxsZXN0IHBpeGVsIHZhbHVlIHRoYXQgZmVsbCBpbnRvIHRoZSBmaXJzdCBjbGFzcy4KKyAgZmxvYXQgd2lkdGg7ICAvLyBUaGUgc2l6ZSBvZiBlYWNoIGNsYXNzLgorICBmbG9hdCBtZWFuOyAgLy8gVGhlIG1lYW4gdmFsdWUgb2YgdGhlIHBpeGVscyB0aGF0IHRoZSBmdW5jdGlvbiBjbGFzc2lmaWVkLgorICBmbG9hdCBzdGREZXY7ICAvLyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgLy8gY2xhc3NpZmllZC4KKyAgaW50IG51bVBpeGVsczsgIC8vIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgdGhlIGZ1bmN0aW9uIGNsYXNzaWZpZWQuCit9IEhpc3RvZ3JhbVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQXJjSW5mb19zdHJ1Y3QgeworICBSZWN0IGJvdW5kaW5nQm94OyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgYXJjLgorICBkb3VibGUgc3RhcnRBbmdsZTsgIC8vIFRoZSBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGZyb20gdGhlIHgtYXhpcyBpbiBkZWdyZWVzCisgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHN0YXJ0IG9mIHRoZSBhcmMuCisgIGRvdWJsZSBlbmRBbmdsZTsgIC8vIFRoZSBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGZyb20gdGhlIHgtYXhpcyBpbiBkZWdyZWVzIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGFyYy4KK30gQXJjSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQXhpc1JlcG9ydF9zdHJ1Y3QgeworICBQb2ludEZsb2F0IG9yaWdpbjsgIC8vIFRoZSBvcmlnaW4gb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLCB3aGljaCBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBheGVzIG9mIHRoZSBjb29yZGluYXRlIHN5c3RlbS4KKyAgUG9pbnRGbG9hdCBtYWluQXhpc0VuZDsgIC8vIFRoZSBlbmQgb2YgdGhlIG1haW4gYXhpcywgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG1haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF4aXMgd2l0aCB0aGUgcmVjdGFuZ3VsYXIgc2VhcmNoIGFyZWEuCisgIFBvaW50RmxvYXQgc2Vjb25kYXJ5QXhpc0VuZDsgIC8vIFRoZSBlbmQgb2YgdGhlIHNlY29uZGFyeSBheGlzLCB3aGljaCBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0IG9mIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgaW50ZXJzZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzZWNvbmRhcnkgYXhpcyB3aXRoIHRoZSByZWN0YW5ndWxhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFyY2ggYXJlYS4KK30gQXhpc1JlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQmFyY29kZUluZm9fc3RydWN0IHsKKyAgY29uc3QgY2hhciogb3V0cHV0U3RyaW5nOyAgLy8gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGVjb2RlZCBiYXJjb2RlIGRhdGEuCisgIGludCBzaXplOyAgLy8gVGhlIHNpemUgb2YgdGhlIG91dHB1dCBzdHJpbmcuCisgIGNoYXIgb3V0cHV0Q2hhcjE7ICAvLyBUaGUgY29udGVudHMgb2YgdGhpcyBjaGFyYWN0ZXIgZGVwZW5kIG9uIHRoZSBiYXJjb2RlCisgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlLgorICBjaGFyIG91dHB1dENoYXIyOyAgLy8gVGhlIGNvbnRlbnRzIG9mIHRoaXMgY2hhcmFjdGVyIGRlcGVuZCBvbiB0aGUgYmFyY29kZQorICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZS4KKyAgZG91YmxlIGNvbmZpZGVuY2VMZXZlbDsgIC8vIEEgcXVhbGl0eSBtZWFzdXJlIG9mIHRoZSBkZWNvZGVkIGJhcmNvZGUgcmFuZ2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSAwIHRvIDEwMCwgd2l0aCAxMDAgYmVpbmcgdGhlIGJlc3QuCisgIEJhcmNvZGVUeXBlIHR5cGU7ICAvLyBUaGUgdHlwZSBvZiBiYXJjb2RlLgorfSBCYXJjb2RlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQkNHT3B0aW9uc19zdHJ1Y3QgeworICBmbG9hdCBicmlnaHRuZXNzOyAgLy8gQWRqdXN0cyB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgaW1hZ2UuCisgIGZsb2F0IGNvbnRyYXN0OyAgLy8gQWRqdXN0cyB0aGUgY29udHJhc3Qgb2YgdGhlIGltYWdlLgorICBmbG9hdCBnYW1tYTsgIC8vIFBlcmZvcm1zIGdhbW1hIGNvcnJlY3Rpb24uCit9IEJDR09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IEJlc3RDaXJjbGVfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBjZW50ZXI7ICAvLyBUaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuCisgIGRvdWJsZSByYWRpdXM7ICAvLyBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuCisgIGRvdWJsZSBhcmVhOyAgLy8gVGhlIGFyZWEgb2YgdGhlIGNpcmNsZS4KKyAgZG91YmxlIHBlcmltZXRlcjsgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHBlcmltZXRlciBvZiB0aGUgY2lyY2xlLgorICBkb3VibGUgZXJyb3I7ICAvLyBSZXByZXNlbnRzIHRoZSBsZWFzdCBzcXVhcmUgZXJyb3Igb2YgdGhlIGZpdHRlZCBjaXJjbGUgdG8KKyAgICAgICAgICAgICAgICAgLy8gdGhlIGVudGlyZSBzZXQgb2YgcG9pbnRzLgorfSBCZXN0Q2lyY2xlOworCit0eXBlZGVmIHN0cnVjdCBCZXN0RWxsaXBzZV9zdHJ1Y3QgeworICBQb2ludEZsb2F0IGNlbnRlcjsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuCisgIFBvaW50RmxvYXQgbWFqb3JBeGlzU3RhcnQ7ICAvLyBUaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWpvciBheGlzIG9mIHRoZSBlbGxpcHNlLgorICBQb2ludEZsb2F0IG1ham9yQXhpc0VuZDsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIG1ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXhpcyBvZiB0aGUgZWxsaXBzZS4KKyAgUG9pbnRGbG9hdCBtaW5vckF4aXNTdGFydDsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbm9yIGF4aXMgb2YgdGhlIGVsbGlwc2UuCisgIFBvaW50RmxvYXQgbWlub3JBeGlzRW5kOyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbWlub3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBheGlzIG9mIHRoZSBlbGxpcHNlLgorICBkb3VibGUgYXJlYTsgIC8vIFRoZSBhcmVhIG9mIHRoZSBlbGxpcHNlLgorICBkb3VibGUgcGVyaW1ldGVyOyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcGVyaW1ldGVyIG9mIHRoZSBlbGxpcHNlLgorfSBCZXN0RWxsaXBzZTsKKwordHlwZWRlZiBzdHJ1Y3QgQmVzdExpbmVfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBzdGFydDsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZS4KKyAgUG9pbnRGbG9hdCBlbmQ7ICAvLyBUaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICBMaW5lRXF1YXRpb24gZXF1YXRpb247ICAvLyBEZWZpbmVzIHRoZSB0aHJlZSBjb2VmZmljaWVudHMgb2YgdGhlIGVxdWF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBiZXN0IGZpdCBsaW5lLgorICBpbnQgdmFsaWQ7ICAvLyBUaGlzIGVsZW1lbnQgaXMgVFJVRSBpZiB0aGUgZnVuY3Rpb24gYWNoaWV2ZWQgdGhlIG1pbmltdW0gc2NvcmUKKyAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBudW1iZXIgb2YgYWxsb3dlZCByZWZpbmVtZW50IGl0ZXJhdGlvbnMgYW5kIEZBTFNFIGlmCisgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBkaWQgbm90IGFjaGlldmUgdGhlIG1pbmltdW0gc2NvcmUuCisgIGRvdWJsZSBlcnJvcjsgIC8vIFJlcHJlc2VudHMgdGhlIGxlYXN0IHNxdWFyZSBlcnJvciBvZiB0aGUgZml0dGVkIGxpbmUgdG8gdGhlCisgICAgICAgICAgICAgICAgIC8vIGVudGlyZSBzZXQgb2YgcG9pbnRzLgorICBpbnQqIHBvaW50c1VzZWQ7ICAvLyBBbiBhcnJheSBvZiB0aGUgaW5kZXhlcyBmb3IgdGhlIHBvaW50cyBhcnJheSBpbmRpY2F0aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHBvaW50cyB0aGUgZnVuY3Rpb24gdXNlZCB0byBmaXQgdGhlIGxpbmUuCisgIGludCBudW1Qb2ludHNVc2VkOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZml0IHRoZSBsaW5lLgorfSBCZXN0TGluZTsKKwordHlwZWRlZiBzdHJ1Y3QgQnJvd3Nlck9wdGlvbnNfc3RydWN0IHsKKyAgaW50IHdpZHRoOyAgLy8gVGhlIHdpZHRoIHRvIG1ha2UgdGhlIGJyb3dzZXIuCisgIGludCBoZWlnaHQ7ICAvLyBUaGUgaGVpZ2h0IHRvIG1ha2UgdGhlIGJyb3dzZXIgaW1hZ2UuCisgIGludCBpbWFnZXNQZXJMaW5lOyAgLy8gVGhlIG51bWJlciBvZiBpbWFnZXMgdG8gcGxhY2Ugb24gYSBzaW5nbGUgbGluZS4KKyAgUkdCVmFsdWUgYmFja2dyb3VuZENvbG9yOyAgLy8gVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGJyb3dzZXIuCisgIGludCBmcmFtZVNpemU7ICAvLyBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwaXhlbHMgd2l0aCB3aGljaCB0byBib3JkZXIgZWFjaAorICAgICAgICAgICAgICAgICAgLy8gdGh1bWJuYWlsLgorICBCcm93c2VyRnJhbWVTdHlsZSBzdHlsZTsgIC8vIFRoZSBzdHlsZSBmb3IgdGhlIGZyYW1lIGFyb3VuZCBlYWNoIHRodW1ibmFpbC4KKyAgZmxvYXQgcmF0aW87ICAvLyBTcGVjaWZpZXMgdGhlIHdpZHRoIHRvIGhlaWdodCByYXRpbyBvZiBlYWNoIHRodW1ibmFpbC4KKyAgUkdCVmFsdWUgZm9jdXNDb2xvcjsgIC8vIFRoZSBjb2xvciB0byB1c2UgdG8gZGlzcGxheSBmb2N1c2VkIGNlbGxzLgorfSBCcm93c2VyT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgQ29vcmRpbmF0ZVN5c3RlbV9zdHJ1Y3QgeworICBQb2ludEZsb2F0IG9yaWdpbjsgIC8vIFRoZSBvcmlnaW4gb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLgorICBmbG9hdCBhbmdsZTsgIC8vIFRoZSBhbmdsZSwgaW4gZGVncmVlcywgb2YgdGhlIHgtYXhpcyBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0KKyAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSB0byB0aGUgaW1hZ2UgeC1heGlzLgorICBBeGlzT3JpZW50YXRpb24gYXhpc09yaWVudGF0aW9uOyAgLy8gVGhlIGRpcmVjdGlvbiBvZiB0aGUgeS1heGlzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZSByZWZlcmVuY2Ugc3lzdGVtLgorfSBDb29yZGluYXRlU3lzdGVtOworCit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvbkluZm9fc3RydWN0IHsKKyAgZmxvYXQqIGVycm9yTWFwOyAgLy8gVGhlIGVycm9yIG1hcCBmb3IgdGhlIGNhbGlicmF0aW9uLgorICBpbnQgbWFwQ29sdW1uczsgIC8vIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZXJyb3IgbWFwLgorICBpbnQgbWFwUm93czsgIC8vIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZXJyb3IgbWFwLgorICBST0kqIHVzZXJSb2k7ICAvLyBTcGVjaWZpZXMgdGhlIFJPSSB0aGUgdXNlciBwcm92aWRlZCB3aGVuIGxlYXJuaW5nIHRoZQorICAgICAgICAgICAgICAgICAvLyBjYWxpYnJhdGlvbi4KKyAgUk9JKiBjYWxpYnJhdGlvblJvaTsgIC8vIFNwZWNpZmllcyB0aGUgUk9JIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHJlZ2lvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGltYWdlIHdoZXJlIHRoZSBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdXJhdGUuCisgIExlYXJuQ2FsaWJyYXRpb25PcHRpb25zIG9wdGlvbnM7ICAvLyBTcGVjaWZpZXMgdGhlIGNhbGlicmF0aW9uIG9wdGlvbnMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIHByb3ZpZGVkIHdoZW4gbGVhcm5pbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxpYnJhdGlvbi4KKyAgR3JpZERlc2NyaXB0b3IgZ3JpZDsgIC8vIFNwZWNpZmllcyB0aGUgc2NhbGluZyBjb25zdGFudHMgZm9yIHRoZSBpbWFnZS4KKyAgQ29vcmRpbmF0ZVN5c3RlbSBzeXN0ZW07ICAvLyBTcGVjaWZpZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGZvciB0aGUgcmVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkIGNvb3JkaW5hdGVzLgorICBSYW5nZUZsb2F0IHJhbmdlOyAgLy8gVGhlIHJhbmdlIG9mIHRoZSBncmF5c2NhbGUgdGhlIGZ1bmN0aW9uIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudCB0aGUgY2lyY2xlcyBpbiB0aGUgZ3JpZCBpbWFnZS4KKyAgZmxvYXQgcXVhbGl0eTsgIC8vIFRoZSBxdWFsaXR5IHNjb3JlIG9mIHRoZSBsZWFybmluZyBwcm9jZXNzLCB3aGljaCBpcyBhIHZhbHVlCisgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIDAtMTAwMC4KK30gQ2FsaWJyYXRpb25JbmZvOworCit0eXBlZGVmIHN0cnVjdCBDYWxpYnJhdGlvblBvaW50c19zdHJ1Y3QgeworICBQb2ludEZsb2F0KiBwaXhlbENvb3JkaW5hdGVzOyAgLy8gVGhlIGFycmF5IG9mIHBpeGVsIGNvb3JkaW5hdGVzLgorICBQb2ludEZsb2F0KiByZWFsV29ybGRDb29yZGluYXRlczsgIC8vIFRoZSBhcnJheSBvZiBjb3JyZXNwb25kaW5nIHJlYWwtd29ybGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29yZGluYXRlcy4KKyAgaW50IG51bUNvb3JkaW5hdGVzOyAgLy8gVGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBpbiBib3RoIG9mIHRoZSBhcnJheXMuCit9IENhbGlicmF0aW9uUG9pbnRzOworCit0eXBlZGVmIHN0cnVjdCBDYWxpcGVyT3B0aW9uc19zdHJ1Y3QgeworICBUd29FZGdlUG9sYXJpdHlUeXBlCisgICAgICBwb2xhcml0eTsgIC8vIFNwZWNpZmllcyB0aGUgZWRnZSBwb2xhcml0eSBvZiB0aGUgZWRnZSBwYWlycy4KKyAgZmxvYXQgc2VwYXJhdGlvbjsgIC8vIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVkZ2UgcGFpcnMuCisgIGZsb2F0IHNlcGFyYXRpb25EZXZpYXRpb247ICAvLyBTZXRzIHRoZSByYW5nZSBhcm91bmQgdGhlIHNlcGFyYXRpb24gdmFsdWUuCit9IENhbGlwZXJPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDYWxpcGVyUmVwb3J0X3N0cnVjdCB7CisgIGZsb2F0IGVkZ2UxQ29udHJhc3Q7ICAvLyBUaGUgY29udHJhc3Qgb2YgdGhlIGZpcnN0IGVkZ2UuCisgIFBvaW50RmxvYXQgZWRnZTFDb29yZDsgIC8vIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgZWRnZS4KKyAgZmxvYXQgZWRnZTJDb250cmFzdDsgIC8vIFRoZSBjb250cmFzdCBvZiB0aGUgc2Vjb25kIGVkZ2UuCisgIFBvaW50RmxvYXQgZWRnZTJDb29yZDsgIC8vIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgc2Vjb25kIGVkZ2UuCisgIGZsb2F0IHNlcGFyYXRpb247ICAvLyBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIGVkZ2VzLgorICBmbG9hdCByZXNlcnZlZDsgIC8vIFRoaXMgZWxlbWVudCBpcyByZXNlcnZlZC4KK30gQ2FsaXBlclJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgRHJhd1RleHRPcHRpb25zX3N0cnVjdCB7CisgIGNoYXIgZm9udE5hbWVbMzJdOyAgLy8gVGhlIGZvbnQgbmFtZSB0byB1c2UuCisgIGludCBmb250U2l6ZTsgIC8vIFRoZSBzaXplIG9mIHRoZSBmb250LgorICBpbnQgYm9sZDsgIC8vIFNldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIGJvbGQgdGV4dC4KKyAgaW50IGl0YWxpYzsgIC8vIFNldCB0aGlzIHBhcmFtZXRlciB0byBUUlVFIHRvIGl0YWxpY2l6ZSB0ZXh0LgorICBpbnQgdW5kZXJsaW5lOyAgLy8gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gdW5kZXJsaW5lIHRleHQuCisgIGludCBzdHJpa2VvdXQ7ICAvLyBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byBzdHJpa2VvdXQgdGV4dC4KKyAgVGV4dEFsaWdubWVudCB0ZXh0QWxpZ25tZW50OyAgLy8gU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRleHQuCisgIEZvbnRDb2xvciBmb250Q29sb3I7ICAvLyBTZXRzIHRoZSBmb250IGNvbG9yLgorfSBEcmF3VGV4dE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IENpcmNsZVJlcG9ydF9zdHJ1Y3QgeworICBQb2ludCBjZW50ZXI7ICAvLyBUaGUgY29vcmRpbmF0ZSBwb2ludCBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuCisgIGludCByYWRpdXM7ICAvLyBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUsIGluIHBpeGVscy4KKyAgaW50IGFyZWE7ICAvLyBUaGUgYXJlYSBvZiB0aGUgY2lyY2xlLCBpbiBwaXhlbHMuCit9IENpcmNsZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ2xvc2VkQ29udG91cl9zdHJ1Y3QgeworICBQb2ludCogcG9pbnRzOyAgLy8gVGhlIHBvaW50cyB0aGF0IG1ha2UgdXAgdGhlIGNsb3NlZCBjb250b3VyLgorICBpbnQgbnVtUG9pbnRzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGFycmF5LgorfSBDbG9zZWRDb250b3VyOworCit0eXBlZGVmIHN0cnVjdCBDb2xvckhpc3RvZ3JhbVJlcG9ydF9zdHJ1Y3QgeworICBIaXN0b2dyYW1SZXBvcnQgcGxhbmUxOyAgLy8gVGhlIGhpc3RvZ3JhbSByZXBvcnQgb2YgdGhlIGZpcnN0IGNvbG9yIHBsYW5lLgorICBIaXN0b2dyYW1SZXBvcnQgcGxhbmUyOyAgLy8gVGhlIGhpc3RvZ3JhbSByZXBvcnQgb2YgdGhlIHNlY29uZCBwbGFuZS4KKyAgSGlzdG9ncmFtUmVwb3J0IHBsYW5lMzsgIC8vIFRoZSBoaXN0b2dyYW0gcmVwb3J0IG9mIHRoZSB0aGlyZCBwbGFuZS4KK30gQ29sb3JIaXN0b2dyYW1SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IENvbG9ySW5mb3JtYXRpb25fc3RydWN0IHsKKyAgaW50IGluZm9Db3VudDsgIC8vIFRoZSBzaXplIG9mIHRoZSBpbmZvIGFycmF5LgorICBpbnQgc2F0dXJhdGlvbjsgIC8vIFRoZSBzYXR1cmF0aW9uIGxldmVsIHRoZSBmdW5jdGlvbiB1c2VzIHRvIGxlYXJuIHRoZSBjb2xvcgorICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uLgorICBkb3VibGUqIGluZm87ICAvLyBBbiBhcnJheSBvZiBjb2xvciBpbmZvcm1hdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbG9yCisgICAgICAgICAgICAgICAgIC8vIHNwZWN0cnVtIGFuYWx5c2lzIG9mIGEgcmVnaW9uIG9mIGFuIGltYWdlIGluIGEgY29tcGFjdCBmb3JtLgorfSBDb2xvckluZm9ybWF0aW9uOworCit0eXBlZGVmIHN0cnVjdCBDb21wbGV4X3N0cnVjdCB7CisgIGZsb2F0IHI7ICAvLyBUaGUgcmVhbCBwYXJ0IG9mIHRoZSB2YWx1ZS4KKyAgZmxvYXQgaTsgIC8vIFRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgdmFsdWUuCit9IENvbXBsZXg7CisKK3R5cGVkZWYgc3RydWN0IENvbmNlbnRyaWNSYWtlUmVwb3J0X3N0cnVjdCB7CisgIEFyY0luZm8qIHJha2VBcmNzOyAgLy8gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgbG9jYXRpb24gb2YgZWFjaCBjb25jZW50cmljIGFyYworICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgdXNlZCBmb3IgZWRnZSBkZXRlY3Rpb24uCisgIGludCBudW1BcmNzOyAgLy8gVGhlIG51bWJlciBvZiBhcmMgbGluZXMgaW4gdGhlIHJha2VBcmNzIGFycmF5LgorICBQb2ludEZsb2F0KiBmaXJzdEVkZ2VzOyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgYWxsIGVkZ2VzIGRldGVjdGVkIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBlZGdlcy4KKyAgaW50IG51bUZpcnN0RWRnZXM7ICAvLyBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZmlyc3QgZWRnZXMgYXJyYXkuCisgIFBvaW50RmxvYXQqIGxhc3RFZGdlczsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGFsbCBlZGdlcyBkZXRlY3RlZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IGVkZ2VzLgorICBpbnQgbnVtTGFzdEVkZ2VzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGxhc3QgZWRnZXMgYXJyYXkuCisgIEVkZ2VMb2NhdGlvblJlcG9ydCogYWxsRWRnZXM7ICAvLyBBbiBhcnJheSBvZiByZXBvcnRzIGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZWRnZXMgbG9jYXRlZCBieSBlYWNoIGNvbmNlbnRyaWMgcmFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJjIGxpbmUuCisgIGludCogbGluZXNXaXRoRWRnZXM7ICAvLyBBbiBhcnJheSBvZiBpbmRpY2VzIGludG8gdGhlIHJha2VBcmNzIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0aW5nIHRoZSBjb25jZW50cmljIHJha2UgYXJjIGxpbmVzIG9uIHdoaWNoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gZGV0ZWN0ZWQgYXQgbGVhc3Qgb25lIGVkZ2UuCisgIGludCBudW1MaW5lc1dpdGhFZGdlczsgIC8vIFRoZSBudW1iZXIgb2YgY29uY2VudHJpYyByYWtlIGFyYyBsaW5lcyBhbG9uZyB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZnVuY3Rpb24gZGV0ZWN0ZWQgZWRnZXMuCit9IENvbmNlbnRyaWNSYWtlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBDb25zdHJ1Y3RST0lPcHRpb25zX3N0cnVjdCB7CisgIGludCB3aW5kb3dOdW1iZXI7ICAvLyBUaGUgd2luZG93IG51bWJlciBvZiB0aGUgaW1hZ2Ugd2luZG93LgorICBjb25zdCBjaGFyKiB3aW5kb3dUaXRsZTsgIC8vIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBzdHJpbmcgdGhhdCB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5cyBpbiB0aGUgdGl0bGUgYmFyIG9mIHRoZSB3aW5kb3cuCisgIFBhbGV0dGVUeXBlIHR5cGU7ICAvLyBUaGUgcGFsZXR0ZSB0eXBlIHRvIHVzZS4KKyAgUkdCVmFsdWUqIHBhbGV0dGU7ICAvLyBJZiB0eXBlIGlzIElNQVFfUEFMRVRURV9VU0VSLCB0aGlzIGFycmF5IGlzIHRoZSBwYWxldHRlCisgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgY29sb3JzIHRvIHVzZSB3aXRoIHRoZSB3aW5kb3cuCisgIGludCBudW1Db2xvcnM7ICAvLyBJZiB0eXBlIGlzIElNQVFfUEFMRVRURV9VU0VSLCB0aGlzIGVsZW1lbnQgaXMgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgLy8gY29sb3JzIGluIHRoZSBwYWxldHRlIGFycmF5LgorfSBDb25zdHJ1Y3RST0lPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBDb250b3VySW5mb19zdHJ1Y3QgeworICBDb250b3VyVHlwZSB0eXBlOyAgLy8gVGhlIGNvbnRvdXIgdHlwZS4KKyAgdW5zaWduZWQgbnVtUG9pbnRzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBtYWtlIHVwIHRoZSBjb250b3VyLgorICBQb2ludCogcG9pbnRzOyAgLy8gVGhlIHBvaW50cyBkZXNjcmliaW5nIHRoZSBjb250b3VyLgorICBSR0JWYWx1ZSBjb250b3VyQ29sb3I7ICAvLyBUaGUgY29udG91ciBjb2xvci4KK30gQ29udG91ckluZm87CisKK3R5cGVkZWYgdW5pb24gQ29udG91clVuaW9uX3VuaW9uIHsKKyAgUG9pbnQqIHBvaW50OyAgLy8gVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZSBJTUFRX1BPSU5ULgorICBMaW5lKiBsaW5lOyAgLy8gVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZSBJTUFRX0xJTkUuCisgIFJlY3QqIHJlY3Q7ICAvLyBVc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlIElNQVFfUkVDVC4KKyAgUmVjdCogb3ZhbEJvdW5kaW5nQm94OyAgLy8gVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJTUFRX09WQUwuCisgIENsb3NlZENvbnRvdXIqIGNsb3NlZENvbnRvdXI7ICAvLyBVc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJTUFRX0NMT1NFRF9DT05UT1VSLgorICBPcGVuQ29udG91ciogb3BlbkNvbnRvdXI7ICAvLyBVc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElNQVFfT1BFTl9DT05UT1VSLgorICBBbm51bHVzKiBhbm51bHVzOyAgLy8gVXNlIHRoaXMgbWVtYmVyIHdoZW4gdGhlIGNvbnRvdXIgaXMgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgLy8gSU1BUV9BTk5VTFVTLgorICBSb3RhdGVkUmVjdCogcm90YXRlZFJlY3Q7ICAvLyBVc2UgdGhpcyBtZW1iZXIgd2hlbiB0aGUgY29udG91ciBpcyBvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElNQVFfUk9UQVRFRF9SRUNULgorfSBDb250b3VyVW5pb247CisKK3R5cGVkZWYgc3RydWN0IENvbnRvdXJJbmZvMl9zdHJ1Y3QgeworICBDb250b3VyVHlwZSB0eXBlOyAgLy8gVGhlIGNvbnRvdXIgdHlwZS4KKyAgUkdCVmFsdWUgY29sb3I7ICAvLyBUaGUgY29udG91ciBjb2xvci4KKyAgQ29udG91clVuaW9uIHN0cnVjdHVyZTsgIC8vIFRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgdGhlIGNvbnRvdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNvb3JkaW5hdGUgc3BhY2UuCit9IENvbnRvdXJJbmZvMjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29udG91clBvaW50X3N0cnVjdCB7CisgIGRvdWJsZSB4OyAgLy8gVGhlIHgtY29vcmRpbmF0ZSB2YWx1ZSBpbiB0aGUgaW1hZ2UuCisgIGRvdWJsZSB5OyAgLy8gVGhlIHktY29vcmRpbmF0ZSB2YWx1ZSBpbiB0aGUgaW1hZ2UuCisgIGRvdWJsZSBjdXJ2YXR1cmU7ICAvLyBUaGUgY2hhbmdlIGluIHNsb3BlIGF0IHRoaXMgZWRnZSBwb2ludCBvZiB0aGUgc2VnbWVudC4KKyAgZG91YmxlIHhEaXNwbGFjZW1lbnQ7ICAvLyBUaGUgeCBkaXNwbGFjZW1lbnQgb2YgdGhlIGN1cnJlbnQgZWRnZSBwaXhlbCBmcm9tIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdWJpYyBzcGxpbmUgZml0IG9mIHRoZSBjdXJyZW50IGVkZ2Ugc2VnbWVudC4KKyAgZG91YmxlIHlEaXNwbGFjZW1lbnQ7ICAvLyBUaGUgeSBkaXNwbGFjZW1lbnQgb2YgdGhlIGN1cnJlbnQgZWRnZSBwaXhlbCBmcm9tIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdWJpYyBzcGxpbmUgZml0IG9mIHRoZSBjdXJyZW50IGVkZ2Ugc2VnbWVudC4KK30gQ29udG91clBvaW50OworCit0eXBlZGVmIHN0cnVjdCBDb29yZGluYXRlVHJhbnNmb3JtX3N0cnVjdCB7CisgIFBvaW50IGluaXRpYWxPcmlnaW47ICAvLyBUaGUgb3JpZ2luIG9mIHRoZSBpbml0aWFsIGNvb3JkaW5hdGUgc3lzdGVtLgorICBmbG9hdCBpbml0aWFsQW5nbGU7ICAvLyBUaGUgYW5nbGUsIGluIGRlZ3JlZXMsIG9mIHRoZSB4LWF4aXMgb2YgdGhlIGluaXRpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZSBzeXN0ZW0gcmVsYXRpdmUgdG8gdGhlIGltYWdlIHgtYXhpcy4KKyAgUG9pbnQgZmluYWxPcmlnaW47ICAvLyBUaGUgb3JpZ2luIG9mIHRoZSBmaW5hbCBjb29yZGluYXRlIHN5c3RlbS4KKyAgZmxvYXQgZmluYWxBbmdsZTsgIC8vIFRoZSBhbmdsZSwgaW4gZGVncmVlcywgb2YgdGhlIHgtYXhpcyBvZiB0aGUgZmluYWwKKyAgICAgICAgICAgICAgICAgICAgIC8vIGNvb3JkaW5hdGUgc3lzdGVtIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSB4LWF4aXMuCit9IENvb3JkaW5hdGVUcmFuc2Zvcm07CisKK3R5cGVkZWYgc3RydWN0IENvb3JkaW5hdGVUcmFuc2Zvcm0yX3N0cnVjdCB7CisgIENvb3JkaW5hdGVTeXN0ZW0KKyAgICAgIHJlZmVyZW5jZVN5c3RlbTsgIC8vIERlZmluZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGZvciBpbnB1dCBjb29yZGluYXRlcy4KKyAgQ29vcmRpbmF0ZVN5c3RlbSBtZWFzdXJlbWVudFN5c3RlbTsgIC8vIERlZmluZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGluIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYXN1cmVtZW50cy4KK30gQ29vcmRpbmF0ZVRyYW5zZm9ybTI7CisKK3R5cGVkZWYgc3RydWN0IENhbm55T3B0aW9uc19zdHJ1Y3QgeworICBmbG9hdCBzaWdtYTsgIC8vIFRoZSBzaWdtYSBvZiB0aGUgR2F1c3NpYW4gc21vb3RoaW5nIGZpbHRlciB0aGF0IHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgIC8vIGFwcGxpZXMgdG8gdGhlIGltYWdlIGJlZm9yZSBlZGdlIGRldGVjdGlvbi4KKyAgZmxvYXQgdXBwZXJUaHJlc2hvbGQ7ICAvLyBUaGUgdXBwZXIgZnJhY3Rpb24gb2YgcGl4ZWwgdmFsdWVzIGluIHRoZSBpbWFnZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdGhlIGZ1bmN0aW9uIGNob29zZXMgYSBzZWVkIG9yIHN0YXJ0aW5nIHBvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgYW4gZWRnZSBzZWdtZW50LgorICBmbG9hdCBsb3dlclRocmVzaG9sZDsgIC8vIFRoZSBmdW5jdGlvbiBtdWx0aXBsaWVzIHRoaXMgdmFsdWUgYnkgdXBwZXJUaHJlc2hvbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIGxvd2VyIHRocmVzaG9sZCBmb3IgYWxsIHRoZSBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbiBlZGdlIHNlZ21lbnQuCisgIGludCB3aW5kb3dTaXplOyAgLy8gVGhlIHdpbmRvdyBzaXplIG9mIHRoZSBHYXVzc2lhbiBmaWx0ZXIgdGhhdCB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIHRvIHRoZSBpbWFnZS4KK30gQ2FubnlPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBSYW5nZV9zdHJ1Y3QgeworICBpbnQgbWluVmFsdWU7ICAvLyBUaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UuCisgIGludCBtYXhWYWx1ZTsgIC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSByYW5nZS4KK30gUmFuZ2U7CisKK3R5cGVkZWYgc3RydWN0IFVzZXJQb2ludFN5bWJvbF9zdHJ1Y3QgeworICBpbnQgY29sczsgIC8vIE51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBzeW1ib2wuCisgIGludCByb3dzOyAgLy8gTnVtYmVyIG9mIHJvd3MgaW4gdGhlIHN5bWJvbC4KKyAgaW50KiBwaXhlbHM7ICAvLyBUaGUgcGl4ZWxzIG9mIHRoZSBzeW1ib2wuCit9IFVzZXJQb2ludFN5bWJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgVmlldzNET3B0aW9uc19zdHJ1Y3QgeworICBpbnQgc2l6ZVJlZHVjdGlvbjsgIC8vIEEgZGl2aXNvciB0aGUgZnVuY3Rpb24gdXNlcyB3aGVuIGRldGVybWluaW5nIHRoZSBmaW5hbAorICAgICAgICAgICAgICAgICAgICAgIC8vIGhlaWdodCBhbmQgd2lkdGggb2YgdGhlIDNEIGltYWdlLgorICBpbnQgbWF4SGVpZ2h0OyAgLy8gRGVmaW5lcyB0aGUgbWF4aW11bSBoZWlnaHQgb2YgYSBwaXhlbCBmcm9tIHRoZSBpbWFnZSBzb3VyY2UKKyAgICAgICAgICAgICAgICAgIC8vIGRyYXduIGluIDNELgorICBEaXJlY3Rpb24zRCBkaXJlY3Rpb247ICAvLyBEZWZpbmVzIHRoZSAzRCBvcmllbnRhdGlvbi4KKyAgZmxvYXQgYWxwaGE7ICAvLyBEZXRlcm1pbmVzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBob3Jpem9udGFsIGFuZCB0aGUgYmFzZWxpbmUuCisgIGZsb2F0IGJldGE7ICAvLyBEZXRlcm1pbmVzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBob3Jpem9udGFsIGFuZCB0aGUgc2Vjb25kCisgICAgICAgICAgICAgICAvLyBiYXNlbGluZS4KKyAgaW50IGJvcmRlcjsgIC8vIERlZmluZXMgdGhlIGJvcmRlciBzaXplLgorICBpbnQgYmFja2dyb3VuZDsgIC8vIERlZmluZXMgdGhlIGJhY2tncm91bmQgY29sb3IuCisgIFBsYW5lM0QgcGxhbmU7ICAvLyBJbmRpY2F0ZXMgdGhlIHZpZXcgYSBmdW5jdGlvbiB1c2VzIHRvIHNob3cgY29tcGxleCBpbWFnZXMuCit9IFZpZXczRE9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IE1hdGNoUGF0dGVybk9wdGlvbnNfc3RydWN0IHsKKyAgTWF0Y2hpbmdNb2RlIG1vZGU7ICAvLyBTcGVjaWZpZXMgdGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBsb29raW5nIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBwYXR0ZXJuIGluIHRoZSBpbWFnZS4KKyAgaW50IG1pbkNvbnRyYXN0OyAgLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGNvbnRyYXN0IGV4cGVjdGVkIGluIHRoZSBpbWFnZS4KKyAgaW50IHN1YnBpeGVsQWNjdXJhY3k7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gcmV0dXJuIGFyZWFzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4gYXJlYSB3aXRoIHN1YnBpeGVsCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdXJhY3kuCisgIFJvdGF0aW9uQW5nbGVSYW5nZSogYW5nbGVSYW5nZXM7ICAvLyBBbiBhcnJheSBvZiBhbmdsZSByYW5nZXMsIGluIGRlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSBlYWNoIHJhbmdlIHNwZWNpZmllcyBob3cgbXVjaCB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdCB0aGUgcGF0dGVybiB0byBiZSByb3RhdGVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UuCisgIGludCBudW1SYW5nZXM7ICAvLyBOdW1iZXIgb2YgYW5nbGUgcmFuZ2VzIGluIHRoZSBhbmdsZVJhbmdlcyBhcnJheS4KKyAgaW50IG51bU1hdGNoZXNSZXF1ZXN0ZWQ7ICAvLyBOdW1iZXIgb2YgdmFsaWQgbWF0Y2hlcyBleHBlY3RlZC4KKyAgaW50IG1hdGNoRmFjdG9yOyAgLy8gQ29udHJvbHMgdGhlIG51bWJlciBvZiBwb3RlbnRpYWwgbWF0Y2hlcyB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBleGFtaW5lcy4KKyAgZmxvYXQgbWluTWF0Y2hTY29yZTsgIC8vIFRoZSBtaW5pbXVtIHNjb3JlIGEgbWF0Y2ggY2FuIGhhdmUgZm9yIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29uc2lkZXIgdGhlIG1hdGNoIHZhbGlkLgorfSBNYXRjaFBhdHRlcm5PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBUSUZGRmlsZU9wdGlvbnNfc3RydWN0IHsKKyAgaW50IHJvd3NQZXJTdHJpcDsgIC8vIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHJvd3MgdGhhdCB0aGUgZnVuY3Rpb24gd3JpdGVzCisgICAgICAgICAgICAgICAgICAgICAvLyBwZXIgc3RyaXAuCisgIFBob3RvbWV0cmljTW9kZQorICAgICAgcGhvdG9JbnRlcnA7ICAvLyBEZXNpZ25hdGVzIHdoaWNoIHBob3RvbWV0cmljIGludGVycHJldGF0aW9uIHRvIHVzZS4KKyAgVElGRkNvbXByZXNzaW9uVHlwZSBjb21wcmVzc2lvblR5cGU7ICAvLyBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgY29tcHJlc3Npb24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2Ugb24gdGhlIFRJRkYgZmlsZS4KK30gVElGRkZpbGVPcHRpb25zOworCit0eXBlZGVmIHVuaW9uIENvbG9yX3VuaW9uIHsKKyAgUkdCVmFsdWUgcmdiOyAgLy8gVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBSR0IgKFJlZCwKKyAgICAgICAgICAgICAgICAgLy8gR3JlZW4sIGFuZCBCbHVlKSBjb2xvciBzcGFjZS4KKyAgSFNMVmFsdWUgaHNsOyAgLy8gVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXNjcmliZSBhIGNvbG9yIGluIHRoZSBIU0wgKEh1ZSwKKyAgICAgICAgICAgICAgICAgLy8gU2F0dXJhdGlvbiwgYW5kIEx1bWluYW5jZSkgY29sb3Igc3BhY2UuCisgIEhTVlZhbHVlIGhzdjsgIC8vIFRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgSFNJIChIdWUsCisgICAgICAgICAgICAgICAgIC8vIFNhdHVyYXRpb24sIGFuZCBWYWx1ZSkgY29sb3Igc3BhY2UuCisgIEhTSVZhbHVlIGhzaTsgIC8vIFRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVzY3JpYmUgYSBjb2xvciBpbiB0aGUgSFNJIChIdWUsCisgICAgICAgICAgICAgICAgIC8vIFNhdHVyYXRpb24sIGFuZCBJbnRlbnNpdHkpIGNvbG9yIHNwYWNlLgorICBpbnQgcmF3VmFsdWU7ICAvLyBUaGUgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIGRhdGEgaW4gdGhlIGNvbG9yIHVuaW9uLgorfSBDb2xvcjsKKwordHlwZWRlZiB1bmlvbiBQaXhlbFZhbHVlX3VuaW9uIHsKKyAgZmxvYXQgZ3JheXNjYWxlOyAgLy8gQSBncmF5c2NhbGUgcGl4ZWwgdmFsdWUuCisgIFJHQlZhbHVlIHJnYjsgIC8vIEEgUkdCIHBpeGVsIHZhbHVlLgorICBIU0xWYWx1ZSBoc2w7ICAvLyBBIEhTTCBwaXhlbCB2YWx1ZS4KKyAgQ29tcGxleCBjb21wbGV4OyAgLy8gQSBjb21wbGV4IHBpeGVsIHZhbHVlLgorICBSR0JVNjRWYWx1ZSByZ2J1NjQ7ICAvLyBBbiB1bnNpZ25lZCA2NC1iaXQgUkdCIHBpeGVsIHZhbHVlLgorfSBQaXhlbFZhbHVlOworCit0eXBlZGVmIHN0cnVjdCBPcGVuQ29udG91cl9zdHJ1Y3QgeworICBQb2ludCogcG9pbnRzOyAgLy8gVGhlIHBvaW50cyB0aGF0IG1ha2UgdXAgdGhlIG9wZW4gY29udG91ci4KKyAgaW50IG51bVBvaW50czsgIC8vIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBhcnJheS4KK30gT3BlbkNvbnRvdXI7CisKK3R5cGVkZWYgc3RydWN0IE92ZXJsYXlUZXh0T3B0aW9uc19zdHJ1Y3QgeworICBjb25zdCBjaGFyKiBmb250TmFtZTsgIC8vIFRoZSBuYW1lIG9mIHRoZSBmb250IHRvIHVzZS4KKyAgaW50IGZvbnRTaXplOyAgLy8gVGhlIHNpemUgb2YgdGhlIGZvbnQuCisgIGludCBib2xkOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIGJvbGQgdGhlIHRleHQuCisgIGludCBpdGFsaWM7ICAvLyBTZXQgdGhpcyBlbGVtZW50IHRvIFRSVUUgdG8gaXRhbGljaXplIHRoZSB0ZXh0LgorICBpbnQgdW5kZXJsaW5lOyAgLy8gU2V0IHRoaXMgZWxlbWVudCB0byBUUlVFIHRvIHVuZGVybGluZSB0aGUgdGV4dC4KKyAgaW50IHN0cmlrZW91dDsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBzdHJpa2VvdXQgdGhlIHRleHQuCisgIFRleHRBbGlnbm1lbnQgaG9yaXpvbnRhbFRleHRBbGlnbm1lbnQ7ICAvLyBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHRleHQuCisgIFZlcnRpY2FsVGV4dEFsaWdubWVudAorICAgICAgdmVydGljYWxUZXh0QWxpZ25tZW50OyAgLy8gU2V0cyB0aGUgdmVydGljYWwgYWxpZ25tZW50IGZvciB0aGUgdGV4dC4KKyAgUkdCVmFsdWUgYmFja2dyb3VuZENvbG9yOyAgLy8gU2V0cyB0aGUgY29sb3IgZm9yIHRoZSB0ZXh0IGJhY2tncm91bmQgcGl4ZWxzLgorICBkb3VibGUgYW5nbGU7ICAvLyBUaGUgY291bnRlcmNsb2Nrd2lzZSBhbmdsZSwgaW4gZGVncmVlcywgb2YgdGhlIHRleHQgcmVsYXRpdmUKKyAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHgtYXhpcy4KK30gT3ZlcmxheVRleHRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhX3N0cnVjdCB7CisgIE1lYXN1cmVtZW50VmFsdWUgcGFyYW1ldGVyOyAgLy8gVGhlIG1vcnBob2xvZ2ljYWwgbWVhc3VyZW1lbnQgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiB1c2VzIGZvciBmaWx0ZXJpbmcuCisgIGZsb2F0IGxvd2VyOyAgLy8gVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBjcml0ZXJpYSByYW5nZS4KKyAgZmxvYXQgdXBwZXI7ICAvLyBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIGNyaXRlcmlhIHJhbmdlLgorICBpbnQgZXhjbHVkZTsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBpbmRpY2F0ZSB0aGF0IGEgbWF0Y2ggb2NjdXJzIHdoZW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgaXMgb3V0c2lkZSB0aGUgY3JpdGVyaWEgcmFuZ2UuCit9IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWE7CisKK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlUmVwb3J0X3N0cnVjdCB7CisgIGludCBhcmVhOyAgLy8gVGhlIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlIHBhcnRpY2xlLgorICBmbG9hdCBjYWxpYnJhdGVkQXJlYTsgIC8vIFRoZSBzaXplIG9mIHRoZSBwYXJ0aWNsZSwgY2FsaWJyYXRlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUgaW1hZ2UuCisgIGZsb2F0IHBlcmltZXRlcjsgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHBlcmltZXRlciwgY2FsaWJyYXRlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gb2YgdGhlIGltYWdlLgorICBpbnQgbnVtSG9sZXM7ICAvLyBUaGUgbnVtYmVyIG9mIGhvbGVzIGluIHRoZSBwYXJ0aWNsZS4KKyAgaW50IGFyZWFPZkhvbGVzOyAgLy8gVGhlIHRvdGFsIHN1cmZhY2UgYXJlYSwgaW4gcGl4ZWxzLCBvZiBhbGwgdGhlIGhvbGVzIGluIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFydGljbGUuCisgIGZsb2F0IHBlcmltZXRlck9mSG9sZXM7ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBwZXJpbWV0ZXIgb2YgYWxsIHRoZSBob2xlcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBhcnRpY2xlIGNhbGlicmF0ZWQgdG8gdGhlIGNhbGlicmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBvZiB0aGUgaW1hZ2UuCisgIFJlY3QgYm91bmRpbmdCb3g7ICAvLyBUaGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQgZW5jbG9zZXMgdGhlIHBhcnRpY2xlLgorICBmbG9hdCBzaWdtYVg7ICAvLyBUaGUgc3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcy4KKyAgZmxvYXQgc2lnbWFZOyAgLy8gVGhlIHN1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB5LWF4aXMuCisgIGZsb2F0IHNpZ21hWFg7ICAvLyBUaGUgc3VtIG9mIHRoZSBwYXJ0aWNsZSBwaXhlbHMgb24gdGhlIHgtYXhpcywgc3F1YXJlZC4KKyAgZmxvYXQgc2lnbWFZWTsgIC8vIFRoZSBzdW0gb2YgdGhlIHBhcnRpY2xlIHBpeGVscyBvbiB0aGUgeS1heGlzLCBzcXVhcmVkLgorICBmbG9hdCBzaWdtYVhZOyAgLy8gVGhlIHN1bSBvZiB0aGUgcGFydGljbGUgcGl4ZWxzIG9uIHRoZSB4LWF4aXMgYW5kIHktYXhpcy4KKyAgaW50IGxvbmdlc3RMZW5ndGg7ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGhvcml6b250YWwgbGluZSBzZWdtZW50LgorICBQb2ludCBsb25nZXN0UG9pbnQ7ICAvLyBUaGUgbG9jYXRpb24gb2YgdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBsb25nZXN0CisgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZ21lbnQgaW4gdGhlIHBhcnRpY2xlLgorICBpbnQgcHJvamVjdGlvblg7ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBwYXJ0aWNsZSB3aGVuIHByb2plY3RlZCBvbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB4LWF4aXMuCisgIGludCBwcm9qZWN0aW9uWTsgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHBhcnRpY2xlIHdoZW4gcHJvamVjdGVkIG9udG8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHktYXhpcy4KKyAgaW50IGNvbm5lY3Q4OyAgLy8gVGhpcyBlbGVtZW50IGlzIFRSVUUgaWYgdGhlIGZ1bmN0aW9uIHVzZWQgY29ubmVjdGl2aXR5LTggdG8KKyAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHBhcnRpY2xlcyBhcmUgdG91Y2hpbmcuCit9IFBhcnRpY2xlUmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBQYXR0ZXJuTWF0Y2hfc3RydWN0IHsKKyAgUG9pbnRGbG9hdCBwb3NpdGlvbjsgIC8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBtYXRjaC4KKyAgZmxvYXQgcm90YXRpb247ICAvLyBUaGUgcm90YXRpb24gb2YgdGhlIG1hdGNoIHJlbGF0aXZlIHRvIHRoZSB0ZW1wbGF0ZSBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAvLyBpbiBkZWdyZWVzLgorICBmbG9hdCBzY2FsZTsgIC8vIFRoZSBzaXplIG9mIHRoZSBtYXRjaCByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdGVtcGxhdGUKKyAgICAgICAgICAgICAgICAvLyBpbWFnZSwgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZS4KKyAgZmxvYXQgc2NvcmU7ICAvLyBUaGUgYWNjdXJhY3kgb2YgdGhlIG1hdGNoLgorICBQb2ludEZsb2F0IGNvcm5lcls0XTsgIC8vIEFuIGFycmF5IG9mIGZvdXIgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIHJlY3RhbmdsZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cnJvdW5kaW5nIHRoZSB0ZW1wbGF0ZSBpbWFnZS4KK30gUGF0dGVybk1hdGNoOworCit0eXBlZGVmIHN0cnVjdCBRdWFudGlmeURhdGFfc3RydWN0IHsKKyAgZmxvYXQgbWVhbjsgIC8vIFRoZSBtZWFuIHZhbHVlIG9mIHRoZSBwaXhlbCB2YWx1ZXMuCisgIGZsb2F0IHN0ZERldjsgIC8vIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHBpeGVsIHZhbHVlcy4KKyAgZmxvYXQgbWluOyAgLy8gVGhlIHNtYWxsZXN0IHBpeGVsIHZhbHVlLgorICBmbG9hdCBtYXg7ICAvLyBUaGUgbGFyZ2VzdCBwaXhlbCB2YWx1ZS4KKyAgZmxvYXQgY2FsaWJyYXRlZEFyZWE7ICAvLyBUaGUgYXJlYSwgY2FsaWJyYXRlZCB0byB0aGUgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgaW1hZ2UuCisgIGludCBwaXhlbEFyZWE7ICAvLyBUaGUgYXJlYSwgaW4gbnVtYmVyIG9mIHBpeGVscy4KKyAgZmxvYXQgcmVsYXRpdmVTaXplOyAgLy8gVGhlIHByb3BvcnRpb24sIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHJlZ2lvbiByZWxhdGl2ZSB0byB0aGUgd2hvbGUgaW1hZ2UuCit9IFF1YW50aWZ5RGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgUXVhbnRpZnlSZXBvcnRfc3RydWN0IHsKKyAgUXVhbnRpZnlEYXRhIGdsb2JhbDsgIC8vIFN0YXRpc3RpY2FsIGRhdGEgb2YgdGhlIHdob2xlIGltYWdlLgorICBRdWFudGlmeURhdGEqIHJlZ2lvbnM7ICAvLyBBbiBhcnJheSBvZiBRdWFudGlmeURhdGEgc3RydWN0dXJlcyBjb250YWluaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRpc3RpY2FsIGRhdGEgb2YgZWFjaCByZWdpb24gb2YgdGhlIGltYWdlLgorICBpbnQgcmVnaW9uQ291bnQ7ICAvLyBUaGUgbnVtYmVyIG9mIHJlZ2lvbnMuCit9IFF1YW50aWZ5UmVwb3J0OworCit0eXBlZGVmIHN0cnVjdCBSYWtlT3B0aW9uc19zdHJ1Y3QgeworICBpbnQgdGhyZXNob2xkOyAgLy8gU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZm9yIHRoZSBjb250cmFzdCBvZiB0aGUgZWRnZS4KKyAgaW50IHdpZHRoOyAgLy8gVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gYXZlcmFnZXMgdG8gZmluZCB0aGUKKyAgICAgICAgICAgICAgLy8gY29udHJhc3QgYXQgZWl0aGVyIHNpZGUgb2YgdGhlIGVkZ2UuCisgIGludCBzdGVlcG5lc3M7ICAvLyBUaGUgc3BhbiwgaW4gcGl4ZWxzLCBvZiB0aGUgc2xvcGUgb2YgdGhlIGVkZ2UgcHJvamVjdGVkCisgICAgICAgICAgICAgICAgICAvLyBhbG9uZyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IHBvaW50cy4KKyAgaW50IHN1YnNhbXBsaW5nUmF0aW87ICAvLyBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCBzZXBhcmF0ZSB0d28KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zZWN1dGl2ZSBzZWFyY2ggbGluZXMuCisgIEludGVycG9sYXRpb25NZXRob2Qgc3VicGl4ZWxUeXBlOyAgLy8gVGhlIG1ldGhvZCBmb3IgaW50ZXJwb2xhdGluZy4KKyAgaW50IHN1YnBpeGVsRGl2aXNpb25zOyAgLy8gVGhlIG51bWJlciBvZiBzYW1wbGVzIHRoZSBmdW5jdGlvbiBvYnRhaW5zIGZyb20gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbC4KK30gUmFrZU9wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFJha2VSZXBvcnRfc3RydWN0IHsKKyAgTGluZUZsb2F0KiByYWtlTGluZXM7ICAvLyBUaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiBlYWNoIG9mIHRoZSByYWtlIGxpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgZnVuY3Rpb24uCisgIGludCBudW1SYWtlTGluZXM7ICAvLyBUaGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSByYWtlTGluZXMgYXJyYXkuCisgIFBvaW50RmxvYXQqIGZpcnN0RWRnZXM7ICAvLyBUaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiBhbGwgZWRnZXMgZGV0ZWN0ZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVkZ2VzLgorICB1bnNpZ25lZCBpbnQgbnVtRmlyc3RFZGdlczsgIC8vIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBmaXJzdEVkZ2VzIGFycmF5LgorICBQb2ludEZsb2F0KiBsYXN0RWRnZXM7ICAvLyBUaGUgY29vcmRpbmF0ZSBsb2NhdGlvbiBvZiBhbGwgZWRnZXMgZGV0ZWN0ZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBlZGdlcy4KKyAgdW5zaWduZWQgaW50IG51bUxhc3RFZGdlczsgIC8vIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBsYXN0RWRnZXMgYXJyYXkuCisgIEVkZ2VMb2NhdGlvblJlcG9ydCogYWxsRWRnZXM7ICAvLyBBbiBhcnJheSBvZiByZXBvcnRzIGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZWRnZXMgbG9jYXRlZCBieSBlYWNoIHJha2UgbGluZS4KKyAgaW50KiBsaW5lc1dpdGhFZGdlczsgIC8vIEFuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUgcmFrZUxpbmVzIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0aW5nIHRoZSByYWtlIGxpbmVzIG9uIHdoaWNoIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZWN0ZWQgYXQgbGVhc3Qgb25lIGVkZ2UuCisgIGludCBudW1MaW5lc1dpdGhFZGdlczsgIC8vIFRoZSBudW1iZXIgb2YgcmFrZSBsaW5lcyBhbG9uZyB3aGljaCB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZWN0ZWQgZWRnZXMuCit9IFJha2VSZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFRyYW5zZm9ybVJlcG9ydF9zdHJ1Y3QgeworICBQb2ludEZsb2F0KiBwb2ludHM7ICAvLyBBbiBhcnJheSBvZiB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KKyAgaW50KiB2YWxpZFBvaW50czsgIC8vIEFuIGFycmF5IG9mIHZhbHVlcyB0aGF0IGRlc2NyaWJlIHRoZSB2YWxpZGl0eSBvZiBlYWNoIG9mCisgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29vcmRpbmF0ZXMgYWNjb3JkaW5nIHRvIHRoZSByZWdpb24gb2YgaW50ZXJlc3QgeW91CisgICAgICAgICAgICAgICAgICAgICAvLyBjYWxpYnJhdGVkIHVzaW5nIGVpdGhlciBpbWFxTGVhcm5DYWxpYnJhdGlvbkdyaWQoKSBvcgorICAgICAgICAgICAgICAgICAgICAgLy8gaW1hcUxlYXJuQ2FsaWJyYXRpb25Qb2ludHMoKS4KKyAgaW50IG51bVBvaW50czsgIC8vIFRoZSBsZW5ndGggb2YgYm90aCB0aGUgcG9pbnRzIGFycmF5IGFuZCB0aGUgdmFsaWRQb2ludHMKKyAgICAgICAgICAgICAgICAgIC8vIGFycmF5LgorfSBUcmFuc2Zvcm1SZXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IFNoYXBlUmVwb3J0X3N0cnVjdCB7CisgIFJlY3QgY29vcmRpbmF0ZXM7ICAvLyBUaGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBvYmplY3QuCisgIFBvaW50IGNlbnRyb2lkOyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgdGhlIGNlbnRyb2lkIG9mIHRoZSBvYmplY3QuCisgIGludCBzaXplOyAgLy8gVGhlIHNpemUsIGluIHBpeGVscywgb2YgdGhlIG9iamVjdC4KKyAgZG91YmxlIHNjb3JlOyAgLy8gQSB2YWx1ZSByYW5naW5nIGJldHdlZW4gMSBhbmQgMSwwMDAgdGhhdCBzcGVjaWZpZXMgaG93CisgICAgICAgICAgICAgICAgIC8vIHNpbWlsYXIgdGhlIG9iamVjdCBpbiB0aGUgaW1hZ2UgaXMgdG8gdGhlIHRlbXBsYXRlLgorfSBTaGFwZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgTWV0ZXJBcmNfc3RydWN0IHsKKyAgUG9pbnRGbG9hdAorICAgICAgbmVlZGxlQmFzZTsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHRoZSBiYXNlIG9mIHRoZSBtZXRlciBuZWVkbGUuCisgIFBvaW50RmxvYXQqIGFyY0Nvb3JkUG9pbnRzOyAgLy8gQW4gYXJyYXkgb2YgcG9pbnRzIGRlc2NyaWJpbmcgdGhlIGNvb3JkaW5hdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbiBvZiB0aGUgbWV0ZXIgYXJjLgorICBpbnQgbnVtT2ZBcmNDb29yZFBvaW50czsgIC8vIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBhcmNDb29yZFBvaW50cyBhcnJheS4KKyAgaW50IG5lZWRsZUNvbG9yOyAgLy8gVGhpcyBlbGVtZW50IGlzIFRSVUUgd2hlbiB0aGUgbWV0ZXIgaGFzIGEgbGlnaHQtY29sb3JlZAorICAgICAgICAgICAgICAgICAgICAvLyBuZWVkbGUgb24gYSBkYXJrIGJhY2tncm91bmQuCit9IE1ldGVyQXJjOworCit0eXBlZGVmIHN0cnVjdCBUaHJlc2hvbGREYXRhX3N0cnVjdCB7CisgIGZsb2F0IHJhbmdlTWluOyAgLy8gVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSB0byBrZWVwLgorICBmbG9hdCByYW5nZU1heDsgIC8vIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UgdG8ga2VlcC4KKyAgZmxvYXQgbmV3VmFsdWU7ICAvLyBJZiB1c2VOZXdWYWx1ZSBpcyBUUlVFLCBuZXdWYWx1ZSBpcyB0aGUgcmVwbGFjZW1lbnQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAvLyBmb3IgcGl4ZWxzIHdpdGhpbiB0aGUgcmFuZ2UuCisgIGludCB1c2VOZXdWYWx1ZTsgIC8vIElmIFRSVUUsIHRoZSBmdW5jdGlvbiBzZXRzIHBpeGVsIHZhbHVlcyB3aXRoaW4gW3JhbmdlTWluLAorICAgICAgICAgICAgICAgICAgICAvLyByYW5nZU1heF0gdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiBuZXdWYWx1ZS4KK30gVGhyZXNob2xkRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgU3RydWN0dXJpbmdFbGVtZW50X3N0cnVjdCB7CisgIGludCBtYXRyaXhDb2xzOyAgLy8gTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIG1hdHJpeC4KKyAgaW50IG1hdHJpeFJvd3M7ICAvLyBOdW1iZXIgb2Ygcm93cyBpbiB0aGUgbWF0cml4LgorICBpbnQgaGV4YTsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSBpZiB5b3Ugc3BlY2lmeSBhIGhleGFnb25hbCBzdHJ1Y3R1cmluZworICAgICAgICAgICAgIC8vIGVsZW1lbnQgaW4ga2VybmVsLgorICBpbnQqIGtlcm5lbDsgIC8vIFRoZSB2YWx1ZXMgb2YgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuCit9IFN0cnVjdHVyaW5nRWxlbWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgU3Bva2VSZXBvcnRfc3RydWN0IHsKKyAgTGluZUZsb2F0KiBzcG9rZUxpbmVzOyAgLy8gVGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2YgZWFjaCBvZiB0aGUgc3Bva2UgbGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgZnVuY3Rpb24uCisgIGludCBudW1TcG9rZUxpbmVzOyAgLy8gVGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgc3Bva2VMaW5lcyBhcnJheS4KKyAgUG9pbnRGbG9hdCogZmlyc3RFZGdlczsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGFsbCBlZGdlcyBkZXRlY3RlZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgZWRnZXMuCisgIGludCBudW1GaXJzdEVkZ2VzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGZpcnN0RWRnZXMgYXJyYXkuCisgIFBvaW50RmxvYXQqIGxhc3RFZGdlczsgIC8vIFRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIGFsbCBlZGdlcyBkZXRlY3RlZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IGVkZ2VzLgorICBpbnQgbnVtTGFzdEVkZ2VzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGxhc3RFZGdlcyBhcnJheS4KKyAgRWRnZUxvY2F0aW9uUmVwb3J0KiBhbGxFZGdlczsgIC8vIEFuIGFycmF5IG9mIHJlcG9ydHMgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBlZGdlcyBsb2NhdGVkIGJ5IGVhY2ggc3Bva2UgbGluZS4KKyAgaW50KiBsaW5lc1dpdGhFZGdlczsgIC8vIEFuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUgc3Bva2VMaW5lcyBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGluZyB0aGUgcmFrZSBsaW5lcyBvbiB3aGljaCB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdGVkIGF0IGxlYXN0IG9uZSBlZGdlLgorICBpbnQgbnVtTGluZXNXaXRoRWRnZXM7ICAvLyBUaGUgbnVtYmVyIG9mIHNwb2tlIGxpbmVzIGFsb25nIHdoaWNoIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRlY3RzIGVkZ2VzLgorfSBTcG9rZVJlcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgU2ltcGxlRWRnZU9wdGlvbnNfc3RydWN0IHsKKyAgTGV2ZWxUeXBlIHR5cGU7ICAvLyBEZXRlcm1pbmVzIGhvdyB0aGUgZnVuY3Rpb24gZXZhbHVhdGVzIHRoZSB0aHJlc2hvbGQgYW5kCisgICAgICAgICAgICAgICAgICAgLy8gaHlzdGVyZXNpcyB2YWx1ZXMuCisgIGludCB0aHJlc2hvbGQ7ICAvLyBUaGUgcGl4ZWwgdmFsdWUgYXQgd2hpY2ggYW4gZWRnZSBvY2N1cnMuCisgIGludCBoeXN0ZXJlc2lzOyAgLy8gQSB2YWx1ZSB0aGF0IGhlbHBzIGRldGVybWluZSBlZGdlcyBpbiBub2lzeSBpbWFnZXMuCisgIEVkZ2VQcm9jZXNzIHByb2Nlc3M7ICAvLyBEZXRlcm1pbmVzIHdoaWNoIGVkZ2VzIHRoZSBmdW5jdGlvbiBsb29rcyBmb3IuCisgIGludCBzdWJwaXhlbDsgIC8vIFNldCB0aGlzIGVsZW1lbnQgdG8gVFJVRSB0byBmaW5kIGVkZ2VzIHdpdGggc3VicGl4ZWwKKyAgICAgICAgICAgICAgICAgLy8gYWNjdXJhY3kgYnkgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHBvaW50cyB0byBmaW5kIHRoZQorICAgICAgICAgICAgICAgICAvLyBjcm9zc2luZyBvZiB0aGUgZ2l2ZW4gdGhyZXNob2xkLgorfSBTaW1wbGVFZGdlT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgU2VsZWN0UGFydGljbGVDcml0ZXJpYV9zdHJ1Y3QgeworICBNZWFzdXJlbWVudFZhbHVlIHBhcmFtZXRlcjsgIC8vIFRoZSBtb3JwaG9sb2dpY2FsIG1lYXN1cmVtZW50IHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gdXNlcyBmb3IgZmlsdGVyaW5nLgorICBmbG9hdCBsb3dlcjsgIC8vIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgY3JpdGVyaWEgcmFuZ2UuCisgIGZsb2F0IHVwcGVyOyAgLy8gVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSBjcml0ZXJpYSByYW5nZS4KK30gU2VsZWN0UGFydGljbGVDcml0ZXJpYTsKKwordHlwZWRlZiBzdHJ1Y3QgU2VnbWVudEluZm9fc3RydWN0IHsKKyAgaW50IG51bWJlck9mUG9pbnRzOyAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHNlZ21lbnQuCisgIGludCBpc09wZW47ICAvLyBJZiBUUlVFLCB0aGUgY29udG91ciBpcyBvcGVuLgorICBkb3VibGUgd2VpZ2h0OyAgLy8gVGhlIHNpZ25pZmljYW5jZSBvZiB0aGUgZWRnZSBpbiB0ZXJtcyBvZiB0aGUgZ3JheSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgIC8vIHRoYXQgY29uc3RpdHV0ZSB0aGUgZWRnZS4KKyAgQ29udG91clBvaW50KiBwb2ludHM7ICAvLyBUaGUgcG9pbnRzIG9mIHRoZSBzZWdtZW50LgorfSBTZWdtZW50SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgUm90YXRpb25BbmdsZVJhbmdlX3N0cnVjdCB7CisgIGZsb2F0IGxvd2VyOyAgLy8gVGhlIGxvd2VzdCBhbW91bnQgb2Ygcm90YXRpb24sIGluIGRlZ3JlZXMsIGEgdmFsaWQgcGF0dGVybgorICAgICAgICAgICAgICAgIC8vIGNhbiBoYXZlLgorICBmbG9hdCB1cHBlcjsgIC8vIFRoZSBoaWdoZXN0IGFtb3VudCBvZiByb3RhdGlvbiwgaW4gZGVncmVlcywgYSB2YWxpZCBwYXR0ZXJuCisgICAgICAgICAgICAgICAgLy8gY2FuIGhhdmUuCit9IFJvdGF0aW9uQW5nbGVSYW5nZTsKKwordHlwZWRlZiBzdHJ1Y3QgUm90YXRlZFJlY3Rfc3RydWN0IHsKKyAgaW50IHRvcDsgIC8vIExvY2F0aW9uIG9mIHRoZSB0b3AgZWRnZSBvZiB0aGUgcmVjdGFuZ2xlIGJlZm9yZSByb3RhdGlvbi4KKyAgaW50IGxlZnQ7ICAvLyBMb2NhdGlvbiBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSByZWN0YW5nbGUgYmVmb3JlIHJvdGF0aW9uLgorICBpbnQgaGVpZ2h0OyAgLy8gSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgIGludCB3aWR0aDsgIC8vIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgIGRvdWJsZSBhbmdsZTsgIC8vIFRoZSByb3RhdGlvbiwgaW4gZGVncmVlcywgb2YgdGhlIHJlY3RhbmdsZS4KK30gUm90YXRlZFJlY3Q7CisKK3R5cGVkZWYgc3RydWN0IFJPSVByb2ZpbGVfc3RydWN0IHsKKyAgTGluZVByb2ZpbGUgcmVwb3J0OyAgLy8gUXVhbnRpZnlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBvaW50cyBhbG9uZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRnZSBvZiBlYWNoIGNvbnRvdXIgaW4gdGhlIFJPSS4KKyAgUG9pbnQqIHBpeGVsczsgIC8vIEFuIGFycmF5IG9mIHRoZSBwb2ludHMgYWxvbmcgdGhlIGVkZ2Ugb2YgZWFjaCBjb250b3VyIGluCisgICAgICAgICAgICAgICAgICAvLyB0aGUgUk9JLgorfSBST0lQcm9maWxlOworCit0eXBlZGVmIHN0cnVjdCBUb29sV2luZG93T3B0aW9uc19zdHJ1Y3QgeworICBpbnQgc2hvd1NlbGVjdGlvblRvb2w7ICAvLyBJZiBUUlVFLCB0aGUgc2VsZWN0aW9uIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICBpbnQgc2hvd1pvb21Ub29sOyAgLy8gSWYgVFJVRSwgdGhlIHpvb20gdG9vbCBiZWNvbWVzIHZpc2libGUuCisgIGludCBzaG93UG9pbnRUb29sOyAgLy8gSWYgVFJVRSwgdGhlIHBvaW50IHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICBpbnQgc2hvd0xpbmVUb29sOyAgLy8gSWYgVFJVRSwgdGhlIGxpbmUgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgIGludCBzaG93UmVjdGFuZ2xlVG9vbDsgIC8vIElmIFRSVUUsIHRoZSByZWN0YW5nbGUgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgIGludCBzaG93T3ZhbFRvb2w7ICAvLyBJZiBUUlVFLCB0aGUgb3ZhbCB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgaW50IHNob3dQb2x5Z29uVG9vbDsgIC8vIElmIFRSVUUsIHRoZSBwb2x5Z29uIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICBpbnQgc2hvd0Nsb3NlZEZyZWVoYW5kVG9vbDsgIC8vIElmIFRSVUUsIHRoZSBjbG9zZWQgZnJlZWhhbmQgdG9vbCBiZWNvbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmlzaWJsZS4KKyAgaW50IHNob3dQb2x5TGluZVRvb2w7ICAvLyBJZiBUUlVFLCB0aGUgcG9seWxpbmUgdG9vbCBiZWNvbWVzIHZpc2libGUuCisgIGludCBzaG93RnJlZWhhbmRUb29sOyAgLy8gSWYgVFJVRSwgdGhlIGZyZWVoYW5kIHRvb2wgYmVjb21lcyB2aXNpYmxlLgorICBpbnQgc2hvd0FubnVsdXNUb29sOyAgLy8gSWYgVFJVRSwgdGhlIGFubnVsdXMgYmVjb21lcyB2aXNpYmxlLgorICBpbnQgc2hvd1JvdGF0ZWRSZWN0YW5nbGVUb29sOyAgLy8gSWYgVFJVRSwgdGhlIHJvdGF0ZWQgcmVjdGFuZ2xlIHRvb2wgYmVjb21lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmlzaWJsZS4KKyAgaW50IHNob3dQYW5Ub29sOyAgLy8gSWYgVFJVRSwgdGhlIHBhbiB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgaW50IHNob3dab29tT3V0VG9vbDsgIC8vIElmIFRSVUUsIHRoZSB6b29tIG91dCB0b29sIGJlY29tZXMgdmlzaWJsZS4KKyAgaW50IHJlc2VydmVkMjsgIC8vIFRoaXMgZWxlbWVudCBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHNldCB0byBGQUxTRS4KKyAgaW50IHJlc2VydmVkMzsgIC8vIFRoaXMgZWxlbWVudCBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHNldCB0byBGQUxTRS4KKyAgaW50IHJlc2VydmVkNDsgIC8vIFRoaXMgZWxlbWVudCBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHNldCB0byBGQUxTRS4KK30gVG9vbFdpbmRvd09wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IFNwb2tlT3B0aW9uc19zdHJ1Y3QgeworICBpbnQgdGhyZXNob2xkOyAgLy8gU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZm9yIHRoZSBjb250cmFzdCBvZiB0aGUgZWRnZS4KKyAgaW50IHdpZHRoOyAgLy8gVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgZnVuY3Rpb24gYXZlcmFnZXMgdG8gZmluZCB0aGUKKyAgICAgICAgICAgICAgLy8gY29udHJhc3QgYXQgZWl0aGVyIHNpZGUgb2YgdGhlIGVkZ2UuCisgIGludCBzdGVlcG5lc3M7ICAvLyBUaGUgc3BhbiwgaW4gcGl4ZWxzLCBvZiB0aGUgc2xvcGUgb2YgdGhlIGVkZ2UgcHJvamVjdGVkCisgICAgICAgICAgICAgICAgICAvLyBhbG9uZyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IHBvaW50cy4KKyAgZG91YmxlIHN1YnNhbXBsaW5nUmF0aW87ICAvLyBUaGUgYW5nbGUsIGluIGRlZ3JlZXMsIGJldHdlZW4gZWFjaCByYWRpYWwgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZSBpbiB0aGUgc3Bva2UuCisgIEludGVycG9sYXRpb25NZXRob2Qgc3VicGl4ZWxUeXBlOyAgLy8gVGhlIG1ldGhvZCBmb3IgaW50ZXJwb2xhdGluZy4KKyAgaW50IHN1YnBpeGVsRGl2aXNpb25zOyAgLy8gVGhlIG51bWJlciBvZiBzYW1wbGVzIHRoZSBmdW5jdGlvbiBvYnRhaW5zIGZyb20gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaXhlbC4KK30gU3Bva2VPcHRpb25zOworCisjaWYgIWRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX01fWDY0CisjcHJhZ21hIHBhY2socG9wKQorI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ2FsbGJhY2sgRnVuY3Rpb24gVHlwZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWZuZGVmIF9fR05VQ19fCit0eXBlZGVmIHZvaWQoSU1BUV9DQUxMQkFDSyogRXZlbnRDYWxsYmFjaykoV2luZG93RXZlbnRUeXBlIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dOdW1iZXIsIFRvb2wgdG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IHJlY3QpOworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEdsb2JhbHMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBjb25zdF9zZWcoIklNQVFWaXNpb25Db2xvckNvbnN0YW50cyIpCisjZW5kaWYKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9UUkFOU1BBUkVOVCA9IHswLCAwLCAwLCAxfTsKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9SRUQgPSB7MCwgMCwgMjU1LCAwfTsKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9CTFVFID0gezI1NSwgMCwgMCwgMH07CitzdGF0aWMgY29uc3QgUkdCVmFsdWUgSU1BUV9SR0JfR1JFRU4gPSB7MCwgMjU1LCAwLCAwfTsKK3N0YXRpYyBjb25zdCBSR0JWYWx1ZSBJTUFRX1JHQl9ZRUxMT1cgPSB7MCwgMjU1LCAyNTUsIDB9Oworc3RhdGljIGNvbnN0IFJHQlZhbHVlIElNQVFfUkdCX1dISVRFID0gezI1NSwgMjU1LCAyNTUsIDB9Oworc3RhdGljIGNvbnN0IFJHQlZhbHVlIElNQVFfUkdCX0JMQUNLID0gezAsIDAsIDAsIDB9OworI2lmbmRlZiBfX0dOVUNfXworI3ByYWdtYSBjb25zdF9zZWcoKQorI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJhY2t3YXJkcyBDb21wYXRpYmlsaXR5CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgQ29sb3JTZW5zaXRpdml0eSBDb2xvckNvbXBsZXhpdHk7CisjZGVmaW5lIElNQVFfQ09NUExFWElUWV9MT1cgSU1BUV9TRU5TSVRJVklUWV9MT1cKKyNkZWZpbmUgSU1BUV9DT01QTEVYSVRZX01FRCBJTUFRX1NFTlNJVElWSVRZX01FRAorI2RlZmluZSBJTUFRX0NPTVBMRVhJVFlfSElHSCBJTUFRX1NFTlNJVElWSVRZX0hJR0gKKyNkZWZpbmUgRVJSX0lOVkFMSURfQ09MT1JDT01QTEVYSVRZIEVSUl9JTlZBTElEX0NPTE9SU0VOU0lUSVZJVFkKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgTG9naWNhbCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFBbmQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUFuZENvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDb21wYXJlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UqIGNvbXBhcmVJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmlzb25GdW5jdGlvbiBjb21wYXJlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDb21wYXJlQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsVmFsdWUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmlzb25GdW5jdGlvbiBjb21wYXJlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTG9naWNhbERpZmZlcmVuY2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTG9naWNhbERpZmZlcmVuY2VDb25zdGFudChJbWFnZSogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTmFuZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTmFuZENvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTm9yKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFOb3JDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU9yKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFPckNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxWG5vcihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxWG5vckNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxWG9yKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFYb3JDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFBhcnRpY2xlIEFuYWx5c2lzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUNvdW50UGFydGljbGVzKEltYWdlKiBpbWFnZSwgaW50IGNvbm5lY3Rpdml0eTgsIGludCogbnVtUGFydGljbGVzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTWVhc3VyZVBhcnRpY2xlKEltYWdlKiBpbWFnZSwgaW50IHBhcnRpY2xlTnVtYmVyLCBpbnQgY2FsaWJyYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZW1lbnRUeXBlIG1lYXN1cmVtZW50LCBkb3VibGUqIHZhbHVlKTsKK0lNQVFfRlVOQyBNZWFzdXJlUGFydGljbGVzUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFNZWFzdXJlUGFydGljbGVzKEltYWdlKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVQYXJ0aWNsZXNDYWxpYnJhdGlvbk1vZGUgY2FsaWJyYXRpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVhc3VyZW1lbnRUeXBlKiBtZWFzdXJlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtTWVhc3VyZW1lbnRzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxUGFydGljbGVGaWx0ZXI0KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiogY3JpdGVyaWEsIGludCBjcml0ZXJpYUNvdW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnMyKiBvcHRpb25zLCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBudW1QYXJ0aWNsZXMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNb3JwaG9sb2d5IGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUNvbnZleEh1bGwoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFEYW5pZWxzc29uRGlzdGFuY2UoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFGaWxsSG9sZXMoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4KTsKK0lNQVFfRlVOQyBDaXJjbGVSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUZpbmRDaXJjbGVzKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBmbG9hdCBtaW5SYWRpdXMsIGZsb2F0IG1heFJhZGl1cywKKyAgICAgICAgICAgICAgICBpbnQqIG51bUNpcmNsZXMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFMYWJlbDIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4LCBpbnQqIHBhcnRpY2xlQ291bnQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxUmVqZWN0Qm9yZGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgY29ubmVjdGl2aXR5OCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2VnbWVudGF0aW9uKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2VwYXJhdGlvbihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGVyb3Npb25zLAorICAgICAgICAgICAgICAgY29uc3QgU3RydWN0dXJpbmdFbGVtZW50KiBzdHJ1Y3R1cmluZ0VsZW1lbnQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFTaW1wbGVEaXN0YW5jZShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJ1Y3R1cmluZ0VsZW1lbnQqIHN0cnVjdHVyaW5nRWxlbWVudCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNpemVGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4LCBpbnQgZXJvc2lvbnMsCisgICAgICAgICAgICAgICBTaXplVHlwZSBrZWVwU2l6ZSwgY29uc3QgU3RydWN0dXJpbmdFbGVtZW50KiBzdHJ1Y3R1cmluZ0VsZW1lbnQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFTa2VsZXRvbihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgU2tlbGV0b25NZXRob2QgbWV0aG9kKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQWNxdWlzaXRpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBJbWFnZSogSU1BUV9TVERDQUxMIGltYXFDb3B5RnJvbVJpbmcoU0VTU0lPTl9JRCBzZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlKiBpbWFnZSwgaW50IGltYWdlVG9Db3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGltYWdlTnVtYmVyLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIEltYWdlKiBJTUFRX1NURENBTEwgaW1hcUVhc3lBY3F1aXJlKGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUpOworSU1BUV9GVU5DIEltYWdlKiBJTUFRX1NURENBTEwKK2ltYXFFeHRyYWN0RnJvbVJpbmcoU0VTU0lPTl9JRCBzZXNzaW9uSUQsIGludCBpbWFnZVRvRXh0cmFjdCwgaW50KiBpbWFnZU51bWJlcik7CitJTUFRX0ZVTkMgSW1hZ2UqIElNQVFfU1REQ0FMTAoraW1hcUdyYWIoU0VTU0lPTl9JRCBzZXNzaW9uSUQsIEltYWdlKiBpbWFnZSwgaW50IGltbWVkaWF0ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxUmVsZWFzZUltYWdlKFNFU1NJT05fSUQgc2Vzc2lvbklEKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFTZXR1cEdyYWIoU0VTU0lPTl9JRCBzZXNzaW9uSUQsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2V0dXBSaW5nKFNFU1NJT05fSUQgc2Vzc2lvbklELCBJbWFnZSoqIGltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUltYWdlcywgaW50IHNraXBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFTZXR1cFNlcXVlbmNlKFNFU1NJT05fSUQgc2Vzc2lvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UqKiBpbWFnZXMsIGludCBudW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcENvdW50LCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIEltYWdlKiBJTUFRX1NURENBTEwKK2ltYXFTbmFwKFNFU1NJT05fSUQgc2Vzc2lvbklELCBJbWFnZSogaW1hZ2UsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU3RhcnRBY3F1aXNpdGlvbihTRVNTSU9OX0lEIHNlc3Npb25JRCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU3RvcEFjcXVpc2l0aW9uKFNFU1NJT05fSUQgc2Vzc2lvbklEKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQXJpdGhtZXRpYyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFBYnNvbHV0ZURpZmZlcmVuY2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQWJzb2x1dGVEaWZmZXJlbmNlQ29uc3RhbnQoSW1hZ2UqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQWRkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFBZGRDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUF2ZXJhZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUF2ZXJhZ2VDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRGl2aWRlMihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZSogc291cmNlQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURpdmlkZUNvbnN0YW50MihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxWYWx1ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU1heChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTWF4Q29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFNaW4oSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU1pbkNvbnN0YW50KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBQaXhlbFZhbHVlIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTW9kdWxvKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwgY29uc3QgSW1hZ2UqIHNvdXJjZUIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFNb2R1bG9Db25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTXVsRGl2KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UqIHNvdXJjZUIsIGZsb2F0IHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTXVsdGlwbHkoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU11bHRpcGx5Q29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFTdWJ0cmFjdChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZUEsIGNvbnN0IEltYWdlKiBzb3VyY2VCKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU3VidHJhY3RDb25zdGFudChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSB2YWx1ZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENhbGlwZXIgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDYWxpcGVyUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFDYWxpcGVyVG9vbChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgY29uc3QgRWRnZU9wdGlvbnMqIGVkZ2VPcHRpb25zLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbGlwZXJPcHRpb25zKiBjYWxpcGVyT3B0aW9ucywgaW50KiBudW1FZGdlUGFpcnMpOworSU1BUV9GVU5DIENvbmNlbnRyaWNSYWtlUmVwb3J0MiogSU1BUV9TVERDQUxMCitpbWFxQ29uY2VudHJpY1Jha2UyKEltYWdlKiBpbWFnZSwgUk9JKiByb2ksIENvbmNlbnRyaWNSYWtlRGlyZWN0aW9uIGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgRWRnZVByb2Nlc3MgcHJvY2VzcywgaW50IHN0ZXBTaXplLAorICAgICAgICAgICAgICAgICAgICBFZGdlT3B0aW9uczIqIGVkZ2VPcHRpb25zKTsKK0lNQVFfRlVOQyBFeHRyZW1lUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFEZXRlY3RFeHRyZW1lcyhjb25zdCBkb3VibGUqIHBpeGVscywgaW50IG51bVBpeGVscywgRGV0ZWN0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERldGVjdEV4dHJlbWVzT3B0aW9ucyogb3B0aW9ucywgaW50KiBudW1FeHRyZW1lcyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcURldGVjdFJvdGF0aW9uKGNvbnN0IEltYWdlKiByZWZlcmVuY2VJbWFnZSwgY29uc3QgSW1hZ2UqIHRlc3RJbWFnZSwKKyAgICAgICAgICAgICAgICAgICBQb2ludEZsb2F0IHJlZmVyZW5jZUNlbnRlciwgUG9pbnRGbG9hdCB0ZXN0Q2VudGVyLAorICAgICAgICAgICAgICAgICAgIGludCByYWRpdXMsIGZsb2F0IHByZWNpc2lvbiwgZG91YmxlKiBhbmdsZSk7CitJTUFRX0ZVTkMgRWRnZVJlcG9ydDIqIElNQVFfU1REQ0FMTAoraW1hcUVkZ2VUb29sNChJbWFnZSogaW1hZ2UsIFJPSSogcm9pLCBFZGdlUHJvY2VzcyBwcm9jZXNzVHlwZSwKKyAgICAgICAgICAgICAgRWRnZU9wdGlvbnMyKiBlZGdlT3B0aW9ucywgY29uc3QgdW5zaWduZWQgaW50IHJldmVyc2VEaXJlY3Rpb24pOworSU1BUV9GVU5DIEZpbmRFZGdlUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFGaW5kRWRnZTIoSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogYmFzZVN5c3RlbSwKKyAgICAgICAgICAgICAgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogbmV3U3lzdGVtLAorICAgICAgICAgICAgICBjb25zdCBGaW5kRWRnZU9wdGlvbnMyKiBmaW5kRWRnZU9wdGlvbnMsCisgICAgICAgICAgICAgIGNvbnN0IFN0cmFpZ2h0RWRnZU9wdGlvbnMqIHN0cmFpZ2h0RWRnZU9wdGlvbnMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFGaW5kVHJhbnNmb3JtUmVjdDIoSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgRmluZFRyYW5zZm9ybU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29vcmRpbmF0ZVN5c3RlbSogYmFzZVN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29vcmRpbmF0ZVN5c3RlbSogbmV3U3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaW5kVHJhbnNmb3JtUmVjdE9wdGlvbnMyKiBmaW5kVHJhbnNmb3JtT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyYWlnaHRFZGdlT3B0aW9ucyogc3RyYWlnaHRFZGdlT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgQXhpc1JlcG9ydCogYXhpc1JlcG9ydCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUZpbmRUcmFuc2Zvcm1SZWN0czIoSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHByaW1hcnlST0ksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBST0kqIHNlY29uZGFyeVJPSSwgRmluZFRyYW5zZm9ybU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBDb29yZGluYXRlU3lzdGVtKiBuZXdTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaW5kVHJhbnNmb3JtUmVjdHNPcHRpb25zMiogZmluZFRyYW5zZm9ybU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJhaWdodEVkZ2VPcHRpb25zKiBwcmltYXJ5U3RyYWlnaHRFZGdlT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmFpZ2h0RWRnZU9wdGlvbnMqIHNlY29uZGFyeVN0cmFpZ2h0RWRnZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBBeGlzUmVwb3J0KiBheGlzUmVwb3J0KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTGluZUdhdWdlVG9vbDIoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBzdGFydCwgUG9pbnQgZW5kLAorICAgICAgICAgICAgICAgICAgIExpbmVHYXVnZU1ldGhvZCBtZXRob2QsIGNvbnN0IEVkZ2VPcHRpb25zKiBlZGdlT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDb29yZGluYXRlVHJhbnNmb3JtMiogdHJhbnNmb3JtLCBmbG9hdCogZGlzdGFuY2UpOworSU1BUV9GVU5DIFJha2VSZXBvcnQyKiBJTUFRX1NURENBTEwKK2ltYXFSYWtlMihJbWFnZSogaW1hZ2UsIFJPSSogcm9pLCBSYWtlRGlyZWN0aW9uIGRpcmVjdGlvbiwgRWRnZVByb2Nlc3MgcHJvY2VzcywKKyAgICAgICAgICBpbnQgc3RlcFNpemUsIEVkZ2VPcHRpb25zMiogZWRnZU9wdGlvbnMpOworSU1BUV9GVU5DIFBvaW50RmxvYXQqIElNQVFfU1REQ0FMTAoraW1hcVNpbXBsZUVkZ2UoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBQb2ludCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgY29uc3QgU2ltcGxlRWRnZU9wdGlvbnMqIG9wdGlvbnMsIGludCogbnVtRWRnZXMpOworSU1BUV9GVU5DIFNwb2tlUmVwb3J0MiogSU1BUV9TVERDQUxMCitpbWFxU3Bva2UyKEltYWdlKiBpbWFnZSwgUk9JKiByb2ksIFNwb2tlRGlyZWN0aW9uIGRpcmVjdGlvbiwKKyAgICAgICAgICAgRWRnZVByb2Nlc3MgcHJvY2VzcywgaW50IHN0ZXBTaXplLCBFZGdlT3B0aW9uczIqIGVkZ2VPcHRpb25zKTsKK0lNQVFfRlVOQyBTdHJhaWdodEVkZ2VSZXBvcnQyKiBJTUFRX1NURENBTEwKK2ltYXFTdHJhaWdodEVkZ2UoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICAgICAgU2VhcmNoRGlyZWN0aW9uIHNlYXJjaERpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgRWRnZU9wdGlvbnMyKiBlZGdlT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3QgU3RyYWlnaHRFZGdlT3B0aW9ucyogc3RyYWlnaHRFZGdlT3B0aW9ucyk7CitJTUFRX0ZVTkMgU3RyYWlnaHRFZGdlUmVwb3J0MiogSU1BUV9TVERDQUxMCitpbWFxU3RyYWlnaHRFZGdlMihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLAorICAgICAgICAgICAgICAgICAgU2VhcmNoRGlyZWN0aW9uIHNlYXJjaERpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEVkZ2VPcHRpb25zMiogZWRnZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBTdHJhaWdodEVkZ2VPcHRpb25zKiBzdHJhaWdodEVkZ2VPcHRpb25zLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9wdGltaXplZE1vZGUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBTcGF0aWFsIEZpbHRlcnMgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDYW5ueUVkZ2VGaWx0ZXIoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbm55T3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUNvbnZvbHZlMihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgZmxvYXQqIGtlcm5lbCwgaW50IG1hdHJpeFJvd3MsCisgICAgICAgICAgICAgIGludCBtYXRyaXhDb2xzLCBmbG9hdCBub3JtYWxpemUsIEltYWdlKiBtYXNrLAorICAgICAgICAgICAgICBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDb3JyZWxhdGUoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiB0ZW1wbGF0ZUltYWdlLCBSZWN0IHJlY3QpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUVkZ2VGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRsaW5lTWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFMb3dQYXNzKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBmbG9hdCB0b2xlcmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTWVkaWFuRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFOdGhPcmRlckZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRHJhd2luZyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURyYXdMaW5lT25JbWFnZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd01vZGUgbW9kZSwgUG9pbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IGVuZCwgZmxvYXQgbmV3UGl4ZWxWYWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcURyYXdTaGFwZU9uSW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFJlY3QgcmVjdCwgRHJhd01vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIFNoYXBlTW9kZSBzaGFwZSwgZmxvYXQgbmV3UGl4ZWxWYWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRHJhd1RleHRPbkltYWdlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludCBjb29yZCwgY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJhd1RleHRPcHRpb25zKiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZvbnROYW1lVXNlZCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEludGVybGFjaW5nIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUludGVybGFjZUNvbWJpbmUoSW1hZ2UqIGZyYW1lLCBjb25zdCBJbWFnZSogb2RkLCBjb25zdCBJbWFnZSogZXZlbik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUludGVybGFjZVNlcGFyYXRlKGNvbnN0IEltYWdlKiBmcmFtZSwgSW1hZ2UqIG9kZCwgSW1hZ2UqIGV2ZW4pOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbWFnZSBJbmZvcm1hdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGNoYXIqKiBJTUFRX1NURENBTEwKK2ltYXFFbnVtZXJhdGVDdXN0b21LZXlzKGNvbnN0IEltYWdlKiBpbWFnZSwgdW5zaWduZWQgaW50KiBzaXplKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0Qml0RGVwdGgoY29uc3QgSW1hZ2UqIGltYWdlLCB1bnNpZ25lZCBpbnQqIGJpdERlcHRoKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0Qnl0ZXNQZXJQaXhlbChjb25zdCBJbWFnZSogaW1hZ2UsIGludCogYnl0ZUNvdW50KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0SW1hZ2VJbmZvKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2VJbmZvKiBpbmZvKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0SW1hZ2VTaXplKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRJbWFnZVR5cGUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZVR5cGUqIHR5cGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldE1hc2tPZmZzZXQoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCogb2Zmc2V0KTsKK0lNQVFfRlVOQyB2b2lkKiBJTUFRX1NURENBTEwKK2ltYXFHZXRQaXhlbEFkZHJlc3MoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBwaXhlbCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldFZpc2lvbkluZm9UeXBlcyhjb25zdCBJbWFnZSogaW1hZ2UsIHVuc2lnbmVkIGludCogcHJlc2VudCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxSXNJbWFnZUVtcHR5KGNvbnN0IEltYWdlKiBpbWFnZSwgaW50KiBlbXB0eSk7CitJTUFRX0ZVTkMgdm9pZCogSU1BUV9TVERDQUxMCitpbWFxUmVhZEN1c3RvbURhdGEoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBrZXksIHVuc2lnbmVkIGludCogc2l6ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxUmVtb3ZlQ3VzdG9tRGF0YShJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGtleSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVJlbW92ZVZpc2lvbkluZm8yKGNvbnN0IEltYWdlKiBpbWFnZSwgdW5zaWduZWQgaW50IGluZm8pOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldEJpdERlcHRoKEltYWdlKiBpbWFnZSwgdW5zaWduZWQgaW50IGJpdERlcHRoKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0SW1hZ2VTaXplKEltYWdlKiBpbWFnZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFTZXRNYXNrT2Zmc2V0KEltYWdlKiBpbWFnZSwgUG9pbnQgb2Zmc2V0KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFXcml0ZUN1c3RvbURhdGEoSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRGlzcGxheSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUFyZVRvb2xzQ29udGV4dFNlbnNpdGl2ZShpbnQqIHNlbnNpdGl2ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ2xvc2VXaW5kb3coaW50IHdpbmRvd051bWJlcik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcURpc3BsYXlJbWFnZShjb25zdCBJbWFnZSogaW1hZ2UsIGludCB3aW5kb3dOdW1iZXIsIGludCByZXNpemUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRMYXN0S2V5KGNoYXIqIGtleVByZXNzZWQsIGludCogd2luZG93TnVtYmVyLCBpbnQqIG1vZGlmaWVycyk7CitJTUFRX0ZVTkMgdm9pZCogSU1BUV9TVERDQUxMIGltYXFHZXRTeXN0ZW1XaW5kb3dIYW5kbGUoaW50IHdpbmRvd051bWJlcik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldFdpbmRvd0NlbnRlclBvcyhpbnQgd2luZG93TnVtYmVyLCBQb2ludCogY2VudGVyUG9zaXRpb24pOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldFRvb2xDb250ZXh0U2Vuc2l0aXZpdHkoaW50IHNlbnNpdGl2ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2hvd1dpbmRvdyhpbnQgd2luZG93TnVtYmVyLCBpbnQgdmlzaWJsZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEltYWdlIE1hbmlwdWxhdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNhc3QoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVR5cGUgdHlwZSwgY29uc3QgZmxvYXQqIGxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGlmdCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUNvcHlSZWN0KEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBSZWN0IHJlY3QsIFBvaW50IGRlc3RMb2MpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUR1cGxpY2F0ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgdm9pZCogSU1BUV9TVERDQUxMIGltYXFGbGF0dGVuKGNvbnN0IEltYWdlKiBpbWFnZSwgRmxhdHRlblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25UeXBlIGNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgdW5zaWduZWQgaW50KiBzaXplKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxRmxpcChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgRmxpcEF4aXMgYXhpcyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU1hc2soSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFSZXNhbXBsZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3V2lkdGgsIGludCBuZXdIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbk1ldGhvZCBtZXRob2QsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVJvdGF0ZTIoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IGFuZ2xlLCBQaXhlbFZhbHVlIGZpbGwsCisgICAgICAgICAgICBJbnRlcnBvbGF0aW9uTWV0aG9kIG1ldGhvZCwgaW50IG1haW50YWluU2l6ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2NhbGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTY2FsZSwgaW50IHlTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsaW5nTW9kZSBzY2FsZU1vZGUsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2hpZnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0WCwgaW50IHNoaWZ0WSwgUGl4ZWxWYWx1ZSBmaWxsKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFUcmFuc3Bvc2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFVbmZsYXR0ZW4oSW1hZ2UqIGltYWdlLCBjb25zdCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVVud3JhcEltYWdlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBBbm51bHVzIGFubnVsdXMsCisgICAgICAgICAgICAgICAgUmVjdE9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBJbnRlcnBvbGF0aW9uTWV0aG9kIG1ldGhvZCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVZpZXczRChJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgVmlldzNET3B0aW9ucyogb3B0aW9ucyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEZpbGUgSS9PIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ2xvc2VBVkkoQVZJU2Vzc2lvbiBzZXNzaW9uKTsKK0lNQVFfRlVOQyBBVklTZXNzaW9uIElNQVFfU1REQ0FMTAoraW1hcUNyZWF0ZUFWSShjb25zdCBjaGFyKiBmaWxlTmFtZSwgY29uc3QgY2hhciogY29tcHJlc3Npb25GaWx0ZXIsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZnJhbWVzUGVyU2Vjb25kLCB1bnNpZ25lZCBpbnQgbWF4RGF0YVNpemUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldEFWSUluZm8oQVZJU2Vzc2lvbiBzZXNzaW9uLCBBVklJbmZvKiBpbmZvKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0RmlsZUluZm8oY29uc3QgY2hhciogZmlsZU5hbWUsIENhbGlicmF0aW9uVW5pdCogY2FsaWJyYXRpb25Vbml0LAorICAgICAgICAgICAgICAgIGZsb2F0KiBjYWxpYnJhdGlvblgsIGZsb2F0KiBjYWxpYnJhdGlvblksIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsIEltYWdlVHlwZSogaW1hZ2VUeXBlKTsKK0lNQVFfRlVOQyBGaWx0ZXJOYW1lKiBJTUFRX1NURENBTEwgaW1hcUdldEZpbHRlck5hbWVzKGludCogbnVtRmlsdGVycyk7CitJTUFRX0ZVTkMgY2hhcioqIElNQVFfU1REQ0FMTAoraW1hcUxvYWRJbWFnZVBvcHVwKGNvbnN0IGNoYXIqIGRlZmF1bHREaXJlY3RvcnksIGNvbnN0IGNoYXIqIGRlZmF1bHRGaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlVHlwZUxpc3QsIGNvbnN0IGNoYXIqIHRpdGxlLAorICAgICAgICAgICAgICAgICAgIGludCBhbGxvd011bHRpcGxlUGF0aHMsIEJ1dHRvbkxhYmVsIGJ1dHRvbkxhYmVsLAorICAgICAgICAgICAgICAgICAgIGludCByZXN0cmljdERpcmVjdG9yeSwgaW50IHJlc3RyaWN0RXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgIGludCBhbGxvd0NhbmNlbCwgaW50IGFsbG93TWFrZURpcmVjdG9yeSwgaW50KiBjYW5jZWxsZWQsCisgICAgICAgICAgICAgICAgICAgaW50KiBudW1QYXRocyk7CitJTUFRX0ZVTkMgQVZJU2Vzc2lvbiBJTUFRX1NURENBTEwgaW1hcU9wZW5BVkkoY29uc3QgY2hhciogZmlsZU5hbWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVJlYWRBVklGcmFtZShJbWFnZSogaW1hZ2UsIEFWSVNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZyYW1lTnVtLCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIGRhdGFTaXplKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFSZWFkRmlsZShJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQlZhbHVlKiBjb2xvclRhYmxlLCBpbnQqIG51bUNvbG9ycyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVJlYWRWaXNpb25GaWxlKEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUsIFJHQlZhbHVlKiBjb2xvclRhYmxlLAorICAgICAgICAgICAgICAgICAgIGludCogbnVtQ29sb3JzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFXcml0ZUFWSUZyYW1lKEltYWdlKiBpbWFnZSwgQVZJU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhTGVuZ3RoKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFXcml0ZUJNUEZpbGUoY29uc3QgSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlTmFtZSwgaW50IGNvbXByZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSR0JWYWx1ZSogY29sb3JUYWJsZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxV3JpdGVGaWxlKGNvbnN0IEltYWdlKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJHQlZhbHVlKiBjb2xvclRhYmxlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxV3JpdGVKUEVHRmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHF1YWxpdHksIHZvaWQqIGNvbG9yVGFibGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFXcml0ZUpQRUcyMDAwRmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBpbnQgbG9zc2xlc3MsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY29tcHJlc3Npb25SYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKUEVHMjAwMEZpbGVBZHZhbmNlZE9wdGlvbnMqIGFkdmFuY2VkT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSR0JWYWx1ZSogY29sb3JUYWJsZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVdyaXRlUE5HRmlsZTIoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb21wcmVzc2lvblNwZWVkLCBjb25zdCBSR0JWYWx1ZSogY29sb3JUYWJsZSwKKyAgICAgICAgICAgICAgICAgIGludCB1c2VCaXREZXB0aCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVdyaXRlVElGRkZpbGUoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFRJRkZGaWxlT3B0aW9ucyogb3B0aW9ucywgY29uc3QgUkdCVmFsdWUqIGNvbG9yVGFibGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVdyaXRlVmlzaW9uRmlsZShjb25zdCBJbWFnZSogaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSR0JWYWx1ZSogY29sb3JUYWJsZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEFuYWx5dGljIEdlb21ldHJ5IGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUJ1aWxkQ29vcmRpbmF0ZVN5c3RlbShjb25zdCBQb2ludCogcG9pbnRzLCBSZWZlcmVuY2VNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29vcmRpbmF0ZVN5c3RlbSogc3lzdGVtKTsKK0lNQVFfRlVOQyBCZXN0Q2lyY2xlMiogSU1BUV9TVERDQUxMCitpbWFxRml0Q2lyY2xlMihjb25zdCBQb2ludEZsb2F0KiBwb2ludHMsIGludCBudW1Qb2ludHMsCisgICAgICAgICAgICAgICBjb25zdCBGaXRDaXJjbGVPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBCZXN0RWxsaXBzZTIqIElNQVFfU1REQ0FMTAoraW1hcUZpdEVsbGlwc2UyKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bVBvaW50cywKKyAgICAgICAgICAgICAgICBjb25zdCBGaXRFbGxpcHNlT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgQmVzdExpbmUqIElNQVFfU1REQ0FMTCBpbWFxRml0TGluZShjb25zdCBQb2ludEZsb2F0KiBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRml0TGluZU9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldEFuZ2xlKFBvaW50RmxvYXQgc3RhcnQxLCBQb2ludEZsb2F0IGVuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRGbG9hdCBzdGFydDIsIFBvaW50RmxvYXQgZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYW5nbGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRCaXNlY3RpbmdMaW5lKFBvaW50RmxvYXQgc3RhcnQxLCBQb2ludEZsb2F0IGVuZDEsIFBvaW50RmxvYXQgc3RhcnQyLAorICAgICAgICAgICAgICAgICAgICAgUG9pbnRGbG9hdCBlbmQyLCBQb2ludEZsb2F0KiBiaXNlY3RTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIFBvaW50RmxvYXQqIGJpc2VjdEVuZCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldERpc3RhbmNlKFBvaW50RmxvYXQgcG9pbnQxLCBQb2ludEZsb2F0IHBvaW50MiwgZmxvYXQqIGRpc3RhbmNlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0SW50ZXJzZWN0aW9uKFBvaW50RmxvYXQgc3RhcnQxLCBQb2ludEZsb2F0IGVuZDEsIFBvaW50RmxvYXQgc3RhcnQyLAorICAgICAgICAgICAgICAgICAgICBQb2ludEZsb2F0IGVuZDIsIFBvaW50RmxvYXQqIGludGVyc2VjdGlvbik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldE1pZExpbmUoUG9pbnRGbG9hdCByZWZMaW5lU3RhcnQsIFBvaW50RmxvYXQgcmVmTGluZUVuZCwgUG9pbnRGbG9hdCBwb2ludCwKKyAgICAgICAgICAgICAgIFBvaW50RmxvYXQqIG1pZExpbmVTdGFydCwgUG9pbnRGbG9hdCogbWlkTGluZUVuZCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldFBlcnBlbmRpY3VsYXJMaW5lKFBvaW50RmxvYXQgcmVmTGluZVN0YXJ0LCBQb2ludEZsb2F0IHJlZkxpbmVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRGbG9hdCBwb2ludCwgUG9pbnRGbG9hdCogcGVycExpbmVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludEZsb2F0KiBwZXJwTGluZUVuZCwgZG91YmxlKiBkaXN0YW5jZSk7CitJTUFRX0ZVTkMgU2VnbWVudEluZm8qIElNQVFfU1REQ0FMTAoraW1hcUdldFBvaW50c09uQ29udG91cihjb25zdCBJbWFnZSogaW1hZ2UsIGludCogbnVtU2VnbWVudHMpOworSU1BUV9GVU5DIFBvaW50KiBJTUFRX1NURENBTEwKK2ltYXFHZXRQb2ludHNPbkxpbmUoUG9pbnQgc3RhcnQsIFBvaW50IGVuZCwgaW50KiBudW1Qb2ludHMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRQb2x5Z29uQXJlYShjb25zdCBQb2ludEZsb2F0KiBwb2ludHMsIGludCBudW1Qb2ludHMsIGZsb2F0KiBhcmVhKTsKK0lNQVFfRlVOQyBmbG9hdCogSU1BUV9TVERDQUxMCitpbWFxSW50ZXJwb2xhdGVQb2ludHMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBQb2ludCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb25NZXRob2QgbWV0aG9kLCBpbnQgc3VicGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgaW50KiBpbnRlcnBDb3VudCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENsaXBib2FyZCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNsaXBib2FyZFRvSW1hZ2UoSW1hZ2UqIGRlc3QsIFJHQlZhbHVlKiBwYWxldHRlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxSW1hZ2VUb0NsaXBib2FyZChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJHQlZhbHVlKiBwYWxldHRlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQm9yZGVyIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRmlsbEJvcmRlcihJbWFnZSogaW1hZ2UsIEJvcmRlck1ldGhvZCBtZXRob2QpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRCb3JkZXJTaXplKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50KiBib3JkZXJTaXplKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFTZXRCb3JkZXJTaXplKEltYWdlKiBpbWFnZSwgaW50IHNpemUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbWFnZSBNYW5hZ2VtZW50IGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUFycmF5VG9JbWFnZShJbWFnZSogaW1hZ2UsIGNvbnN0IHZvaWQqIGFycmF5LCBpbnQgbnVtQ29scywgaW50IG51bVJvd3MpOworSU1BUV9GVU5DIEltYWdlKiBJTUFRX1NURENBTEwgaW1hcUNyZWF0ZUltYWdlKEltYWdlVHlwZSB0eXBlLCBpbnQgYm9yZGVyU2l6ZSk7CitJTUFRX0ZVTkMgdm9pZCogSU1BUV9TVERDQUxMCitpbWFxSW1hZ2VUb0FycmF5KGNvbnN0IEltYWdlKiBpbWFnZSwgUmVjdCByZWN0LCBpbnQqIGNvbHVtbnMsIGludCogcm93cyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENvbG9yIFByb2Nlc3NpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDb2xvcjIgSU1BUV9TVERDQUxMCitpbWFxQ2hhbmdlQ29sb3JTcGFjZTIoY29uc3QgQ29sb3IyKiBzb3VyY2VDb2xvciwgQ29sb3JNb2RlIHNvdXJjZVNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgIENvbG9yTW9kZSBkZXN0U3BhY2UsIGRvdWJsZSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0lFWFlaVmFsdWUqIHdoaXRlUmVmZXJlbmNlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29sb3JCQ0dUcmFuc2Zvcm0oSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkNHT3B0aW9ucyogcmVkT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCQ0dPcHRpb25zKiBncmVlbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkNHT3B0aW9ucyogYmx1ZU9wdGlvbnMsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbG9yRXF1YWxpemF0aW9uKTsKK0lNQVFfRlVOQyBDb2xvckhpc3RvZ3JhbVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxQ29sb3JIaXN0b2dyYW0yKEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIENvbG9yTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDSUVYWVpWYWx1ZSogd2hpdGVSZWZlcmVuY2UsIEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29sb3JMb29rdXAoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbG9yTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrLCBjb25zdCBzaG9ydCogcGxhbmUxLCBjb25zdCBzaG9ydCogcGxhbmUyLAorICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0KiBwbGFuZTMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFDb2xvclRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHJlcGxhY2VWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBDb2xvck1vZGUgbW9kZSwgY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhbmdlKiBwbGFuZTJSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlKTsKK0lNQVFfRlVOQyBTdXBlcnZpc2VkQ29sb3JTZWdtZW50YXRpb25SZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcVN1cGVydmlzZWRDb2xvclNlZ21lbnRhdGlvbihDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgSW1hZ2UqIGxhYmVsSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBzcmNJbWFnZSwgY29uc3QgUk9JKiByb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJPSUxhYmVsKiBsYWJlbEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGFiZWxJbiwgaW50IG1heERpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluSWRlbnRpZmljYXRpb25TY29yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29sb3JTZWdtZW5hdGlvbk9wdGlvbnMqIHNlZ21lbnRPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFHZXRDb2xvclNlZ21lbnRhdGlvbk1heERpc3RhbmNlKAorICAgIENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBDb2xvclNlZ21lbmF0aW9uT3B0aW9ucyogc2VnbWVudE9wdGlvbnMsCisgICAgU2VnbWVudGF0aW9uRGlzdGFuY2VMZXZlbCBkaXN0TGV2ZWwsIGludCogbWF4RGlzdGFuY2UpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBUcmFuc2Zvcm0gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFCQ0dUcmFuc2Zvcm0oSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJDR09wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW4sIGZsb2F0IG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUludmVyc2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNYXRoVHJhbnNmb3JtKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aFRyYW5zZm9ybU1ldGhvZCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByYW5nZU1pbiwgZmxvYXQgcmFuZ2VNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBwb3dlciwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFXYXRlcnNoZWRUcmFuc2Zvcm0oSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHpvbmVDb3VudCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTG9va3VwMihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogdGFibGUsIGNvbnN0IEltYWdlKiBtYXNrKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgV2luZG93IE1hbmFnZW1lbnQgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQXJlU2Nyb2xsYmFyc1Zpc2libGUoaW50IHdpbmRvd051bWJlciwgaW50KiB2aXNpYmxlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFCcmluZ1dpbmRvd1RvVG9wKGludCB3aW5kb3dOdW1iZXIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldE1vdXNlUG9zKFBvaW50KiBwb3NpdGlvbiwgaW50KiB3aW5kb3dOdW1iZXIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRXaW5kb3dCYWNrZ3JvdW5kKGludCB3aW5kb3dOdW1iZXIsIFdpbmRvd0JhY2tncm91bmRGaWxsU3R5bGUqIGZpbGxTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd0JhY2tncm91bmRIYXRjaFN0eWxlKiBoYXRjaFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgUkdCVmFsdWUqIGZpbGxDb2xvciwgUkdCVmFsdWUqIGJhY2tncm91bmRDb2xvcik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldFdpbmRvd0Rpc3BsYXlNYXBwaW5nKGludCB3aW5kb3dOdW0sIERpc3BsYXlNYXBwaW5nKiBtYXBwaW5nKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0V2luZG93R3JpZChpbnQgd2luZG93TnVtYmVyLCBpbnQqIHhSZXNvbHV0aW9uLCBpbnQqIHlSZXNvbHV0aW9uKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFHZXRXaW5kb3dIYW5kbGUoaW50KiBoYW5kbGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd1BvcyhpbnQgd2luZG93TnVtYmVyLCBQb2ludCogcG9zaXRpb24pOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRXaW5kb3dTaXplKGludCB3aW5kb3dOdW1iZXIsIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK0lNQVFfRlVOQyBjaGFyKiBJTUFRX1NURENBTEwgaW1hcUdldFdpbmRvd1RpdGxlKGludCB3aW5kb3dOdW1iZXIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRXaW5kb3dab29tMihpbnQgd2luZG93TnVtYmVyLCBmbG9hdCogeFpvb20sIGZsb2F0KiB5Wm9vbSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUlzV2luZG93Tm9uVGVhcmluZyhpbnQgd2luZG93TnVtYmVyLCBpbnQqIG5vblRlYXJpbmcpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUlzV2luZG93VmlzaWJsZShpbnQgd2luZG93TnVtYmVyLCBpbnQqIHZpc2libGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1vdmVXaW5kb3coaW50IHdpbmRvd051bWJlciwgUG9pbnQgcG9zaXRpb24pOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldHVwV2luZG93KGludCB3aW5kb3dOdW1iZXIsIGludCBjb25maWd1cmF0aW9uKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0V2luZG93QmFja2dyb3VuZChpbnQgd2luZG93TnVtYmVyLCBXaW5kb3dCYWNrZ3JvdW5kRmlsbFN0eWxlIGZpbGxTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd0JhY2tncm91bmRIYXRjaFN0eWxlIGhhdGNoU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSR0JWYWx1ZSogZmlsbENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkdCVmFsdWUqIGJhY2tncm91bmRDb2xvcik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldFdpbmRvd0Rpc3BsYXlNYXBwaW5nKGludCB3aW5kb3dOdW1iZXIsIGNvbnN0IERpc3BsYXlNYXBwaW5nKiBtYXBwaW5nKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0V2luZG93R3JpZChpbnQgd2luZG93TnVtYmVyLCBpbnQgeFJlc29sdXRpb24sIGludCB5UmVzb2x1dGlvbik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldFdpbmRvd01heENvbnRvdXJDb3VudChpbnQgd2luZG93TnVtYmVyLCB1bnNpZ25lZCBpbnQgbWF4Q29udG91ckNvdW50KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0V2luZG93Tm9uVGVhcmluZyhpbnQgd2luZG93TnVtYmVyLCBpbnQgbm9uVGVhcmluZyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldFdpbmRvd1BhbGV0dGUoaW50IHdpbmRvd051bWJlciwgUGFsZXR0ZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJHQlZhbHVlKiBwYWxldHRlLCBpbnQgbnVtQ29sb3JzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0V2luZG93U2l6ZShpbnQgd2luZG93TnVtYmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd1RocmVhZFBvbGljeShXaW5kb3dUaHJlYWRQb2xpY3kgcG9saWN5KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0V2luZG93VGl0bGUoaW50IHdpbmRvd051bWJlciwgY29uc3QgY2hhciogdGl0bGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFTZXRXaW5kb3dab29tVG9GaXQoaW50IHdpbmRvd051bWJlciwgaW50IHpvb21Ub0ZpdCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2hvd1Njcm9sbGJhcnMoaW50IHdpbmRvd051bWJlciwgaW50IHZpc2libGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFab29tV2luZG93MihpbnQgd2luZG93TnVtYmVyLCBmbG9hdCB4Wm9vbSwgZmxvYXQgeVpvb20sIFBvaW50IGNlbnRlcik7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFV0aWxpdGllcyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGNvbnN0IGZsb2F0KiBJTUFRX1NURENBTEwKK2ltYXFHZXRLZXJuZWwoS2VybmVsRmFtaWx5IGZhbWlseSwgaW50IHNpemUsIGludCBudW1iZXIpOworSU1BUV9GVU5DIEFubnVsdXMgSU1BUV9TVERDQUxMCitpbWFxTWFrZUFubnVsdXMoUG9pbnQgY2VudGVyLCBpbnQgaW5uZXJSYWRpdXMsIGludCBvdXRlclJhZGl1cywKKyAgICAgICAgICAgICAgICBkb3VibGUgc3RhcnRBbmdsZSwgZG91YmxlIGVuZEFuZ2xlKTsKK0lNQVFfRlVOQyBQb2ludCBJTUFRX1NURENBTEwgaW1hcU1ha2VQb2ludChpbnQgeENvb3JkaW5hdGUsIGludCB5Q29vcmRpbmF0ZSk7CitJTUFRX0ZVTkMgUG9pbnRGbG9hdCBJTUFRX1NURENBTEwKK2ltYXFNYWtlUG9pbnRGbG9hdChmbG9hdCB4Q29vcmRpbmF0ZSwgZmxvYXQgeUNvb3JkaW5hdGUpOworSU1BUV9GVU5DIFJlY3QgSU1BUV9TVERDQUxMCitpbWFxTWFrZVJlY3QoaW50IHRvcCwgaW50IGxlZnQsIGludCBoZWlnaHQsIGludCB3aWR0aCk7CitJTUFRX0ZVTkMgUmVjdCBJTUFRX1NURENBTEwKK2ltYXFNYWtlUmVjdEZyb21Sb3RhdGVkUmVjdChSb3RhdGVkUmVjdCByb3RhdGVkUmVjdCk7CitJTUFRX0ZVTkMgUm90YXRlZFJlY3QgSU1BUV9TVERDQUxMCitpbWFxTWFrZVJvdGF0ZWRSZWN0KGludCB0b3AsIGludCBsZWZ0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGRvdWJsZSBhbmdsZSk7CitJTUFRX0ZVTkMgUm90YXRlZFJlY3QgSU1BUV9TVERDQUxMIGltYXFNYWtlUm90YXRlZFJlY3RGcm9tUmVjdChSZWN0IHJlY3QpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU11bHRpY29yZU9wdGlvbnMoTXVsdGljb3JlT3BlcmF0aW9uIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogY3VzdG9tTnVtQ29yZXMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBUb29sIFdpbmRvdyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNsb3NlVG9vbFdpbmRvdyh2b2lkKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFHZXRDdXJyZW50VG9vbChUb29sKiBjdXJyZW50VG9vbCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxR2V0TGFzdEV2ZW50KFdpbmRvd0V2ZW50VHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aW5kb3dOdW1iZXIsIFRvb2wqIHRvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QqIHJlY3QpOworSU1BUV9GVU5DIHZvaWQqIElNQVFfU1REQ0FMTCBpbWFxR2V0VG9vbFdpbmRvd0hhbmRsZSh2b2lkKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFHZXRUb29sV2luZG93UG9zKFBvaW50KiBwb3NpdGlvbik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxSXNUb29sV2luZG93VmlzaWJsZShpbnQqIHZpc2libGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU1vdmVUb29sV2luZG93KFBvaW50IHBvc2l0aW9uKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFTZXRDdXJyZW50VG9vbChUb29sIGN1cnJlbnRUb29sKTsKKyNpZm5kZWYgX19HTlVDX18KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0RXZlbnRDYWxsYmFjayhFdmVudENhbGxiYWNrIGNhbGxiYWNrLCBpbnQgc3luY2hyb25vdXMpOworI2VuZGlmCitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2V0VG9vbENvbG9yKGNvbnN0IFJHQlZhbHVlKiBjb2xvcik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldHVwVG9vbFdpbmRvdyhpbnQgc2hvd0Nvb3JkaW5hdGVzLCBpbnQgbWF4SWNvbnNQZXJMaW5lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUb29sV2luZG93T3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2hvd1Rvb2xXaW5kb3coaW50IHZpc2libGUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNZXRlciBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIE1ldGVyQXJjKiBJTUFRX1NURENBTEwKK2ltYXFHZXRNZXRlckFyYyhpbnQgbGlnaHROZWVkbGUsIE1ldGVyQXJjTW9kZSBtb2RlLCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICAgICBQb2ludEZsb2F0IGJhc2UsIFBvaW50RmxvYXQgc3RhcnQsIFBvaW50RmxvYXQgZW5kKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxUmVhZE1ldGVyKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgTWV0ZXJBcmMqIGFyY0luZm8sIGRvdWJsZSogcGVyY2VudGFnZSwKKyAgICAgICAgICAgICAgUG9pbnRGbG9hdCogZW5kT2ZOZWVkbGUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDYWxpYnJhdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFDb3B5Q2FsaWJyYXRpb25JbmZvMihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgUG9pbnQgb2Zmc2V0KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29ycmVjdENhbGlicmF0ZWRJbWFnZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgUGl4ZWxWYWx1ZSBmaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbk1ldGhvZCBtZXRob2QsIGNvbnN0IFJPSSogcm9pKTsKK0lNQVFfRlVOQyBDYWxpYnJhdGlvbkluZm8qIElNQVFfU1REQ0FMTAoraW1hcUdldENhbGlicmF0aW9uSW5mbzIoY29uc3QgSW1hZ2UqIGltYWdlKTsKK0lNQVFfRlVOQyBDYWxpYnJhdGlvbkluZm8qIElNQVFfU1REQ0FMTAoraW1hcUdldENhbGlicmF0aW9uSW5mbzMoSW1hZ2UqIGltYWdlLCB1bnNpZ25lZCBpbnQgaXNHZXRFcnJvck1hcCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUxlYXJuQ2FsaWJyYXRpb25HcmlkKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGVhcm5DYWxpYnJhdGlvbk9wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JpZERlc2NyaXB0b3IqIGdyaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhbmdlRmxvYXQqIHJhbmdlLCBmbG9hdCogcXVhbGl0eSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUxlYXJuQ2FsaWJyYXRpb25Qb2ludHMoSW1hZ2UqIGltYWdlLCBjb25zdCBDYWxpYnJhdGlvblBvaW50cyogcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUk9JKiByb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMZWFybkNhbGlicmF0aW9uT3B0aW9ucyogb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyaWREZXNjcmlwdG9yKiBncmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogc3lzdGVtLCBmbG9hdCogcXVhbGl0eSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldENvb3JkaW5hdGVTeXN0ZW0oSW1hZ2UqIGltYWdlLCBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBzeXN0ZW0pOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFTZXRTaW1wbGVDYWxpYnJhdGlvbihJbWFnZSogaW1hZ2UsIFNjYWxpbmdNZXRob2QgbWV0aG9kLCBpbnQgbGVhcm5UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHcmlkRGVzY3JpcHRvciogZ3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBzeXN0ZW0pOworSU1BUV9GVU5DIFRyYW5zZm9ybVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxVHJhbnNmb3JtUGl4ZWxUb1JlYWxXb3JsZChjb25zdCBJbWFnZSogaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludEZsb2F0KiBwaXhlbENvb3JkaW5hdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUNvb3JkaW5hdGVzKTsKK0lNQVFfRlVOQyBUcmFuc2Zvcm1SZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcVRyYW5zZm9ybVJlYWxXb3JsZFRvUGl4ZWwoY29uc3QgSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRGbG9hdCogcmVhbFdvcmxkQ29vcmRpbmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQ29vcmRpbmF0ZXMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFTZXRTaW1wbGVDYWxpYnJhdGlvbjIoSW1hZ2UqIGltYWdlLCBjb25zdCBHcmlkRGVzY3JpcHRvciogZ3JpZERlc2NyaXB0b3IpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFDYWxpYnJhdGlvblNldEF4aXNJbmZvKEltYWdlKiBpbWFnZSwgQ29vcmRpbmF0ZVN5c3RlbSogYXhpc0luZm8pOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFDYWxpYnJhdGlvbkdldFRodW1ibmFpbEltYWdlKEltYWdlKiB0ZW1wbGF0ZUltYWdlLCBJbWFnZSogaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxpYnJhdGlvblRodW1ibmFpbFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCk7CitJTUFRX0ZVTkMgR2V0Q2FsaWJyYXRpb25JbmZvUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFDYWxpYnJhdGlvbkdldENhbGlicmF0aW9uSW5mbyhJbWFnZSogaW1hZ2UsIHVuc2lnbmVkIGludCBpc0dldEVycm9yTWFwKTsKK0lNQVFfRlVOQyBHZXRDYW1lcmFQYXJhbWV0ZXJzUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFDYWxpYnJhdGlvbkdldENhbWVyYVBhcmFtZXRlcnMoSW1hZ2UqIHRlbXBsYXRlSW1hZ2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNhbGlicmF0aW9uQ29tcGFjdEluZm9ybWF0aW9uKEltYWdlKiBpbWFnZSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFBpeGVsIE1hbmlwdWxhdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFBcnJheVRvQ29tcGxleFBsYW5lKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIG5ld1BpeGVscywgQ29tcGxleFBsYW5lIHBsYW5lKTsKK0lNQVFfRlVOQyBmbG9hdCogSU1BUV9TVERDQUxMCitpbWFxQ29tcGxleFBsYW5lVG9BcnJheShjb25zdCBJbWFnZSogaW1hZ2UsIENvbXBsZXhQbGFuZSBwbGFuZSwgUmVjdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiByb3dzLCBpbnQqIGNvbHVtbnMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUV4dHJhY3RDb2xvclBsYW5lcyhjb25zdCBJbWFnZSogaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yTW9kZSBtb2RlLCBJbWFnZSogcGxhbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSogcGxhbmUyLCBJbWFnZSogcGxhbmUzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxRXh0cmFjdENvbXBsZXhQbGFuZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgQ29tcGxleFBsYW5lIHBsYW5lKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxRmlsbEltYWdlKEltYWdlKiBpbWFnZSwgUGl4ZWxWYWx1ZSB2YWx1ZSwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIHZvaWQqIElNQVFfU1REQ0FMTAoraW1hcUdldExpbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBzdGFydCwgUG9pbnQgZW5kLCBpbnQqIG51bVBvaW50cyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldFBpeGVsKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgcGl4ZWwsIFBpeGVsVmFsdWUqIHZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxUmVwbGFjZUNvbG9yUGxhbmVzKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBDb2xvck1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UqIHBsYW5lMSwgY29uc3QgSW1hZ2UqIHBsYW5lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UqIHBsYW5lMyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVJlcGxhY2VDb21wbGV4UGxhbmUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZSogbmV3VmFsdWVzLCBDb21wbGV4UGxhbmUgcGxhbmUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldExpbmUoSW1hZ2UqIGltYWdlLCBjb25zdCB2b2lkKiBhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJheVNpemUsIFBvaW50IHN0YXJ0LCBQb2ludCBlbmQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFTZXRQaXhlbChJbWFnZSogaW1hZ2UsIFBvaW50IGNvb3JkLCBQaXhlbFZhbHVlIHZhbHVlKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ29sb3IgTWF0Y2hpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDb2xvckluZm9ybWF0aW9uKiBJTUFRX1NURENBTEwKK2ltYXFMZWFybkNvbG9yKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIENvbG9yU2Vuc2l0aXZpdHkgc2Vuc2l0aXZpdHksCisgICAgICAgICAgICAgICBpbnQgc2F0dXJhdGlvbik7CitJTUFRX0ZVTkMgaW50KiBJTUFRX1NURENBTEwgaW1hcU1hdGNoQ29sb3IoY29uc3QgSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbG9ySW5mb3JtYXRpb24qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUk9JKiByb2ksIGludCogbnVtU2NvcmVzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgRnJlcXVlbmN5IERvbWFpbiBBbmFseXNpcyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFBdHRlbnVhdGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIEF0dGVudWF0ZU1vZGUgaGlnaGxvdyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ29uanVnYXRlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFGRlQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFGbGlwRnJlcXVlbmNpZXMoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUludmVyc2VGRlQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVRydW5jYXRlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydW5jYXRlTW9kZSBoaWdobG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvVG9LZWVwKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQmFyY29kZSBJL08gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR3JhZGVEYXRhTWF0cml4QmFyY29kZUFJTShjb25zdCBJbWFnZSogaW1hZ2UsIEFJTUdyYWRlUmVwb3J0KiByZXBvcnQpOworSU1BUV9GVU5DIEJhcmNvZGVJbmZvKiBJTUFRX1NURENBTEwKK2ltYXFSZWFkQmFyY29kZShjb25zdCBJbWFnZSogaW1hZ2UsIEJhcmNvZGVUeXBlIHR5cGUsIGNvbnN0IFJPSSogcm9pLAorICAgICAgICAgICAgICAgIGludCB2YWxpZGF0ZSk7CitJTUFRX0ZVTkMgRGF0YU1hdHJpeFJlcG9ydCogSU1BUV9TVERDQUxMIGltYXFSZWFkRGF0YU1hdHJpeEJhcmNvZGUyKAorICAgIEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIERhdGFNYXRyaXhHcmFkaW5nTW9kZSBwcmVwYXJlRm9yR3JhZGluZywKKyAgICBjb25zdCBEYXRhTWF0cml4RGVzY3JpcHRpb25PcHRpb25zKiBkZXNjcmlwdGlvbk9wdGlvbnMsCisgICAgY29uc3QgRGF0YU1hdHJpeFNpemVPcHRpb25zKiBzaXplT3B0aW9ucywKKyAgICBjb25zdCBEYXRhTWF0cml4U2VhcmNoT3B0aW9ucyogc2VhcmNoT3B0aW9ucyk7CitJTUFRX0ZVTkMgQmFyY29kZTJESW5mbyogSU1BUV9TVERDQUxMCitpbWFxUmVhZFBERjQxN0JhcmNvZGUoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICAgICAgICAgICBCYXJjb2RlMkRTZWFyY2hNb2RlIHNlYXJjaE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBudW1CYXJjb2Rlcyk7CitJTUFRX0ZVTkMgUVJDb2RlUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFSZWFkUVJDb2RlKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIFFSR3JhZGluZ01vZGUgcmVzZXJ2ZWQsCisgICAgICAgICAgICAgICBjb25zdCBRUkNvZGVEZXNjcmlwdGlvbk9wdGlvbnMqIGRlc2NyaXB0aW9uT3B0aW9ucywKKyAgICAgICAgICAgICAgIGNvbnN0IFFSQ29kZVNpemVPcHRpb25zKiBzaXplT3B0aW9ucywKKyAgICAgICAgICAgICAgIGNvbnN0IFFSQ29kZVNlYXJjaE9wdGlvbnMqIHNlYXJjaE9wdGlvbnMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBMQ0QgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxRmluZExDRFNlZ21lbnRzKFJPSSogcm9pLCBjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IExDRE9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIExDRFJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxUmVhZExDRChjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBjb25zdCBMQ0RPcHRpb25zKiBvcHRpb25zKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgU2hhcGUgTWF0Y2hpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBTaGFwZVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxTWF0Y2hTaGFwZShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgSW1hZ2UqIHRlbXBsYXRlSW1hZ2UsCisgICAgICAgICAgICAgICBpbnQgc2NhbGVJbnZhcmlhbnQsIGludCBjb25uZWN0aXZpdHk4LCBkb3VibGUgdG9sZXJhbmNlLAorICAgICAgICAgICAgICAgaW50KiBudW1NYXRjaGVzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ29udG91cnMgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDb250b3VySUQgSU1BUV9TVERDQUxMCitpbWFxQWRkQW5udWx1c0NvbnRvdXIoUk9JKiByb2ksIEFubnVsdXMgYW5udWx1cyk7CitJTUFRX0ZVTkMgQ29udG91cklEIElNQVFfU1REQ0FMTAoraW1hcUFkZENsb3NlZENvbnRvdXIoUk9JKiByb2ksIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMpOworSU1BUV9GVU5DIENvbnRvdXJJRCBJTUFRX1NURENBTEwKK2ltYXFBZGRMaW5lQ29udG91cihST0kqIHJvaSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCk7CitJTUFRX0ZVTkMgQ29udG91cklEIElNQVFfU1REQ0FMTAoraW1hcUFkZE9wZW5Db250b3VyKFJPSSogcm9pLCBjb25zdCBQb2ludCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzKTsKK0lNQVFfRlVOQyBDb250b3VySUQgSU1BUV9TVERDQUxMIGltYXFBZGRPdmFsQ29udG91cihST0kqIHJvaSwgUmVjdCBib3VuZGluZ0JveCk7CitJTUFRX0ZVTkMgQ29udG91cklEIElNQVFfU1REQ0FMTCBpbWFxQWRkUG9pbnRDb250b3VyKFJPSSogcm9pLCBQb2ludCBwb2ludCk7CitJTUFRX0ZVTkMgQ29udG91cklEIElNQVFfU1REQ0FMTCBpbWFxQWRkUmVjdENvbnRvdXIoUk9JKiByb2ksIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgQ29udG91cklEIElNQVFfU1REQ0FMTAoraW1hcUFkZFJvdGF0ZWRSZWN0Q29udG91cjIoUk9JKiByb2ksIFJvdGF0ZWRSZWN0IHJlY3QpOworSU1BUV9GVU5DIENvbnRvdXJJRCBJTUFRX1NURENBTEwKK2ltYXFDb3B5Q29udG91cihST0kqIGRlc3RSb2ksIGNvbnN0IFJPSSogc291cmNlUm9pLCBDb250b3VySUQgaWQpOworSU1BUV9GVU5DIENvbnRvdXJJRCBJTUFRX1NURENBTEwKK2ltYXFHZXRDb250b3VyKGNvbnN0IFJPSSogcm9pLCB1bnNpZ25lZCBpbnQgaW5kZXgpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRDb250b3VyQ29sb3IoY29uc3QgUk9JKiByb2ksIENvbnRvdXJJRCBpZCwgUkdCVmFsdWUqIGNvbnRvdXJDb2xvcik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxR2V0Q29udG91ckNvdW50KGNvbnN0IFJPSSogcm9pKTsKK0lNQVFfRlVOQyBDb250b3VySW5mbzIqIElNQVFfU1REQ0FMTAoraW1hcUdldENvbnRvdXJJbmZvMihjb25zdCBST0kqIHJvaSwgQ29udG91cklEIGlkKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTW92ZUNvbnRvdXIoUk9JKiByb2ksIENvbnRvdXJJRCBpZCwgaW50IGRlbHRhWCwgaW50IGRlbHRhWSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxUmVtb3ZlQ29udG91cihST0kqIHJvaSwgQ29udG91cklEIGlkKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0Q29udG91ckNvbG9yKFJPSSogcm9pLCBDb250b3VySUQgaWQsIGNvbnN0IFJHQlZhbHVlKiBjb2xvcik7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFJlZ2lvbnMgb2YgSW50ZXJlc3QgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29uc3RydWN0Uk9JMihjb25zdCBJbWFnZSogaW1hZ2UsIFJPSSogcm9pLCBUb29sIGluaXRpYWxUb29sLAorICAgICAgICAgICAgICAgICAgY29uc3QgVG9vbFdpbmRvd09wdGlvbnMqIHRvb2xzLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RydWN0Uk9JT3B0aW9uczIqIG9wdGlvbnMsIGludCogb2theSk7CitJTUFRX0ZVTkMgUk9JKiBJTUFRX1NURENBTEwgaW1hcUNyZWF0ZVJPSSh2b2lkKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0Uk9JQm91bmRpbmdCb3goY29uc3QgUk9JKiByb2ksIFJlY3QqIGJvdW5kaW5nQm94KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFHZXRST0lDb2xvcihjb25zdCBST0kqIHJvaSwgUkdCVmFsdWUqIHJvaUNvbG9yKTsKK0lNQVFfRlVOQyBST0kqIElNQVFfU1REQ0FMTCBpbWFxR2V0V2luZG93Uk9JKGludCB3aW5kb3dOdW1iZXIpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldFJPSUNvbG9yKFJPSSogcm9pLCBjb25zdCBSR0JWYWx1ZSogY29sb3IpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldFdpbmRvd1JPSShpbnQgd2luZG93TnVtYmVyLCBjb25zdCBST0kqIHJvaSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEltYWdlIEFuYWx5c2lzIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUNlbnRyb2lkKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnRGbG9hdCogY2VudHJvaWQsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBDdXJ2ZSogSU1BUV9TVERDQUxMCitpbWFxRXh0cmFjdEN1cnZlcyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsIHVuc2lnbmVkIGludCogbnVtQ3VydmVzKTsKK0lNQVFfRlVOQyBIaXN0b2dyYW1SZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUhpc3RvZ3JhbShjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwKKyAgICAgICAgICAgICAgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIExpbmVhckF2ZXJhZ2VzKiBJTUFRX1NURENBTEwKK2ltYXFMaW5lYXJBdmVyYWdlczIoSW1hZ2UqIGltYWdlLCBMaW5lYXJBdmVyYWdlc01vZGUgbW9kZSwgUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBMaW5lUHJvZmlsZSogSU1BUV9TVERDQUxMCitpbWFxTGluZVByb2ZpbGUoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBzdGFydCwgUG9pbnQgZW5kKTsKK0lNQVFfRlVOQyBRdWFudGlmeVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxUXVhbnRpZnkoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBJbWFnZSogbWFzayk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEVycm9yIE1hbmFnZW1lbnQgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDbGVhckVycm9yKHZvaWQpOworSU1BUV9GVU5DIGNoYXIqIElNQVFfU1REQ0FMTCBpbWFxR2V0RXJyb3JUZXh0KGludCBlcnJvckNvZGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldExhc3RFcnJvcih2b2lkKTsKK0lNQVFfRlVOQyBjb25zdCBjaGFyKiBJTUFRX1NURENBTEwgaW1hcUdldExhc3RFcnJvckZ1bmModm9pZCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2V0RXJyb3IoaW50IGVycm9yQ29kZSwgY29uc3QgY2hhciogZnVuY3Rpb24pOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBUaHJlc2hvbGQgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBUaHJlc2hvbGREYXRhKiBJTUFRX1NURENBTEwKK2ltYXFBdXRvVGhyZXNob2xkMihJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IG51bUNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgVGhyZXNob2xkTWV0aG9kIG1ldGhvZCwgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFMb2NhbFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgdW5zaWduZWQgaW50IHdpbmRvd1dpZHRoLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB3aW5kb3dIZWlnaHQsIExvY2FsVGhyZXNob2xkTWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgZGV2aWF0aW9uV2VpZ2h0LCBPYmplY3RUeXBlIHR5cGUsIGZsb2F0IHJlcGxhY2VWYWx1ZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTWFnaWNXYW5kKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludCBjb29yZCwgZmxvYXQgdG9sZXJhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubmVjdGl2aXR5OCwgZmxvYXQgcmVwbGFjZVZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFNdWx0aXRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlc2hvbGREYXRhKiByYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVJhbmdlcyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByYW5nZU1pbiwgZmxvYXQgcmFuZ2VNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VOZXdWYWx1ZSwgZmxvYXQgbmV3VmFsdWUpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNZW1vcnkgTWFuYWdlbWVudCBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcURpc3Bvc2Uodm9pZCogb2JqZWN0KTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgUGF0dGVybiBNYXRjaGluZyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIENpcmNsZU1hdGNoKiBJTUFRX1NURENBTEwKK2ltYXFEZXRlY3RDaXJjbGVzKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgQ2lyY2xlRGVzY3JpcHRvciogY2lyY2xlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3QgU2hhcGVEZXRlY3Rpb25PcHRpb25zKiBzaGFwZURldGVjdGlvbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzUmV0dXJuZWQpOworSU1BUV9GVU5DIEVsbGlwc2VNYXRjaCogSU1BUV9TVERDQUxMCitpbWFxRGV0ZWN0RWxsaXBzZXMoY29uc3QgSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsbGlwc2VEZXNjcmlwdG9yKiBlbGxpcHNlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdXJ2ZU9wdGlvbnMqIGN1cnZlT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTaGFwZURldGVjdGlvbk9wdGlvbnMqIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzUmV0dXJuZWQpOworSU1BUV9GVU5DIExpbmVNYXRjaCogSU1BUV9TVERDQUxMCitpbWFxRGV0ZWN0TGluZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBMaW5lRGVzY3JpcHRvciogbGluZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgY29uc3QgU2hhcGVEZXRlY3Rpb25PcHRpb25zKiBzaGFwZURldGVjdGlvbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgY29uc3QgUk9JKiByb2ksIGludCogbnVtTWF0Y2hlc1JldHVybmVkKTsKK0lNQVFfRlVOQyBSZWN0YW5nbGVNYXRjaCogSU1BUV9TVERDQUxMCitpbWFxRGV0ZWN0UmVjdGFuZ2xlcyhjb25zdCBJbWFnZSogaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWN0YW5nbGVEZXNjcmlwdG9yKiByZWN0YW5nbGVEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaGFwZURldGVjdGlvbk9wdGlvbnMqIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bU1hdGNoZXNSZXR1cm5lZCk7CitJTUFRX0ZVTkMgRmVhdHVyZURhdGEqIElNQVFfU1REQ0FMTAoraW1hcUdldEdlb21ldHJpY0ZlYXR1cmVzRnJvbUN1cnZlcyhjb25zdCBDdXJ2ZSogY3VydmVzLCB1bnNpZ25lZCBpbnQgbnVtQ3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGZWF0dXJlVHlwZSogZmVhdHVyZVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtRmVhdHVyZVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIG51bUZlYXR1cmVzKTsKK0lNQVFfRlVOQyBGZWF0dXJlRGF0YSogSU1BUV9TVERDQUxMCitpbWFxR2V0R2VvbWV0cmljVGVtcGxhdGVGZWF0dXJlSW5mbyhjb25zdCBJbWFnZSogcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogbnVtRmVhdHVyZXMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFMZWFybkNvbG9yUGF0dGVybihJbWFnZSogaW1hZ2UsIGNvbnN0IExlYXJuQ29sb3JQYXR0ZXJuT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTGVhcm5HZW9tZXRyaWNQYXR0ZXJuKAorICAgIEltYWdlKiBpbWFnZSwgUG9pbnRGbG9hdCBvcmlnaW5PZmZzZXQsIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLAorICAgIGNvbnN0IExlYXJuR2VvbWV0cmljUGF0dGVybkFkdmFuY2VkT3B0aW9ucyogYWR2YW5jZWRMZWFybk9wdGlvbnMsCisgICAgY29uc3QgSW1hZ2UqIG1hc2spOworSU1BUV9GVU5DIE11bHRpcGxlR2VvbWV0cmljUGF0dGVybiogSU1BUV9TVERDQUxMCitpbWFxTGVhcm5NdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5zKGNvbnN0IEltYWdlKiogcGF0dGVybnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1iZXJPZlBhdHRlcm5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcyNTUqIGxhYmVscyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUxlYXJuUGF0dGVybjMoSW1hZ2UqIGltYWdlLCBMZWFybmluZ01vZGUgbGVhcm5pbmdNb2RlLAorICAgICAgICAgICAgICAgICAgTGVhcm5QYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiBJTUFRX1NURENBTEwKK2ltYXFNYXRjaENvbG9yUGF0dGVybihjb25zdCBJbWFnZSogaW1hZ2UsIEltYWdlKiBwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdGNoQ29sb3JQYXR0ZXJuT3B0aW9ucyogb3B0aW9ucywgUmVjdCBzZWFyY2hSZWN0LAorICAgICAgICAgICAgICAgICAgICAgIGludCogbnVtTWF0Y2hlcyk7CitJTUFRX0ZVTkMgR2VvbWV0cmljUGF0dGVybk1hdGNoMiogSU1BUV9TVERDQUxMIGltYXFNYXRjaEdlb21ldHJpY1BhdHRlcm4yKAorICAgIGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLAorICAgIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnMqIG1hdGNoT3B0aW9ucywKKyAgICBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyKiBhZHZhbmNlZE1hdGNoT3B0aW9ucywKKyAgICBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBHZW9tZXRyaWNQYXR0ZXJuTWF0Y2gyKiBJTUFRX1NURENBTEwKK2ltYXFNYXRjaE11bHRpcGxlR2VvbWV0cmljUGF0dGVybnMoCisgICAgY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm4qIG11bHRpcGxlUGF0dGVybiwKKyAgICBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm4qIElNQVFfU1REQ0FMTAoraW1hcVJlYWRNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5GaWxlKGNvbnN0IGNoYXIqIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzI1NSBkZXNjcmlwdGlvbik7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiBJTUFRX1NURENBTEwKK2ltYXFSZWZpbmVNYXRjaGVzKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICBjb25zdCBQYXR0ZXJuTWF0Y2gqIGNhbmRpZGF0ZXNJbiwgaW50IG51bUNhbmRpZGF0ZXNJbiwKKyAgICAgICAgICAgICAgICAgIE1hdGNoUGF0dGVybk9wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBNYXRjaFBhdHRlcm5BZHZhbmNlZE9wdGlvbnMqIGFkdmFuY2VkT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGludCogbnVtQ2FuZGlkYXRlc091dCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2V0TXVsdGlwbGVHZW9tZXRyaWNQYXR0ZXJuc09wdGlvbnMoCisgICAgTXVsdGlwbGVHZW9tZXRyaWNQYXR0ZXJuKiBtdWx0aXBsZVBhdHRlcm4sIGNvbnN0IGNoYXIqIGxhYmVsLAorICAgIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLAorICAgIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnMqIG1hdGNoT3B0aW9ucywKKyAgICBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyKiBhZHZhbmNlZE1hdGNoT3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxV3JpdGVNdWx0aXBsZUdlb21ldHJpY1BhdHRlcm5GaWxlKAorICAgIGNvbnN0IE11bHRpcGxlR2VvbWV0cmljUGF0dGVybiogbXVsdGlwbGVQYXR0ZXJuLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwKKyAgICBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7CitJTUFRX0ZVTkMgR2VvbWV0cmljUGF0dGVybk1hdGNoMyogSU1BUV9TVERDQUxMIGltYXFNYXRjaEdlb21ldHJpY1BhdHRlcm4zKAorICAgIGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IEN1cnZlT3B0aW9ucyogY3VydmVPcHRpb25zLAorICAgIGNvbnN0IE1hdGNoR2VvbWV0cmljUGF0dGVybk9wdGlvbnMqIG1hdGNoT3B0aW9ucywKKyAgICBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMzKiBhZHZhbmNlZE1hdGNoT3B0aW9ucywKKyAgICBjb25zdCBST0kqIHJvaSwgc2l6ZV90KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFMZWFybkdlb21ldHJpY1BhdHRlcm4yKAorICAgIEltYWdlKiBpbWFnZSwgUG9pbnRGbG9hdCBvcmlnaW5PZmZzZXQsIGRvdWJsZSBhbmdsZU9mZnNldCwKKyAgICBjb25zdCBDdXJ2ZU9wdGlvbnMqIGN1cnZlT3B0aW9ucywKKyAgICBjb25zdCBMZWFybkdlb21ldHJpY1BhdHRlcm5BZHZhbmNlZE9wdGlvbnMyKiBhZHZhbmNlZExlYXJuT3B0aW9ucywKKyAgICBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiBJTUFRX1NURENBTEwKK2ltYXFNYXRjaFBhdHRlcm4zKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICBjb25zdCBNYXRjaFBhdHRlcm5PcHRpb25zKiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgT3ZlcmxheSBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNsZWFyT3ZlcmxheShJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29weU92ZXJsYXkoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0T3ZlcmxheVByb3BlcnRpZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1CZWhhdmlvcnMqIHRyYW5zZm9ybUJlaGF2aW9ycyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU1lcmdlT3ZlcmxheShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUkdCVmFsdWUqIHBhbGV0dGUsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Db2xvcnMsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5QXJjKEltYWdlKiBpbWFnZSwgY29uc3QgQXJjSW5mbyogYXJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkdCVmFsdWUqIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd01vZGUgZHJhd01vZGUsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxT3ZlcmxheUJpdG1hcChJbWFnZSogaW1hZ2UsIFBvaW50IGRlc3RMb2MsIGNvbnN0IFJHQlZhbHVlKiBiaXRtYXAsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtQ29scywgdW5zaWduZWQgaW50IG51bVJvd3MsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBncm91cCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU92ZXJsYXlDbG9zZWRDb250b3VyKEltYWdlKiBpbWFnZSwgY29uc3QgUG9pbnQqIHBvaW50cywgaW50IG51bVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSR0JWYWx1ZSogY29sb3IsIERyYXdNb2RlIGRyYXdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5TGluZShJbWFnZSogaW1hZ2UsIFBvaW50IHN0YXJ0LCBQb2ludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkdCVmFsdWUqIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFPdmVybGF5TWV0YWZpbGUoSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtZXRhZmlsZSwgUmVjdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBncm91cCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU92ZXJsYXlPcGVuQ29udG91cihJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJHQlZhbHVlKiBjb2xvciwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcU92ZXJsYXlPdmFsKEltYWdlKiBpbWFnZSwgUmVjdCBib3VuZGluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSR0JWYWx1ZSogY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd01vZGUgZHJhd01vZGUsIGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxT3ZlcmxheVBvaW50cyhJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBSR0JWYWx1ZSogY29sb3JzLCBpbnQgbnVtQ29sb3JzLCBQb2ludFN5bWJvbCBzeW1ib2wsCisgICAgICAgICAgICAgICAgICBjb25zdCBVc2VyUG9pbnRTeW1ib2wqIHVzZXJTeW1ib2wsIGNvbnN0IGNoYXIqIGdyb3VwKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxT3ZlcmxheVJlY3QoSW1hZ2UqIGltYWdlLCBSZWN0IHJlY3QsIGNvbnN0IFJHQlZhbHVlKiBjb2xvciwKKyAgICAgICAgICAgICAgICBEcmF3TW9kZSBkcmF3TW9kZSwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFPdmVybGF5Uk9JKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIFBvaW50U3ltYm9sIHN5bWJvbCwKKyAgICAgICAgICAgICAgIGNvbnN0IFVzZXJQb2ludFN5bWJvbCogdXNlclN5bWJvbCwgY29uc3QgY2hhciogZ3JvdXApOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFPdmVybGF5VGV4dChJbWFnZSogaW1hZ2UsIFBvaW50IG9yaWdpbiwgY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICBjb25zdCBSR0JWYWx1ZSogY29sb3IsIGNvbnN0IE92ZXJsYXlUZXh0T3B0aW9ucyogb3B0aW9ucywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBncm91cCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldE92ZXJsYXlQcm9wZXJ0aWVzKEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtQmVoYXZpb3JzKiB0cmFuc2Zvcm1CZWhhdmlvcnMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBPQ1IgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBDaGFyU2V0KiBJTUFRX1NURENBTEwgaW1hcUNyZWF0ZUNoYXJTZXQodm9pZCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxRGVsZXRlQ2hhcihDaGFyU2V0KiBzZXQsIGludCBpbmRleCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxR2V0Q2hhckNvdW50KGNvbnN0IENoYXJTZXQqIHNldCk7CitJTUFRX0ZVTkMgQ2hhckluZm8yKiBJTUFRX1NURENBTEwKK2ltYXFHZXRDaGFySW5mbzIoY29uc3QgQ2hhclNldCogc2V0LCBpbnQgaW5kZXgpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFSZWFkT0NSRmlsZShjb25zdCBjaGFyKiBmaWxlTmFtZSwgQ2hhclNldCogc2V0LCBTdHJpbmcyNTUgc2V0RGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgUmVhZFRleHRPcHRpb25zKiByZWFkT3B0aW9ucywKKyAgICAgICAgICAgICAgICBPQ1JQcm9jZXNzaW5nT3B0aW9ucyogcHJvY2Vzc2luZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgT0NSU3BhY2luZ09wdGlvbnMqIHNwYWNpbmdPcHRpb25zKTsKK0lNQVFfRlVOQyBSZWFkVGV4dFJlcG9ydDMqIElNQVFfU1REQ0FMTAoraW1hcVJlYWRUZXh0Myhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IENoYXJTZXQqIHNldCwgY29uc3QgUk9JKiByb2ksCisgICAgICAgICAgICAgIGNvbnN0IFJlYWRUZXh0T3B0aW9ucyogcmVhZE9wdGlvbnMsCisgICAgICAgICAgICAgIGNvbnN0IE9DUlByb2Nlc3NpbmdPcHRpb25zKiBwcm9jZXNzaW5nT3B0aW9ucywKKyAgICAgICAgICAgICAgY29uc3QgT0NSU3BhY2luZ09wdGlvbnMqIHNwYWNpbmdPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxUmVuYW1lQ2hhcihDaGFyU2V0KiBzZXQsIGludCBpbmRleCwgY29uc3QgY2hhciogbmV3Q2hhclZhbHVlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2V0UmVmZXJlbmNlQ2hhcihjb25zdCBDaGFyU2V0KiBzZXQsIGludCBpbmRleCwgaW50IGlzUmVmZXJlbmNlQ2hhcik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVRyYWluQ2hhcnMoY29uc3QgSW1hZ2UqIGltYWdlLCBDaGFyU2V0KiBzZXQsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNoYXJWYWx1ZSwgY29uc3QgUk9JKiByb2ksCisgICAgICAgICAgICAgICBjb25zdCBPQ1JQcm9jZXNzaW5nT3B0aW9ucyogcHJvY2Vzc2luZ09wdGlvbnMsCisgICAgICAgICAgICAgICBjb25zdCBPQ1JTcGFjaW5nT3B0aW9ucyogc3BhY2luZ09wdGlvbnMpOworSU1BUV9GVU5DIGludCogSU1BUV9TVERDQUxMCitpbWFxVmVyaWZ5UGF0dGVybnMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBDaGFyU2V0KiBzZXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMjU1KiBleHBlY3RlZFBhdHRlcm5zLCBpbnQgcGF0dGVybkNvdW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bVNjb3Jlcyk7CitJTUFRX0ZVTkMgaW50KiBJTUFRX1NURENBTEwKK2ltYXFWZXJpZnlUZXh0KGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgQ2hhclNldCogc2V0LAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRTdHJpbmcsIGNvbnN0IFJPSSogcm9pLCBpbnQqIG51bVNjb3Jlcyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVdyaXRlT0NSRmlsZShjb25zdCBjaGFyKiBmaWxlTmFtZSwgY29uc3QgQ2hhclNldCogc2V0LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXREZXNjcmlwdGlvbiwgY29uc3QgUmVhZFRleHRPcHRpb25zKiByZWFkT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3QgT0NSUHJvY2Vzc2luZ09wdGlvbnMqIHByb2Nlc3NpbmdPcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBPQ1JTcGFjaW5nT3B0aW9ucyogc3BhY2luZ09wdGlvbnMpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBHZW9tZXRyaWMgTWF0Y2hpbmcgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBFeHRyYWN0Q29udG91clJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxRXh0cmFjdENvbnRvdXIoSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICAgICAgICBFeHRyYWN0Q29udG91ckRpcmVjdGlvbiBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgQ3VydmVQYXJhbWV0ZXJzKiBjdXJ2ZVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDb25uZWN0aW9uQ29uc3RyYWludCogY29ubmVjdGlvbkNvbnN0cmFpbnRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bU9mQ29uc3RyYWludHMsCisgICAgICAgICAgICAgICAgICAgRXh0cmFjdENvbnRvdXJTZWxlY3Rpb24gc2VsZWN0aW9uLCBJbWFnZSogY29udG91ckltYWdlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29udG91ck92ZXJsYXkoSW1hZ2UqIGltYWdlLCBjb25zdCBJbWFnZSogY29udG91ckltYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRvdXJPdmVybGF5U2V0dGluZ3MqIHBvaW50c1NldHRpbmdzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRvdXJPdmVybGF5U2V0dGluZ3MqIGVxblNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdyb3VwTmFtZSk7CitJTUFRX0ZVTkMgQ29udG91ckNvbXB1dGVDdXJ2YXR1cmVSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUNvbnRvdXJDb21wdXRlQ3VydmF0dXJlKGNvbnN0IEltYWdlKiBjb250b3VySW1hZ2UsIHVuc2lnbmVkIGludCBrZXJuZWwpOworSU1BUV9GVU5DIEN1cnZhdHVyZUFuYWx5c2lzUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFDb250b3VyQ2xhc3NpZnlDdXJ2YXR1cmUoY29uc3QgSW1hZ2UqIGNvbnRvdXJJbWFnZSwgdW5zaWduZWQgaW50IGtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2VMYWJlbCogY3VydmF0dXJlQ2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bUN1cnZhdHVyZUNsYXNzZXMpOworSU1BUV9GVU5DIENvbXB1dGVEaXN0YW5jZXNSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUNvbnRvdXJDb21wdXRlRGlzdGFuY2VzKGNvbnN0IEltYWdlKiB0YXJnZXRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZSogdGVtcGxhdGVJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXR1cE1hdGNoUGF0dGVybkRhdGEqIG1hdGNoU2V0dXBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzbW9vdGhpbmdLZXJuZWwpOworSU1BUV9GVU5DIENsYXNzaWZ5RGlzdGFuY2VzUmVwb3J0KiBJTUFRX1NURENBTEwgaW1hcUNvbnRvdXJDbGFzc2lmeURpc3RhbmNlcygKKyAgICBjb25zdCBJbWFnZSogdGFyZ2V0SW1hZ2UsIGNvbnN0IEltYWdlKiB0ZW1wbGF0ZUltYWdlLAorICAgIGNvbnN0IFNldHVwTWF0Y2hQYXR0ZXJuRGF0YSogbWF0Y2hTZXR1cERhdGEsIHVuc2lnbmVkIGludCBzbW9vdGhpbmdLZXJuZWwsCisgICAgY29uc3QgUmFuZ2VMYWJlbCogZGlzdGFuY2VSYW5nZXMsIHVuc2lnbmVkIGludCBudW1EaXN0YW5jZVJhbmdlcyk7CitJTUFRX0ZVTkMgQ29udG91ckluZm9SZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUNvbnRvdXJJbmZvKGNvbnN0IEltYWdlKiBjb250b3VySW1hZ2UpOworSU1BUV9GVU5DIFNldHVwTWF0Y2hQYXR0ZXJuRGF0YSogSU1BUV9TVERDQUxMIGltYXFDb250b3VyU2V0dXBNYXRjaFBhdHRlcm4oCisgICAgTWF0Y2hNb2RlKiBtYXRjaE1vZGUsIHVuc2lnbmVkIGludCBlbmFibGVTdWJQaXhlbEFjY3VyYWN5LAorICAgIEN1cnZlUGFyYW1ldGVycyogY3VydmVQYXJhbXMsIHVuc2lnbmVkIGludCB1c2VMZWFybkN1cnZlUGFyYW1ldGVycywKKyAgICBjb25zdCBSYW5nZVNldHRpbmdEb3VibGUqIHJhbmdlU2V0dGluZ3MsIHVuc2lnbmVkIGludCBudW1SYW5nZVNldHRpbmdzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFDb250b3VyQWR2YW5jZWRTZXR1cE1hdGNoUGF0dGVybigKKyAgICBTZXR1cE1hdGNoUGF0dGVybkRhdGEqIG1hdGNoU2V0dXBEYXRhLAorICAgIEdlb21ldHJpY0FkdmFuY2VkU2V0dXBEYXRhT3B0aW9uKiBnZW9tZXRyaWNPcHRpb25zLAorICAgIHVuc2lnbmVkIGludCBudW1HZW9tZXRyaWNPcHRpb25zKTsKK0lNQVFfRlVOQyBDb250b3VyRml0TGluZVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxQ29udG91ckZpdExpbmUoSW1hZ2UqIGltYWdlLCBkb3VibGUgcGl4ZWxSYWRpdXMpOworSU1BUV9GVU5DIFBhcnRpYWxDaXJjbGUqIElNQVFfU1REQ0FMTAoraW1hcUNvbnRvdXJGaXRDaXJjbGUoSW1hZ2UqIGltYWdlLCBkb3VibGUgcGl4ZWxSYWRpdXMsIGludCByZWplY3RPdXRsaWVycyk7CitJTUFRX0ZVTkMgUGFydGlhbEVsbGlwc2UqIElNQVFfU1REQ0FMTAoraW1hcUNvbnRvdXJGaXRFbGxpcHNlKEltYWdlKiBpbWFnZSwgZG91YmxlIHBpeGVsUmFkaXVzLCBpbnQgcmVqZWN0T3V0bGllcnMpOworSU1BUV9GVU5DIENvbnRvdXJGaXRTcGxpbmVSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUNvbnRvdXJGaXRTcGxpbmUoSW1hZ2UqIGltYWdlLCBpbnQgZGVncmVlLCBpbnQgbnVtYmVyT2ZDb250cm9sUG9pbnRzKTsKK0lNQVFfRlVOQyBDb250b3VyRml0UG9seW5vbWlhbFJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxQ29udG91ckZpdFBvbHlub21pYWwoSW1hZ2UqIGltYWdlLCBpbnQgb3JkZXIpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBFZGdlIERldGVjdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIEZpbmRDaXJjdWxhckVkZ2VSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUZpbmRDaXJjdWxhckVkZ2UyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogYmFzZVN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb29yZGluYXRlU3lzdGVtKiBuZXdTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmluZENpcmN1bGFyRWRnZU9wdGlvbnMqIGVkZ2VPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENpcmNsZUZpdE9wdGlvbnMqIGNpcmNsZUZpdE9wdGlvbnMpOworSU1BUV9GVU5DIEZpbmRDb25jZW50cmljRWRnZVJlcG9ydCogSU1BUV9TVERDQUxMIGltYXFGaW5kQ29uY2VudHJpY0VkZ2UyKAorICAgIEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sCisgICAgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogbmV3U3lzdGVtLAorICAgIGNvbnN0IEZpbmRDb25jZW50cmljRWRnZU9wdGlvbnMqIGVkZ2VPcHRpb25zLAorICAgIGNvbnN0IENvbmNlbnRyaWNFZGdlRml0T3B0aW9ucyogY29uY2VudHJpY0VkZ2VGaXRPcHRpb25zKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgTW9ycGhvbG9neSBSZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHcmF5TW9ycGhvbG9neVJlY29uc3RydWN0KEltYWdlKiBkc3RJbWFnZSwgSW1hZ2UqIHNyY0ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UqIG1hcmtlckltYWdlLCBQb2ludEZsb2F0KiBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtT2ZQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3JwaG9sb2d5UmVjb25zdHJ1Y3RPcGVyYXRpb24gb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RydWN0dXJpbmdFbGVtZW50KiBzdHJ1Y3R1cmluZ0VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBST0kqIHJvaSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcU1vcnBob2xvZ3lSZWNvbnN0cnVjdChJbWFnZSogZHN0SW1hZ2UsIEltYWdlKiBzcmNJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UqIG1hcmtlckltYWdlLCBQb2ludEZsb2F0KiBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1PZlBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ycGhvbG9neVJlY29uc3RydWN0T3BlcmF0aW9uIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5IGNvbm5lY3Rpdml0eSwgY29uc3QgUk9JKiByb2kpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBUZXh0dXJlIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcURldGVjdFRleHR1cmVEZWZlY3QoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIEltYWdlKiBkZXN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZSogc3JjSW1hZ2UsIGNvbnN0IFJPSSogcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRpYWxTdGVwU2l6ZSwgaW50IGZpbmFsU3RlcFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGRlZmVjdFBpeGVsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWluQ2xhc3NpZmljYXRpb25TY29yZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ2xhc3NpZmljYXRpb25UZXh0dXJlRGVmZWN0T3B0aW9ucygKKyAgICBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgV2luZG93U2l6ZSogd2luZG93T3B0aW9ucywKKyAgICBXYXZlbGV0T3B0aW9ucyogd2F2ZWxldE9wdGlvbnMsIHZvaWQqKiBiYW5kc1VzZWQsIGludCogbnVtQmFuZHNVc2VkLAorICAgIENvb2NjdXJyZW5jZU9wdGlvbnMqIGNvb2NjdXJyZW5jZU9wdGlvbnMsIHVuc2lnbmVkIGNoYXIgc2V0T3BlcmF0aW9uKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29vY2N1cnJlbmNlTWF0cml4KGNvbnN0IEltYWdlKiBzcmNJbWFnZSwgY29uc3QgUk9JKiByb2ksIGludCBsZXZlbFBpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaXNwbGFjZW1lbnRWZWN0b3IqIGRpc3BsYWNlbWVudFZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZmVhdHVyZU9wdGlvbkFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmVhdHVyZU9wdGlvbkFycmF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGNvb2NjdXJyZW5jZU1hdHJpeEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvb2N1cnJlbmNlTWF0cml4Um93cywgaW50KiBjb29jdXJyZW5jZU1hdHJpeENvbHMsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBmZWF0dXJlVmVjdG9yQXJyYXksIGludCogZmVhdHVyZVZlY3RvckFycmF5U2l6ZSk7CitJTUFRX0ZVTkMgRXh0cmFjdFRleHR1cmVGZWF0dXJlc1JlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxRXh0cmFjdFRleHR1cmVGZWF0dXJlcyhjb25zdCBJbWFnZSogc3JjSW1hZ2UsIGNvbnN0IFJPSSogcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2luZG93U2l6ZSogd2luZG93T3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdhdmVsZXRPcHRpb25zKiB3YXZlbGV0T3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHdhdmVsZXRCYW5kcywgdW5zaWduZWQgaW50IG51bVdhdmVsZXRCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvb2NjdXJyZW5jZU9wdGlvbnMqIGNvb2NjdXJyZW5jZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVzZVdpbmRvdyk7CitJTUFRX0ZVTkMgV2F2ZWxldEJhbmRzUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFFeHRyYWN0V2F2ZWxldEJhbmRzKGNvbnN0IEltYWdlKiBzcmNJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdhdmVsZXRPcHRpb25zKiB3YXZlbGV0T3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHdhdmVsZXRCYW5kcywgdW5zaWduZWQgaW50IG51bVdhdmVsZXRCYW5kcyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFJlZ2lvbnMgb2YgSW50ZXJlc3QgTWFuaXB1bGF0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgUk9JKiBJTUFRX1NURENBTEwgaW1hcU1hc2tUb1JPSShjb25zdCBJbWFnZSogbWFzaywgaW50KiB3aXRoaW5MaW1pdCk7CitJTUFRX0ZVTkMgUk9JUHJvZmlsZSogSU1BUV9TVERDQUxMCitpbWFxUk9JUHJvZmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFST0lUb01hc2soSW1hZ2UqIG1hc2ssIGNvbnN0IFJPSSogcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbFZhbHVlLCBjb25zdCBJbWFnZSogaW1hZ2VNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBpblNwYWNlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFUcmFuc2Zvcm1ST0kyKFJPSSogcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29vcmRpbmF0ZVN5c3RlbSogYmFzZVN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIG5ld1N5c3RlbSk7CitJTUFRX0ZVTkMgTGFiZWxUb1JPSVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxTGFiZWxUb1JPSShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IHVuc2lnbmVkIGludCogbGFiZWxzSW4sCisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGFiZWxzSW4sIGludCBtYXhOdW1WZWN0b3JzLAorICAgICAgICAgICAgICAgaW50IGlzRXh0ZXJuZWxFZGdlcyk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE1vcnBob2xvZ3kgZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR3JheU1vcnBob2xvZ3koSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE1vcnBob2xvZ3lNZXRob2QgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ2xhc3NpZmljYXRpb24gZnVuY3Rpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQWRkQ2xhc3NpZmllclNhbXBsZShJbWFnZSogaW1hZ2UsIENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUk9JKiByb2ksIGNvbnN0IGNoYXIqIHNhbXBsZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZWF0dXJlVmVjdG9yLCB1bnNpZ25lZCBpbnQgdmVjdG9yU2l6ZSk7CitJTUFRX0ZVTkMgQ2xhc3NpZmllclJlcG9ydEFkdmFuY2VkKiBJTUFRX1NURENBTEwKK2ltYXFBZHZhbmNlQ2xhc3NpZnkoSW1hZ2UqIGltYWdlLCBjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUk9JKiByb2ksIGRvdWJsZSogZmVhdHVyZVZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZlY3RvclNpemUpOworSU1BUV9GVU5DIENsYXNzaWZpZXJSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUNsYXNzaWZ5KEltYWdlKiBpbWFnZSwgY29uc3QgQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIGNvbnN0IFJPSSogcm9pLAorICAgICAgICAgICAgIGRvdWJsZSogZmVhdHVyZVZlY3RvciwgdW5zaWduZWQgaW50IHZlY3RvclNpemUpOworSU1BUV9GVU5DIENsYXNzaWZpZXJTZXNzaW9uKiBJTUFRX1NURENBTEwKK2ltYXFDcmVhdGVDbGFzc2lmaWVyKENsYXNzaWZpZXJUeXBlIHR5cGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFEZWxldGVDbGFzc2lmaWVyU2FtcGxlKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBpbnQgaW5kZXgpOworSU1BUV9GVU5DIENsYXNzaWZpZXJBY2N1cmFjeVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxR2V0Q2xhc3NpZmllckFjY3VyYWN5KGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uKTsKK0lNQVFfRlVOQyBDbGFzc2lmaWVyU2FtcGxlSW5mbyogSU1BUV9TVERDQUxMCitpbWFxR2V0Q2xhc3NpZmllclNhbXBsZUluZm8oY29uc3QgQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG51bVNhbXBsZXMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFHZXRDb2xvckNsYXNzaWZpZXJPcHRpb25zKGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxR2V0TmVhcmVzdE5laWdoYm9yT3B0aW9ucyhjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lYXJlc3ROZWlnaGJvck9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUdldFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnMyKAorICAgIGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLAorICAgIFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zMiogcHJlcHJvY2Vzc2luZ09wdGlvbnMsCisgICAgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgQ2xhc3NpZmllclNlc3Npb24qIElNQVFfU1REQ0FMTAoraW1hcVJlYWRDbGFzc2lmaWVyRmlsZShDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3QgY2hhciogZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFJlYWRDbGFzc2lmaWVyRmlsZU1vZGUgbW9kZSwgQ2xhc3NpZmllclR5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZpZXJFbmdpbmVUeXBlKiBlbmdpbmUsIFN0cmluZzI1NSBkZXNjcmlwdGlvbik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVJlbGFiZWxDbGFzc2lmaWVyU2FtcGxlKENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmV3Q2xhc3MpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcVNldFBhcnRpY2xlQ2xhc3NpZmllck9wdGlvbnMyKAorICAgIENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLAorICAgIGNvbnN0IFBhcnRpY2xlQ2xhc3NpZmllclByZXByb2Nlc3NpbmdPcHRpb25zMiogcHJlcHJvY2Vzc2luZ09wdGlvbnMsCisgICAgY29uc3QgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldENvbG9yQ2xhc3NpZmllck9wdGlvbnMoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2xvck9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIE5lYXJlc3ROZWlnaGJvclRyYWluaW5nUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFUcmFpbk5lYXJlc3ROZWlnaGJvckNsYXNzaWZpZXIoQ2xhc3NpZmllclNlc3Npb24qIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5lYXJlc3ROZWlnaGJvck9wdGlvbnMqIG9wdGlvbnMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFXcml0ZUNsYXNzaWZpZXJGaWxlKGNvbnN0IENsYXNzaWZpZXJTZXNzaW9uKiBzZXNzaW9uLCBjb25zdCBjaGFyKiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlQ2xhc3NpZmllckZpbGVNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcyNTUgZGVzY3JpcHRpb24pOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBNZWFzdXJlIERpc3RhbmNlcyBmdW5jdGlvbnMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSU1BUV9GVU5DIENsYW1wTWF4MlJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxQ2xhbXBNYXgyKEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIGJhc2VTeXN0ZW0sCisgICAgICAgICAgICAgIGNvbnN0IENvb3JkaW5hdGVTeXN0ZW0qIG5ld1N5c3RlbSwKKyAgICAgICAgICAgICAgY29uc3QgQ3VydmVPcHRpb25zKiBjdXJ2ZVNldHRpbmdzLAorICAgICAgICAgICAgICBjb25zdCBDbGFtcFNldHRpbmdzKiBjbGFtcFNldHRpbmdzLAorICAgICAgICAgICAgICBjb25zdCBDbGFtcE92ZXJsYXlTZXR0aW5ncyogY2xhbXBPdmVybGF5U2V0dGluZ3MpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBJbnNwZWN0aW9uIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUNvbXBhcmVHb2xkZW5UZW1wbGF0ZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBnb2xkZW5UZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UqIGJyaWdodERlZmVjdHMsIEltYWdlKiBkYXJrRGVmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zcGVjdGlvbkFsaWdubWVudCogYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnNwZWN0aW9uT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxTGVhcm5Hb2xkZW5UZW1wbGF0ZShJbWFnZSogZ29sZGVuVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludEZsb2F0IG9yaWdpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrKTsKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIE9ic29sZXRlIGZ1bmN0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxUm90YXRlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbmdsZSwgUGl4ZWxWYWx1ZSBmaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uTWV0aG9kIG1ldGhvZCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVdyaXRlUE5HRmlsZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29tcHJlc3Npb25TcGVlZCwgY29uc3QgUkdCVmFsdWUqIGNvbG9yVGFibGUpOworSU1BUV9GVU5DIFBhcnRpY2xlUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFTZWxlY3RQYXJ0aWNsZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBQYXJ0aWNsZVJlcG9ydCogcmVwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlcG9ydENvdW50LCBpbnQgcmVqZWN0Qm9yZGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3RQYXJ0aWNsZUNyaXRlcmlhKiBjcml0ZXJpYSwgaW50IGNyaXRlcmlhQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGludCogc2VsZWN0ZWRDb3VudCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVBhcnRpY2xlRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEqIGNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcmVqZWN0TWF0Y2hlcywgaW50IGNvbm5lY3Rpdml0eTgpOworSU1BUV9GVU5DIFBhcnRpY2xlUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFHZXRQYXJ0aWNsZUluZm8oSW1hZ2UqIGltYWdlLCBpbnQgY29ubmVjdGl2aXR5OCwgUGFydGljbGVJbmZvTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICBpbnQqIHJlcG9ydENvdW50KTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ2FsY0NvZWZmKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUGFydGljbGVSZXBvcnQqIHJlcG9ydCwKKyAgICAgICAgICAgICAgTWVhc3VyZW1lbnRWYWx1ZSBwYXJhbWV0ZXIsIGZsb2F0KiBjb2VmZmljaWVudCk7CitJTUFRX0ZVTkMgRWRnZVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxRWRnZVRvb2woY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBQb2ludCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLAorICAgICAgICAgICAgIGNvbnN0IEVkZ2VPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bUVkZ2VzKTsKK0lNQVFfRlVOQyBDaXJjbGVSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUNpcmNsZXMoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pblJhZGl1cywgZmxvYXQgbWF4UmFkaXVzLAorICAgICAgICAgICAgaW50KiBudW1DaXJjbGVzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTGFiZWwoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4LCBpbnQqIHBhcnRpY2xlQ291bnQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFGaXRFbGxpcHNlKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywgaW50IG51bVBvaW50cywgQmVzdEVsbGlwc2UqIGVsbGlwc2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFGaXRDaXJjbGUoY29uc3QgUG9pbnRGbG9hdCogcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBCZXN0Q2lyY2xlKiBjaXJjbGUpOworSU1BUV9GVU5DIENvbG9yIElNQVFfU1REQ0FMTCBpbWFxQ2hhbmdlQ29sb3JTcGFjZShjb25zdCBDb2xvciogc291cmNlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yTW9kZSBzb3VyY2VTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JNb2RlIGRlc3RTcGFjZSk7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiBJTUFRX1NURENBTEwKK2ltYXFNYXRjaFBhdHRlcm4oY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZSogcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hQYXR0ZXJuT3B0aW9ucyogb3B0aW9ucywgUmVjdCBzZWFyY2hSZWN0LAorICAgICAgICAgICAgICAgICBpbnQqIG51bU1hdGNoZXMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUNvbnZleChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUlzVmlzaW9uSW5mb1ByZXNlbnQoY29uc3QgSW1hZ2UqIGltYWdlLCBWaXNpb25JbmZvVHlwZSB0eXBlLCBpbnQqIHByZXNlbnQpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFMaW5lR2F1Z2VUb29sKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgc3RhcnQsIFBvaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgIExpbmVHYXVnZU1ldGhvZCBtZXRob2QsIGNvbnN0IEVkZ2VPcHRpb25zKiBlZGdlT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENvb3JkaW5hdGVUcmFuc2Zvcm0qIHJlZmVyZW5jZSwgZmxvYXQqIGRpc3RhbmNlKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFCZXN0Q2lyY2xlKGNvbnN0IFBvaW50RmxvYXQqIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1Qb2ludHMsIFBvaW50RmxvYXQqIGNlbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmFkaXVzKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxU2F2ZVBhdHRlcm4oY29uc3QgSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IGNoYXIqIGZpbGVOYW1lKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxTG9hZFBhdHRlcm4oSW1hZ2UqIHBhdHRlcm4sIGNvbnN0IGNoYXIqIGZpbGVOYW1lKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMIGltYXFUcmFuc2Zvcm1ST0koUk9JKiByb2ksIFBvaW50IG9yaWdpblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbmdsZVN0YXJ0LCBQb2ludCBvcmlnaW5GaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5nbGVGaW5hbCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxQ29vcmRpbmF0ZVJlZmVyZW5jZShjb25zdCBQb2ludCogcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQqIG9yaWdpbiwgZmxvYXQqIGFuZ2xlKTsKK0lNQVFfRlVOQyBDb250b3VySW5mbyogSU1BUV9TVERDQUxMCitpbWFxR2V0Q29udG91ckluZm8oY29uc3QgUk9JKiByb2ksIENvbnRvdXJJRCBpZCk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldFdpbmRvd092ZXJsYXkoaW50IHdpbmRvd051bWJlciwgY29uc3QgT3ZlcmxheSogb3ZlcmxheSk7CitJTUFRX0ZVTkMgT3ZlcmxheSogSU1BUV9TVERDQUxMIGltYXFDcmVhdGVPdmVybGF5RnJvbVJPSShjb25zdCBST0kqIHJvaSk7CitJTUFRX0ZVTkMgT3ZlcmxheSogSU1BUV9TVERDQUxMCitpbWFxQ3JlYXRlT3ZlcmxheUZyb21NZXRhZmlsZShjb25zdCB2b2lkKiBtZXRhZmlsZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVNldENhbGlicmF0aW9uSW5mbyhJbWFnZSogaW1hZ2UsIENhbGlicmF0aW9uVW5pdCB1bml0LCBmbG9hdCB4RGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHlEaXN0YW5jZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldENhbGlicmF0aW9uSW5mbyhjb25zdCBJbWFnZSogaW1hZ2UsIENhbGlicmF0aW9uVW5pdCogdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHhEaXN0YW5jZSwgZmxvYXQqIHlEaXN0YW5jZSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUNvbnN0cnVjdFJPSShjb25zdCBJbWFnZSogaW1hZ2UsIFJPSSogcm9pLCBUb29sIGluaXRpYWxUb29sLAorICAgICAgICAgICAgICAgICBjb25zdCBUb29sV2luZG93T3B0aW9ucyogdG9vbHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0cnVjdFJPSU9wdGlvbnMqIG9wdGlvbnMsIGludCogb2theSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxR2V0UGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucygKKyAgICBjb25zdCBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9ucyogcHJlcHJvY2Vzc2luZ09wdGlvbnMsCisgICAgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVpvb21XaW5kb3coaW50IHdpbmRvd051bWJlciwgaW50IHhab29tLCBpbnQgeVpvb20sIFBvaW50IGNlbnRlcik7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUdldFdpbmRvd1pvb20oaW50IHdpbmRvd051bWJlciwgaW50KiB4Wm9vbSwgaW50KiB5Wm9vbSk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcVBhcnRpY2xlRmlsdGVyMyhJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCBpbnQgY3JpdGVyaWFDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zKiBvcHRpb25zLCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBudW1QYXJ0aWNsZXMpOworSU1BUV9GVU5DIFJlYWRUZXh0UmVwb3J0MiogSU1BUV9TVERDQUxMCitpbWFxUmVhZFRleHQyKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgQ2hhclNldCogc2V0LCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICAgY29uc3QgUmVhZFRleHRPcHRpb25zKiByZWFkT3B0aW9ucywKKyAgICAgICAgICAgICAgY29uc3QgT0NSUHJvY2Vzc2luZ09wdGlvbnMqIHByb2Nlc3NpbmdPcHRpb25zLAorICAgICAgICAgICAgICBjb25zdCBPQ1JTcGFjaW5nT3B0aW9ucyogc3BhY2luZ09wdGlvbnMpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFMZWFyblBhdHRlcm4yKEltYWdlKiBpbWFnZSwgTGVhcm5pbmdNb2RlIGxlYXJuaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgIExlYXJuUGF0dGVybkFkdmFuY2VkT3B0aW9ucyogYWR2YW5jZWRPcHRpb25zKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxQ29udm9sdmUoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGNvbnN0IGZsb2F0KiBrZXJuZWwsIGludCBtYXRyaXhSb3dzLAorICAgICAgICAgICAgIGludCBtYXRyaXhDb2xzLCBmbG9hdCBub3JtYWxpemUsIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBpbnQgSU1BUV9TVERDQUxMCitpbWFxRGl2aWRlQ29uc3RhbnQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFBpeGVsVmFsdWUgdmFsdWUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFEaXZpZGUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2VBLCBjb25zdCBJbWFnZSogc291cmNlQik7CitJTUFRX0ZVTkMgRWRnZVJlcG9ydDIqIElNQVFfU1REQ0FMTAoraW1hcUVkZ2VUb29sMyhjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFJPSSogcm9pLCBFZGdlUHJvY2VzcyBwcm9jZXNzVHlwZSwKKyAgICAgICAgICAgICAgY29uc3QgRWRnZU9wdGlvbnMyKiBlZGdlT3B0aW9ucyk7CitJTUFRX0ZVTkMgQ29uY2VudHJpY1Jha2VSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUNvbmNlbnRyaWNSYWtlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksCisgICAgICAgICAgICAgICAgICAgQ29uY2VudHJpY1Jha2VEaXJlY3Rpb24gZGlyZWN0aW9uLCBFZGdlUHJvY2VzcyBwcm9jZXNzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFJha2VPcHRpb25zKiBvcHRpb25zKTsKK0lNQVFfRlVOQyBTcG9rZVJlcG9ydCogSU1BUV9TVERDQUxMCitpbWFxU3Bva2UoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwgU3Bva2VEaXJlY3Rpb24gZGlyZWN0aW9uLAorICAgICAgICAgIEVkZ2VQcm9jZXNzIHByb2Nlc3MsIGNvbnN0IFNwb2tlT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUxlYXJuUGF0dGVybihJbWFnZSogaW1hZ2UsIExlYXJuaW5nTW9kZSBsZWFybmluZ01vZGUpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwgaW1hcUxvb2t1cChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQqIHRhYmxlLCBjb25zdCBJbWFnZSogbWFzayk7CitJTUFRX0ZVTkMgUGF0dGVybk1hdGNoKiBJTUFRX1NURENBTEwKK2ltYXFNYXRjaFBhdHRlcm4yKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgSW1hZ2UqIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICBjb25zdCBNYXRjaFBhdHRlcm5PcHRpb25zKiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hQYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBSZWN0IHNlYXJjaFJlY3QsIGludCogbnVtTWF0Y2hlcyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBpbWFxU2V0UGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucygKKyAgICBDbGFzc2lmaWVyU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICBjb25zdCBQYXJ0aWNsZUNsYXNzaWZpZXJQcmVwcm9jZXNzaW5nT3B0aW9ucyogcHJlcHJvY2Vzc2luZ09wdGlvbnMsCisgICAgY29uc3QgUGFydGljbGVDbGFzc2lmaWVyT3B0aW9ucyogb3B0aW9ucyk7CitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTAoraW1hcUNvcHlDYWxpYnJhdGlvbkluZm8oSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpOworSU1BUV9GVU5DIGludCBJTUFRX1NURENBTEwKK2ltYXFQYXJ0aWNsZUZpbHRlcjIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyKiBjcml0ZXJpYSwgaW50IGNyaXRlcmlhQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGludCByZWplY3RNYXRjaGVzLCBpbnQgY29ubmVjdGl2aXR5OCwgaW50KiBudW1QYXJ0aWNsZXMpOworSU1BUV9GVU5DIEVkZ2VSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUVkZ2VUb29sMihjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IFBvaW50KiBwb2ludHMsIGludCBudW1Qb2ludHMsCisgICAgICAgICAgICAgIEVkZ2VQcm9jZXNzIHByb2Nlc3MsIGNvbnN0IEVkZ2VPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bUVkZ2VzKTsKK0lNQVFfRlVOQyBDb250b3VySUQgSU1BUV9TVERDQUxMCitpbWFxQWRkUm90YXRlZFJlY3RDb250b3VyKFJPSSogcm9pLCBSb3RhdGVkUmVjdCByZWN0KTsKK0lNQVFfRlVOQyBCYXJjb2RlMkRJbmZvKiBJTUFRX1NURENBTEwKK2ltYXFSZWFkRGF0YU1hdHJpeEJhcmNvZGUoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1hdHJpeE9wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogbnVtQmFyY29kZXMpOworSU1BUV9GVU5DIExpbmVhckF2ZXJhZ2VzKiBJTUFRX1NURENBTEwKK2ltYXFMaW5lYXJBdmVyYWdlcyhjb25zdCBJbWFnZSogaW1hZ2UsIFJlY3QgcmVjdCk7CitJTUFRX0ZVTkMgR2VvbWV0cmljUGF0dGVybk1hdGNoKiBJTUFRX1NURENBTEwgaW1hcU1hdGNoR2VvbWV0cmljUGF0dGVybigKKyAgICBjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IEltYWdlKiBwYXR0ZXJuLCBjb25zdCBDdXJ2ZU9wdGlvbnMqIGN1cnZlT3B0aW9ucywKKyAgICBjb25zdCBNYXRjaEdlb21ldHJpY1BhdHRlcm5PcHRpb25zKiBtYXRjaE9wdGlvbnMsCisgICAgY29uc3QgTWF0Y2hHZW9tZXRyaWNQYXR0ZXJuQWR2YW5jZWRPcHRpb25zKiBhZHZhbmNlZE1hdGNoT3B0aW9ucywKKyAgICBjb25zdCBST0kqIHJvaSwgaW50KiBudW1NYXRjaGVzKTsKK0lNQVFfRlVOQyBDaGFySW5mbyogSU1BUV9TVERDQUxMIGltYXFHZXRDaGFySW5mbyhjb25zdCBDaGFyU2V0KiBzZXQsIGludCBpbmRleCk7CitJTUFRX0ZVTkMgUmVhZFRleHRSZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcVJlYWRUZXh0KGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgQ2hhclNldCogc2V0LCBjb25zdCBST0kqIHJvaSwKKyAgICAgICAgICAgICBjb25zdCBSZWFkVGV4dE9wdGlvbnMqIHJlYWRPcHRpb25zLAorICAgICAgICAgICAgIGNvbnN0IE9DUlByb2Nlc3NpbmdPcHRpb25zKiBwcm9jZXNzaW5nT3B0aW9ucywKKyAgICAgICAgICAgICBjb25zdCBPQ1JTcGFjaW5nT3B0aW9ucyogc3BhY2luZ09wdGlvbnMpOworSU1BUV9GVU5DIFRocmVzaG9sZERhdGEqIElNQVFfU1REQ0FMTAoraW1hcUF1dG9UaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBudW1DbGFzc2VzLAorICAgICAgICAgICAgICAgICAgVGhyZXNob2xkTWV0aG9kIG1ldGhvZCk7CitJTUFRX0ZVTkMgQ29sb3JIaXN0b2dyYW1SZXBvcnQqIElNQVFfU1REQ0FMTAoraW1hcUNvbG9ySGlzdG9ncmFtKEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIENvbG9yTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrKTsKK0lNQVFfRlVOQyBSYWtlUmVwb3J0KiBJTUFRX1NURENBTEwKK2ltYXFSYWtlKGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgUk9JKiByb2ksIFJha2VEaXJlY3Rpb24gZGlyZWN0aW9uLAorICAgICAgICAgRWRnZVByb2Nlc3MgcHJvY2VzcywgY29uc3QgUmFrZU9wdGlvbnMqIG9wdGlvbnMpOworCitJTUFRX0ZVTkMgaW50IElNQVFfU1REQ0FMTCBQcml2X1JlYWRKUEVHU3RyaW5nX0MoSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RyaW5nTGVuZ3RoKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9wY3JlLmggYi93cGlsaWJjL0F0aGVuYS9pbmNsdWRlL3BjcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjA1NDYxCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvaW5jbHVkZS9wY3JlLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgIFBlcmwtQ29tcGF0aWJsZSBSZWd1bGFyIEV4cHJlc3Npb25zICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBpcyB0aGUgcHVibGljIGhlYWRlciBmaWxlIGZvciB0aGUgUENSRSBsaWJyYXJ5LCB0byBiZSAjaW5jbHVkZWQgYnkKK2FwcGxpY2F0aW9ucyB0aGF0IGNhbGwgdGhlIFBDUkUgZnVuY3Rpb25zLgorCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ny0yMDA4IFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2Ugbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgICAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKK0FORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCitBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKK0lOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCitDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX1BDUkVfSAorI2RlZmluZSBfUENSRV9ICisKKy8qIFRoZSBjdXJyZW50IFBDUkUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gKi8KKworI2RlZmluZSBQQ1JFX01BSk9SIDcKKyNkZWZpbmUgUENSRV9NSU5PUiA4CisjZGVmaW5lIFBDUkVfUFJFUkVMRUFTRQorI2RlZmluZSBQQ1JFX0RBVEUgMjAwOCAtIDA5IC0gMDUKKworLyogV2hlbiBhbiBhcHBsaWNhdGlvbiBsaW5rcyB0byBhIFBDUkUgRExMIGluIFdpbmRvd3MsIHRoZSBzeW1ib2xzIHRoYXQgYXJlCitpbXBvcnRlZCBoYXZlIHRvIGJlIGlkZW50aWZpZWQgYXMgc3VjaC4gV2hlbiBidWlsZGluZyBQQ1JFLCB0aGUgYXBwcm9wcmlhdGUKK2V4cG9ydCBzZXR0aW5nIGlzIGRlZmluZWQgaW4gcGNyZV9pbnRlcm5hbC5oLCB3aGljaCBpbmNsdWRlcyB0aGlzIGZpbGUuIFNvIHdlCitkb24ndCBjaGFuZ2UgZXhpc3RpbmcgZGVmaW5pdGlvbnMgb2YgUENSRV9FWFBfREVDTCBhbmQgUENSRUNQUF9FWFBfREVDTC4gKi8KKworLyoqCisgKiBOSSBDSEFOR0UKKyAqCisgKiBXZSBkb24ndCBidWlsZCB0aGUgRExMIHZlcnNpb24uIFdlIG9ubHkgYnVpbGQgdGhlIHN0YXRpYyBsaWIgdmVyc2lvbi4KKyAqIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0byAjZGVmaW5lIFBDUkVfU1RBVElDIGluIGV2ZXJ5IGNvbXBvbmVudCB0aGF0CisgKiBpbmNsdWRlcyBwY3JlLmgsIHdlJ3JlIGp1c3QgZ29pbmcgdG8gZ28gYWhlYWQgYW5kIGRlZmluZSBpdCBoZXJlLgorICoKKyAqIEFkYW0gS2VtcCwgMTIvMTUvMjAwOAorKi8KKyNkZWZpbmUgUENSRV9TVEFUSUMKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChQQ1JFX1NUQVRJQykKKyNpZm5kZWYgUENSRV9FWFBfREVDTAorI2RlZmluZSBQQ1JFX0VYUF9ERUNMIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFBDUkVDUFBfRVhQX0RFQ0wKKyNkZWZpbmUgUENSRUNQUF9FWFBfREVDTCBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZW5kaWYKKyNpZm5kZWYgUENSRUNQUF9FWFBfREVGTgorI2RlZmluZSBQQ1JFQ1BQX0VYUF9ERUZOIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiBCeSBkZWZhdWx0LCB3ZSB1c2UgdGhlIHN0YW5kYXJkICJleHRlcm4iIGRlY2xhcmF0aW9ucy4gKi8KKworI2lmbmRlZiBQQ1JFX0VYUF9ERUNMCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgUENSRV9FWFBfREVDTCBleHRlcm4gIkMiCisjZWxzZQorI2RlZmluZSBQQ1JFX0VYUF9ERUNMIGV4dGVybgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFBDUkVDUFBfRVhQX0RFQ0wKKyNkZWZpbmUgUENSRUNQUF9FWFBfREVDTCBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBQQ1JFQ1BQX0VYUF9ERUZOCisjZGVmaW5lIFBDUkVDUFBfRVhQX0RFRk4KKyNlbmRpZgorI2VuZGlmCisKKy8qKgorICogTkkgQ0hBTkdFCisgKgorICogV2UgdXNlIF9fY2RlY2wgb24gd2luMzIgYW5kIHRoZSBkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbiBlbHNld2hlcmUuCisgKgorICogT3JpZ2luYWxsIHRoaXMgbWFjcm8gZGlkIG5vdCBhcHBlYXIgaW4gdGhpcyBmaWxlLCBidXQgaXQgd2FzIHVzZWQgaW4KKyAqIGludGVybmFsIGhlYWRlcnMuIEkgY29uc2lkZXIgaXQgYW4gb3ZlcnNpZ2h0IG9uIHRoZSBwYXJ0IG9mIHRoZSBwY3JlCisgKiBkZXZlbG9wZXJzIHRoYXQgKiBpdCB3YXMgbm90IHVzZWQgaW4gdGhpcyBmaWxlLiBJZiB0aGVzZSBmdW5jdGlvbnMgdXNlCisgKiBzcGVjaWZpYyBjYWxsaW5nIGNvbnZlbnRpb25zIHRoZW4gdGhlaXIgcHJvdG90eXBlcyBzaG91bGQgaW5jbHVkZSB0aGF0CisgKiBjYWxsaW5nIGNvbnZlbnRpb24gaW4gY2FzZSBzb21lIG90aGVyIHByb2plY3QgdXNlcyBhIGRpZmZlcmVudCBkZWZhdWx0LgorICoKKyAqIEFkYW0gS2VtcCAxMi8xNS8yMDA4CisqLworI2lmbmRlZiBQQ1JFX0NBTExfQ09OVkVOVElPTgorI2lmIGRlZmluZWQoX1dJTjMyKSAvKiAzMi1iaXQgYW5kIDY0LWJpdCAqLworI2RlZmluZSBQQ1JFX0NBTExfQ09OVkVOVElPTiBfX2NkZWNsCisjZWxzZQorI2RlZmluZSBQQ1JFX0NBTExfQ09OVkVOVElPTgorI2VuZGlmCisjZWxzZQorI2RlZmluZSBQQ1JFX0NBTExfQ09OVkVOVElPTgorI2VuZGlmCisKKy8qIEhhdmUgdG8gaW5jbHVkZSBzdGRsaWIuaCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBzaXplX3QgaXMgZGVmaW5lZDsKK2l0IGlzIG5lZWRlZCBoZXJlIGZvciBtYWxsb2MuICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogQWxsb3cgZm9yIEMrKyB1c2VycyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIE9wdGlvbnMgKi8KKworI2RlZmluZSBQQ1JFX0NBU0VMRVNTIDB4MDAwMDAwMDEKKyNkZWZpbmUgUENSRV9NVUxUSUxJTkUgMHgwMDAwMDAwMgorI2RlZmluZSBQQ1JFX0RPVEFMTCAweDAwMDAwMDA0CisjZGVmaW5lIFBDUkVfRVhURU5ERUQgMHgwMDAwMDAwOAorI2RlZmluZSBQQ1JFX0FOQ0hPUkVEIDB4MDAwMDAwMTAKKyNkZWZpbmUgUENSRV9ET0xMQVJfRU5ET05MWSAweDAwMDAwMDIwCisjZGVmaW5lIFBDUkVfRVhUUkEgMHgwMDAwMDA0MAorI2RlZmluZSBQQ1JFX05PVEJPTCAweDAwMDAwMDgwCisjZGVmaW5lIFBDUkVfTk9URU9MIDB4MDAwMDAxMDAKKyNkZWZpbmUgUENSRV9VTkdSRUVEWSAweDAwMDAwMjAwCisjZGVmaW5lIFBDUkVfTk9URU1QVFkgMHgwMDAwMDQwMAorI2RlZmluZSBQQ1JFX1VURjggMHgwMDAwMDgwMAorI2RlZmluZSBQQ1JFX05PX0FVVE9fQ0FQVFVSRSAweDAwMDAxMDAwCisjZGVmaW5lIFBDUkVfTk9fVVRGOF9DSEVDSyAweDAwMDAyMDAwCisjZGVmaW5lIFBDUkVfQVVUT19DQUxMT1VUIDB4MDAwMDQwMDAKKyNkZWZpbmUgUENSRV9QQVJUSUFMIDB4MDAwMDgwMDAKKyNkZWZpbmUgUENSRV9ERkFfU0hPUlRFU1QgMHgwMDAxMDAwMAorI2RlZmluZSBQQ1JFX0RGQV9SRVNUQVJUIDB4MDAwMjAwMDAKKyNkZWZpbmUgUENSRV9GSVJTVExJTkUgMHgwMDA0MDAwMAorI2RlZmluZSBQQ1JFX0RVUE5BTUVTIDB4MDAwODAwMDAKKyNkZWZpbmUgUENSRV9ORVdMSU5FX0NSIDB4MDAxMDAwMDAKKyNkZWZpbmUgUENSRV9ORVdMSU5FX0xGIDB4MDAyMDAwMDAKKyNkZWZpbmUgUENSRV9ORVdMSU5FX0NSTEYgMHgwMDMwMDAwMAorI2RlZmluZSBQQ1JFX05FV0xJTkVfQU5ZIDB4MDA0MDAwMDAKKyNkZWZpbmUgUENSRV9ORVdMSU5FX0FOWUNSTEYgMHgwMDUwMDAwMAorI2RlZmluZSBQQ1JFX0JTUl9BTllDUkxGIDB4MDA4MDAwMDAKKyNkZWZpbmUgUENSRV9CU1JfVU5JQ09ERSAweDAxMDAwMDAwCisjZGVmaW5lIFBDUkVfSkFWQVNDUklQVF9DT01QQVQgMHgwMjAwMDAwMAorCisvKiBFeGVjLXRpbWUgYW5kIGdldC9zZXQtdGltZSBlcnJvciBjb2RlcyAqLworCisjZGVmaW5lIFBDUkVfRVJST1JfTk9NQVRDSCAoLTEpCisjZGVmaW5lIFBDUkVfRVJST1JfTlVMTCAoLTIpCisjZGVmaW5lIFBDUkVfRVJST1JfQkFET1BUSU9OICgtMykKKyNkZWZpbmUgUENSRV9FUlJPUl9CQURNQUdJQyAoLTQpCisjZGVmaW5lIFBDUkVfRVJST1JfVU5LTk9XTl9PUENPREUgKC01KQorI2RlZmluZSBQQ1JFX0VSUk9SX1VOS05PV05fTk9ERSAoLTUpIC8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFBDUkVfRVJST1JfTk9NRU1PUlkgKC02KQorI2RlZmluZSBQQ1JFX0VSUk9SX05PU1VCU1RSSU5HICgtNykKKyNkZWZpbmUgUENSRV9FUlJPUl9NQVRDSExJTUlUICgtOCkKKyNkZWZpbmUgUENSRV9FUlJPUl9DQUxMT1VUICgtOSkgLyogTmV2ZXIgdXNlZCBieSBQQ1JFIGl0c2VsZiAqLworI2RlZmluZSBQQ1JFX0VSUk9SX0JBRFVURjggKC0xMCkKKyNkZWZpbmUgUENSRV9FUlJPUl9CQURVVEY4X09GRlNFVCAoLTExKQorI2RlZmluZSBQQ1JFX0VSUk9SX1BBUlRJQUwgKC0xMikKKyNkZWZpbmUgUENSRV9FUlJPUl9CQURQQVJUSUFMICgtMTMpCisjZGVmaW5lIFBDUkVfRVJST1JfSU5URVJOQUwgKC0xNCkKKyNkZWZpbmUgUENSRV9FUlJPUl9CQURDT1VOVCAoLTE1KQorI2RlZmluZSBQQ1JFX0VSUk9SX0RGQV9VSVRFTSAoLTE2KQorI2RlZmluZSBQQ1JFX0VSUk9SX0RGQV9VQ09ORCAoLTE3KQorI2RlZmluZSBQQ1JFX0VSUk9SX0RGQV9VTUxJTUlUICgtMTgpCisjZGVmaW5lIFBDUkVfRVJST1JfREZBX1dTU0laRSAoLTE5KQorI2RlZmluZSBQQ1JFX0VSUk9SX0RGQV9SRUNVUlNFICgtMjApCisjZGVmaW5lIFBDUkVfRVJST1JfUkVDVVJTSU9OTElNSVQgKC0yMSkKKyNkZWZpbmUgUENSRV9FUlJPUl9OVUxMV1NMSU1JVCAoLTIyKSAvKiBObyBsb25nZXIgYWN0dWFsbHkgdXNlZCAqLworI2RlZmluZSBQQ1JFX0VSUk9SX0JBRE5FV0xJTkUgKC0yMykKKworLyogUmVxdWVzdCB0eXBlcyBmb3IgcGNyZV9mdWxsaW5mbygpICovCisKKyNkZWZpbmUgUENSRV9JTkZPX09QVElPTlMgMAorI2RlZmluZSBQQ1JFX0lORk9fU0laRSAxCisjZGVmaW5lIFBDUkVfSU5GT19DQVBUVVJFQ09VTlQgMgorI2RlZmluZSBQQ1JFX0lORk9fQkFDS1JFRk1BWCAzCisjZGVmaW5lIFBDUkVfSU5GT19GSVJTVEJZVEUgNAorI2RlZmluZSBQQ1JFX0lORk9fRklSU1RDSEFSIDQgLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFBDUkVfSU5GT19GSVJTVFRBQkxFIDUKKyNkZWZpbmUgUENSRV9JTkZPX0xBU1RMSVRFUkFMIDYKKyNkZWZpbmUgUENSRV9JTkZPX05BTUVFTlRSWVNJWkUgNworI2RlZmluZSBQQ1JFX0lORk9fTkFNRUNPVU5UIDgKKyNkZWZpbmUgUENSRV9JTkZPX05BTUVUQUJMRSA5CisjZGVmaW5lIFBDUkVfSU5GT19TVFVEWVNJWkUgMTAKKyNkZWZpbmUgUENSRV9JTkZPX0RFRkFVTFRfVEFCTEVTIDExCisjZGVmaW5lIFBDUkVfSU5GT19PS1BBUlRJQUwgMTIKKyNkZWZpbmUgUENSRV9JTkZPX0pDSEFOR0VEIDEzCisjZGVmaW5lIFBDUkVfSU5GT19IQVNDUk9STEYgMTQKKworLyogUmVxdWVzdCB0eXBlcyBmb3IgcGNyZV9jb25maWcoKS4gRG8gbm90IHJlLWFycmFuZ2UsIGluIG9yZGVyIHRvIHJlbWFpbgorY29tcGF0aWJsZS4gKi8KKworI2RlZmluZSBQQ1JFX0NPTkZJR19VVEY4IDAKKyNkZWZpbmUgUENSRV9DT05GSUdfTkVXTElORSAxCisjZGVmaW5lIFBDUkVfQ09ORklHX0xJTktfU0laRSAyCisjZGVmaW5lIFBDUkVfQ09ORklHX1BPU0lYX01BTExPQ19USFJFU0hPTEQgMworI2RlZmluZSBQQ1JFX0NPTkZJR19NQVRDSF9MSU1JVCA0CisjZGVmaW5lIFBDUkVfQ09ORklHX1NUQUNLUkVDVVJTRSA1CisjZGVmaW5lIFBDUkVfQ09ORklHX1VOSUNPREVfUFJPUEVSVElFUyA2CisjZGVmaW5lIFBDUkVfQ09ORklHX01BVENIX0xJTUlUX1JFQ1VSU0lPTiA3CisjZGVmaW5lIFBDUkVfQ09ORklHX0JTUiA4CisKKy8qIEJpdCBmbGFncyBmb3IgdGhlIHBjcmVfZXh0cmEgc3RydWN0dXJlLiBEbyBub3QgcmUtYXJyYW5nZSBvciByZWRlZmluZQordGhlc2UgYml0cywganVzdCBhZGQgbmV3IG9uZXMgb24gdGhlIGVuZCwgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUuICovCisKKyNkZWZpbmUgUENSRV9FWFRSQV9TVFVEWV9EQVRBIDB4MDAwMQorI2RlZmluZSBQQ1JFX0VYVFJBX01BVENIX0xJTUlUIDB4MDAwMgorI2RlZmluZSBQQ1JFX0VYVFJBX0NBTExPVVRfREFUQSAweDAwMDQKKyNkZWZpbmUgUENSRV9FWFRSQV9UQUJMRVMgMHgwMDA4CisjZGVmaW5lIFBDUkVfRVhUUkFfTUFUQ0hfTElNSVRfUkVDVVJTSU9OIDB4MDAxMAorCisvKiBUeXBlcyAqLworCitzdHJ1Y3QgcmVhbF9wY3JlOyAvKiBkZWNsYXJhdGlvbjsgdGhlIGRlZmluaXRpb24gaXMgcHJpdmF0ZSAgKi8KK3R5cGVkZWYgc3RydWN0IHJlYWxfcGNyZSBwY3JlOworCisvKiBXaGVuIFBDUkUgaXMgY29tcGlsZWQgYXMgYSBDKysgbGlicmFyeSwgdGhlIHN1YmplY3QgcG9pbnRlciB0eXBlIGNhbiBiZQorcmVwbGFjZWQgd2l0aCBhIGN1c3RvbSB0eXBlLiBGb3IgY29udmVudGlvbmFsIHVzZSwgdGhlIHB1YmxpYyBpbnRlcmZhY2UgaXMgYQorY29uc3QgY2hhciAqLiAqLworCisjaWZuZGVmIFBDUkVfU1BUUgorI2RlZmluZSBQQ1JFX1NQVFIgY29uc3QgY2hhciAqCisjZW5kaWYKKworLyogVGhlIHN0cnVjdHVyZSBmb3IgcGFzc2luZyBhZGRpdGlvbmFsIGRhdGEgdG8gcGNyZV9leGVjKCkuIFRoaXMgaXMgZGVmaW5lZCBpbgorc3VjaCBhcyB3YXkgYXMgdG8gYmUgZXh0ZW5zaWJsZS4gQWx3YXlzIGFkZCBuZXcgZmllbGRzIGF0IHRoZSBlbmQsIGluIG9yZGVyIHRvCityZW1haW4gY29tcGF0aWJsZS4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgcGNyZV9leHRyYSB7CisgIHVuc2lnbmVkIGxvbmcgaW50IGZsYWdzOyAgICAgICAvKiBCaXRzIGZvciB3aGljaCBmaWVsZHMgYXJlIHNldCAqLworICB2b2lkICpzdHVkeV9kYXRhOyAgICAgICAgICAgICAgLyogT3BhcXVlIGRhdGEgZnJvbSBwY3JlX3N0dWR5KCkgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgbWF0Y2hfbGltaXQ7IC8qIE1heGltdW0gbnVtYmVyIG9mIGNhbGxzIHRvIG1hdGNoKCkgKi8KKyAgdm9pZCAqY2FsbG91dF9kYXRhOyAgICAgICAgICAgIC8qIERhdGEgcGFzc2VkIGJhY2sgaW4gY2FsbG91dHMgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqdGFibGVzOyAgIC8qIFBvaW50ZXIgdG8gY2hhcmFjdGVyIHRhYmxlcyAqLworICB1bnNpZ25lZCBsb25nIGludCBtYXRjaF9saW1pdF9yZWN1cnNpb247IC8qIE1heCByZWN1cnNpdmUgY2FsbHMgdG8gbWF0Y2goKSAqLworfSBwY3JlX2V4dHJhOworCisvKiBUaGUgc3RydWN0dXJlIGZvciBwYXNzaW5nIG91dCBkYXRhIHZpYSB0aGUgcGNyZV9jYWxsb3V0X2Z1bmN0aW9uLiBXZSB1c2UgYQorc3RydWN0dXJlIHNvIHRoYXQgbmV3IGZpZWxkcyBjYW4gYmUgYWRkZWQgb24gdGhlIGVuZCBpbiBmdXR1cmUgdmVyc2lvbnMsCit3aXRob3V0IGNoYW5naW5nIHRoZSBBUEkgb2YgdGhlIGZ1bmN0aW9uLCB0aGVyZWJ5IGFsbG93aW5nIG9sZCBjbGllbnRzIHRvIHdvcmsKK3dpdGhvdXQgbW9kaWZpY2F0aW9uLiAqLworCit0eXBlZGVmIHN0cnVjdCBwY3JlX2NhbGxvdXRfYmxvY2sgeworICBpbnQgdmVyc2lvbjsgLyogSWRlbnRpZmllcyB2ZXJzaW9uIG9mIGJsb2NrICovCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWZXJzaW9uIDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBpbnQgY2FsbG91dF9udW1iZXI7ICAgLyogTnVtYmVyIGNvbXBpbGVkIGludG8gcGF0dGVybiAqLworICBpbnQgKm9mZnNldF92ZWN0b3I7ICAgLyogVGhlIG9mZnNldCB2ZWN0b3IgKi8KKyAgUENSRV9TUFRSIHN1YmplY3Q7ICAgIC8qIFRoZSBzdWJqZWN0IGJlaW5nIG1hdGNoZWQgKi8KKyAgaW50IHN1YmplY3RfbGVuZ3RoOyAgIC8qIFRoZSBsZW5ndGggb2YgdGhlIHN1YmplY3QgKi8KKyAgaW50IHN0YXJ0X21hdGNoOyAgICAgIC8qIE9mZnNldCB0byBzdGFydCBvZiB0aGlzIG1hdGNoIGF0dGVtcHQgKi8KKyAgaW50IGN1cnJlbnRfcG9zaXRpb247IC8qIFdoZXJlIHdlIGN1cnJlbnRseSBhcmUgaW4gdGhlIHN1YmplY3QgKi8KKyAgaW50IGNhcHR1cmVfdG9wOyAgICAgIC8qIE1heCBjdXJyZW50IGNhcHR1cmUgKi8KKyAgaW50IGNhcHR1cmVfbGFzdDsgICAgIC8qIE1vc3QgcmVjZW50bHkgY2xvc2VkIGNhcHR1cmUgKi8KKyAgdm9pZCAqY2FsbG91dF9kYXRhOyAgIC8qIERhdGEgcGFzc2VkIGluIHdpdGggdGhlIGNhbGwgKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBBZGRlZCBmb3IgVmVyc2lvbiAxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIGludCBwYXR0ZXJuX3Bvc2l0aW9uOyAvKiBPZmZzZXQgdG8gbmV4dCBpdGVtIGluIHRoZSBwYXR0ZXJuICovCisgIGludCBuZXh0X2l0ZW1fbGVuZ3RoOyAvKiBMZW5ndGggb2YgbmV4dCBpdGVtIGluIHRoZSBwYXR0ZXJuICovCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworfSBwY3JlX2NhbGxvdXRfYmxvY2s7CisKKy8qIEluZGlyZWN0aW9uIGZvciBzdG9yZSBnZXQgYW5kIGZyZWUgZnVuY3Rpb25zLiBUaGVzZSBjYW4gYmUgc2V0IHRvCithbHRlcm5hdGl2ZSBtYWxsb2MvZnJlZSBmdW5jdGlvbnMgaWYgcmVxdWlyZWQuIFNwZWNpYWwgb25lcyBhcmUgdXNlZCBpbiB0aGUKK25vbi1yZWN1cnNpdmUgY2FzZSBmb3IgImZyYW1lcyIuIFRoZXJlIGlzIGFsc28gYW4gb3B0aW9uYWwgY2FsbG91dCBmdW5jdGlvbgordGhhdCBpcyB0cmlnZ2VyZWQgYnkgdGhlICg/KSByZWdleCBpdGVtLiBGb3IgVmlydHVhbCBQYXNjYWwsIHRoZXNlIGRlZmluaXRpb25zCitoYXZlIHRvIHRha2UgYW5vdGhlciBmb3JtLiAqLworCisjaWZuZGVmIFZQQ09NUEFUCitQQ1JFX0VYUF9ERUNMIHZvaWQgKihQQ1JFX0NBTExfQ09OVkVOVElPTiAqcGNyZV9tYWxsb2MpKHNpemVfdCk7CitQQ1JFX0VYUF9ERUNMIHZvaWQoUENSRV9DQUxMX0NPTlZFTlRJT04gKnBjcmVfZnJlZSkodm9pZCAqKTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCAqKFBDUkVfQ0FMTF9DT05WRU5USU9OICpwY3JlX3N0YWNrX21hbGxvYykoc2l6ZV90KTsKK1BDUkVfRVhQX0RFQ0wgdm9pZChQQ1JFX0NBTExfQ09OVkVOVElPTiAqcGNyZV9zdGFja19mcmVlKSh2b2lkICopOworUENSRV9FWFBfREVDTCBpbnQoUENSRV9DQUxMX0NPTlZFTlRJT04gKnBjcmVfY2FsbG91dCkocGNyZV9jYWxsb3V0X2Jsb2NrICopOworI2Vsc2UgIC8qIFZQQ09NUEFUICovCitQQ1JFX0VYUF9ERUNMIHZvaWQgKlBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfbWFsbG9jKHNpemVfdCk7CitQQ1JFX0VYUF9ERUNMIHZvaWQgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9mcmVlKHZvaWQgKik7CitQQ1JFX0VYUF9ERUNMIHZvaWQgKlBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfc3RhY2tfbWFsbG9jKHNpemVfdCk7CitQQ1JFX0VYUF9ERUNMIHZvaWQgUENSRV9DQUxMX0NPTlZFTlRJT04gcGNyZV9zdGFja19mcmVlKHZvaWQgKik7CitQQ1JFX0VYUF9ERUNMIGludCBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2NhbGxvdXQocGNyZV9jYWxsb3V0X2Jsb2NrICopOworI2VuZGlmIC8qIFZQQ09NUEFUICovCisKKy8qIEV4cG9ydGVkIFBDUkUgZnVuY3Rpb25zICovCisKK1BDUkVfRVhQX0RFQ0wgcGNyZSAqUENSRV9DQUxMX0NPTlZFTlRJT04KK3BjcmVfY29tcGlsZShjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKiwgaW50ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7CitQQ1JFX0VYUF9ERUNMIHBjcmUgKlBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfY29tcGlsZTIoY29uc3QgY2hhciAqLCBpbnQsIGludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiosIGludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7CitQQ1JFX0VYUF9ERUNMIGludCBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2NvbmZpZyhpbnQsIHZvaWQgKik7CitQQ1JFX0VYUF9ERUNMIGludCBQQ1JFX0NBTExfQ09OVkVOVElPTgorcGNyZV9jb3B5X25hbWVkX3N1YnN0cmluZyhjb25zdCBwY3JlICosIGNvbnN0IGNoYXIgKiwgaW50ICosIGludCwgY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIGludCk7CitQQ1JFX0VYUF9ERUNMIGludCBQQ1JFX0NBTExfQ09OVkVOVElPTgorcGNyZV9jb3B5X3N1YnN0cmluZyhjb25zdCBjaGFyICosIGludCAqLCBpbnQsIGludCwgY2hhciAqLCBpbnQpOworUENSRV9FWFBfREVDTCBpbnQgUENSRV9DQUxMX0NPTlZFTlRJT04KK3BjcmVfZGZhX2V4ZWMoY29uc3QgcGNyZSAqLCBjb25zdCBwY3JlX2V4dHJhICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCwKKyAgICAgICAgICAgICAgaW50ICosIGludCwgaW50ICosIGludCk7CitQQ1JFX0VYUF9ERUNMIGludCBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2V4ZWMoY29uc3QgcGNyZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjcmVfZXh0cmEgKiwgUENSRV9TUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQsIGludCAqLCBpbnQpOworUENSRV9FWFBfREVDTCB2b2lkIFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfZnJlZV9zdWJzdHJpbmcoY29uc3QgY2hhciAqKTsKK1BDUkVfRVhQX0RFQ0wgdm9pZCBQQ1JFX0NBTExfQ09OVkVOVElPTiBwY3JlX2ZyZWVfc3Vic3RyaW5nX2xpc3QoY29uc3QgY2hhciAqKik7CitQQ1JFX0VYUF9ERUNMIGludCBQQ1JFX0NBTExfQ09OVkVOVElPTgorcGNyZV9mdWxsaW5mbyhjb25zdCBwY3JlICosIGNvbnN0IHBjcmVfZXh0cmEgKiwgaW50LCB2b2lkICopOworUENSRV9FWFBfREVDTCBpbnQgUENSRV9DQUxMX0NPTlZFTlRJT04KK3BjcmVfZ2V0X25hbWVkX3N1YnN0cmluZyhjb25zdCBwY3JlICosIGNvbnN0IGNoYXIgKiwgaW50ICosIGludCwgY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiopOworUENSRV9FWFBfREVDTCBpbnQgUENSRV9DQUxMX0NPTlZFTlRJT04KK3BjcmVfZ2V0X3N0cmluZ251bWJlcihjb25zdCBwY3JlICosIGNvbnN0IGNoYXIgKik7CitQQ1JFX0VYUF9ERUNMIGludCBQQ1JFX0NBTExfQ09OVkVOVElPTgorcGNyZV9nZXRfc3RyaW5ndGFibGVfZW50cmllcyhjb25zdCBwY3JlICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgY2hhciAqKik7CitQQ1JFX0VYUF9ERUNMIGludCBQQ1JFX0NBTExfQ09OVkVOVElPTgorcGNyZV9nZXRfc3Vic3RyaW5nKGNvbnN0IGNoYXIgKiwgaW50ICosIGludCwgaW50LCBjb25zdCBjaGFyICoqKTsKK1BDUkVfRVhQX0RFQ0wgaW50IFBDUkVfQ0FMTF9DT05WRU5USU9OCitwY3JlX2dldF9zdWJzdHJpbmdfbGlzdChjb25zdCBjaGFyICosIGludCAqLCBpbnQsIGNvbnN0IGNoYXIgKioqKTsKK1BDUkVfRVhQX0RFQ0wgaW50IFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfaW5mbyhjb25zdCBwY3JlICosIGludCAqLCBpbnQgKik7CitQQ1JFX0VYUF9ERUNMIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfbWFrZXRhYmxlcyh2b2lkKTsKK1BDUkVfRVhQX0RFQ0wgaW50IFBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfcmVmY291bnQocGNyZSAqLCBpbnQpOworUENSRV9FWFBfREVDTCBwY3JlX2V4dHJhICpQQ1JFX0NBTExfQ09OVkVOVElPTgorcGNyZV9zdHVkeShjb25zdCBwY3JlICosIGludCwgY29uc3QgY2hhciAqKik7CitQQ1JFX0VYUF9ERUNMIGNvbnN0IGNoYXIgKlBDUkVfQ0FMTF9DT05WRU5USU9OIHBjcmVfdmVyc2lvbih2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogRW5kIG9mIHBjcmUuaCAqLwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0FEWEwzNDVfSTJDLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BRFhMMzQ1X0kyQy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwZDRiOAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BRFhMMzQ1X0kyQy5jcHAKQEAgLTAsMCArMSw5NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQURYTDM0NV9JMkMuaCIKKyNpbmNsdWRlICJJMkMuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworY29uc3QgdWludDhfdCBBRFhMMzQ1X0kyQzo6a0FkZHJlc3M7Citjb25zdCB1aW50OF90IEFEWEwzNDVfSTJDOjprUG93ZXJDdGxSZWdpc3RlcjsKK2NvbnN0IHVpbnQ4X3QgQURYTDM0NV9JMkM6OmtEYXRhRm9ybWF0UmVnaXN0ZXI7Citjb25zdCB1aW50OF90IEFEWEwzNDVfSTJDOjprRGF0YVJlZ2lzdGVyOworY29uc3RleHByIGRvdWJsZSBBRFhMMzQ1X0kyQzo6a0dzUGVyTFNCOworCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBJMkMgcG9ydCB0aGUgYWNjZWxlcm9tZXRlciBpcyBhdHRhY2hlZCB0bworICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSAoKyBvciAtKSB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZS4KKyAqLworQURYTDM0NV9JMkM6OkFEWEwzNDVfSTJDKFBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2UpIDogSTJDKHBvcnQsIGtBZGRyZXNzKSB7CisgIC8vIFR1cm4gb24gdGhlIG1lYXN1cmVtZW50cworICBXcml0ZShrUG93ZXJDdGxSZWdpc3Rlciwga1Bvd2VyQ3RsX01lYXN1cmUpOworICAvLyBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCB0byByZWFkCisgIFNldFJhbmdlKHJhbmdlKTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQURYTDM0NSwKKyAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprQURYTDM0NV9JMkMsIDApOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkFEWEwzNDVfSTJDIiwgcG9ydCwgdGhpcyk7Cit9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCit2b2lkIEFEWEwzNDVfSTJDOjpTZXRSYW5nZShSYW5nZSByYW5nZSkgeworICBXcml0ZShrRGF0YUZvcm1hdFJlZ2lzdGVyLCBrRGF0YUZvcm1hdF9GdWxsUmVzIHwgKHVpbnQ4X3QpcmFuZ2UpOworfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNDVfSTJDOjpHZXRYKCkgeyByZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1gpOyB9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCitkb3VibGUgQURYTDM0NV9JMkM6OkdldFkoKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWSk7IH0KKworLyoqIHtAaW5oZXJpdGRvY30gKi8KK2RvdWJsZSBBRFhMMzQ1X0kyQzo6R2V0WigpIHsgcmV0dXJuIEdldEFjY2VsZXJhdGlvbihrQXhpc19aKTsgfQorCisvKioKKyAqIEdldCB0aGUgYWNjZWxlcmF0aW9uIG9mIG9uZSBheGlzIGluIEdzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQgZnJvbS4KKyAqIEByZXR1cm4gQWNjZWxlcmF0aW9uIG9mIHRoZSBBRFhMMzQ1IGluIEdzLgorICovCitkb3VibGUgQURYTDM0NV9JMkM6OkdldEFjY2VsZXJhdGlvbihBRFhMMzQ1X0kyQzo6QXhlcyBheGlzKSB7CisgIGludDE2X3QgcmF3QWNjZWwgPSAwOworICBSZWFkKGtEYXRhUmVnaXN0ZXIgKyAodWludDhfdClheGlzLCBzaXplb2YocmF3QWNjZWwpLCAodWludDhfdCAqKSZyYXdBY2NlbCk7CisgIHJldHVybiByYXdBY2NlbCAqIGtHc1BlckxTQjsKK30KKworLyoqCisgKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBhbGwgYXhlcyBpbiBHcy4KKyAqCisgKiBAcmV0dXJuIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBhY2NlbGVyYXRpb24gbWVhc3VyZWQgb24gZWFjaCBheGlzIG9mIHRoZQorICogQURYTDM0NSBpbiBHcy4KKyAqLworQURYTDM0NV9JMkM6OkFsbEF4ZXMgQURYTDM0NV9JMkM6OkdldEFjY2VsZXJhdGlvbnMoKSB7CisgIEFsbEF4ZXMgZGF0YSA9IEFsbEF4ZXMoKTsKKyAgaW50MTZfdCByYXdEYXRhWzNdOworICBSZWFkKGtEYXRhUmVnaXN0ZXIsIHNpemVvZihyYXdEYXRhKSwgKHVpbnQ4X3QgKilyYXdEYXRhKTsKKworICBkYXRhLlhBeGlzID0gcmF3RGF0YVswXSAqIGtHc1BlckxTQjsKKyAgZGF0YS5ZQXhpcyA9IHJhd0RhdGFbMV0gKiBrR3NQZXJMU0I7CisgIGRhdGEuWkF4aXMgPSByYXdEYXRhWzJdICoga0dzUGVyTFNCOworICByZXR1cm4gZGF0YTsKK30KKworc3RkOjpzdHJpbmcgQURYTDM0NV9JMkM6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICIzQXhpc0FjY2VsZXJvbWV0ZXIiOworfQorCit2b2lkIEFEWEwzNDVfSTJDOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3VidGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YnRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCit2b2lkIEFEWEwzNDVfSTJDOjpVcGRhdGVUYWJsZSgpIHsKKyAgbV90YWJsZS0+UHV0TnVtYmVyKCJYIiwgR2V0WCgpKTsKKyAgbV90YWJsZS0+UHV0TnVtYmVyKCJZIiwgR2V0WSgpKTsKKyAgbV90YWJsZS0+UHV0TnVtYmVyKCJaIiwgR2V0WigpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gQURYTDM0NV9JMkM6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0FEWEwzNDVfU1BJLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BRFhMMzQ1X1NQSS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiM2I3MQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BRFhMMzQ1X1NQSS5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkFEWEwzNDVfU1BJLmgiCisjaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiCisjaW5jbHVkZSAiRGlnaXRhbE91dHB1dC5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorCitjb25zdCB1aW50OF90IEFEWEwzNDVfU1BJOjprUG93ZXJDdGxSZWdpc3RlcjsKK2NvbnN0IHVpbnQ4X3QgQURYTDM0NV9TUEk6OmtEYXRhRm9ybWF0UmVnaXN0ZXI7Citjb25zdCB1aW50OF90IEFEWEwzNDVfU1BJOjprRGF0YVJlZ2lzdGVyOworY29uc3RleHByIGRvdWJsZSBBRFhMMzQ1X1NQSTo6a0dzUGVyTFNCOworCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBTUEkgcG9ydCB0aGUgYWNjZWxlcm9tZXRlciBpcyBhdHRhY2hlZCB0bworICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSAoKyBvciAtKSB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZS4KKyAqLworQURYTDM0NV9TUEk6OkFEWEwzNDVfU1BJKFNQSTo6UG9ydCBwb3J0LCBBRFhMMzQ1X1NQSTo6UmFuZ2UgcmFuZ2UpIDogU1BJKHBvcnQpIHsKKyAgU2V0Q2xvY2tSYXRlKDUwMDAwMCk7CisgIFNldE1TQkZpcnN0KCk7CisgIFNldFNhbXBsZURhdGFPbkZhbGxpbmcoKTsKKyAgU2V0Q2xvY2tBY3RpdmVMb3coKTsKKyAgU2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKTsKKworICB1aW50OF90IGNvbW1hbmRzWzJdOworICAvLyBUdXJuIG9uIHRoZSBtZWFzdXJlbWVudHMKKyAgY29tbWFuZHNbMF0gPSBrUG93ZXJDdGxSZWdpc3RlcjsKKyAgY29tbWFuZHNbMV0gPSBrUG93ZXJDdGxfTWVhc3VyZTsKKyAgVHJhbnNhY3Rpb24oY29tbWFuZHMsIGNvbW1hbmRzLCAyKTsKKworICBTZXRSYW5nZShyYW5nZSk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FEWEwzNDUsCisgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a0FEWEwzNDVfU1BJKTsKKworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkFEWEwzNDVfU1BJIiwgcG9ydCwgdGhpcyk7Cit9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCit2b2lkIEFEWEwzNDVfU1BJOjpTZXRSYW5nZShSYW5nZSByYW5nZSkgeworICB1aW50OF90IGNvbW1hbmRzWzJdOworCisgIC8vIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IHRvIHJlYWQKKyAgY29tbWFuZHNbMF0gPSBrRGF0YUZvcm1hdFJlZ2lzdGVyOworICBjb21tYW5kc1sxXSA9IGtEYXRhRm9ybWF0X0Z1bGxSZXMgfCAodWludDhfdCkocmFuZ2UgJiAweDAzKTsKKyAgVHJhbnNhY3Rpb24oY29tbWFuZHMsIGNvbW1hbmRzLCAyKTsKK30KKworLyoqIHtAaW5oZXJpdGRvY30gKi8KK2RvdWJsZSBBRFhMMzQ1X1NQSTo6R2V0WCgpIHsgcmV0dXJuIEdldEFjY2VsZXJhdGlvbihrQXhpc19YKTsgfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNDVfU1BJOjpHZXRZKCkgeyByZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1kpOyB9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCitkb3VibGUgQURYTDM0NV9TUEk6OkdldFooKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWik7IH0KKworLyoqCisgKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBvbmUgYXhpcyBpbiBHcy4KKyAqCisgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byByZWFkIGZyb20uCisgKiBAcmV0dXJuIEFjY2VsZXJhdGlvbiBvZiB0aGUgQURYTDM0NSBpbiBHcy4KKyAqLworZG91YmxlIEFEWEwzNDVfU1BJOjpHZXRBY2NlbGVyYXRpb24oQURYTDM0NV9TUEk6OkF4ZXMgYXhpcykgeworICB1aW50OF90IGJ1ZmZlclszXTsKKyAgdWludDhfdCBjb21tYW5kWzNdID0gezAsIDAsIDB9OworICBjb21tYW5kWzBdID0KKyAgICAgIChrQWRkcmVzc19SZWFkIHwga0FkZHJlc3NfTXVsdGlCeXRlIHwga0RhdGFSZWdpc3RlcikgKyAodWludDhfdClheGlzOworICBUcmFuc2FjdGlvbihjb21tYW5kLCBidWZmZXIsIDMpOworCisgIC8vIFNlbnNvciBpcyBsaXR0bGUgZW5kaWFuLi4uIHN3YXAgYnl0ZXMKKyAgaW50MTZfdCByYXdBY2NlbCA9IGJ1ZmZlclsyXSA8PCA4IHwgYnVmZmVyWzFdOworICByZXR1cm4gcmF3QWNjZWwgKiBrR3NQZXJMU0I7Cit9CisKKy8qKgorICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2YgYWxsIGF4ZXMgaW4gR3MuCisgKgorICogQHJldHVybiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYWNjZWxlcmF0aW9uIG1lYXN1cmVkIG9uIGVhY2ggYXhpcyBvZiB0aGUKKyAqIEFEWEwzNDUgaW4gR3MuCisgKi8KK0FEWEwzNDVfU1BJOjpBbGxBeGVzIEFEWEwzNDVfU1BJOjpHZXRBY2NlbGVyYXRpb25zKCkgeworICBBbGxBeGVzIGRhdGEgPSBBbGxBeGVzKCk7CisgIHVpbnQ4X3QgZGF0YUJ1ZmZlcls3XSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwfTsKKyAgaW50MTZfdCByYXdEYXRhWzNdOworCisgIC8vIFNlbGVjdCB0aGUgZGF0YSBhZGRyZXNzLgorICBkYXRhQnVmZmVyWzBdID0gKGtBZGRyZXNzX1JlYWQgfCBrQWRkcmVzc19NdWx0aUJ5dGUgfCBrRGF0YVJlZ2lzdGVyKTsKKyAgVHJhbnNhY3Rpb24oZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciwgNyk7CisKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgLy8gU2Vuc29yIGlzIGxpdHRsZSBlbmRpYW4uLi4gc3dhcCBieXRlcworICAgIHJhd0RhdGFbaV0gPSBkYXRhQnVmZmVyW2kgKiAyICsgMl0gPDwgOCB8IGRhdGFCdWZmZXJbaSAqIDIgKyAxXTsKKyAgfQorCisgIGRhdGEuWEF4aXMgPSByYXdEYXRhWzBdICoga0dzUGVyTFNCOworICBkYXRhLllBeGlzID0gcmF3RGF0YVsxXSAqIGtHc1BlckxTQjsKKyAgZGF0YS5aQXhpcyA9IHJhd0RhdGFbMl0gKiBrR3NQZXJMU0I7CisKKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0ZDo6c3RyaW5nIEFEWEwzNDVfU1BJOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiAiM0F4aXNBY2NlbGVyb21ldGVyIjsKK30KKwordm9pZCBBRFhMMzQ1X1NQSTo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YnRhYmxlKSB7CisgIG1fdGFibGUgPSBzdWJ0YWJsZTsKKyAgVXBkYXRlVGFibGUoKTsKK30KKwordm9pZCBBRFhMMzQ1X1NQSTo6VXBkYXRlVGFibGUoKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIlgiLCBHZXRYKCkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiWSIsIEdldFkoKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJaIiwgR2V0WigpKTsKKyAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBBRFhMMzQ1X1NQSTo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvQURYTDM2Mi5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvQURYTDM2Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3MGI5YgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BRFhMMzYyLmNwcApAQCAtMCwwICsxLDE4MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQURYTDM2Mi5oIgorI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgorI2luY2x1ZGUgIkRpZ2l0YWxPdXRwdXQuaCIKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKK3N0YXRpYyB1aW50OF90IGtSZWdXcml0ZSA9IDB4MEE7CitzdGF0aWMgdWludDhfdCBrUmVnUmVhZCA9IDB4MEI7CisKK3N0YXRpYyB1aW50OF90IGtQYXJ0SWRSZWdpc3RlciA9IDB4MDI7CitzdGF0aWMgdWludDhfdCBrRGF0YVJlZ2lzdGVyID0gMHgwRTsKK3N0YXRpYyB1aW50OF90IGtGaWx0ZXJDdGxSZWdpc3RlciA9IDB4MkM7CitzdGF0aWMgdWludDhfdCBrUG93ZXJDdGxSZWdpc3RlciA9IDB4MkQ7CisKKy8vc3RhdGljIHVpbnQ4X3Qga0ZpbHRlckN0bF9SYW5nZTJHID0gMHgwMDsKKy8vc3RhdGljIHVpbnQ4X3Qga0ZpbHRlckN0bF9SYW5nZTRHID0gMHg0MDsKKy8vc3RhdGljIHVpbnQ4X3Qga0ZpbHRlckN0bF9SYW5nZThHID0gMHg4MDsKK3N0YXRpYyB1aW50OF90IGtGaWx0ZXJDdGxfT0RSXzEwMEh6ID0gMHgwMzsKKworc3RhdGljIHVpbnQ4X3Qga1Bvd2VyQ3RsX1VsdHJhTG93Tm9pc2UgPSAweDIwOworLy9zdGF0aWMgdWludDhfdCBrUG93ZXJDdGxfQXV0b1NsZWVwID0gMHgwNDsKK3N0YXRpYyB1aW50OF90IGtQb3dlckN0bF9NZWFzdXJlID0gMHgwMjsKKworLyoqCisgKiBDb25zdHJ1Y3Rvci4gIFVzZXMgdGhlIG9uYm9hcmQgQ1MxLgorICoKKyAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgKCsgb3IgLSkgdGhhdCB0aGUgYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUuCisgKi8KK0FEWEwzNjI6OkFEWEwzNjIoUmFuZ2UgcmFuZ2UpIDogQURYTDM2MihTUEk6OlBvcnQ6OmtPbmJvYXJkQ1MxLCByYW5nZSkge30KKworLyoqCisgKiBDb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgU1BJIHBvcnQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMgYXR0YWNoZWQgdG8KKyAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgKCsgb3IgLSkgdGhhdCB0aGUgYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUuCisgKi8KK0FEWEwzNjI6OkFEWEwzNjIoU1BJOjpQb3J0IHBvcnQsIFJhbmdlIHJhbmdlKSA6IG1fc3BpKHBvcnQpIHsKKyAgbV9zcGkuU2V0Q2xvY2tSYXRlKDMwMDAwMDApOworICBtX3NwaS5TZXRNU0JGaXJzdCgpOworICBtX3NwaS5TZXRTYW1wbGVEYXRhT25GYWxsaW5nKCk7CisgIG1fc3BpLlNldENsb2NrQWN0aXZlTG93KCk7CisgIG1fc3BpLlNldENoaXBTZWxlY3RBY3RpdmVMb3coKTsKKworICAvLyBWYWxpZGF0ZSB0aGUgcGFydCBJRAorICB1aW50OF90IGNvbW1hbmRzWzNdOworICBjb21tYW5kc1swXSA9IGtSZWdSZWFkOworICBjb21tYW5kc1sxXSA9IGtQYXJ0SWRSZWdpc3RlcjsKKyAgY29tbWFuZHNbMl0gPSAwOworICBtX3NwaS5UcmFuc2FjdGlvbihjb21tYW5kcywgY29tbWFuZHMsIDMpOworICBpZiAoY29tbWFuZHNbMl0gIT0gMHhGMikgeworICAgIERyaXZlclN0YXRpb246OlJlcG9ydEVycm9yKCJjb3VsZCBub3QgZmluZCBBRFhMMzYyIik7CisgICAgbV9nc1BlckxTQiA9IDAuMDsKKyAgICByZXR1cm47CisgIH0KKworICBTZXRSYW5nZShyYW5nZSk7CisKKyAgLy8gVHVybiBvbiB0aGUgbWVhc3VyZW1lbnRzCisgIGNvbW1hbmRzWzBdID0ga1JlZ1dyaXRlOworICBjb21tYW5kc1sxXSA9IGtQb3dlckN0bFJlZ2lzdGVyOworICBjb21tYW5kc1syXSA9IGtQb3dlckN0bF9NZWFzdXJlIHwga1Bvd2VyQ3RsX1VsdHJhTG93Tm9pc2U7CisgIG1fc3BpLldyaXRlKGNvbW1hbmRzLCAzKTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQURYTDM2MiwgcG9ydCk7CisKKyAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkU2Vuc29yKCJBRFhMMzYyIiwgcG9ydCwgdGhpcyk7Cit9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCit2b2lkIEFEWEwzNjI6OlNldFJhbmdlKFJhbmdlIHJhbmdlKSB7CisgIGlmIChtX2dzUGVyTFNCID09IDAuMCkgcmV0dXJuOworCisgIHVpbnQ4X3QgY29tbWFuZHNbM107CisKKyAgc3dpdGNoIChyYW5nZSkgeworICAgIGNhc2Uga1JhbmdlXzJHOgorICAgICAgbV9nc1BlckxTQiA9IDAuMDAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrUmFuZ2VfNEc6CisgICAgICBtX2dzUGVyTFNCID0gMC4wMDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtSYW5nZV84RzoKKyAgICBjYXNlIGtSYW5nZV8xNkc6ICAvLyAxNkcgbm90IHN1cHBvcnRlZDsgdHJlYXQgYXMgOEcKKyAgICAgIG1fZ3NQZXJMU0IgPSAwLjAwNDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLy8gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgdG8gcmVhZAorICBjb21tYW5kc1swXSA9IGtSZWdXcml0ZTsKKyAgY29tbWFuZHNbMV0gPSBrRmlsdGVyQ3RsUmVnaXN0ZXI7CisgIGNvbW1hbmRzWzJdID0ga0ZpbHRlckN0bF9PRFJfMTAwSHogfCAodWludDhfdCkoKHJhbmdlICYgMHgwMykgPDwgNik7CisgIG1fc3BpLldyaXRlKGNvbW1hbmRzLCAzKTsKK30KKworLyoqIHtAaW5oZXJpdGRvY30gKi8KK2RvdWJsZSBBRFhMMzYyOjpHZXRYKCkgeyByZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1gpOyB9CisKKy8qKiB7QGluaGVyaXRkb2N9ICovCitkb3VibGUgQURYTDM2Mjo6R2V0WSgpIHsgcmV0dXJuIEdldEFjY2VsZXJhdGlvbihrQXhpc19ZKTsgfQorCisvKioge0Bpbmhlcml0ZG9jfSAqLworZG91YmxlIEFEWEwzNjI6OkdldFooKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWik7IH0KKworLyoqCisgKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBvbmUgYXhpcyBpbiBHcy4KKyAqCisgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byByZWFkIGZyb20uCisgKiBAcmV0dXJuIEFjY2VsZXJhdGlvbiBvZiB0aGUgQURYTDM2MiBpbiBHcy4KKyAqLworZG91YmxlIEFEWEwzNjI6OkdldEFjY2VsZXJhdGlvbihBRFhMMzYyOjpBeGVzIGF4aXMpIHsKKyAgaWYgKG1fZ3NQZXJMU0IgPT0gMC4wKSByZXR1cm4gMC4wOworCisgIHVpbnQ4X3QgYnVmZmVyWzRdOworICB1aW50OF90IGNvbW1hbmRbNF0gPSB7MCwgMCwgMCwgMH07CisgIGNvbW1hbmRbMF0gPSBrUmVnUmVhZDsKKyAgY29tbWFuZFsxXSA9IGtEYXRhUmVnaXN0ZXIgKyAodWludDhfdClheGlzOworICBtX3NwaS5UcmFuc2FjdGlvbihjb21tYW5kLCBidWZmZXIsIDQpOworCisgIC8vIFNlbnNvciBpcyBsaXR0bGUgZW5kaWFuLi4uIHN3YXAgYnl0ZXMKKyAgaW50MTZfdCByYXdBY2NlbCA9IGJ1ZmZlclszXSA8PCA4IHwgYnVmZmVyWzJdOworICByZXR1cm4gcmF3QWNjZWwgKiBtX2dzUGVyTFNCOworfQorCisvKioKKyAqIEdldCB0aGUgYWNjZWxlcmF0aW9uIG9mIGFsbCBheGVzIGluIEdzLgorICoKKyAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFjY2VsZXJhdGlvbiBtZWFzdXJlZCBvbiBlYWNoIGF4aXMgb2YgdGhlCisgKiBBRFhMMzYyIGluIEdzLgorICovCitBRFhMMzYyOjpBbGxBeGVzIEFEWEwzNjI6OkdldEFjY2VsZXJhdGlvbnMoKSB7CisgIEFsbEF4ZXMgZGF0YSA9IEFsbEF4ZXMoKTsKKyAgaWYgKG1fZ3NQZXJMU0IgPT0gMC4wKSB7CisgICAgZGF0YS5YQXhpcyA9IGRhdGEuWUF4aXMgPSBkYXRhLlpBeGlzID0gMC4wOworICAgIHJldHVybiBkYXRhOworICB9CisKKyAgdWludDhfdCBkYXRhQnVmZmVyWzhdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OworICBpbnQxNl90IHJhd0RhdGFbM107CisKKyAgLy8gU2VsZWN0IHRoZSBkYXRhIGFkZHJlc3MuCisgIGRhdGFCdWZmZXJbMF0gPSBrUmVnUmVhZDsKKyAgZGF0YUJ1ZmZlclsxXSA9IGtEYXRhUmVnaXN0ZXI7CisgIG1fc3BpLlRyYW5zYWN0aW9uKGRhdGFCdWZmZXIsIGRhdGFCdWZmZXIsIDgpOworCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIC8vIFNlbnNvciBpcyBsaXR0bGUgZW5kaWFuLi4uIHN3YXAgYnl0ZXMKKyAgICByYXdEYXRhW2ldID0gZGF0YUJ1ZmZlcltpICogMiArIDNdIDw8IDggfCBkYXRhQnVmZmVyW2kgKiAyICsgMl07CisgIH0KKworICBkYXRhLlhBeGlzID0gcmF3RGF0YVswXSAqIG1fZ3NQZXJMU0I7CisgIGRhdGEuWUF4aXMgPSByYXdEYXRhWzFdICogbV9nc1BlckxTQjsKKyAgZGF0YS5aQXhpcyA9IHJhd0RhdGFbMl0gKiBtX2dzUGVyTFNCOworCisgIHJldHVybiBkYXRhOworfQorCitzdGQ6OnN0cmluZyBBRFhMMzYyOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiAiM0F4aXNBY2NlbGVyb21ldGVyIjsKK30KKwordm9pZCBBRFhMMzYyOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3VidGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YnRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCit2b2lkIEFEWEwzNjI6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJYIiwgR2V0WCgpKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIlkiLCBHZXRZKCkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiWiIsIEdldFooKSk7CisgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gQURYTDM2Mjo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvQURYUlM0NTBfR3lyby5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvQURYUlM0NTBfR3lyby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxMTFjZgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BRFhSUzQ1MF9HeXJvLmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KKy8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQURYUlM0NTBfR3lyby5oIgorI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorCitzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU2FtcGxlUGVyaW9kID0gMC4wMDE7CitzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrQ2FsaWJyYXRpb25TYW1wbGVUaW1lID0gNS4wOworc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0RlZ3JlZVBlclNlY29uZFBlckxTQiA9IDAuMDEyNTsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtSYXRlUmVnaXN0ZXIgPSAweDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtUZW1SZWdpc3RlciA9IDB4MDI7CitzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0xvQ1NUUmVnaXN0ZXIgPSAweDA0Oworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtIaUNTVFJlZ2lzdGVyID0gMHgwNjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrUXVhZFJlZ2lzdGVyID0gMHgwODsKK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrRmF1bHRSZWdpc3RlciA9IDB4MEE7CitzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga1BJRFJlZ2lzdGVyID0gMHgwQzsKK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrU05IaWdoUmVnaXN0ZXIgPSAweDBFOworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtTTkxvd1JlZ2lzdGVyID0gMHgxMDsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBneXJvLgorICogQ2FsaWJyYXRlIHRoZSBneXJvIGJ5IHJ1bm5pbmcgZm9yIGEgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIGNvbXB1dGluZyB0aGUKKyAqIGNlbnRlciB2YWx1ZS4KKyAqIFRoZW4gdXNlIHRoZSBjZW50ZXIgdmFsdWUgYXMgdGhlIEFjY3VtdWxhdG9yIGNlbnRlciB2YWx1ZSBmb3Igc3Vic2VxdWVudAorICogbWVhc3VyZW1lbnRzLgorICogSXQncyBpbXBvcnRhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJvYm90IGlzIG5vdCBtb3Zpbmcgd2hpbGUgdGhlIGNlbnRlcmluZworICogY2FsY3VsYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgdGhpcyBpcyB0eXBpY2FsbHkgZG9uZSB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdAorICogdHVybmVkIG9uIHdoaWxlIGl0J3Mgc2l0dGluZyBhdCByZXN0IGJlZm9yZSB0aGUgY29tcGV0aXRpb24gc3RhcnRzLgorICovCit2b2lkIEFEWFJTNDUwX0d5cm86OkNhbGlicmF0ZSgpIHsKKyAgV2FpdCgwLjEpOworCisgIG1fc3BpLlNldEFjY3VtdWxhdG9yQ2VudGVyKDApOworICBtX3NwaS5SZXNldEFjY3VtdWxhdG9yKCk7CisKKyAgV2FpdChrQ2FsaWJyYXRpb25TYW1wbGVUaW1lKTsKKworICBtX3NwaS5TZXRBY2N1bXVsYXRvckNlbnRlcigoaW50MzJfdCltX3NwaS5HZXRBY2N1bXVsYXRvckF2ZXJhZ2UoKSk7CisgIG1fc3BpLlJlc2V0QWNjdW11bGF0b3IoKTsKK30KKworLyoqCisgKiBHeXJvIGNvbnN0cnVjdG9yIG9uIG9uYm9hcmQgQ1MwLgorICovCitBRFhSUzQ1MF9HeXJvOjpBRFhSUzQ1MF9HeXJvKCkgOiBBRFhSUzQ1MF9HeXJvKFNQSTo6a09uYm9hcmRDUzApIHt9CisKKy8qKgorICogR3lybyBjb25zdHJ1Y3RvciBvbiB0aGUgc3BlY2lmaWVkIFNQSSBwb3J0LgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBTUEkgcG9ydCB0aGUgZ3lybyBpcyBhdHRhY2hlZCB0by4KKyAqLworQURYUlM0NTBfR3lybzo6QURYUlM0NTBfR3lybyhTUEk6OlBvcnQgcG9ydCkgOiBtX3NwaShwb3J0KSB7CisgIG1fc3BpLlNldENsb2NrUmF0ZSgzMDAwMDAwKTsKKyAgbV9zcGkuU2V0TVNCRmlyc3QoKTsKKyAgbV9zcGkuU2V0U2FtcGxlRGF0YU9uUmlzaW5nKCk7CisgIG1fc3BpLlNldENsb2NrQWN0aXZlSGlnaCgpOworICBtX3NwaS5TZXRDaGlwU2VsZWN0QWN0aXZlTG93KCk7CisKKyAgLy8gVmFsaWRhdGUgdGhlIHBhcnQgSUQKKyAgaWYgKChSZWFkUmVnaXN0ZXIoa1BJRFJlZ2lzdGVyKSAmIDB4ZmYwMCkgIT0gMHg1MjAwKSB7CisgICAgRHJpdmVyU3RhdGlvbjo6UmVwb3J0RXJyb3IoImNvdWxkIG5vdCBmaW5kIEFEWFJTNDUwIGd5cm8iKTsKKyAgICByZXR1cm47CisgIH0KKworICBtX3NwaS5Jbml0QWNjdW11bGF0b3Ioa1NhbXBsZVBlcmlvZCwgMHgyMDAwMDAwMHUsIDQsIDB4MGMwMDAwMDB1LCAweDA0MDAwMDAwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwdSwgMTZ1LCB0cnVlLCB0cnVlKTsKKworICBDYWxpYnJhdGUoKTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQURYUlM0NTAsIHBvcnQpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkFEWFJTNDUwX0d5cm8iLCBwb3J0LCB0aGlzKTsKK30KKworc3RhdGljIGJvb2wgQ2FsY1Bhcml0eSh1aW50MzJfdCB2KSB7CisgIGJvb2wgcGFyaXR5ID0gZmFsc2U7CisgIHdoaWxlICh2ICE9IDApIHsKKyAgICBwYXJpdHkgPSAhcGFyaXR5OworICAgIHYgPSB2ICYgKHYgLSAxKTsKKyAgfQorICByZXR1cm4gcGFyaXR5OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEJ5dGVzVG9JbnRCRSh1aW50OF90KiBidWYpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gKCh1aW50MzJfdClidWZbMF0pIDw8IDI0OworICByZXN1bHQgfD0gKCh1aW50MzJfdClidWZbMV0pIDw8IDE2OworICByZXN1bHQgfD0gKCh1aW50MzJfdClidWZbMl0pIDw8IDg7CisgIHJlc3VsdCB8PSAodWludDMyX3QpYnVmWzNdOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MTZfdCBBRFhSUzQ1MF9HeXJvOjpSZWFkUmVnaXN0ZXIodWludDhfdCByZWcpIHsKKyAgdWludDMyX3QgY21kID0gMHg4MDAwMDAwMCB8ICgoKHVpbnQzMl90KXJlZykgPDwgMTcpOworICBpZiAoIUNhbGNQYXJpdHkoY21kKSkgY21kIHw9IDF1OworCisgIC8vIGJpZyBlbmRpYW4KKyAgdWludDhfdCBidWZbNF0gPSB7KHVpbnQ4X3QpKChjbWQgPj4gMjQpICYgMHhmZiksCisgICAgICAgICAgICAgICAgICAgICh1aW50OF90KSgoY21kID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoKGNtZCA+PiA4KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoY21kICYgMHhmZil9OworCisgIG1fc3BpLldyaXRlKGJ1ZiwgNCk7CisgIG1fc3BpLlJlYWQoZmFsc2UsIGJ1ZiwgNCk7CisgIGlmICgoYnVmWzBdICYgMHhlMCkgPT0gMCkgcmV0dXJuIDA7ICAvLyBlcnJvciwgcmV0dXJuIDAKKyAgcmV0dXJuICh1aW50MTZfdCkoKEJ5dGVzVG9JbnRCRShidWYpID4+IDUpICYgMHhmZmZmKTsKK30KKworLyoqCisgKiBSZXNldCB0aGUgZ3lyby4KKyAqIFJlc2V0cyB0aGUgZ3lybyB0byBhIGhlYWRpbmcgb2YgemVyby4gVGhpcyBjYW4gYmUgdXNlZCBpZiB0aGVyZSBpcworICogc2lnbmlmaWNhbnQKKyAqIGRyaWZ0IGluIHRoZSBneXJvIGFuZCBpdCBuZWVkcyB0byBiZSByZWNhbGlicmF0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gcnVubmluZy4KKyAqLwordm9pZCBBRFhSUzQ1MF9HeXJvOjpSZXNldCgpIHsKKyAgbV9zcGkuUmVzZXRBY2N1bXVsYXRvcigpOworfQorCisvKioKKyAqIFJldHVybiB0aGUgYWN0dWFsIGFuZ2xlIGluIGRlZ3JlZXMgdGhhdCB0aGUgcm9ib3QgaXMgY3VycmVudGx5IGZhY2luZy4KKyAqCisgKiBUaGUgYW5nbGUgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgYWNjdW11bGF0b3IgdmFsdWUgY29ycmVjdGVkIGJ5IHRoZQorICogb3ZlcnNhbXBsaW5nIHJhdGUsIHRoZQorICogZ3lybyB0eXBlIGFuZCB0aGUgQS9EIGNhbGlicmF0aW9uIHZhbHVlcy4KKyAqIFRoZSBhbmdsZSBpcyBjb250aW51b3VzLCB0aGF0IGlzIGl0IHdpbGwgY29udGludWUgZnJvbSAzNjAtPjM2MSBkZWdyZWVzLiBUaGlzCisgKiBhbGxvd3MgYWxnb3JpdGhtcyB0aGF0IHdvdWxkbid0CisgKiB3YW50IHRvIHNlZSBhIGRpc2NvbnRpbnVpdHkgaW4gdGhlIGd5cm8gb3V0cHV0IGFzIGl0IHN3ZWVwcyBmcm9tIDM2MCB0byAwIG9uCisgKiB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kLgorICoKKyAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaGVhZGluZyBvZiB0aGUgcm9ib3QgaW4gZGVncmVlcy4gVGhpcyBoZWFkaW5nIGlzIGJhc2VkIG9uCisgKiBpbnRlZ3JhdGlvbgorICogb2YgdGhlIHJldHVybmVkIHJhdGUgZnJvbSB0aGUgZ3lyby4KKyAqLworZmxvYXQgQURYUlM0NTBfR3lybzo6R2V0QW5nbGUoKSBjb25zdCB7CisgIHJldHVybiAoZmxvYXQpKG1fc3BpLkdldEFjY3VtdWxhdG9yVmFsdWUoKSAqIGtEZWdyZWVQZXJTZWNvbmRQZXJMU0IgKgorICAgICAgICAgICAgICAgICBrU2FtcGxlUGVyaW9kKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIHJhdGUgb2Ygcm90YXRpb24gb2YgdGhlIGd5cm8KKyAqCisgKiBUaGUgcmF0ZSBpcyBiYXNlZCBvbiB0aGUgbW9zdCByZWNlbnQgcmVhZGluZyBvZiB0aGUgZ3lybyBhbmFsb2cgdmFsdWUKKyAqCisgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgaW4gZGVncmVlcyBwZXIgc2Vjb25kCisgKi8KK2RvdWJsZSBBRFhSUzQ1MF9HeXJvOjpHZXRSYXRlKCkgY29uc3QgeworICByZXR1cm4gKGRvdWJsZSltX3NwaS5HZXRBY2N1bXVsYXRvckxhc3RWYWx1ZSgpICoga0RlZ3JlZVBlclNlY29uZFBlckxTQjsKK30KKworc3RkOjpzdHJpbmcgQURYUlM0NTBfR3lybzo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworICByZXR1cm4gIkFEWFJTNDUwX0d5cm8iOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0FuYWxvZ0FjY2VsZXJvbWV0ZXIuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0FuYWxvZ0FjY2VsZXJvbWV0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZjQxZDkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvQW5hbG9nQWNjZWxlcm9tZXRlci5jcHAKQEAgLTAsMCArMSwxMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkFuYWxvZ0FjY2VsZXJvbWV0ZXIuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworLyoqCisgKiBDb21tb24gZnVuY3Rpb24gZm9yIGluaXRpYWxpemluZyB0aGUgYWNjZWxlcm9tZXRlci4KKyAqLwordm9pZCBBbmFsb2dBY2NlbGVyb21ldGVyOjpJbml0QWNjZWxlcm9tZXRlcigpIHsKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FjY2VsZXJvbWV0ZXIsCisgICAgICAgICAgICBtX2FuYWxvZ0lucHV0LT5HZXRDaGFubmVsKCkpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkFjY2VsZXJvbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmFsb2dJbnB1dC0+R2V0Q2hhbm5lbCgpLCB0aGlzKTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gYWNjZWxlcm9tZXRlci4KKyAqIFRoZSBjb25zdHJ1Y3RvciBhbGxvY2F0ZXMgZGVzaXJlZCBhbmFsb2cgaW5wdXQuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBhbmFsb2cgaW5wdXQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMKKyAqIGNvbm5lY3RlZCB0bworICovCitBbmFsb2dBY2NlbGVyb21ldGVyOjpBbmFsb2dBY2NlbGVyb21ldGVyKGludDMyX3QgY2hhbm5lbCkgeworICBtX2FuYWxvZ0lucHV0ID0gc3RkOjptYWtlX3NoYXJlZDxBbmFsb2dJbnB1dD4oY2hhbm5lbCk7CisgIEluaXRBY2NlbGVyb21ldGVyKCk7Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEFjY2VsZXJvbWV0ZXIgZnJvbSBhbiBleGlzdGluZyBBbmFsb2dJbnB1dC4KKyAqIE1ha2UgYSBuZXcgaW5zdGFuY2Ugb2YgYWNjZWxlcm9tZXRlciBnaXZlbiBhbiBBbmFsb2dJbnB1dC4gVGhpcyBpcworICogcGFydGljdWxhcmx5IHVzZWZ1bCBpZiB0aGUgcG9ydCBpcyBnb2luZyB0byBiZSByZWFkIGFzIGFuIGFuYWxvZyBjaGFubmVsIGFzCisgKiB3ZWxsIGFzIHRocm91Z2ggdGhlIEFjY2VsZXJvbWV0ZXIgY2xhc3MuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgZXhpc3RpbmcgQW5hbG9nSW5wdXQgb2JqZWN0IGZvciB0aGUgYW5hbG9nIGlucHV0IHRoZQorICogYWNjZWxlcm9tZXRlciBpcyBjb25uZWN0ZWQgdG8KKyAqLworQW5hbG9nQWNjZWxlcm9tZXRlcjo6QW5hbG9nQWNjZWxlcm9tZXRlcihBbmFsb2dJbnB1dCAqY2hhbm5lbCkKKyAgICA6IG1fYW5hbG9nSW5wdXQoY2hhbm5lbCwgTnVsbERlbGV0ZXI8QW5hbG9nSW5wdXQ+KCkpIHsKKyAgaWYgKGNoYW5uZWwgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKyAgfSBlbHNlIHsKKyAgICBJbml0QWNjZWxlcm9tZXRlcigpOworICB9Cit9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEFjY2VsZXJvbWV0ZXIgZnJvbSBhbiBleGlzdGluZyBBbmFsb2dJbnB1dC4KKyAqIE1ha2UgYSBuZXcgaW5zdGFuY2Ugb2YgYWNjZWxlcm9tZXRlciBnaXZlbiBhbiBBbmFsb2dJbnB1dC4gVGhpcyBpcworICogcGFydGljdWxhcmx5IHVzZWZ1bCBpZiB0aGUgcG9ydCBpcyBnb2luZyB0byBiZSByZWFkIGFzIGFuIGFuYWxvZyBjaGFubmVsIGFzCisgKiB3ZWxsIGFzIHRocm91Z2ggdGhlIEFjY2VsZXJvbWV0ZXIgY2xhc3MuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgZXhpc3RpbmcgQW5hbG9nSW5wdXQgb2JqZWN0IGZvciB0aGUgYW5hbG9nIGlucHV0IHRoZQorICogYWNjZWxlcm9tZXRlciBpcyBjb25uZWN0ZWQgdG8KKyAqLworQW5hbG9nQWNjZWxlcm9tZXRlcjo6QW5hbG9nQWNjZWxlcm9tZXRlcihzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nSW5wdXQ+IGNoYW5uZWwpCisgICAgOiBtX2FuYWxvZ0lucHV0KGNoYW5uZWwpIHsKKyAgaWYgKGNoYW5uZWwgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKyAgfSBlbHNlIHsKKyAgICBJbml0QWNjZWxlcm9tZXRlcigpOworICB9Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBhY2NlbGVyYXRpb24gaW4gR3MuCisgKgorICogVGhlIGFjY2VsZXJhdGlvbiBpcyByZXR1cm5lZCB1bml0cyBvZiBHcy4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGFjY2VsZXJhdGlvbiBvZiB0aGUgc2Vuc29yIGluIEdzLgorICovCitmbG9hdCBBbmFsb2dBY2NlbGVyb21ldGVyOjpHZXRBY2NlbGVyYXRpb24oKSBjb25zdCB7CisgIHJldHVybiAobV9hbmFsb2dJbnB1dC0+R2V0QXZlcmFnZVZvbHRhZ2UoKSAtIG1femVyb0dWb2x0YWdlKSAvIG1fdm9sdHNQZXJHOworfQorCisvKioKKyAqIFNldCB0aGUgYWNjZWxlcm9tZXRlciBzZW5zaXRpdml0eS4KKyAqCisgKiBUaGlzIHNldHMgdGhlIHNlbnNpdGl2aXR5IG9mIHRoZSBhY2NlbGVyb21ldGVyIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZQorICogYWNjZWxlcmF0aW9uLgorICogVGhlIHNlbnNpdGl2aXR5IHZhcmllcyBieSBhY2NlbGVyb21ldGVyIG1vZGVsLiBUaGVyZSBhcmUgY29uc3RhbnRzIGRlZmluZWQKKyAqIGZvciB2YXJpb3VzIG1vZGVscy4KKyAqCisgKiBAcGFyYW0gc2Vuc2l0aXZpdHkgVGhlIHNlbnNpdGl2aXR5IG9mIGFjY2VsZXJvbWV0ZXIgaW4gVm9sdHMgcGVyIEcuCisgKi8KK3ZvaWQgQW5hbG9nQWNjZWxlcm9tZXRlcjo6U2V0U2Vuc2l0aXZpdHkoZmxvYXQgc2Vuc2l0aXZpdHkpIHsKKyAgbV92b2x0c1BlckcgPSBzZW5zaXRpdml0eTsKK30KKworLyoqCisgKiBTZXQgdGhlIHZvbHRhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byAwIEcuCisgKgorICogVGhlIHplcm8gRyB2b2x0YWdlIHZhcmllcyBieSBhY2NlbGVyb21ldGVyIG1vZGVsLiBUaGVyZSBhcmUgY29uc3RhbnRzIGRlZmluZWQKKyAqIGZvciB2YXJpb3VzIG1vZGVscy4KKyAqCisgKiBAcGFyYW0gemVybyBUaGUgemVybyBHIHZvbHRhZ2UuCisgKi8KK3ZvaWQgQW5hbG9nQWNjZWxlcm9tZXRlcjo6U2V0WmVybyhmbG9hdCB6ZXJvKSB7IG1femVyb0dWb2x0YWdlID0gemVybzsgfQorCisvKioKKyAqIEdldCB0aGUgQWNjZWxlcmF0aW9uIGZvciB0aGUgUElEIFNvdXJjZSBwYXJlbnQuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCBhY2NlbGVyYXRpb24gaW4gR3MuCisgKi8KK2RvdWJsZSBBbmFsb2dBY2NlbGVyb21ldGVyOjpQSURHZXQoKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oKTsgfQorCit2b2lkIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldEFjY2VsZXJhdGlvbigpKTsKKyAgfQorfQorCit2b2lkIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OlN0YXJ0TGl2ZVdpbmRvd01vZGUoKSB7fQorCit2b2lkIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OlN0b3BMaXZlV2luZG93TW9kZSgpIHt9CisKK3N0ZDo6c3RyaW5nIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJBY2NlbGVyb21ldGVyIjsKK30KKwordm9pZCBBbmFsb2dBY2NlbGVyb21ldGVyOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YlRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBBbmFsb2dBY2NlbGVyb21ldGVyOjpHZXRUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGU7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9BbmFsb2dHeXJvLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BbmFsb2dHeXJvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDA5M2VjCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0FuYWxvZ0d5cm8uY3BwCkBAIC0wLDAgKzEsMjU1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJBbmFsb2dHeXJvLmgiCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorI2luY2x1ZGUgPGNsaW1pdHM+Citjb25zdCB1aW50MzJfdCBBbmFsb2dHeXJvOjprT3ZlcnNhbXBsZUJpdHM7Citjb25zdCB1aW50MzJfdCBBbmFsb2dHeXJvOjprQXZlcmFnZUJpdHM7Citjb25zdGV4cHIgZmxvYXQgQW5hbG9nR3lybzo6a1NhbXBsZXNQZXJTZWNvbmQ7Citjb25zdGV4cHIgZmxvYXQgQW5hbG9nR3lybzo6a0NhbGlicmF0aW9uU2FtcGxlVGltZTsKK2NvbnN0ZXhwciBmbG9hdCBBbmFsb2dHeXJvOjprRGVmYXVsdFZvbHRzUGVyRGVncmVlUGVyU2Vjb25kOworCisvKioKKyAqIEd5cm8gY29uc3RydWN0b3IgdXNpbmcgdGhlIEFuYWxvZyBJbnB1dCBjaGFubmVsIG51bWJlci4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgYW5hbG9nIGNoYW5uZWwgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLiBHeXJvcworICAgICAgICAgICAgICAgICAgICAgIGNhbiBvbmx5IGJlIHVzZWQgb24gb24tYm9hcmQgQW5hbG9nIElucHV0cyAwLTEuCisgKi8KK0FuYWxvZ0d5cm86OkFuYWxvZ0d5cm8oaW50MzJfdCBjaGFubmVsKSA6CisgICAgQW5hbG9nR3lybyhzdGQ6Om1ha2Vfc2hhcmVkPEFuYWxvZ0lucHV0PihjaGFubmVsKSkge30KKworLyoqCisgKiBHeXJvIGNvbnN0cnVjdG9yIHdpdGggYSBwcmVjcmVhdGVkIEFuYWxvZ0lucHV0IG9iamVjdC4KKyAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHdoZW4gdGhlIGFuYWxvZyBjaGFubmVsIG5lZWRzIHRvIGJlIHNoYXJlZC4KKyAqIFRoaXMgb2JqZWN0IHdpbGwgbm90IGNsZWFuIHVwIHRoZSBBbmFsb2dJbnB1dCBvYmplY3Qgd2hlbiB1c2luZyB0aGlzCisgKiBjb25zdHJ1Y3Rvci4KKyAqIEd5cm9zIGNhbiBvbmx5IGJlIHVzZWQgb24gb24tYm9hcmQgY2hhbm5lbHMgMC0xLgorICogQHBhcmFtIGNoYW5uZWwgQSBwb2ludGVyIHRvIHRoZSBBbmFsb2dJbnB1dCBvYmplY3QgdGhhdCB0aGUgZ3lybyBpcyBjb25uZWN0ZWQKKyAqIHRvLgorICovCitBbmFsb2dHeXJvOjpBbmFsb2dHeXJvKEFuYWxvZ0lucHV0ICpjaGFubmVsKQorICAgIDogQW5hbG9nR3lybygKKyAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nSW5wdXQ+KGNoYW5uZWwsIE51bGxEZWxldGVyPEFuYWxvZ0lucHV0PigpKSkge30KKworLyoqCisgKiBHeXJvIGNvbnN0cnVjdG9yIHdpdGggYSBwcmVjcmVhdGVkIEFuYWxvZ0lucHV0IG9iamVjdC4KKyAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHdoZW4gdGhlIGFuYWxvZyBjaGFubmVsIG5lZWRzIHRvIGJlIHNoYXJlZC4KKyAqIFRoaXMgb2JqZWN0IHdpbGwgbm90IGNsZWFuIHVwIHRoZSBBbmFsb2dJbnB1dCBvYmplY3Qgd2hlbiB1c2luZyB0aGlzCisgKiBjb25zdHJ1Y3RvcgorICogQHBhcmFtIGNoYW5uZWwgQSBwb2ludGVyIHRvIHRoZSBBbmFsb2dJbnB1dCBvYmplY3QgdGhhdCB0aGUgZ3lybyBpcworICogY29ubmVjdGVkIHRvLgorICovCitBbmFsb2dHeXJvOjpBbmFsb2dHeXJvKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dJbnB1dD4gY2hhbm5lbCkKKyAgICA6IG1fYW5hbG9nKGNoYW5uZWwpIHsKKyAgaWYgKGNoYW5uZWwgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKyAgfSBlbHNlIHsKKyAgICBJbml0R3lybygpOworICAgIENhbGlicmF0ZSgpOworICB9Cit9CisKKy8qKgorICogR3lybyBjb25zdHJ1Y3RvciB1c2luZyB0aGUgQW5hbG9nIElucHV0IGNoYW5uZWwgbnVtYmVyIHdpdGggcGFyYW1ldGVycyBmb3IKKyAqIHByZXNldHRpbmcgdGhlIGNlbnRlciBhbmQgb2Zmc2V0IHZhbHVlcy4gQnlwYXNzZXMgY2FsaWJyYXRpb24uCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGFuYWxvZyBjaGFubmVsIHRoZSBneXJvIGlzIGNvbm5lY3RlZCB0by4gR3lyb3MKKyAqICAgICAgICBjYW4gb25seSBiZSB1c2VkIG9uIG9uLWJvYXJkIEFuYWxvZyBJbnB1dHMgMC0xLgorICogQHBhcmFtIGNlbnRlciBQcmVzZXQgdW5jYWxpYnJhdGVkIHZhbHVlIHRvIHVzZSBhcyB0aGUgYWNjdW11bGF0b3IgY2VudGVyIHZhbHVlLgorICogQHBhcmFtIG9mZnNldCBQcmVzZXQgdW5jYWxpYnJhdGVkIHZhbHVlIHRvIHVzZSBhcyB0aGUgZ3lybyBvZmZzZXQuCisgKi8KK0FuYWxvZ0d5cm86OkFuYWxvZ0d5cm8oaW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBjZW50ZXIsIGZsb2F0IG9mZnNldCkgeworICBtX2FuYWxvZyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbG9nSW5wdXQ+KGNoYW5uZWwpOworICBJbml0R3lybygpOworICBtX2NlbnRlciA9IGNlbnRlcjsKKyAgbV9vZmZzZXQgPSBvZmZzZXQ7CisgIG1fYW5hbG9nLT5TZXRBY2N1bXVsYXRvckNlbnRlcihtX2NlbnRlcik7CisgIG1fYW5hbG9nLT5SZXNldEFjY3VtdWxhdG9yKCk7Cit9CisKKy8qKgorICogR3lybyBjb25zdHJ1Y3RvciB3aXRoIGEgcHJlY3JlYXRlZCBBbmFsb2dJbnB1dCBvYmplY3QgYW5kIGNhbGlicmF0ZWQgcGFyYW1ldGVycy4KKyAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHdoZW4gdGhlIGFuYWxvZyBjaGFubmVsIG5lZWRzIHRvIGJlIHNoYXJlZC4KKyAqIFRoaXMgb2JqZWN0IHdpbGwgbm90IGNsZWFuIHVwIHRoZSBBbmFsb2dJbnB1dCBvYmplY3Qgd2hlbiB1c2luZyB0aGlzCisgKiBjb25zdHJ1Y3RvcgorICogQHBhcmFtIGNoYW5uZWwgQSBwb2ludGVyIHRvIHRoZSBBbmFsb2dJbnB1dCBvYmplY3QgdGhhdCB0aGUgZ3lybyBpcworICogY29ubmVjdGVkIHRvLgorICovCitBbmFsb2dHeXJvOjpBbmFsb2dHeXJvKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dJbnB1dD4gY2hhbm5lbCwgdWludDMyX3QgY2VudGVyLCBmbG9hdCBvZmZzZXQpIDogbV9hbmFsb2coY2hhbm5lbCkgeworICBpZiAoY2hhbm5lbCA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworICB9IGVsc2UgeworICAgIEluaXRHeXJvKCk7CisgICAgbV9jZW50ZXIgPSBjZW50ZXI7CisgICAgbV9vZmZzZXQgPSBvZmZzZXQ7CisgICAgbV9hbmFsb2ctPlNldEFjY3VtdWxhdG9yQ2VudGVyKG1fY2VudGVyKTsKKyAgICBtX2FuYWxvZy0+UmVzZXRBY2N1bXVsYXRvcigpOworICB9Cit9CisKKy8qKgorICogUmVzZXQgdGhlIGd5cm8uCisgKiBSZXNldHMgdGhlIGd5cm8gdG8gYSBoZWFkaW5nIG9mIHplcm8uIFRoaXMgY2FuIGJlIHVzZWQgaWYgdGhlcmUgaXMKKyAqIHNpZ25pZmljYW50CisgKiBkcmlmdCBpbiB0aGUgZ3lybyBhbmQgaXQgbmVlZHMgdG8gYmUgcmVjYWxpYnJhdGVkIGFmdGVyIGl0IGhhcyBiZWVuIHJ1bm5pbmcuCisgKi8KK3ZvaWQgQW5hbG9nR3lybzo6UmVzZXQoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgbV9hbmFsb2ctPlJlc2V0QWNjdW11bGF0b3IoKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBneXJvLiAgQ2FsaWJyYXRpb24gaXMgaGFuZGxlZCBieSBDYWxpYnJhdGUoKS4KKyAqLwordm9pZCBBbmFsb2dHeXJvOjpJbml0R3lybygpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisgIGlmICghbV9hbmFsb2ctPklzQWNjdW11bGF0b3JDaGFubmVsKCkpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2hhbm5lbCAobXVzdCBiZSBhY2N1bXVsYXRvciBjaGFubmVsKSIpOworICAgIG1fYW5hbG9nID0gbnVsbHB0cjsKKyAgICByZXR1cm47CisgIH0KKworICBtX3ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kID0ga0RlZmF1bHRWb2x0c1BlckRlZ3JlZVBlclNlY29uZDsKKyAgbV9hbmFsb2ctPlNldEF2ZXJhZ2VCaXRzKGtBdmVyYWdlQml0cyk7CisgIG1fYW5hbG9nLT5TZXRPdmVyc2FtcGxlQml0cyhrT3ZlcnNhbXBsZUJpdHMpOworICBmbG9hdCBzYW1wbGVSYXRlID0KKyAgICAgIGtTYW1wbGVzUGVyU2Vjb25kICogKDEgPDwgKGtBdmVyYWdlQml0cyArIGtPdmVyc2FtcGxlQml0cykpOworICBtX2FuYWxvZy0+U2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKKyAgV2FpdCgwLjEpOworCisgIFNldERlYWRiYW5kKDAuMGYpOworCisgIFNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZTo6a0Rpc3BsYWNlbWVudCk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0d5cm8sIG1fYW5hbG9nLT5HZXRDaGFubmVsKCkpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkd5cm8iLCBtX2FuYWxvZy0+R2V0Q2hhbm5lbCgpLCB0aGlzKTsKK30KKworLyoqCisgKiB7QGluaGVyaXREb2N9CisgKi8KK3ZvaWQgQW5hbG9nR3lybzo6Q2FsaWJyYXRlKCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKyAgbV9hbmFsb2ctPkluaXRBY2N1bXVsYXRvcigpOworCisgIFdhaXQoa0NhbGlicmF0aW9uU2FtcGxlVGltZSk7CisKKyAgaW50NjRfdCB2YWx1ZTsKKyAgdWludDMyX3QgY291bnQ7CisgIG1fYW5hbG9nLT5HZXRBY2N1bXVsYXRvck91dHB1dCh2YWx1ZSwgY291bnQpOworCisgIG1fY2VudGVyID0gKHVpbnQzMl90KSgoZmxvYXQpdmFsdWUgLyAoZmxvYXQpY291bnQgKyAuNSk7CisKKyAgbV9vZmZzZXQgPSAoKGZsb2F0KXZhbHVlIC8gKGZsb2F0KWNvdW50KSAtIChmbG9hdCltX2NlbnRlcjsKKyAgbV9hbmFsb2ctPlNldEFjY3VtdWxhdG9yQ2VudGVyKG1fY2VudGVyKTsKKyAgbV9hbmFsb2ctPlJlc2V0QWNjdW11bGF0b3IoKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFjdHVhbCBhbmdsZSBpbiBkZWdyZWVzIHRoYXQgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBmYWNpbmcuCisgKgorICogVGhlIGFuZ2xlIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGFjY3VtdWxhdG9yIHZhbHVlIGNvcnJlY3RlZCBieSB0aGUKKyAqIG92ZXJzYW1wbGluZyByYXRlLCB0aGUKKyAqIGd5cm8gdHlwZSBhbmQgdGhlIEEvRCBjYWxpYnJhdGlvbiB2YWx1ZXMuCisgKiBUaGUgYW5nbGUgaXMgY29udGludW91cywgdGhhdCBpcyBpdCB3aWxsIGNvbnRpbnVlIGZyb20gMzYwLT4zNjEgZGVncmVlcy4gVGhpcworICogYWxsb3dzIGFsZ29yaXRobXMgdGhhdCB3b3VsZG4ndAorICogd2FudCB0byBzZWUgYSBkaXNjb250aW51aXR5IGluIHRoZSBneXJvIG91dHB1dCBhcyBpdCBzd2VlcHMgZnJvbSAzNjAgdG8gMCBvbgorICogdGhlIHNlY29uZCB0aW1lIGFyb3VuZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGhlYWRpbmcgb2YgdGhlIHJvYm90IGluIGRlZ3JlZXMuIFRoaXMgaGVhZGluZyBpcyBiYXNlZCBvbgorICogaW50ZWdyYXRpb24KKyAqIG9mIHRoZSByZXR1cm5lZCByYXRlIGZyb20gdGhlIGd5cm8uCisgKi8KK2Zsb2F0IEFuYWxvZ0d5cm86OkdldEFuZ2xlKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC5mOworCisgIGludDY0X3QgcmF3VmFsdWU7CisgIHVpbnQzMl90IGNvdW50OworICBtX2FuYWxvZy0+R2V0QWNjdW11bGF0b3JPdXRwdXQocmF3VmFsdWUsIGNvdW50KTsKKworICBpbnQ2NF90IHZhbHVlID0gcmF3VmFsdWUgLSAoaW50NjRfdCkoKGZsb2F0KWNvdW50ICogbV9vZmZzZXQpOworCisgIGRvdWJsZSBzY2FsZWRWYWx1ZSA9IHZhbHVlICogMWUtOSAqIChkb3VibGUpbV9hbmFsb2ctPkdldExTQldlaWdodCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkoMSA8PCBtX2FuYWxvZy0+R2V0QXZlcmFnZUJpdHMoKSkgLworICAgICAgICAgICAgICAgICAgICAgICAobV9hbmFsb2ctPkdldFNhbXBsZVJhdGUoKSAqIG1fdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQpOworCisgIHJldHVybiAoZmxvYXQpc2NhbGVkVmFsdWU7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSByYXRlIG9mIHJvdGF0aW9uIG9mIHRoZSBneXJvCisgKgorICogVGhlIHJhdGUgaXMgYmFzZWQgb24gdGhlIG1vc3QgcmVjZW50IHJlYWRpbmcgb2YgdGhlIGd5cm8gYW5hbG9nIHZhbHVlCisgKgorICogQHJldHVybiB0aGUgY3VycmVudCByYXRlIGluIGRlZ3JlZXMgcGVyIHNlY29uZAorICovCitkb3VibGUgQW5hbG9nR3lybzo6R2V0UmF0ZSgpIGNvbnN0IHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKworICByZXR1cm4gKG1fYW5hbG9nLT5HZXRBdmVyYWdlVmFsdWUoKSAtICgoZG91YmxlKW1fY2VudGVyICsgbV9vZmZzZXQpKSAqIDFlLTkgKgorICAgICAgICAgbV9hbmFsb2ctPkdldExTQldlaWdodCgpIC8KKyAgICAgICAgICgoMSA8PCBtX2FuYWxvZy0+R2V0T3ZlcnNhbXBsZUJpdHMoKSkgKiBtX3ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGd5cm8gb2Zmc2V0IHZhbHVlLiBJZiBydW4gYWZ0ZXIgY2FsaWJyYXRpb24sCisgKiB0aGUgb2Zmc2V0IHZhbHVlIGNhbiBiZSB1c2VkIGFzIGEgcHJlc2V0IGxhdGVyLgorICoKKyAqIEByZXR1cm4gdGhlIGN1cnJlbnQgb2Zmc2V0IHZhbHVlCisgKi8KK2Zsb2F0IEFuYWxvZ0d5cm86OkdldE9mZnNldCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fb2Zmc2V0OworfQorCisvKioKKyAqIFJldHVybiB0aGUgZ3lybyBjZW50ZXIgdmFsdWUuIElmIHJ1biBhZnRlciBjYWxpYnJhdGlvbiwKKyAqIHRoZSBjZW50ZXIgdmFsdWUgY2FuIGJlIHVzZWQgYXMgYSBwcmVzZXQgbGF0ZXIuCisgKgorICogQHJldHVybiB0aGUgY3VycmVudCBjZW50ZXIgdmFsdWUKKyAqLwordWludDMyX3QgQW5hbG9nR3lybzo6R2V0Q2VudGVyKCkgY29uc3QgeworICByZXR1cm4gbV9jZW50ZXI7Cit9CisKKy8qKgorICogU2V0IHRoZSBneXJvIHNlbnNpdGl2aXR5LgorICogVGhpcyB0YWtlcyB0aGUgbnVtYmVyIG9mIHZvbHRzL2RlZ3JlZS9zZWNvbmQgc2Vuc2l0aXZpdHkgb2YgdGhlIGd5cm8gYW5kIHVzZXMKKyAqIGl0IGluIHN1YnNlcXVlbnQKKyAqIGNhbGN1bGF0aW9ucyB0byBhbGxvdyB0aGUgY29kZSB0byB3b3JrIHdpdGggbXVsdGlwbGUgZ3lyb3MuIFRoaXMgdmFsdWUgaXMKKyAqIHR5cGljYWxseSBmb3VuZCBpbgorICogdGhlIGd5cm8gZGF0YXNoZWV0LgorICoKKyAqIEBwYXJhbSB2b2x0c1BlckRlZ3JlZVBlclNlY29uZCBUaGUgc2Vuc2l0aXZpdHkgaW4gVm9sdHMvZGVncmVlL3NlY29uZAorICovCit2b2lkIEFuYWxvZ0d5cm86OlNldFNlbnNpdGl2aXR5KGZsb2F0IHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKSB7CisgIG1fdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQgPSB2b2x0c1BlckRlZ3JlZVBlclNlY29uZDsKK30KKworLyoqCisgKiBTZXQgdGhlIHNpemUgb2YgdGhlIG5ldXRyYWwgem9uZS4gIEFueSB2b2x0YWdlIGZyb20gdGhlIGd5cm8gbGVzcyB0aGFuIHRoaXMKKyAqIGFtb3VudCBmcm9tIHRoZSBjZW50ZXIgaXMgY29uc2lkZXJlZCBzdGF0aW9uYXJ5LiAgU2V0dGluZyBhIGRlYWRiYW5kIHdpbGwKKyAqIGRlY3JlYXNlIHRoZSBhbW91bnQgb2YgZHJpZnQgd2hlbiB0aGUgZ3lybyBpc24ndCByb3RhdGluZywgYnV0IHdpbGwgbWFrZSBpdAorICogbGVzcyBhY2N1cmF0ZS4KKyAqCisgKiBAcGFyYW0gdm9sdHMgVGhlIHNpemUgb2YgdGhlIGRlYWRiYW5kIGluIHZvbHRzCisgKi8KK3ZvaWQgQW5hbG9nR3lybzo6U2V0RGVhZGJhbmQoZmxvYXQgdm9sdHMpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisgIGludDMyX3QgZGVhZGJhbmQgPSB2b2x0cyAqIDFlOSAvIG1fYW5hbG9nLT5HZXRMU0JXZWlnaHQoKSAqCisgICAgICAgICAgICAgICAgICAgICAoMSA8PCBtX2FuYWxvZy0+R2V0T3ZlcnNhbXBsZUJpdHMoKSk7CisgIG1fYW5hbG9nLT5TZXRBY2N1bXVsYXRvckRlYWRiYW5kKGRlYWRiYW5kKTsKK30KKworc3RkOjpzdHJpbmcgQW5hbG9nR3lybzo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeyByZXR1cm4gIkFuYWxvZ0d5cm8iOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvQW5hbG9nSW5wdXQuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0FuYWxvZ0lucHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzhlODcyCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0FuYWxvZ0lucHV0LmNwcApAQCAtMCwwICsxLDQyNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKyNpbmNsdWRlICJIQUwvUG9ydC5oIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZXNvdXJjZT4gaW5wdXRzOworCitjb25zdCB1aW50OF90IEFuYWxvZ0lucHV0OjprQWNjdW11bGF0b3JNb2R1bGVOdW1iZXI7Citjb25zdCB1aW50MzJfdCBBbmFsb2dJbnB1dDo6a0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBBbmFsb2dJbnB1dDo6a0FjY3VtdWxhdG9yQ2hhbm5lbHNbXSA9IHswLCAxfTsKKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIGlucHV0LgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciBvbiB0aGUgcm9ib1JJTyB0byByZXByZXNlbnQuIDAtMyBhcmUKKyAqIG9uLWJvYXJkIDQtNyBhcmUgb24gdGhlIE1YUCBwb3J0LgorICovCitBbmFsb2dJbnB1dDo6QW5hbG9nSW5wdXQodWludDMyX3QgY2hhbm5lbCkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CisgIGJ1ZiA8PCAiQW5hbG9nIElucHV0ICIgPDwgY2hhbm5lbDsKKyAgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KGlucHV0cywga0FuYWxvZ0lucHV0cyk7CisKKyAgaWYgKCFjaGVja0FuYWxvZ0lucHV0Q2hhbm5lbChjaGFubmVsKSkgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENoYW5uZWxJbmRleE91dE9mUmFuZ2UsIGJ1Zi5zdHIoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGlucHV0cy0+QWxsb2NhdGUoY2hhbm5lbCwgYnVmLnN0cigpKSA9PQorICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CisgICAgQ2xvbmVFcnJvcigqaW5wdXRzKTsKKyAgICByZXR1cm47CisgIH0KKworICBtX2NoYW5uZWwgPSBjaGFubmVsOworCisgIHZvaWQqIHBvcnQgPSBnZXRQb3J0KGNoYW5uZWwpOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIG1fcG9ydCA9IGluaXRpYWxpemVBbmFsb2dJbnB1dFBvcnQocG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICBmcmVlUG9ydChwb3J0KTsKKworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkFuYWxvZ0lucHV0IiwgY2hhbm5lbCwgdGhpcyk7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BbmFsb2dDaGFubmVsLCBjaGFubmVsKTsKK30KKworLyoqCisgKiBDaGFubmVsIGRlc3RydWN0b3IuCisgKi8KK0FuYWxvZ0lucHV0Ojp+QW5hbG9nSW5wdXQoKSB7CisgIGZyZWVBbmFsb2dJbnB1dFBvcnQobV9wb3J0KTsKKyAgaW5wdXRzLT5GcmVlKG1fY2hhbm5lbCk7Cit9CisKKy8qKgorICogR2V0IGEgc2FtcGxlIHN0cmFpZ2h0IGZyb20gdGhpcyBjaGFubmVsLgorICogVGhlIHNhbXBsZSBpcyBhIDEyLWJpdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIDBWIHRvIDVWIHJhbmdlIG9mIHRoZSBBL0QKKyAqIGNvbnZlcnRlciBpbiB0aGUgbW9kdWxlLgorICogVGhlIHVuaXRzIGFyZSBpbiBBL0QgY29udmVydGVyIGNvZGVzLiAgVXNlIEdldFZvbHRhZ2UoKSB0byBnZXQgdGhlIGFuYWxvZworICogdmFsdWUgaW4gY2FsaWJyYXRlZCB1bml0cy4KKyAqIEByZXR1cm4gQSBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCisgKi8KK2ludDE2X3QgQW5hbG9nSW5wdXQ6OkdldFZhbHVlKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQxNl90IHZhbHVlID0gZ2V0QW5hbG9nVmFsdWUobV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZXQgYSBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcworICogY2hhbm5lbC4KKyAqIFRoZSBzYW1wbGUgaXMgMTItYml0ICsgdGhlIGJpdHMgY29uZmlndXJlZCBpbiBTZXRPdmVyc2FtcGxlQml0cygpLgorICogVGhlIHZhbHVlIGNvbmZpZ3VyZWQgaW4gU2V0QXZlcmFnZUJpdHMoKSB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgYXZlcmFnZWQKKyAqIDIqKmJpdHMgbnVtYmVyIG9mIHNhbXBsZXMuCisgKiBUaGlzIGlzIG5vdCBhIHNsaWRpbmcgd2luZG93LiAgVGhlIHNhbXBsZSB3aWxsIG5vdCBjaGFuZ2UgdW50aWwKKyAqIDIqKihPdmVyc2FtcGxlQml0cyArIEF2ZXJhZ2VCaXRzKSBzYW1wbGVzCisgKiBoYXZlIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgbW9kdWxlIG9uIHRoaXMgY2hhbm5lbC4KKyAqIFVzZSBHZXRBdmVyYWdlVm9sdGFnZSgpIHRvIGdldCB0aGUgYW5hbG9nIHZhbHVlIGluIGNhbGlicmF0ZWQgdW5pdHMuCisgKiBAcmV0dXJuIEEgc2FtcGxlIGZyb20gdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGlzIGNoYW5uZWwuCisgKi8KK2ludDMyX3QgQW5hbG9nSW5wdXQ6OkdldEF2ZXJhZ2VWYWx1ZSgpIGNvbnN0IHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgaW50MzJfdCB2YWx1ZSA9IGdldEFuYWxvZ0F2ZXJhZ2VWYWx1ZShtX3BvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEdldCBhIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCisgKiBUaGUgdmFsdWUgaXMgc2NhbGVkIHRvIHVuaXRzIG9mIFZvbHRzIHVzaW5nIHRoZSBjYWxpYnJhdGVkIHNjYWxpbmcgZGF0YSBmcm9tCisgKiBHZXRMU0JXZWlnaHQoKSBhbmQgR2V0T2Zmc2V0KCkuCisgKiBAcmV0dXJuIEEgc2NhbGVkIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoaXMgY2hhbm5lbC4KKyAqLworZmxvYXQgQW5hbG9nSW5wdXQ6OkdldFZvbHRhZ2UoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjBmOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGZsb2F0IHZvbHRhZ2UgPSBnZXRBbmFsb2dWb2x0YWdlKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gdm9sdGFnZTsKK30KKworLyoqCisgKiBHZXQgYSBzY2FsZWQgc2FtcGxlIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUgZm9yCisgKiB0aGlzIGNoYW5uZWwuCisgKiBUaGUgdmFsdWUgaXMgc2NhbGVkIHRvIHVuaXRzIG9mIFZvbHRzIHVzaW5nIHRoZSBjYWxpYnJhdGVkIHNjYWxpbmcgZGF0YSBmcm9tCisgKiBHZXRMU0JXZWlnaHQoKSBhbmQgR2V0T2Zmc2V0KCkuCisgKiBVc2luZyBvdmVyc2FtcGxpbmcgd2lsbCBjYXVzZSB0aGlzIHZhbHVlIHRvIGJlIGhpZ2hlciByZXNvbHV0aW9uLCBidXQgaXQgd2lsbAorICogdXBkYXRlIG1vcmUgc2xvd2x5LgorICogVXNpbmcgYXZlcmFnaW5nIHdpbGwgY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBtb3JlIHN0YWJsZSwgYnV0IGl0IHdpbGwgdXBkYXRlCisgKiBtb3JlIHNsb3dseS4KKyAqIEByZXR1cm4gQSBzY2FsZWQgc2FtcGxlIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUKKyAqIGZvciB0aGlzIGNoYW5uZWwuCisgKi8KK2Zsb2F0IEFuYWxvZ0lucHV0OjpHZXRBdmVyYWdlVm9sdGFnZSgpIGNvbnN0IHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMGY7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZmxvYXQgdm9sdGFnZSA9IGdldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gdm9sdGFnZTsKK30KKworLyoqCisgKiBHZXQgdGhlIGZhY3Rvcnkgc2NhbGluZyBsZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0IGNvbnN0YW50LgorICoKKyAqIFZvbHRzID0gKChMU0JfV2VpZ2h0ICogMWUtOSkgKiByYXcpIC0gKE9mZnNldCAqIDFlLTkpCisgKgorICogQHJldHVybiBMZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0LgorICovCit1aW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0TFNCV2VpZ2h0KCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQzMl90IGxzYldlaWdodCA9IGdldEFuYWxvZ0xTQldlaWdodChtX3BvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIGxzYldlaWdodDsKK30KKworLyoqCisgKiBHZXQgdGhlIGZhY3Rvcnkgc2NhbGluZyBvZmZzZXQgY29uc3RhbnQuCisgKgorICogVm9sdHMgPSAoKExTQl9XZWlnaHQgKiAxZS05KSAqIHJhdykgLSAoT2Zmc2V0ICogMWUtOSkKKyAqCisgKiBAcmV0dXJuIE9mZnNldCBjb25zdGFudC4KKyAqLworaW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0T2Zmc2V0KCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQzMl90IG9mZnNldCA9IGdldEFuYWxvZ09mZnNldChtX3BvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqCisgKiBHZXQgdGhlIGNoYW5uZWwgbnVtYmVyLgorICogQHJldHVybiBUaGUgY2hhbm5lbCBudW1iZXIuCisgKi8KK3VpbnQzMl90IEFuYWxvZ0lucHV0OjpHZXRDaGFubmVsKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKyAgcmV0dXJuIG1fY2hhbm5lbDsKK30KKworLyoqCisgKiBTZXQgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cy4KKyAqIFRoaXMgc2V0cyB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzLiBUaGUgYWN0dWFsIG51bWJlciBvZiBhdmVyYWdlZCBzYW1wbGVzCisgKiBpcyAyXmJpdHMuCisgKiBVc2UgYXZlcmFnaW5nIHRvIGltcHJvdmUgdGhlIHN0YWJpbGl0eSBvZiB5b3VyIG1lYXN1cmVtZW50IGF0IHRoZSBleHBlbnNlIG9mCisgKiBzYW1wbGluZyByYXRlLgorICogVGhlIGF2ZXJhZ2luZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCisgKgorICogQHBhcmFtIGJpdHMgTnVtYmVyIG9mIGJpdHMgb2YgYXZlcmFnaW5nLgorICovCit2b2lkIEFuYWxvZ0lucHV0OjpTZXRBdmVyYWdlQml0cyh1aW50MzJfdCBiaXRzKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXRBbmFsb2dBdmVyYWdlQml0cyhtX3BvcnQsIGJpdHMsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cyBwcmV2aW91c2x5IGNvbmZpZ3VyZWQuCisgKiBUaGlzIGdldHMgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cyBmcm9tIHRoZSBGUEdBLiBUaGUgYWN0dWFsIG51bWJlciBvZgorICogYXZlcmFnZWQgc2FtcGxlcyBpcyAyXmJpdHMuCisgKiBUaGUgYXZlcmFnaW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGUgRlBHQS4KKyAqCisgKiBAcmV0dXJuIE51bWJlciBvZiBiaXRzIG9mIGF2ZXJhZ2luZyBwcmV2aW91c2x5IGNvbmZpZ3VyZWQuCisgKi8KK3VpbnQzMl90IEFuYWxvZ0lucHV0OjpHZXRBdmVyYWdlQml0cygpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQzMl90IGF2ZXJhZ2VCaXRzID0gZ2V0QW5hbG9nQXZlcmFnZUJpdHMobV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiBhdmVyYWdlQml0czsKK30KKworLyoqCisgKiBTZXQgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMuCisgKiBUaGlzIHNldHMgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIG92ZXJzYW1wbGVkCisgKiB2YWx1ZXMgaXMgMl5iaXRzLgorICogVXNlIG92ZXJzYW1wbGluZyB0byBpbXByb3ZlIHRoZSByZXNvbHV0aW9uIG9mIHlvdXIgbWVhc3VyZW1lbnRzIGF0IHRoZQorICogZXhwZW5zZSBvZiBzYW1wbGluZyByYXRlLgorICogVGhlIG92ZXJzYW1wbGluZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCisgKgorICogQHBhcmFtIGJpdHMgTnVtYmVyIG9mIGJpdHMgb2Ygb3ZlcnNhbXBsaW5nLgorICovCit2b2lkIEFuYWxvZ0lucHV0OjpTZXRPdmVyc2FtcGxlQml0cyh1aW50MzJfdCBiaXRzKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhtX3BvcnQsIGJpdHMsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMgcHJldmlvdXNseSBjb25maWd1cmVkLgorICogVGhpcyBnZXRzIHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzIGZyb20gdGhlIEZQR0EuIFRoZSBhY3R1YWwgbnVtYmVyIG9mCisgKiBvdmVyc2FtcGxlZCB2YWx1ZXMgaXMKKyAqIDJeYml0cy4gVGhlIG92ZXJzYW1wbGluZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYml0cyBvZiBvdmVyc2FtcGxpbmcgcHJldmlvdXNseSBjb25maWd1cmVkLgorICovCit1aW50MzJfdCBBbmFsb2dJbnB1dDo6R2V0T3ZlcnNhbXBsZUJpdHMoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGludDMyX3Qgb3ZlcnNhbXBsZUJpdHMgPSBnZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhtX3BvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIG92ZXJzYW1wbGVCaXRzOworfQorCisvKioKKyAqIElzIHRoZSBjaGFubmVsIGF0dGFjaGVkIHRvIGFuIGFjY3VtdWxhdG9yLgorICoKKyAqIEByZXR1cm4gVGhlIGFuYWxvZyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhbiBhY2N1bXVsYXRvci4KKyAqLworYm9vbCBBbmFsb2dJbnB1dDo6SXNBY2N1bXVsYXRvckNoYW5uZWwoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBib29sIGlzQWNjdW0gPSBpc0FjY3VtdWxhdG9yQ2hhbm5lbChtX3BvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIGlzQWNjdW07Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3IuCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OkluaXRBY2N1bXVsYXRvcigpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBtX2FjY3VtdWxhdG9yT2Zmc2V0ID0gMDsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbml0QWNjdW11bGF0b3IobV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IGFuIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBhY2N1bXVsYXRvci4KKyAqCisgKiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gYWxsIHZhbHVlcyByZXR1cm5lZCB0byB0aGUgdXNlci4KKyAqIEBwYXJhbSBpbml0aWFsVmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIGFjY3VtdWxhdG9yIHNob3VsZCBzdGFydCBmcm9tIHdoZW4KKyAqIHJlc2V0LgorICovCit2b2lkIEFuYWxvZ0lucHV0OjpTZXRBY2N1bXVsYXRvckluaXRpYWxWYWx1ZShpbnQ2NF90IGluaXRpYWxWYWx1ZSkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIG1fYWNjdW11bGF0b3JPZmZzZXQgPSBpbml0aWFsVmFsdWU7Cit9CisKKy8qKgorICogUmVzZXRzIHRoZSBhY2N1bXVsYXRvciB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6UmVzZXRBY2N1bXVsYXRvcigpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHJlc2V0QWNjdW11bGF0b3IobV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgaWYgKCFTdGF0dXNJc0ZhdGFsKCkpIHsKKyAgICAvLyBXYWl0IHVudGlsIHRoZSBuZXh0IHNhbXBsZSwgc28gdGhlIG5leHQgY2FsbCB0byBHZXRBY2N1bXVsYXRvciooKQorICAgIC8vIHdvbid0IGhhdmUgb2xkIHZhbHVlcy4KKyAgICBjb25zdCBmbG9hdCBzYW1wbGVUaW1lID0gMS4wZiAvIEdldFNhbXBsZVJhdGUoKTsKKyAgICBjb25zdCBmbG9hdCBvdmVyU2FtcGxlcyA9IDEgPDwgR2V0T3ZlcnNhbXBsZUJpdHMoKTsKKyAgICBjb25zdCBmbG9hdCBhdmVyYWdlU2FtcGxlcyA9IDEgPDwgR2V0QXZlcmFnZUJpdHMoKTsKKyAgICBXYWl0KHNhbXBsZVRpbWUgKiBvdmVyU2FtcGxlcyAqIGF2ZXJhZ2VTYW1wbGVzKTsKKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgY2VudGVyIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci4KKyAqCisgKiBUaGUgY2VudGVyIHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIEEvRCB2YWx1ZSBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlCisgKiBhY2N1bXVsYXRvci4gVGhpcworICogaXMgdXNlZCBmb3IgdGhlIGNlbnRlciB2YWx1ZSBvZiBkZXZpY2VzIGxpa2UgZ3lyb3MgYW5kIGFjY2VsZXJvbWV0ZXJzIHRvCisgKiB0YWtlIHRoZSBkZXZpY2Ugb2Zmc2V0IGludG8gYWNjb3VudCB3aGVuIGludGVncmF0aW5nLgorICoKKyAqIFRoaXMgY2VudGVyIHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGVkIGFuZCBhdmVyYWdlZAorICogc291cmNlIGZyb20gdGhlIGFjY3VtdWxhdG9yCisgKiBjaGFubmVsLiBCZWNhdXNlIG9mIHRoaXMsIGFueSBub24temVybyBvdmVyc2FtcGxlIGJpdHMgd2lsbCBhZmZlY3QgdGhlIHNpemUKKyAqIG9mIHRoZSB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6U2V0QWNjdW11bGF0b3JDZW50ZXIoaW50MzJfdCBjZW50ZXIpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNldEFjY3VtdWxhdG9yQ2VudGVyKG1fcG9ydCwgY2VudGVyLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBhY2N1bXVsYXRvcidzIGRlYWRiYW5kLgorICogQHBhcmFtCisgKi8KK3ZvaWQgQW5hbG9nSW5wdXQ6OlNldEFjY3VtdWxhdG9yRGVhZGJhbmQoaW50MzJfdCBkZWFkYmFuZCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0QWNjdW11bGF0b3JEZWFkYmFuZChtX3BvcnQsIGRlYWRiYW5kLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCisgKgorICogUmVhZCB0aGUgdmFsdWUgdGhhdCBoYXMgYmVlbiBhY2N1bXVsYXRpbmcuCisgKiBUaGUgYWNjdW11bGF0b3IgaXMgYXR0YWNoZWQgYWZ0ZXIgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lLgorICoKKyAqIEByZXR1cm4gVGhlIDY0LWJpdCB2YWx1ZSBhY2N1bXVsYXRlZCBzaW5jZSB0aGUgbGFzdCBSZXNldCgpLgorICovCitpbnQ2NF90IEFuYWxvZ0lucHV0OjpHZXRBY2N1bXVsYXRvclZhbHVlKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQ2NF90IHZhbHVlID0gZ2V0QWNjdW11bGF0b3JWYWx1ZShtX3BvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHZhbHVlICsgbV9hY2N1bXVsYXRvck9mZnNldDsKK30KKworLyoqCisgKiBSZWFkIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzLgorICoKKyAqIFJlYWQgdGhlIGNvdW50IG9mIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMgc2luY2UgdGhlIGFjY3VtdWxhdG9yIHdhcyBsYXN0CisgKiBSZXNldCgpLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBzYW1wbGVzIGZyb20gdGhlIGNoYW5uZWwgd2VyZSBhY2N1bXVsYXRlZC4KKyAqLwordWludDMyX3QgQW5hbG9nSW5wdXQ6OkdldEFjY3VtdWxhdG9yQ291bnQoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHVpbnQzMl90IGNvdW50ID0gZ2V0QWNjdW11bGF0b3JDb3VudChtX3BvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcyBhdG9taWNhbGx5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHZhbHVlIGFuZCBjb3VudCBmcm9tIHRoZSBGUEdBIGF0b21pY2FsbHkuCisgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhdmVyYWdpbmcuCisgKgorICogQHBhcmFtIHZhbHVlIFJlZmVyZW5jZSB0byB0aGUgNjQtYml0IGFjY3VtdWxhdGVkIG91dHB1dC4KKyAqIEBwYXJhbSBjb3VudCBSZWZlcmVuY2UgdG8gdGhlIG51bWJlciBvZiBhY2N1bXVsYXRpb24gY3ljbGVzLgorICovCit2b2lkIEFuYWxvZ0lucHV0OjpHZXRBY2N1bXVsYXRvck91dHB1dChpbnQ2NF90ICZ2YWx1ZSwgdWludDMyX3QgJmNvdW50KSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBnZXRBY2N1bXVsYXRvck91dHB1dChtX3BvcnQsICZ2YWx1ZSwgJmNvdW50LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHZhbHVlICs9IG1fYWNjdW11bGF0b3JPZmZzZXQ7Cit9CisKKy8qKgorICogU2V0IHRoZSBzYW1wbGUgcmF0ZSBwZXIgY2hhbm5lbCBmb3IgYWxsIGFuYWxvZyBjaGFubmVscy4KKyAqIFRoZSBtYXhpbXVtIHJhdGUgaXMgNTAwa1MvcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdXNlLgorICogVGhpcyBpcyA2MjUwMCBzYW1wbGVzL3MgcGVyIGNoYW5uZWwuCisgKiBAcGFyYW0gc2FtcGxlc1BlclNlY29uZCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZC4KKyAqLwordm9pZCBBbmFsb2dJbnB1dDo6U2V0U2FtcGxlUmF0ZShmbG9hdCBzYW1wbGVzUGVyU2Vjb25kKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0QW5hbG9nU2FtcGxlUmF0ZShzYW1wbGVzUGVyU2Vjb25kLCAmc3RhdHVzKTsKKyAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHNhbXBsZSByYXRlIGZvciBhbGwgY2hhbm5lbHMKKyAqCisgKiBAcmV0dXJuIFNhbXBsZSByYXRlLgorICovCitmbG9hdCBBbmFsb2dJbnB1dDo6R2V0U2FtcGxlUmF0ZSgpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBmbG9hdCBzYW1wbGVSYXRlID0gZ2V0QW5hbG9nU2FtcGxlUmF0ZSgmc3RhdHVzKTsKKyAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiBzYW1wbGVSYXRlOworfQorCisvKioKKyAqIEdldCB0aGUgQXZlcmFnZSB2YWx1ZSBmb3IgdGhlIFBJRCBTb3VyY2UgYmFzZSBvYmplY3QuCisgKgorICogQHJldHVybiBUaGUgYXZlcmFnZSB2b2x0YWdlLgorICovCitkb3VibGUgQW5hbG9nSW5wdXQ6OlBJREdldCgpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKyAgcmV0dXJuIEdldEF2ZXJhZ2VWb2x0YWdlKCk7Cit9CisKK3ZvaWQgQW5hbG9nSW5wdXQ6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldEF2ZXJhZ2VWb2x0YWdlKCkpOworICB9Cit9CisKK3ZvaWQgQW5hbG9nSW5wdXQ6OlN0YXJ0TGl2ZVdpbmRvd01vZGUoKSB7fQorCit2b2lkIEFuYWxvZ0lucHV0OjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7fQorCitzdGQ6OnN0cmluZyBBbmFsb2dJbnB1dDo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworICByZXR1cm4gIkFuYWxvZyBJbnB1dCI7Cit9CisKK3ZvaWQgQW5hbG9nSW5wdXQ6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworICBtX3RhYmxlID0gc3ViVGFibGU7CisgIFVwZGF0ZVRhYmxlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEFuYWxvZ0lucHV0OjpHZXRUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGU7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9BbmFsb2dPdXRwdXQuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0FuYWxvZ091dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhMWY5YwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BbmFsb2dPdXRwdXQuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLworLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJBbmFsb2dPdXRwdXQuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorI2luY2x1ZGUgIkhBTC9Qb3J0LmgiCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZXNvdXJjZT4gb3V0cHV0czsKKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIG91dHB1dCBvbiB0aGUgZ2l2ZW4gY2hhbm5lbC4KKyAqIEFsbCBhbmFsb2cgb3V0cHV0cyBhcmUgbG9jYXRlZCBvbiB0aGUgTVhQIHBvcnQuCisgKiBAcGFyYW0gVGhlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSByb2JvUklPIHRvIHJlcHJlc2VudC4KKyAqLworQW5hbG9nT3V0cHV0OjpBbmFsb2dPdXRwdXQodWludDMyX3QgY2hhbm5lbCkgeworICBSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3Qob3V0cHV0cywga0FuYWxvZ091dHB1dHMpOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKKyAgYnVmIDw8ICJhbmFsb2cgaW5wdXQgIiA8PCBjaGFubmVsOworCisgIGlmICghY2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGNoYW5uZWwpKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmLnN0cigpKTsKKyAgICBtX2NoYW5uZWwgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7CisgICAgbV9wb3J0ID0gbnVsbHB0cjsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAob3V0cHV0cy0+QWxsb2NhdGUoY2hhbm5lbCwgYnVmLnN0cigpKSA9PQorICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CisgICAgQ2xvbmVFcnJvcigqb3V0cHV0cyk7CisgICAgbV9jaGFubmVsID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOworICAgIG1fcG9ydCA9IG51bGxwdHI7CisgICAgcmV0dXJuOworICB9CisKKyAgbV9jaGFubmVsID0gY2hhbm5lbDsKKworICB2b2lkKiBwb3J0ID0gZ2V0UG9ydChtX2NoYW5uZWwpOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIG1fcG9ydCA9IGluaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0KHBvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgZnJlZVBvcnQocG9ydCk7CisKKyAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkQWN0dWF0b3IoIkFuYWxvZ091dHB1dCIsIG1fY2hhbm5lbCwgdGhpcyk7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BbmFsb2dPdXRwdXQsIG1fY2hhbm5lbCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4gRnJlZXMgYW5hbG9nIG91dHB1dCByZXNvdXJjZQorICovCitBbmFsb2dPdXRwdXQ6On5BbmFsb2dPdXRwdXQoKSB7CisgIGZyZWVBbmFsb2dPdXRwdXRQb3J0KG1fcG9ydCk7CisgIG91dHB1dHMtPkZyZWUobV9jaGFubmVsKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhbmFsb2cgb3V0cHV0CisgKgorICogQHBhcmFtIHZvbHRhZ2UgVGhlIG91dHB1dCB2YWx1ZSBpbiBWb2x0cywgZnJvbSAwLjAgdG8gKzUuMAorICovCit2b2lkIEFuYWxvZ091dHB1dDo6U2V0Vm9sdGFnZShmbG9hdCB2b2x0YWdlKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0QW5hbG9nT3V0cHV0KG1fcG9ydCwgdm9sdGFnZSwgJnN0YXR1cyk7CisKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSBhbmFsb2cgb3V0cHV0CisgKgorICogQHJldHVybiBUaGUgdmFsdWUgaW4gVm9sdHMsIGZyb20gMC4wIHRvICs1LjAKKyAqLworZmxvYXQgQW5hbG9nT3V0cHV0OjpHZXRWb2x0YWdlKCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGZsb2F0IHZvbHRhZ2UgPSBnZXRBbmFsb2dPdXRwdXQobV9wb3J0LCAmc3RhdHVzKTsKKworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICByZXR1cm4gdm9sdGFnZTsKK30KKwordm9pZCBBbmFsb2dPdXRwdXQ6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldFZvbHRhZ2UoKSk7CisgIH0KK30KKwordm9pZCBBbmFsb2dPdXRwdXQ6OlN0YXJ0TGl2ZVdpbmRvd01vZGUoKSB7fQorCit2b2lkIEFuYWxvZ091dHB1dDo6U3RvcExpdmVXaW5kb3dNb2RlKCkge30KKworc3RkOjpzdHJpbmcgQW5hbG9nT3V0cHV0OjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiAiQW5hbG9nIE91dHB1dCI7Cit9CisKK3ZvaWQgQW5hbG9nT3V0cHV0OjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YlRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBBbmFsb2dPdXRwdXQ6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0FuYWxvZ1BvdGVudGlvbWV0ZXIuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0FuYWxvZ1BvdGVudGlvbWV0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzJkODQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvQW5hbG9nUG90ZW50aW9tZXRlci5jcHAKQEAgLTAsMCArMSw4NyBAQAorI2luY2x1ZGUgIkFuYWxvZ1BvdGVudGlvbWV0ZXIuaCIKKyNpbmNsdWRlICJDb250cm9sbGVyUG93ZXIuaCIKKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gQW5hbG9nIFBvdGVudGlvbWV0ZXIgb2JqZWN0IGZyb20gYSBjaGFubmVsIG51bWJlci4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciBvbiB0aGUgcm9ib1JJTyB0byByZXByZXNlbnQuIDAtMyBhcmUKKyAqIG9uLWJvYXJkIDQtNyBhcmUgb24gdGhlIE1YUCBwb3J0LgorICogQHBhcmFtIGZ1bGxSYW5nZSBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBmdWxsCisgKiAwLTVWIHJhbmdlIG9mIHRoZSBpbnB1dC4KKyAqIEBwYXJhbSBvZmZzZXQgVGhlIGFuZ3VsYXIgdmFsdWUgKGluIGRlc2lyZWQgdW5pdHMpIHJlcHJlc2VudGluZyB0aGUgYW5ndWxhcgorICogb3V0cHV0IGF0IDBWLgorICovCitBbmFsb2dQb3RlbnRpb21ldGVyOjpBbmFsb2dQb3RlbnRpb21ldGVyKGludCBjaGFubmVsLCBkb3VibGUgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgb2Zmc2V0KQorICAgIDogbV9hbmFsb2dfaW5wdXQoc3RkOjptYWtlX3VuaXF1ZTxBbmFsb2dJbnB1dD4oY2hhbm5lbCkpLAorICAgICAgbV9mdWxsUmFuZ2UoZnVsbFJhbmdlKSwKKyAgICAgIG1fb2Zmc2V0KG9mZnNldCkge30KKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gQW5hbG9nIFBvdGVudGlvbWV0ZXIgb2JqZWN0IGZyb20gYW4gZXhpc3RpbmcgQW5hbG9nIElucHV0CisgKiBwb2ludGVyLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGV4aXN0aW5nIEFuYWxvZyBJbnB1dCBwb2ludGVyCisgKiBAcGFyYW0gZnVsbFJhbmdlIFRoZSBhbmd1bGFyIHZhbHVlIChpbiBkZXNpcmVkIHVuaXRzKSByZXByZXNlbnRpbmcgdGhlIGZ1bGwKKyAqIDAtNVYgcmFuZ2Ugb2YgdGhlIGlucHV0LgorICogQHBhcmFtIG9mZnNldCBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBhbmd1bGFyCisgKiBvdXRwdXQgYXQgMFYuCisgKi8KK0FuYWxvZ1BvdGVudGlvbWV0ZXI6OkFuYWxvZ1BvdGVudGlvbWV0ZXIoQW5hbG9nSW5wdXQgKmlucHV0LCBkb3VibGUgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgb2Zmc2V0KQorICAgIDogbV9hbmFsb2dfaW5wdXQoaW5wdXQsIE51bGxEZWxldGVyPEFuYWxvZ0lucHV0PigpKSwKKyAgICAgIG1fZnVsbFJhbmdlKGZ1bGxSYW5nZSksCisgICAgICBtX29mZnNldChvZmZzZXQpIHt9CisKKy8qKgorICogQ29uc3RydWN0IGFuIEFuYWxvZyBQb3RlbnRpb21ldGVyIG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIEFuYWxvZyBJbnB1dAorICogcG9pbnRlci4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBleGlzdGluZyBBbmFsb2cgSW5wdXQgcG9pbnRlcgorICogQHBhcmFtIGZ1bGxSYW5nZSBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBmdWxsCisgKiAwLTVWIHJhbmdlIG9mIHRoZSBpbnB1dC4KKyAqIEBwYXJhbSBvZmZzZXQgVGhlIGFuZ3VsYXIgdmFsdWUgKGluIGRlc2lyZWQgdW5pdHMpIHJlcHJlc2VudGluZyB0aGUgYW5ndWxhcgorICogb3V0cHV0IGF0IDBWLgorICovCitBbmFsb2dQb3RlbnRpb21ldGVyOjpBbmFsb2dQb3RlbnRpb21ldGVyKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dJbnB1dD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmdWxsUmFuZ2UsIGRvdWJsZSBvZmZzZXQpCisgICAgOiBtX2FuYWxvZ19pbnB1dChpbnB1dCksIG1fZnVsbFJhbmdlKGZ1bGxSYW5nZSksIG1fb2Zmc2V0KG9mZnNldCkge30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgcmVhZGluZyBvZiB0aGUgcG90ZW50aW9tZXRlci4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb3RlbnRpb21ldGVyIChpbiB0aGUgdW5pdHMgdXNlZCBmb3IKKyAqIGZ1bGxSYW5lZyBhbmQgb2Zmc2V0KS4KKyAqLworZG91YmxlIEFuYWxvZ1BvdGVudGlvbWV0ZXI6OkdldCgpIGNvbnN0IHsKKyAgcmV0dXJuIChtX2FuYWxvZ19pbnB1dC0+R2V0Vm9sdGFnZSgpIC8gQ29udHJvbGxlclBvd2VyOjpHZXRWb2x0YWdlNVYoKSkgKgorICAgICAgICAgICAgIG1fZnVsbFJhbmdlICsKKyAgICAgICAgIG1fb2Zmc2V0OworfQorCisvKioKKyAqIEltcGxlbWVudCB0aGUgUElEU291cmNlIGludGVyZmFjZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJlYWRpbmcuCisgKi8KK2RvdWJsZSBBbmFsb2dQb3RlbnRpb21ldGVyOjpQSURHZXQoKSB7IHJldHVybiBHZXQoKTsgfQorCisvKioKKyAqIEByZXR1cm4gdGhlIFNtYXJ0IERhc2hib2FyZCBUeXBlCisgKi8KK3N0ZDo6c3RyaW5nIEFuYWxvZ1BvdGVudGlvbWV0ZXI6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJBbmFsb2cgSW5wdXQiOworfQorCisvKioKKyAqIExpdmUgV2luZG93IGNvZGUsIG9ubHkgZG9lcyBhbnl0aGluZyBpZiBsaXZlIHdpbmRvdyBpcyBhY3RpdmF0ZWQuCisgKi8KK3ZvaWQgQW5hbG9nUG90ZW50aW9tZXRlcjo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YnRhYmxlKSB7CisgIG1fdGFibGUgPSBzdWJ0YWJsZTsKKyAgVXBkYXRlVGFibGUoKTsKK30KKwordm9pZCBBbmFsb2dQb3RlbnRpb21ldGVyOjpVcGRhdGVUYWJsZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlB1dE51bWJlcigiVmFsdWUiLCBHZXQoKSk7CisgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gQW5hbG9nUG90ZW50aW9tZXRlcjo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvQW5hbG9nVHJpZ2dlci5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvQW5hbG9nVHJpZ2dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5ZDZhMAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BbmFsb2dUcmlnZ2VyLmNwcApAQCAtMCwwICsxLDE2MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlci5oIgorCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkhBTC9Qb3J0LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIGFuIGFuYWxvZyB0cmlnZ2VyIGdpdmVuIGEgY2hhbm5lbCBudW1iZXIuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSByb2JvUklPIHRvIHJlcHJlc2VudC4gMC0zIGFyZQorICogb24tYm9hcmQgNC03IGFyZSBvbiB0aGUgTVhQIHBvcnQuCisgKi8KK0FuYWxvZ1RyaWdnZXI6OkFuYWxvZ1RyaWdnZXIoaW50MzJfdCBjaGFubmVsKSB7CisgIHZvaWQqIHBvcnQgPSBnZXRQb3J0KGNoYW5uZWwpOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHVpbnQzMl90IGluZGV4ID0gMDsKKyAgbV90cmlnZ2VyID0gaW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIocG9ydCwgJmluZGV4LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIGZyZWVQb3J0KHBvcnQpOworICBtX2luZGV4ID0gaW5kZXg7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXIsIGNoYW5uZWwpOworfQorCisvKioKKyAqIENvbnN0cnVjdCBhbiBhbmFsb2cgdHJpZ2dlciBnaXZlbiBhbiBhbmFsb2cgaW5wdXQuCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIHNoYXJpbmcgYW4gYW5hbG9nIGNoYW5uZWwgYmV0d2VlbiB0aGUKKyAqIHRyaWdnZXIgYW5kIGFuIGFuYWxvZyBpbnB1dCBvYmplY3QuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgQW5hbG9nSW5wdXQgb2JqZWN0CisgKi8KK0FuYWxvZ1RyaWdnZXI6OkFuYWxvZ1RyaWdnZXIoQW5hbG9nSW5wdXQgKmlucHV0KSA6CisgICAgQW5hbG9nVHJpZ2dlcihpbnB1dC0+R2V0Q2hhbm5lbCgpKSB7Cit9CisKK0FuYWxvZ1RyaWdnZXI6On5BbmFsb2dUcmlnZ2VyKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGNsZWFuQW5hbG9nVHJpZ2dlcihtX3RyaWdnZXIsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICogVGhlIGxpbWl0cyBhcmUgZ2l2ZW4gaW4gQURDIGNvZGVzLiAgSWYgb3ZlcnNhbXBsaW5nIGlzIHVzZWQsIHRoZSB1bml0cyBtdXN0CisgKiBiZSBzY2FsZWQKKyAqIGFwcHJvcHJpYXRlbHkuCisgKiBAcGFyYW0gbG93ZXIgVGhlIGxvd2VyIGxpbWl0IG9mIHRoZSB0cmlnZ2VyIGluIEFEQyBjb2RlcyAoMTItYml0IHZhbHVlcykuCisgKiBAcGFyYW0gdXBwZXIgVGhlIHVwcGVyIGxpbWl0IG9mIHRoZSB0cmlnZ2VyIGluIEFEQyBjb2RlcyAoMTItYml0IHZhbHVlcykuCisgKi8KK3ZvaWQgQW5hbG9nVHJpZ2dlcjo6U2V0TGltaXRzUmF3KGludDMyX3QgbG93ZXIsIGludDMyX3QgdXBwZXIpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNldEFuYWxvZ1RyaWdnZXJMaW1pdHNSYXcobV90cmlnZ2VyLCBsb3dlciwgdXBwZXIsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgorICogVGhlIGxpbWl0cyBhcmUgZ2l2ZW4gYXMgZmxvYXRpbmcgcG9pbnQgdm9sdGFnZSB2YWx1ZXMuCisgKiBAcGFyYW0gbG93ZXIgVGhlIGxvd2VyIGxpbWl0IG9mIHRoZSB0cmlnZ2VyIGluIFZvbHRzLgorICogQHBhcmFtIHVwcGVyIFRoZSB1cHBlciBsaW1pdCBvZiB0aGUgdHJpZ2dlciBpbiBWb2x0cy4KKyAqLwordm9pZCBBbmFsb2dUcmlnZ2VyOjpTZXRMaW1pdHNWb2x0YWdlKGZsb2F0IGxvd2VyLCBmbG9hdCB1cHBlcikgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2UobV90cmlnZ2VyLCBsb3dlciwgdXBwZXIsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGFuYWxvZyB0cmlnZ2VyIHRvIHVzZSB0aGUgYXZlcmFnZWQgdnMuIHJhdyB2YWx1ZXMuCisgKiBJZiB0aGUgdmFsdWUgaXMgdHJ1ZSwgdGhlbiB0aGUgYXZlcmFnZWQgdmFsdWUgaXMgc2VsZWN0ZWQgZm9yIHRoZSBhbmFsb2cKKyAqIHRyaWdnZXIsIG90aGVyd2lzZQorICogdGhlIGltbWVkaWF0ZSB2YWx1ZSBpcyB1c2VkLgorICogQHBhcmFtIHVzZUF2ZXJhZ2VkVmFsdWUgSWYgdHJ1ZSwgdXNlIHRoZSBBdmVyYWdlZCB2YWx1ZSwgb3RoZXJ3aXNlIHVzZSB0aGUKKyAqIGluc3RhbnRhbmVvdXMgcmVhZGluZworICovCit2b2lkIEFuYWxvZ1RyaWdnZXI6OlNldEF2ZXJhZ2VkKGJvb2wgdXNlQXZlcmFnZWRWYWx1ZSkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0QW5hbG9nVHJpZ2dlckF2ZXJhZ2VkKG1fdHJpZ2dlciwgdXNlQXZlcmFnZWRWYWx1ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgYW5hbG9nIHRyaWdnZXIgdG8gdXNlIGEgZmlsdGVyZWQgdmFsdWUuCisgKiBUaGUgYW5hbG9nIHRyaWdnZXIgd2lsbCBvcGVyYXRlIHdpdGggYSAzIHBvaW50IGF2ZXJhZ2UgcmVqZWN0aW9uIGZpbHRlci4gVGhpcworICogaXMgZGVzaWduZWQgdG8KKyAqIGhlbHAgd2l0aCAzNjAgZGVncmVlIHBvdCBhcHBsaWNhdGlvbnMgZm9yIHRoZSBwZXJpb2Qgd2hlcmUgdGhlIHBvdCBjcm9zc2VzCisgKiB0aHJvdWdoIHplcm8uCisgKiBAcGFyYW0gdXNlRmlsdGVyZWRWYWx1ZSBJZiB0cnVlLCB1c2UgdGhlIDMgcG9pbnQgcmVqZWN0aW9uIGZpbHRlciwgb3RoZXJ3aXNlCisgKiB1c2UgdGhlIHVuZmlsdGVyZWQgdmFsdWUKKyAqLwordm9pZCBBbmFsb2dUcmlnZ2VyOjpTZXRGaWx0ZXJlZChib29sIHVzZUZpbHRlcmVkVmFsdWUpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZChtX3RyaWdnZXIsIHVzZUZpbHRlcmVkVmFsdWUsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqIFRoaXMgaXMgdGhlIEZQR0EgaW5kZXggb2YgdGhpcyBhbmFsb2cgdHJpZ2dlciBpbnN0YW5jZS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqLwordWludDMyX3QgQW5hbG9nVHJpZ2dlcjo6R2V0SW5kZXgoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7CisgIHJldHVybiBtX2luZGV4OworfQorCisvKioKKyAqIFJldHVybiB0aGUgSW5XaW5kb3cgb3V0cHV0IG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqIFRydWUgaWYgdGhlIGFuYWxvZyBpbnB1dCBpcyBiZXR3ZWVuIHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmFsb2cgaW5wdXQgaXMgYmV0d2VlbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy4KKyAqLworYm9vbCBBbmFsb2dUcmlnZ2VyOjpHZXRJbldpbmRvdygpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGJvb2wgcmVzdWx0ID0gZ2V0QW5hbG9nVHJpZ2dlckluV2luZG93KG1fdHJpZ2dlciwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybiB0aGUgVHJpZ2dlclN0YXRlIG91dHB1dCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCisgKiBUcnVlIGlmIGFib3ZlIHVwcGVyIGxpbWl0LgorICogRmFsc2UgaWYgYmVsb3cgbG93ZXIgbGltaXQuCisgKiBJZiBpbiBIeXN0ZXJlc2lzLCBtYWludGFpbiBwcmV2aW91cyBzdGF0ZS4KKyAqIEByZXR1cm4gVHJ1ZSBpZiBhYm92ZSB1cHBlciBsaW1pdC4gRmFsc2UgaWYgYmVsb3cgbG93ZXIgbGltaXQuIElmIGluCisgKiBIeXN0ZXJlc2lzLCBtYWludGFpbiBwcmV2aW91cyBzdGF0ZS4KKyAqLworYm9vbCBBbmFsb2dUcmlnZ2VyOjpHZXRUcmlnZ2VyU3RhdGUoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBib29sIHJlc3VsdCA9IGdldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyU3RhdGUobV90cmlnZ2VyLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhbiBBbmFsb2dUcmlnZ2VyT3V0cHV0IG9iamVjdC4KKyAqIEdldHMgYW4gb3V0cHV0IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGZvciByb3V0aW5nLgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgQW5hbG9nVHJpZ2dlck91dHB1dCBvYmplY3QuCisgKiBAcGFyYW0gdHlwZSBBbiBlbnVtIG9mIHRoZSB0eXBlIG9mIG91dHB1dCBvYmplY3QgdG8gY3JlYXRlLgorICogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBuZXcgQW5hbG9nVHJpZ2dlck91dHB1dCBvYmplY3QuCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyT3V0cHV0PiBBbmFsb2dUcmlnZ2VyOjpDcmVhdGVPdXRwdXQoCisgICAgQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyT3V0cHV0PigKKyAgICAgIG5ldyBBbmFsb2dUcmlnZ2VyT3V0cHV0KCp0aGlzLCB0eXBlKSwgTnVsbERlbGV0ZXI8QW5hbG9nVHJpZ2dlck91dHB1dD4oKSk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvQW5hbG9nVHJpZ2dlck91dHB1dC5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvQW5hbG9nVHJpZ2dlck91dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1NDI3NQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9BbmFsb2dUcmlnZ2VyT3V0cHV0LmNwcApAQCAtMCwwICsxLDY4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCisjaW5jbHVkZSAiQW5hbG9nVHJpZ2dlci5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisvKioKKyAqIENyZWF0ZSBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIG9uZSBvZiB0aGUgZm91ciBvdXRwdXRzIGZyb20gYW4gYW5hbG9nCisgKiB0cmlnZ2VyLgorICoKKyAqIEJlY2F1c2UgdGhpcyBjbGFzcyBkZXJpdmVzIGZyb20gRGlnaXRhbFNvdXJjZSwgaXQgY2FuIGJlIHBhc3NlZCBpbnRvIHJvdXRpbmcKKyAqIGZ1bmN0aW9ucworICogZm9yIENvdW50ZXIsIEVuY29kZXIsIGV0Yy4KKyAqCisgKiBAcGFyYW0gdHJpZ2dlciBBIHBvaW50ZXIgdG8gdGhlIHRyaWdnZXIgZm9yIHdoaWNoIHRoaXMgaXMgYW4gb3V0cHV0LgorICogQHBhcmFtIG91dHB1dFR5cGUgQW4gZW51bSB0aGF0IHNwZWNpZmllcyB0aGUgb3V0cHV0IG9uIHRoZSB0cmlnZ2VyIHRvCisgKiByZXByZXNlbnQuCisgKi8KK0FuYWxvZ1RyaWdnZXJPdXRwdXQ6OkFuYWxvZ1RyaWdnZXJPdXRwdXQoY29uc3QgQW5hbG9nVHJpZ2dlciAmdHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nVHJpZ2dlclR5cGUgb3V0cHV0VHlwZSkKKyAgICA6IG1fdHJpZ2dlcih0cmlnZ2VyKSwgbV9vdXRwdXRUeXBlKG91dHB1dFR5cGUpIHsKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXJPdXRwdXQsCisgICAgICAgICAgICB0cmlnZ2VyLkdldEluZGV4KCksIG91dHB1dFR5cGUpOworfQorCitBbmFsb2dUcmlnZ2VyT3V0cHV0Ojp+QW5hbG9nVHJpZ2dlck91dHB1dCgpIHsKKyAgaWYgKG1faW50ZXJydXB0ICE9IG51bGxwdHIpIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgY2xlYW5JbnRlcnJ1cHRzKG1faW50ZXJydXB0LCAmc3RhdHVzKTsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICBtX2ludGVycnVwdCA9IG51bGxwdHI7CisgICAgbV9pbnRlcnJ1cHRzLT5GcmVlKG1faW50ZXJydXB0SW5kZXgpOworICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0LgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dC4KKyAqLworYm9vbCBBbmFsb2dUcmlnZ2VyT3V0cHV0OjpHZXQoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCByZXN1bHQgPQorICAgICAgZ2V0QW5hbG9nVHJpZ2dlck91dHB1dChtX3RyaWdnZXIubV90cmlnZ2VyLCBtX291dHB1dFR5cGUsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBjaGFubmVsIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK3VpbnQzMl90IEFuYWxvZ1RyaWdnZXJPdXRwdXQ6OkdldENoYW5uZWxGb3JSb3V0aW5nKCkgY29uc3QgeworICByZXR1cm4gKG1fdHJpZ2dlci5tX2luZGV4IDw8IDIpICsgbV9vdXRwdXRUeXBlOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG1vZHVsZSBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCit1aW50MzJfdCBBbmFsb2dUcmlnZ2VyT3V0cHV0OjpHZXRNb2R1bGVGb3JSb3V0aW5nKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisvKioKKyAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG1vZHVsZSBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCitib29sIEFuYWxvZ1RyaWdnZXJPdXRwdXQ6OkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0J1aWx0SW5BY2NlbGVyb21ldGVyLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9CdWlsdEluQWNjZWxlcm9tZXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwNDUyNAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9CdWlsdEluQWNjZWxlcm9tZXRlci5jcHAKQEAgLTAsMCArMSw2OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJCdWlsdEluQWNjZWxlcm9tZXRlci5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSB0aGUgYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUKKyAqLworQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OkJ1aWx0SW5BY2NlbGVyb21ldGVyKFJhbmdlIHJhbmdlKSB7CisgIFNldFJhbmdlKHJhbmdlKTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQWNjZWxlcm9tZXRlciwgMCwgMCwKKyAgICAgICAgICAgICJCdWlsdC1pbiBhY2NlbGVyb21ldGVyIik7CisgIExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCktPkFkZFNlbnNvcigoc3RkOjpzdHJpbmcpICJCdWlsdEluQWNjZWwiLCAwLCB0aGlzKTsKK30KKworLyoqIHtAaW5oZXJpdGRvY30gKi8KK3ZvaWQgQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OlNldFJhbmdlKFJhbmdlIHJhbmdlKSB7CisgIGlmIChyYW5nZSA9PSBrUmFuZ2VfMTZHKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCisgICAgICAgIFBhcmFtZXRlck91dE9mUmFuZ2UsICIxNkcgcmFuZ2Ugbm90IHN1cHBvcnRlZCAodXNlIGsyRywgazRHLCBvciBrOEcpIik7CisgIH0KKworICBzZXRBY2NlbGVyb21ldGVyQWN0aXZlKGZhbHNlKTsKKyAgc2V0QWNjZWxlcm9tZXRlclJhbmdlKChBY2NlbGVyb21ldGVyUmFuZ2UpcmFuZ2UpOworICBzZXRBY2NlbGVyb21ldGVyQWN0aXZlKHRydWUpOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBvZiB0aGUgUm9ib1JJTyBhbG9uZyB0aGUgWCBheGlzIGluIGctZm9yY2VzCisgKi8KK2RvdWJsZSBCdWlsdEluQWNjZWxlcm9tZXRlcjo6R2V0WCgpIHsgcmV0dXJuIGdldEFjY2VsZXJvbWV0ZXJYKCk7IH0KKworLyoqCisgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gb2YgdGhlIFJvYm9SSU8gYWxvbmcgdGhlIFkgYXhpcyBpbiBnLWZvcmNlcworICovCitkb3VibGUgQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OkdldFkoKSB7IHJldHVybiBnZXRBY2NlbGVyb21ldGVyWSgpOyB9CisKKy8qKgorICogQHJldHVybiBUaGUgYWNjZWxlcmF0aW9uIG9mIHRoZSBSb2JvUklPIGFsb25nIHRoZSBaIGF4aXMgaW4gZy1mb3JjZXMKKyAqLworZG91YmxlIEJ1aWx0SW5BY2NlbGVyb21ldGVyOjpHZXRaKCkgeyByZXR1cm4gZ2V0QWNjZWxlcm9tZXRlclooKTsgfQorCitzdGQ6OnN0cmluZyBCdWlsdEluQWNjZWxlcm9tZXRlcjo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworICByZXR1cm4gIjNBeGlzQWNjZWxlcm9tZXRlciI7Cit9CisKK3ZvaWQgQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJ0YWJsZSkgeworICBtX3RhYmxlID0gc3VidGFibGU7CisgIFVwZGF0ZVRhYmxlKCk7Cit9CisKK3ZvaWQgQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJYIiwgR2V0WCgpKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIlkiLCBHZXRZKCkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiWiIsIEdldFooKSk7CisgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0NBTkphZ3Vhci5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvQ0FOSmFndWFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzcxZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0NBTkphZ3Vhci5jcHAKQEAgLTAsMCArMSwyMDEzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA5LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkNBTkphZ3Vhci5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjZGVmaW5lIHROSVJJT19pMzIgaW50CisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vQ0FOU2Vzc2lvbk11eC5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorCisvKiB3ZSBhcmUgb24gQVJNLUxFIG5vdywgbm90IEZyZWVzY2FsZSBzbyBubyBuZWVkIHRvIHN3YXAgKi8KKyNkZWZpbmUgc3dhcDE2KHgpICh4KQorI2RlZmluZSBzd2FwMzIoeCkgKHgpCisKKy8qIENvbXBhcmUgZmxvYXRzIGZvciBlcXVhbGl0eSBhcyBmaXhlZCBwb2ludCBudW1iZXJzICovCisjZGVmaW5lIEZYUDhfRVEoYSwgYikgKChpbnQxNl90KSgoYSkqMjU2LjApID09IChpbnQxNl90KSgoYikqMjU2LjApKQorI2RlZmluZSBGWFAxNl9FUShhLCBiKSAoKGludDMyX3QpKChhKSo2NTUzNi4wKSA9PSAoaW50MzJfdCkoKGIpKjY1NTM2LjApKQorCitjb25zdCBpbnQzMl90IENBTkphZ3Vhcjo6a0NvbnRyb2xsZXJSYXRlOworY29uc3RleHByIGRvdWJsZSBDQU5KYWd1YXI6OmtBcHByb3hCdXNWb2x0YWdlOworCitzdGF0aWMgY29uc3QgaW50MzJfdCBrU2VuZE1lc3NhZ2VQZXJpb2QgPSAyMDsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrRnVsbE1lc3NhZ2VJRE1hc2sgPQorICAgIChDQU5fTVNHSURfQVBJX00gfCBDQU5fTVNHSURfTUZSX00gfCBDQU5fTVNHSURfRFRZUEVfTSk7CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtSZWNlaXZlU3RhdHVzQXR0ZW1wdHMgPSA1MDsKKworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZXNvdXJjZT4gYWxsb2NhdGVkOworCitzdGF0aWMgaW50MzJfdCBzZW5kTWVzc2FnZUhlbHBlcih1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRhdGFTaXplLCBpbnQzMl90IHBlcmlvZCkgeworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1RydXN0ZWRNZXNzYWdlc1tdID0geworICAgICAgTE1fQVBJX1ZPTFRfVF9FTiwgIExNX0FQSV9WT0xUX1RfU0VULCAgTE1fQVBJX1NQRF9UX0VOLCBMTV9BUElfU1BEX1RfU0VULAorICAgICAgTE1fQVBJX1ZDT01QX1RfRU4sIExNX0FQSV9WQ09NUF9UX1NFVCwgTE1fQVBJX1BPU19UX0VOLCBMTV9BUElfUE9TX1RfU0VULAorICAgICAgTE1fQVBJX0lDVFJMX1RfRU4sIExNX0FQSV9JQ1RSTF9UX1NFVH07CisKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIGZvciAoYXV0byYga1RydXN0ZWRNZXNzYWdlIDoga1RydXN0ZWRNZXNzYWdlcykgeworICAgIGlmICgoa0Z1bGxNZXNzYWdlSURNYXNrICYgbWVzc2FnZUlEKSA9PSBrVHJ1c3RlZE1lc3NhZ2UpIHsKKyAgICAgIHVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKyAgICAgIGRhdGFCdWZmZXJbMF0gPSAwOworICAgICAgZGF0YUJ1ZmZlclsxXSA9IDA7CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGF0YSB3aWxsIHN0aWxsIGZpdCBhZnRlciBhZGp1c3RpbmcgZm9yIHRoZSB0b2tlbi4KKyAgICAgIGFzc2VydChkYXRhU2l6ZSA8PSA2KTsKKworICAgICAgZm9yICh1aW50OF90IGogPSAwOyBqIDwgZGF0YVNpemU7IGorKykgeworICAgICAgICBkYXRhQnVmZmVyW2ogKyAyXSA9IGRhdGFbal07CisgICAgICB9CisKKyAgICAgIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKAorICAgICAgICAgIG1lc3NhZ2VJRCwgZGF0YUJ1ZmZlciwgZGF0YVNpemUgKyAyLCBwZXJpb2QsICZzdGF0dXMpOworCisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgfQorCisgIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKG1lc3NhZ2VJRCwgZGF0YSwgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCwgJnN0YXR1cyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkluaXRDQU5KYWd1YXIoKSB7CisgIG1fc2FmZXR5SGVscGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb3RvclNhZmV0eUhlbHBlcj4odGhpcyk7CisKKyAgYm9vbCByZWNlaXZlZEZpcm13YXJlVmVyc2lvbiA9IGZhbHNlOworICB1aW50OF90IGRhdGFCdWZmZXJbOF07CisgIHVpbnQ4X3QgZGF0YVNpemU7CisKKyAgLy8gUmVxdWVzdCBmaXJtd2FyZSBhbmQgaGFyZHdhcmUgdmVyc2lvbiBvbmx5IG9uY2UKKyAgcmVxdWVzdE1lc3NhZ2UoQ0FOX0lTX0ZSQU1FX1JFTU9URSB8IENBTl9NU0dJRF9BUElfRklSTVZFUik7CisgIHJlcXVlc3RNZXNzYWdlKExNX0FQSV9IV1ZFUik7CisKKyAgLy8gV2FpdCB1bnRpbCB3ZSd2ZSBnb3R0ZW4gYWxsIG9mIHRoZSBzdGF0dXMgZGF0YSBhdCBsZWFzdCBvbmNlLgorICBmb3IgKGludCBpID0gMDsgaSA8IGtSZWNlaXZlU3RhdHVzQXR0ZW1wdHM7IGkrKykgeworICAgIFdhaXQoMC4wMDEpOworCisgICAgc2V0dXBQZXJpb2RpY1N0YXR1cygpOworICAgIHVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisKKyAgICBpZiAoIXJlY2VpdmVkRmlybXdhcmVWZXJzaW9uICYmCisgICAgICAgIGdldE1lc3NhZ2UoQ0FOX01TR0lEX0FQSV9GSVJNVkVSLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpIHsKKyAgICAgIG1fZmlybXdhcmVWZXJzaW9uID0gdW5wYWNraW50MzJfdChkYXRhQnVmZmVyKTsKKyAgICAgIHJlY2VpdmVkRmlybXdhcmVWZXJzaW9uID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UwICYmIG1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMSAmJgorICAgICAgICBtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIgJiYgcmVjZWl2ZWRGaXJtd2FyZVZlcnNpb24pIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UwIHx8ICFtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTEgfHwKKyAgICAgICFtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIgfHwgIXJlY2VpdmVkRmlybXdhcmVWZXJzaW9uKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSmFndWFyTWVzc2FnZU5vdEZvdW5kLCAiU3RhdHVzIGRhdGEgbm90IGZvdW5kIik7CisgIH0KKworICBpZiAoZ2V0TWVzc2FnZShMTV9BUElfSFdWRVIsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpCisgICAgbV9oYXJkd2FyZVZlcnNpb24gPSBkYXRhQnVmZmVyWzBdOworCisgIGlmIChtX2RldmljZU51bWJlciA8IDEgfHwgbV9kZXZpY2VOdW1iZXIgPiA2MykgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKKyAgICBidWYgPDwgImRldmljZSBudW1iZXIgXCIiIDw8IG1fZGV2aWNlTnVtYmVyCisgICAgICAgIDw8ICJcIiBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNjMiOworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsIGJ1Zi5zdHIoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisgIC8vIDMzMzAgd2FzIHRoZSBmaXJzdCBzaGlwcGluZyBSREsgZmlybXdhcmUgdmVyc2lvbiBmb3IgdGhlIEphZ3VhcgorICBpZiAobV9maXJtd2FyZVZlcnNpb24gPj0gMzMzMCB8fCBtX2Zpcm13YXJlVmVyc2lvbiA8IDEwOCkgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKKyAgICBpZiAobV9maXJtd2FyZVZlcnNpb24gPCAzMzMwKSB7CisgICAgICBidWYgPDwgIkphZyAjIiA8PCBtX2RldmljZU51bWJlciA8PCAiIGZpcm13YXJlICgiIDw8IG1fZmlybXdhcmVWZXJzaW9uCisgICAgICAgICAgPDwgIikgaXMgdG9vIG9sZCAobXVzdCBiZSBhdCBsZWFzdCB2ZXJzaW9uIDEwOCAiCisgICAgICAgICAgICAgIm9mIHRoZSBGSVJTVCBhcHByb3ZlZCBmaXJtd2FyZSkiOworICAgIH0gZWxzZSB7CisgICAgICBidWYgPDwgIkphZyAjIiA8PCBtX2RldmljZU51bWJlciA8PCAiIGZpcm13YXJlICgiIDw8IG1fZmlybXdhcmVWZXJzaW9uCisgICAgICAgICAgPDwgIikgaXMgbm90IEZJUlNUIGFwcHJvdmVkIChtdXN0IGJlIGF0IGxlYXN0ICIKKyAgICAgICAgICAgICAidmVyc2lvbiAxMDggb2YgdGhlIEZJUlNUIGFwcHJvdmVkIGZpcm13YXJlKSI7CisgICAgfQorICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEphZ3VhclZlcnNpb25FcnJvciwgYnVmLnN0cigpKTsKKyAgICByZXR1cm47CisgIH0KKworICBzd2l0Y2ggKG1fY29udHJvbE1vZGUpIHsKKyAgICBjYXNlIGtQZXJjZW50VmJ1czoKKyAgICBjYXNlIGtWb2x0YWdlOgorICAgICAgLy8gTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHJlcXVpcmVkLi4uIHN0YXJ0IGVuYWJsZWQuCisgICAgICBFbmFibGVDb250cm9sKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NBTkphZ3VhciwgbV9kZXZpY2VOdW1iZXIsCisgICAgICAgICAgICBtX2NvbnRyb2xNb2RlKTsKKyAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkQWN0dWF0b3IoIkNBTkphZ3VhciIsIG1fZGV2aWNlTnVtYmVyLCB0aGlzKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIENBTkphZ3VhciBkZXZpY2UuPGJyPgorICogQnkgZGVmYXVsdCB0aGUgZGV2aWNlIGlzIGNvbmZpZ3VyZWQgaW4gUGVyY2VudCBtb2RlLgorICogVGhlIGNvbnRyb2wgbW9kZSBjYW4gYmUgY2hhbmdlZCBieSBjYWxsaW5nIG9uZSBvZiB0aGUgY29udHJvbCBtb2RlcyBsaXN0ZWQKKyAqIGJlbG93LgorICoKKyAqIEBwYXJhbSBkZXZpY2VOdW1iZXIgVGhlIGFkZHJlc3Mgb2YgdGhlIEphZ3VhciBvbiB0aGUgQ0FOIGJ1cy4KKyAqIEBzZWUgQ0FOSmFndWFyI1NldEN1cnJlbnRNb2RlKGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRDdXJyZW50TW9kZShQb3RlbnRpb21ldGVyVGFnLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQorICogQHNlZSBDQU5KYWd1YXIjU2V0Q3VycmVudE1vZGUoRW5jb2RlclRhZywgaW50LCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQorICogQHNlZSBDQU5KYWd1YXIjU2V0Q3VycmVudE1vZGUoUXVhZEVuY29kZXJUYWcsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFBlcmNlbnRNb2RlKCkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFBlcmNlbnRNb2RlKFBvdGVudGlvbWV0ZXJUYWcpCisgKiBAc2VlIENBTkphZ3VhciNTZXRQZXJjZW50TW9kZShFbmNvZGVyVGFnLCBpbnQpCisgKiBAc2VlIENBTkphZ3VhciNTZXRQZXJjZW50TW9kZShRdWFkRW5jb2RlclRhZywgaW50KQorICogQHNlZSBDQU5KYWd1YXIjU2V0UG9zaXRpb25Nb2RlKFBvdGVudGlvbWV0ZXJUYWcsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRQb3NpdGlvbk1vZGUoUXVhZEVuY29kZXJUYWcsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFNwZWVkTW9kZShFbmNvZGVyVGFnLCBpbnQsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIENBTkphZ3VhciNTZXRTcGVlZE1vZGUoUXVhZEVuY29kZXJUYWcsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFZvbHRhZ2VNb2RlKCkKKyAqIEBzZWUgQ0FOSmFndWFyI1NldFZvbHRhZ2VNb2RlKFBvdGVudGlvbWV0ZXJUYWcpCisgKiBAc2VlIENBTkphZ3VhciNTZXRWb2x0YWdlTW9kZShFbmNvZGVyVGFnLCBpbnQpCisgKiBAc2VlIENBTkphZ3VhciNTZXRWb2x0YWdlTW9kZShRdWFkRW5jb2RlclRhZywgaW50KQorICovCitDQU5KYWd1YXI6OkNBTkphZ3Vhcih1aW50OF90IGRldmljZU51bWJlcikKKyAgICA6IG1fZGV2aWNlTnVtYmVyKGRldmljZU51bWJlcikgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CisgIGJ1ZiA8PCAiQ0FOSmFndWFyIGRldmljZSBudW1iZXIgIiA8PCBtX2RldmljZU51bWJlcjsKKyAgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KGFsbG9jYXRlZCwgNjMpOworCisgIGlmIChhbGxvY2F0ZWQtPkFsbG9jYXRlKG1fZGV2aWNlTnVtYmVyIC0gMSwgYnVmLnN0cigpKSA9PQorICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CisgICAgQ2xvbmVFcnJvcigqYWxsb2NhdGVkKTsKKyAgICByZXR1cm47CisgIH0KKworICBTZXRQZXJjZW50TW9kZSgpOworICBJbml0Q0FOSmFndWFyKCk7CisgIENvbmZpZ01heE91dHB1dFZvbHRhZ2Uoa0FwcHJveEJ1c1ZvbHRhZ2UpOworfQorCitDQU5KYWd1YXI6On5DQU5KYWd1YXIoKSB7CisgIGFsbG9jYXRlZC0+RnJlZShtX2RldmljZU51bWJlciAtIDEpOworCisgIGludDMyX3Qgc3RhdHVzOworCisgIC8vIERpc2FibGUgcGVyaW9kaWMgc2V0cG9pbnRzCisgIGlmIChtX2NvbnRyb2xNb2RlID09IGtQZXJjZW50VmJ1cykKKyAgICBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZSgKKyAgICAgICAgbV9kZXZpY2VOdW1iZXIgfCBMTV9BUElfVk9MVF9UX1NFVCwgbnVsbHB0ciwgMCwKKyAgICAgICAgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HLCAmc3RhdHVzKTsKKyAgZWxzZSBpZiAobV9jb250cm9sTW9kZSA9PSBrU3BlZWQpCisgICAgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoCisgICAgICAgIG1fZGV2aWNlTnVtYmVyIHwgTE1fQVBJX1NQRF9UX1NFVCwgbnVsbHB0ciwgMCwKKyAgICAgICAgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HLCAmc3RhdHVzKTsKKyAgZWxzZSBpZiAobV9jb250cm9sTW9kZSA9PSBrUG9zaXRpb24pCisgICAgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoCisgICAgICAgIG1fZGV2aWNlTnVtYmVyIHwgTE1fQVBJX1BPU19UX1NFVCwgbnVsbHB0ciwgMCwKKyAgICAgICAgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HLCAmc3RhdHVzKTsKKyAgZWxzZSBpZiAobV9jb250cm9sTW9kZSA9PSBrQ3VycmVudCkKKyAgICBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZSgKKyAgICAgICAgbV9kZXZpY2VOdW1iZXIgfCBMTV9BUElfSUNUUkxfVF9TRVQsIG51bGxwdHIsIDAsCisgICAgICAgIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORywgJnN0YXR1cyk7CisgIGVsc2UgaWYgKG1fY29udHJvbE1vZGUgPT0ga1ZvbHRhZ2UpCisgICAgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoCisgICAgICAgIG1fZGV2aWNlTnVtYmVyIHwgTE1fQVBJX1ZDT01QX1RfU0VULCBudWxscHRyLCAwLAorICAgICAgICBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcsICZzdGF0dXMpOworCisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgQ0FOIElEIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IKKyAqLwordWludDhfdCBDQU5KYWd1YXI6OmdldERldmljZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fZGV2aWNlTnVtYmVyOyB9CisKKy8qKgorICogU2V0cyB0aGUgb3V0cHV0IHNldC1wb2ludCB2YWx1ZS4KKyAqCisgKiBUaGUgc2NhbGUgYW5kIHRoZSB1bml0cyBkZXBlbmQgb24gdGhlIG1vZGUgdGhlIEphZ3VhciBpcyBpbi48YnI+CisgKiBJbiBwZXJjZW50VmJ1cyBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgZnJvbSAtMS4wIHRvIDEuMCAoc2FtZSBhcyBQV00KKyAqIEphZ3VhcikuPGJyPgorICogSW4gdm9sdGFnZSBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gdm9sdHMuIDxicj4KKyAqIEluIGN1cnJlbnQgTW9kZSwgdGhlIG91dHB1dFZhbHVlIGlzIGluIGFtcHMuIDxicj4KKyAqIEluIHNwZWVkIE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiByb3RhdGlvbnMvbWludXRlLjxicj4KKyAqIEluIHBvc2l0aW9uIE1vZGUsIHRoZSBvdXRwdXRWYWx1ZSBpcyBpbiByb3RhdGlvbnMuCisgKgorICogQHBhcmFtIG91dHB1dFZhbHVlIFRoZSBzZXQtcG9pbnQgdG8gc2VudCB0byB0aGUgbW90b3IgY29udHJvbGxlci4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVGhlIHVwZGF0ZSBncm91cCB0byBhZGQgdGhpcyBTZXQoKSB0bywgcGVuZGluZworICogVXBkYXRlU3luY0dyb3VwKCkuICBJZiAwLCB1cGRhdGUgaW1tZWRpYXRlbHkuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXQoZmxvYXQgb3V0cHV0VmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwKSB7CisgIHVpbnQzMl90IG1lc3NhZ2VJRDsKKyAgdWludDhfdCBkYXRhQnVmZmVyWzhdOworICB1aW50OF90IGRhdGFTaXplOworCisgIGlmIChtX3NhZmV0eUhlbHBlciAmJiAhbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKSAmJiBtX2NvbnRyb2xFbmFibGVkKSB7CisgICAgRW5hYmxlQ29udHJvbCgpOworICB9CisKKyAgaWYgKG1fY29udHJvbEVuYWJsZWQpIHsKKyAgICBzd2l0Y2ggKG1fY29udHJvbE1vZGUpIHsKKyAgICAgIGNhc2Uga1BlcmNlbnRWYnVzOiB7CisgICAgICAgIG1lc3NhZ2VJRCA9IExNX0FQSV9WT0xUX1RfU0VUOworICAgICAgICBpZiAob3V0cHV0VmFsdWUgPiAxLjApIG91dHB1dFZhbHVlID0gMS4wOworICAgICAgICBpZiAob3V0cHV0VmFsdWUgPCAtMS4wKSBvdXRwdXRWYWx1ZSA9IC0xLjA7CisgICAgICAgIGRhdGFTaXplID0gcGFja1BlcmNlbnRhZ2UoZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9pc0ludmVydGVkID8gLW91dHB1dFZhbHVlIDogb3V0cHV0VmFsdWUpKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIGtTcGVlZDogeworICAgICAgICBtZXNzYWdlSUQgPSBMTV9BUElfU1BEX1RfU0VUOworICAgICAgICBkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9pc0ludmVydGVkID8gLW91dHB1dFZhbHVlIDogb3V0cHV0VmFsdWUpKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIGtQb3NpdGlvbjogeworICAgICAgICBtZXNzYWdlSUQgPSBMTV9BUElfUE9TX1RfU0VUOworICAgICAgICBkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBvdXRwdXRWYWx1ZSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBrQ3VycmVudDogeworICAgICAgICBtZXNzYWdlSUQgPSBMTV9BUElfSUNUUkxfVF9TRVQ7CisgICAgICAgIGRhdGFTaXplID0gcGFja0ZYUDhfOChkYXRhQnVmZmVyLCBvdXRwdXRWYWx1ZSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBrVm9sdGFnZTogeworICAgICAgICBtZXNzYWdlSUQgPSBMTV9BUElfVkNPTVBfVF9TRVQ7CisgICAgICAgIGRhdGFTaXplID0KKyAgICAgICAgICAgIHBhY2tGWFA4XzgoZGF0YUJ1ZmZlciwgKG1faXNJbnZlcnRlZCA/IC1vdXRwdXRWYWx1ZSA6IG91dHB1dFZhbHVlKSk7CisgICAgICB9IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBKYWd1YXIgb25seSBzdXBwb3J0cyBDdXJyZW50LCBWb2x0YWdlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3NpdGlvbiwgU3BlZWQsIGFuZCBQZXJjZW50IChUaHJvdHRsZSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZXMuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN5bmNHcm91cCAhPSAwKSB7CisgICAgICBkYXRhQnVmZmVyW2RhdGFTaXplXSA9IHN5bmNHcm91cDsKKyAgICAgIGRhdGFTaXplKys7CisgICAgfQorCisgICAgc2VuZE1lc3NhZ2UobWVzc2FnZUlELCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSwga1NlbmRNZXNzYWdlUGVyaW9kKTsKKworICAgIGlmIChtX3NhZmV0eUhlbHBlcikgbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKKyAgfQorCisgIG1fdmFsdWUgPSBvdXRwdXRWYWx1ZTsKKworICB2ZXJpZnkoKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlY2VudGx5IHNldCBvdXRwdXRWYWx1ZSBzZXRwb2ludC4KKyAqCisgKiBUaGUgc2NhbGUgYW5kIHRoZSB1bml0cyBkZXBlbmQgb24gdGhlIG1vZGUgdGhlIEphZ3VhciBpcyBpbi48YnI+CisgKiBJbiBwZXJjZW50VmJ1cyBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgZnJvbSAtMS4wIHRvIDEuMCAoc2FtZSBhcyBQV00KKyAqIEphZ3VhcikuPGJyPgorICogSW4gdm9sdGFnZSBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gdm9sdHMuPGJyPgorICogSW4gY3VycmVudCBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gYW1wcy48YnI+CisgKiBJbiBzcGVlZCBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gcm90YXRpb25zL21pbnV0ZS48YnI+CisgKiBJbiBwb3NpdGlvbiBNb2RlLCB0aGUgb3V0cHV0VmFsdWUgaXMgaW4gcm90YXRpb25zLjxicj4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCBvdXRwdXRWYWx1ZSBzZXRwb2ludC4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXQoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKKy8qKgorKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyoKKyogQGRlcHJlY2F0ZWQgQ2FsbCB7QGxpbmsgI0Rpc2FibGVDb250cm9sKCl9IGluc3RlYWQuCisqLwordm9pZCBDQU5KYWd1YXI6OkRpc2FibGUoKSB7IERpc2FibGVDb250cm9sKCk7IH0KKworLyoqCisgKiBXcml0ZSBvdXQgdGhlIFBJRCB2YWx1ZSBhcyBzZWVuIGluIHRoZSBQSURPdXRwdXQgYmFzZSBvYmplY3QuCisgKgorICogQGRlcHJlY2F0ZWQgQ2FsbCBTZXQgaW5zdGVhZC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUGVyY2VudFZidXMgdmFsdWUgYXMgd2FzIGNvbXB1dGVkIGJ5IHRoZQorICogUElEQ29udHJvbGxlcgorICovCit2b2lkIENBTkphZ3Vhcjo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KSB7CisgIGlmIChtX2NvbnRyb2xNb2RlID09IGtQZXJjZW50VmJ1cykgeworICAgIFNldChvdXRwdXQpOworICB9IGVsc2UgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBJRCBvbmx5IHN1cHBvcnRlZCBpbiBQZXJjZW50VmJ1cyBtb2RlIik7CisgIH0KK30KKwordWludDhfdCBDQU5KYWd1YXI6OnBhY2tQZXJjZW50YWdlKHVpbnQ4X3QgKmJ1ZmZlciwgZG91YmxlIHZhbHVlKSB7CisgIGludDE2X3QgaW50VmFsdWUgPSAoaW50MTZfdCkodmFsdWUgKiAzMjc2Ny4wKTsKKyAgKigoaW50MTZfdCAqKWJ1ZmZlcikgPSBzd2FwMTYoaW50VmFsdWUpOworICByZXR1cm4gc2l6ZW9mKGludDE2X3QpOworfQorCit1aW50OF90IENBTkphZ3Vhcjo6cGFja0ZYUDhfOCh1aW50OF90ICpidWZmZXIsIGRvdWJsZSB2YWx1ZSkgeworICBpbnQxNl90IGludFZhbHVlID0gKGludDE2X3QpKHZhbHVlICogMjU2LjApOworICAqKChpbnQxNl90ICopYnVmZmVyKSA9IHN3YXAxNihpbnRWYWx1ZSk7CisgIHJldHVybiBzaXplb2YoaW50MTZfdCk7Cit9CisKK3VpbnQ4X3QgQ0FOSmFndWFyOjpwYWNrRlhQMTZfMTYodWludDhfdCAqYnVmZmVyLCBkb3VibGUgdmFsdWUpIHsKKyAgaW50MzJfdCBpbnRWYWx1ZSA9IChpbnQzMl90KSh2YWx1ZSAqIDY1NTM2LjApOworICAqKChpbnQzMl90ICopYnVmZmVyKSA9IHN3YXAzMihpbnRWYWx1ZSk7CisgIHJldHVybiBzaXplb2YoaW50MzJfdCk7Cit9CisKK3VpbnQ4X3QgQ0FOSmFndWFyOjpwYWNraW50MTZfdCh1aW50OF90ICpidWZmZXIsIGludDE2X3QgdmFsdWUpIHsKKyAgKigoaW50MTZfdCAqKWJ1ZmZlcikgPSBzd2FwMTYodmFsdWUpOworICByZXR1cm4gc2l6ZW9mKGludDE2X3QpOworfQorCit1aW50OF90IENBTkphZ3Vhcjo6cGFja2ludDMyX3QodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IHZhbHVlKSB7CisgICooKGludDMyX3QgKilidWZmZXIpID0gc3dhcDMyKHZhbHVlKTsKKyAgcmV0dXJuIHNpemVvZihpbnQzMl90KTsKK30KKworZG91YmxlIENBTkphZ3Vhcjo6dW5wYWNrUGVyY2VudGFnZSh1aW50OF90ICpidWZmZXIpIGNvbnN0IHsKKyAgaW50MTZfdCB2YWx1ZSA9ICooKGludDE2X3QgKilidWZmZXIpOworICB2YWx1ZSA9IHN3YXAxNih2YWx1ZSk7CisgIHJldHVybiB2YWx1ZSAvIDMyNzY3LjA7Cit9CisKK2RvdWJsZSBDQU5KYWd1YXI6OnVucGFja0ZYUDhfOCh1aW50OF90ICpidWZmZXIpIGNvbnN0IHsKKyAgaW50MTZfdCB2YWx1ZSA9ICooKGludDE2X3QgKilidWZmZXIpOworICB2YWx1ZSA9IHN3YXAxNih2YWx1ZSk7CisgIHJldHVybiB2YWx1ZSAvIDI1Ni4wOworfQorCitkb3VibGUgQ0FOSmFndWFyOjp1bnBhY2tGWFAxNl8xNih1aW50OF90ICpidWZmZXIpIGNvbnN0IHsKKyAgaW50MzJfdCB2YWx1ZSA9ICooKGludDMyX3QgKilidWZmZXIpOworICB2YWx1ZSA9IHN3YXAzMih2YWx1ZSk7CisgIHJldHVybiB2YWx1ZSAvIDY1NTM2LjA7Cit9CisKK2ludDE2X3QgQ0FOSmFndWFyOjp1bnBhY2tpbnQxNl90KHVpbnQ4X3QgKmJ1ZmZlcikgY29uc3QgeworICBpbnQxNl90IHZhbHVlID0gKigoaW50MTZfdCAqKWJ1ZmZlcik7CisgIHJldHVybiBzd2FwMTYodmFsdWUpOworfQorCitpbnQzMl90IENBTkphZ3Vhcjo6dW5wYWNraW50MzJfdCh1aW50OF90ICpidWZmZXIpIGNvbnN0IHsKKyAgaW50MzJfdCB2YWx1ZSA9ICooKGludDMyX3QgKilidWZmZXIpOworICByZXR1cm4gc3dhcDMyKHZhbHVlKTsKK30KKworLyoqCisgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgSmFndWFyLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlSUQgVGhlIG1lc3NhZ2VJRCB0byBiZSB1c2VkIG9uIHRoZSBDQU4gYnVzIChkZXZpY2UgbnVtYmVyIGlzCisgKiBhZGRlZCBpbnRlcm5hbGx5KQorICogQHBhcmFtIGRhdGEgVGhlIHVwIHRvIDggYnl0ZXMgb2YgZGF0YSB0byBiZSBzZW50IHdpdGggdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBkYXRhU2l6ZSBTcGVjaWZ5IGhvdyBtdWNoIG9mIHRoZSBkYXRhIGluICJkYXRhIiB0byBzZW5kCisgKiBAcGFyYW0gcGVyaW9kaWMgSWYgcG9zaXRpdmUsIHRlbGwgTmV0d29yayBDb21tdW5pY2F0aW9ucyB0byBzZW5kIHRoZSBtZXNzYWdlCisgKiAJZXZlcnkgInBlcmlvZCIgbWlsbGlzZWNvbmRzLgorICovCit2b2lkIENBTkphZ3Vhcjo6c2VuZE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kKSB7CisgIGludDMyX3QgbG9jYWxTdGF0dXMgPQorICAgICAgc2VuZE1lc3NhZ2VIZWxwZXIobWVzc2FnZUlEIHwgbV9kZXZpY2VOdW1iZXIsIGRhdGEsIGRhdGFTaXplLCBwZXJpb2QpOworCisgIGlmIChsb2NhbFN0YXR1cyA8IDApIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChsb2NhbFN0YXR1cywgInNlbmRNZXNzYWdlIik7CisgIH0KK30KKworLyoqCisgKiBSZXF1ZXN0IGEgbWVzc2FnZSBmcm9tIHRoZSBKYWd1YXIsIGJ1dCBkb24ndCB3YWl0IGZvciBpdCB0byBhcnJpdmUuCisgKgorICogQHBhcmFtIG1lc3NhZ2VJRCBUaGUgbWVzc2FnZSB0byByZXF1ZXN0CisgKiBAcGFyYW0gcGVyaW9kaWMgSWYgcG9zaXRpdmUsIHRlbGwgTmV0d29yayBDb21tdW5pY2F0aW9ucyB0byBzZW5kIHRoZSBtZXNzYWdlCisgKiAJZXZlcnkgInBlcmlvZCIgbWlsbGlzZWNvbmRzLgorICovCit2b2lkIENBTkphZ3Vhcjo6cmVxdWVzdE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCBpbnQzMl90IHBlcmlvZCkgeworICBzZW5kTWVzc2FnZUhlbHBlcihtZXNzYWdlSUQgfCBtX2RldmljZU51bWJlciwgbnVsbHB0ciwgMCwgcGVyaW9kKTsKK30KKworLyoqCisgKiBHZXQgYSBwcmV2aW91c2x5IHJlcXVlc3RlZCBtZXNzYWdlLgorICoKKyAqIEphZ3VhciBhbHdheXMgZ2VuZXJhdGVzIGEgbWVzc2FnZSB3aXRoIHRoZSBzYW1lIG1lc3NhZ2UgSUQgd2hlbiByZXBseWluZy4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZUlEIFRoZSBtZXNzYWdlSUQgdG8gcmVhZCBmcm9tIHRoZSBDQU4gYnVzIChkZXZpY2UgbnVtYmVyIGlzCisgKiBhZGRlZCBpbnRlcm5hbGx5KQorICogQHBhcmFtIGRhdGEgVGhlIHVwIHRvIDggYnl0ZXMgb2YgZGF0YSB0aGF0IHdhcyByZWNlaXZlZCB3aXRoIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZGF0YVNpemUgSW5kaWNhdGVzIGhvdyBtdWNoIGRhdGEgd2FzIHJlY2VpdmVkCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcyBmb3VuZC4gIE90aGVyd2lzZSwgbm8gbmV3IG1lc3NhZ2UgaXMKKyAqIGF2YWlsYWJsZS4KKyAqLworYm9vbCBDQU5KYWd1YXI6OmdldE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgKmRhdGFTaXplKSBjb25zdCB7CisgIHVpbnQzMl90IHRhcmdldGVkTWVzc2FnZUlEID0gbWVzc2FnZUlEIHwgbV9kZXZpY2VOdW1iZXI7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgdWludDMyX3QgdGltZVN0YW1wOworCisgIC8vIENhbGxlciBtYXkgaGF2ZSBzZXQgYml0MzEgZm9yIHJlbW90ZSBmcmFtZSB0cmFuc21pc3Npb24gc28gY2xlYXIgaW52YWxpZAorICAvLyBiaXRzWzMxLTI5XQorICB0YXJnZXRlZE1lc3NhZ2VJRCAmPSBDQU5fTVNHSURfRlVMTF9NOworCisgIC8vIEdldCB0aGUgZGF0YS4KKyAgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVjZWl2ZU1lc3NhZ2UoCisgICAgICAmdGFyZ2V0ZWRNZXNzYWdlSUQsIG1lc3NhZ2VNYXNrLCBkYXRhLCBkYXRhU2l6ZSwgJnRpbWVTdGFtcCwgJnN0YXR1cyk7CisKKyAgLy8gRG8gd2UgYWxyZWFkeSBoYXZlIHRoZSBtb3N0IHJlY2VudCB2YWx1ZT8KKyAgaWYgKHN0YXR1cyA9PSBFUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmQpCisgICAgcmV0dXJuIGZhbHNlOworICBlbHNlCisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCAicmVjZWl2ZU1lc3NhZ2UiKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBFbmFibGVzIHBlcmlvZGljIHN0YXR1cyB1cGRhdGVzIGZyb20gdGhlIEphZ3Vhci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OnNldHVwUGVyaW9kaWNTdGF0dXMoKSB7CisgIHVpbnQ4X3QgZGF0YVs4XTsKKyAgdWludDhfdCBkYXRhU2l6ZTsKKworICAvLyBNZXNzYWdlIDAgcmV0dXJucyBidXMgdm9sdGFnZSwgb3V0cHV0IHZvbHRhZ2UsIG91dHB1dCBjdXJyZW50LCBhbmQKKyAgLy8gdGVtcGVyYXR1cmUuCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtNZXNzYWdlMERhdGFbXSA9IHsKKyAgICAgIExNX1BTVEFUX1ZPTFRCVVNfQjAsIExNX1BTVEFUX1ZPTFRCVVNfQjEsIExNX1BTVEFUX1ZPTFRPVVRfQjAsCisgICAgICBMTV9QU1RBVF9WT0xUT1VUX0IxLCBMTV9QU1RBVF9DVVJSRU5UX0IwLCBMTV9QU1RBVF9DVVJSRU5UX0IxLAorICAgICAgTE1fUFNUQVRfVEVNUF9CMCwgICAgTE1fUFNUQVRfVEVNUF9CMX07CisKKyAgLy8gTWVzc2FnZSAxIHJldHVybnMgcG9zaXRpb24gYW5kIHNwZWVkCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtNZXNzYWdlMURhdGFbXSA9IHsKKyAgICAgIExNX1BTVEFUX1BPU19CMCwgTE1fUFNUQVRfUE9TX0IxLCBMTV9QU1RBVF9QT1NfQjIsIExNX1BTVEFUX1BPU19CMywKKyAgICAgIExNX1BTVEFUX1NQRF9CMCwgTE1fUFNUQVRfU1BEX0IxLCBMTV9QU1RBVF9TUERfQjIsIExNX1BTVEFUX1NQRF9CM307CisKKyAgLy8gTWVzc2FnZSAyIHJldHVybnMgbGltaXRzIGFuZCBmYXVsdHMKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01lc3NhZ2UyRGF0YVtdID0ge0xNX1BTVEFUX0xJTUlUX0NMUiwgTE1fUFNUQVRfRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTV9QU1RBVF9FTkR9OworCisgIGRhdGFTaXplID0gcGFja2ludDE2X3QoZGF0YSwga1NlbmRNZXNzYWdlUGVyaW9kKTsKKyAgc2VuZE1lc3NhZ2UoTE1fQVBJX1BTVEFUX1BFUl9FTl9TMCwgZGF0YSwgZGF0YVNpemUpOworICBzZW5kTWVzc2FnZShMTV9BUElfUFNUQVRfUEVSX0VOX1MxLCBkYXRhLCBkYXRhU2l6ZSk7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9QU1RBVF9QRVJfRU5fUzIsIGRhdGEsIGRhdGFTaXplKTsKKworICBkYXRhU2l6ZSA9IDg7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9QU1RBVF9DRkdfUzAsIGtNZXNzYWdlMERhdGEsIGRhdGFTaXplKTsKKyAgc2VuZE1lc3NhZ2UoTE1fQVBJX1BTVEFUX0NGR19TMSwga01lc3NhZ2UxRGF0YSwgZGF0YVNpemUpOworICBzZW5kTWVzc2FnZShMTV9BUElfUFNUQVRfQ0ZHX1MyLCBrTWVzc2FnZTJEYXRhLCBkYXRhU2l6ZSk7Cit9CisKKy8qKgorICogQ2hlY2sgZm9yIG5ldyBwZXJpb2RpYyBzdGF0dXMgdXBkYXRlcyBhbmQgdW5wYWNrIHRoZW0gaW50byBsb2NhbCB2YXJpYWJsZXMKKyAqLwordm9pZCBDQU5KYWd1YXI6OnVwZGF0ZVBlcmlvZGljU3RhdHVzKCkgY29uc3QgeworICB1aW50OF90IGRhdGFbOF07CisgIHVpbnQ4X3QgZGF0YVNpemU7CisKKyAgLy8gQ2hlY2sgaWYgYSBuZXcgYnVzIHZvbHRhZ2Uvb3V0cHV0IHZvbHRhZ2UvY3VycmVudC90ZW1wZXJhdHVyZSBtZXNzYWdlCisgIC8vIGhhcyBhcnJpdmVkIGFuZCB1bnBhY2sgdGhlIHZhbHVlcyBpbnRvIHRoZSBjYWNoZWQgbWVtYmVyIHZhcmlhYmxlcworICBpZiAoZ2V0TWVzc2FnZShMTV9BUElfUFNUQVRfREFUQV9TMCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YSwgJmRhdGFTaXplKSkgeworICAgIG1fbXV0ZXgubG9jaygpOworICAgIG1fYnVzVm9sdGFnZSA9IHVucGFja0ZYUDhfOChkYXRhKTsKKyAgICBtX291dHB1dFZvbHRhZ2UgPSB1bnBhY2tQZXJjZW50YWdlKGRhdGEgKyAyKSAqIG1fYnVzVm9sdGFnZTsKKyAgICBtX291dHB1dEN1cnJlbnQgPSB1bnBhY2tGWFA4XzgoZGF0YSArIDQpOworICAgIG1fdGVtcGVyYXR1cmUgPSB1bnBhY2tGWFA4XzgoZGF0YSArIDYpOworICAgIG1fbXV0ZXgudW5sb2NrKCk7CisKKyAgICBtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTAgPSB0cnVlOworICB9CisKKyAgLy8gQ2hlY2sgaWYgYSBuZXcgcG9zaXRpb24vc3BlZWQgbWVzc2FnZSBoYXMgYXJyaXZlZCBhbmQgZG8gdGhlIHNhbWUKKyAgaWYgKGdldE1lc3NhZ2UoTE1fQVBJX1BTVEFUX0RBVEFfUzEsIENBTl9NU0dJRF9GVUxMX00sIGRhdGEsICZkYXRhU2l6ZSkpIHsKKyAgICBtX211dGV4LmxvY2soKTsKKyAgICBtX3Bvc2l0aW9uID0gdW5wYWNrRlhQMTZfMTYoZGF0YSk7CisgICAgbV9zcGVlZCA9IHVucGFja0ZYUDE2XzE2KGRhdGEgKyA0KTsKKyAgICBtX211dGV4LnVubG9jaygpOworCisgICAgbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UxID0gdHJ1ZTsKKyAgfQorCisgIC8vIENoZWNrIGlmIGEgbmV3IGxpbWl0cy9mYXVsdHMgbWVzc2FnZSBoYXMgYXJyaXZlZCBhbmQgZG8gdGhlIHNhbWUKKyAgaWYgKGdldE1lc3NhZ2UoTE1fQVBJX1BTVEFUX0RBVEFfUzIsIENBTl9NU0dJRF9GVUxMX00sIGRhdGEsICZkYXRhU2l6ZSkpIHsKKyAgICBtX211dGV4LmxvY2soKTsKKyAgICBtX2xpbWl0cyA9IGRhdGFbMF07CisgICAgbV9mYXVsdHMgPSBkYXRhWzFdOworICAgIG1fbXV0ZXgudW5sb2NrKCk7CisKKyAgICBtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTIgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogQ2hlY2sgYWxsIHVudmVyaWZpZWQgcGFyYW1zIGFuZCBtYWtlIHN1cmUgdGhleSdyZSBlcXVhbCB0byB0aGVpciBsb2NhbAorICogY2FjaGVkIHZlcnNpb25zLiBJZiBhIHZhbHVlIGlzbid0IGF2YWlsYWJsZSwgaXQgZ2V0cyByZXF1ZXN0ZWQuICBJZiBhIHZhbHVlCisgKiBkb2Vzbid0IG1hdGNoIHVwLCBpdCBnZXRzIHNldCBhZ2Fpbi4KKyAqLwordm9pZCBDQU5KYWd1YXI6OnZlcmlmeSgpIHsKKyAgdWludDhfdCBkYXRhQnVmZmVyWzhdOworICB1aW50OF90IGRhdGFTaXplOworCisgIC8vIElmIHRoZSBKYWd1YXIgbG9zdCBwb3dlciwgZXZlcnl0aGluZyBzaG91bGQgYmUgY29uc2lkZXJlZCB1bnZlcmlmaWVkLgorICBpZiAoZ2V0TWVzc2FnZShMTV9BUElfU1RBVFVTX1BPV0VSLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKSB7CisgICAgYm9vbCBwb3dlckN5Y2xlZCA9IChib29sKWRhdGFCdWZmZXJbMF07CisKKyAgICBpZiAocG93ZXJDeWNsZWQpIHsKKyAgICAgIC8vIENsZWFyIHRoZSBwb3dlciBjeWNsZWQgYml0CisgICAgICBkYXRhQnVmZmVyWzBdID0gMTsKKyAgICAgIHNlbmRNZXNzYWdlKExNX0FQSV9TVEFUVVNfUE9XRVIsIGRhdGFCdWZmZXIsIHNpemVvZih1aW50OF90KSk7CisKKyAgICAgIC8vIE1hcmsgZXZlcnl0aGluZyBhcyB1bnZlcmlmaWVkCisgICAgICBtX2NvbnRyb2xNb2RlVmVyaWZpZWQgPSBmYWxzZTsKKyAgICAgIG1fc3BlZWRSZWZWZXJpZmllZCA9IGZhbHNlOworICAgICAgbV9wb3NSZWZWZXJpZmllZCA9IGZhbHNlOworICAgICAgbV9uZXV0cmFsTW9kZVZlcmlmaWVkID0gZmFsc2U7CisgICAgICBtX2VuY29kZXJDb2Rlc1BlclJldlZlcmlmaWVkID0gZmFsc2U7CisgICAgICBtX3BvdGVudGlvbWV0ZXJUdXJuc1ZlcmlmaWVkID0gZmFsc2U7CisgICAgICBtX2ZvcndhcmRMaW1pdFZlcmlmaWVkID0gZmFsc2U7CisgICAgICBtX3JldmVyc2VMaW1pdFZlcmlmaWVkID0gZmFsc2U7CisgICAgICBtX2xpbWl0TW9kZVZlcmlmaWVkID0gZmFsc2U7CisgICAgICBtX21heE91dHB1dFZvbHRhZ2VWZXJpZmllZCA9IGZhbHNlOworICAgICAgbV9mYXVsdFRpbWVWZXJpZmllZCA9IGZhbHNlOworCisgICAgICBpZiAobV9jb250cm9sTW9kZSA9PSBrUGVyY2VudFZidXMgfHwgbV9jb250cm9sTW9kZSA9PSBrVm9sdGFnZSkgeworICAgICAgICBtX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX3BWZXJpZmllZCA9IGZhbHNlOworICAgICAgICBtX2lWZXJpZmllZCA9IGZhbHNlOworICAgICAgICBtX2RWZXJpZmllZCA9IGZhbHNlOworICAgICAgfQorCisgICAgICAvLyBWZXJpZnkgcGVyaW9kaWMgc3RhdHVzIG1lc3NhZ2VzIGFnYWluCisgICAgICBtX3JlY2VpdmVkU3RhdHVzTWVzc2FnZTAgPSBmYWxzZTsKKyAgICAgIG1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMSA9IGZhbHNlOworICAgICAgbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UyID0gZmFsc2U7CisKKyAgICAgIC8vIFJlbW92ZSBhbnkgb2xkIHZhbHVlcyBmcm9tIG5ldGNvbW1zLiBPdGhlcndpc2UsIHBhcmFtZXRlcnMgYXJlCisgICAgICAvLyBpbmNvcnJlY3RseSBtYXJrZWQgYXMgdmVyaWZpZWQgYmFzZWQgb24gc3RhbGUgbWVzc2FnZXMuCisgICAgICBnZXRNZXNzYWdlKExNX0FQSV9TUERfUkVGLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworICAgICAgZ2V0TWVzc2FnZShMTV9BUElfUE9TX1JFRiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKyAgICAgIGdldE1lc3NhZ2UoTE1fQVBJX1NQRF9QQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKyAgICAgIGdldE1lc3NhZ2UoTE1fQVBJX1BPU19QQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKyAgICAgIGdldE1lc3NhZ2UoTE1fQVBJX0lDVFJMX1BDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworICAgICAgZ2V0TWVzc2FnZShMTV9BUElfU1BEX0lDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworICAgICAgZ2V0TWVzc2FnZShMTV9BUElfUE9TX0lDLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworICAgICAgZ2V0TWVzc2FnZShMTV9BUElfSUNUUkxfSUMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisgICAgICBnZXRNZXNzYWdlKExNX0FQSV9TUERfREMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisgICAgICBnZXRNZXNzYWdlKExNX0FQSV9QT1NfREMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisgICAgICBnZXRNZXNzYWdlKExNX0FQSV9JQ1RSTF9EQywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKyAgICAgIGdldE1lc3NhZ2UoTE1fQVBJX0NGR19CUkFLRV9DT0FTVCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICAgIGdldE1lc3NhZ2UoTE1fQVBJX0NGR19FTkNfTElORVMsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisgICAgICBnZXRNZXNzYWdlKExNX0FQSV9DRkdfUE9UX1RVUk5TLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworICAgICAgZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX01PREUsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgICBnZXRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfRldELCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpOworICAgICAgZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX0xJTUlUX1JFViwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKyAgICAgIGdldE1lc3NhZ2UoTE1fQVBJX0NGR19NQVhfVk9VVCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKTsKKyAgICAgIGdldE1lc3NhZ2UoTE1fQVBJX1ZPTFRfU0VUX1JBTVAsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSk7CisgICAgICBnZXRNZXNzYWdlKExNX0FQSV9WQ09NUF9DT01QX1JBTVAsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgICBnZXRNZXNzYWdlKExNX0FQSV9DRkdfRkFVTFRfVElNRSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX1NUQVRVU19QT1dFUik7CisgIH0KKworICAvLyBWZXJpZnkgdGhhdCBhbnkgcmVjZW50bHkgc2V0IHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QKKyAgaWYgKCFtX2NvbnRyb2xNb2RlVmVyaWZpZWQgJiYgbV9jb250cm9sRW5hYmxlZCkgeworICAgIGlmIChnZXRNZXNzYWdlKExNX0FQSV9TVEFUVVNfQ01PREUsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkgeworICAgICAgQ29udHJvbE1vZGUgbW9kZSA9IChDb250cm9sTW9kZSlkYXRhQnVmZmVyWzBdOworCisgICAgICBpZiAobV9jb250cm9sTW9kZSA9PSBtb2RlKQorICAgICAgICBtX2NvbnRyb2xNb2RlVmVyaWZpZWQgPSB0cnVlOworICAgICAgZWxzZQorICAgICAgICAvLyBFbmFibGUgY29udHJvbCBhZ2FpbiB0byByZXNlbmQgdGhlIGNvbnRyb2wgbW9kZQorICAgICAgICBFbmFibGVDb250cm9sKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorICAgICAgcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX1NUQVRVU19DTU9ERSk7CisgICAgfQorICB9CisKKyAgaWYgKCFtX3NwZWVkUmVmVmVyaWZpZWQpIHsKKyAgICBpZiAoZ2V0TWVzc2FnZShMTV9BUElfU1BEX1JFRiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkgeworICAgICAgdWludDhfdCBzcGVlZFJlZiA9IGRhdGFCdWZmZXJbMF07CisKKyAgICAgIGlmIChtX3NwZWVkUmVmZXJlbmNlID09IHNwZWVkUmVmKQorICAgICAgICBtX3NwZWVkUmVmVmVyaWZpZWQgPSB0cnVlOworICAgICAgZWxzZQorICAgICAgICAvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisgICAgICAgIFNldFNwZWVkUmVmZXJlbmNlKG1fc3BlZWRSZWZlcmVuY2UpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKyAgICAgIHJlcXVlc3RNZXNzYWdlKExNX0FQSV9TUERfUkVGKTsKKyAgICB9CisgIH0KKworICBpZiAoIW1fcG9zUmVmVmVyaWZpZWQpIHsKKyAgICBpZiAoZ2V0TWVzc2FnZShMTV9BUElfUE9TX1JFRiwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkgeworICAgICAgdWludDhfdCBwb3NSZWYgPSBkYXRhQnVmZmVyWzBdOworCisgICAgICBpZiAobV9wb3NpdGlvblJlZmVyZW5jZSA9PSBwb3NSZWYpCisgICAgICAgIG1fcG9zUmVmVmVyaWZpZWQgPSB0cnVlOworICAgICAgZWxzZQorICAgICAgICAvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisgICAgICAgIFNldFBvc2l0aW9uUmVmZXJlbmNlKG1fcG9zaXRpb25SZWZlcmVuY2UpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKyAgICAgIHJlcXVlc3RNZXNzYWdlKExNX0FQSV9QT1NfUkVGKTsKKyAgICB9CisgIH0KKworICBpZiAoIW1fcFZlcmlmaWVkKSB7CisgICAgdWludDMyX3QgbWVzc2FnZSA9IDA7CisKKyAgICBpZiAobV9jb250cm9sTW9kZSA9PSBrU3BlZWQpCisgICAgICBtZXNzYWdlID0gTE1fQVBJX1NQRF9QQzsKKyAgICBlbHNlIGlmIChtX2NvbnRyb2xNb2RlID09IGtQb3NpdGlvbikKKyAgICAgIG1lc3NhZ2UgPSBMTV9BUElfUE9TX1BDOworICAgIGVsc2UgaWYgKG1fY29udHJvbE1vZGUgPT0ga0N1cnJlbnQpCisgICAgICBtZXNzYWdlID0gTE1fQVBJX0lDVFJMX1BDOworICAgIGVsc2UgeworICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCisgICAgICAgICAgSW5jb21wYXRpYmxlTW9kZSwKKyAgICAgICAgICAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChnZXRNZXNzYWdlKG1lc3NhZ2UsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsICZkYXRhU2l6ZSkpIHsKKyAgICAgIGRvdWJsZSBwID0gdW5wYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlcik7CisKKyAgICAgIGlmIChGWFAxNl9FUShtX3AsIHApKQorICAgICAgICBtX3BWZXJpZmllZCA9IHRydWU7CisgICAgICBlbHNlCisgICAgICAgIC8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKyAgICAgICAgU2V0UChtX3ApOworICAgIH0gZWxzZSB7CisgICAgICAvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKyAgICAgIHJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIGlmICghbV9pVmVyaWZpZWQpIHsKKyAgICB1aW50MzJfdCBtZXNzYWdlID0gMDsKKworICAgIGlmIChtX2NvbnRyb2xNb2RlID09IGtTcGVlZCkKKyAgICAgIG1lc3NhZ2UgPSBMTV9BUElfU1BEX0lDOworICAgIGVsc2UgaWYgKG1fY29udHJvbE1vZGUgPT0ga1Bvc2l0aW9uKQorICAgICAgbWVzc2FnZSA9IExNX0FQSV9QT1NfSUM7CisgICAgZWxzZSBpZiAobV9jb250cm9sTW9kZSA9PSBrQ3VycmVudCkKKyAgICAgIG1lc3NhZ2UgPSBMTV9BUElfSUNUUkxfSUM7CisgICAgZWxzZSB7CisgICAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKKyAgICAgICAgICBJbmNvbXBhdGlibGVNb2RlLAorICAgICAgICAgICJQSUQgY29uc3RhbnRzIG9ubHkgYXBwbHkgaW4gU3BlZWQsIFBvc2l0aW9uLCBhbmQgQ3VycmVudCBtb2RlIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdldE1lc3NhZ2UobWVzc2FnZSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwgJmRhdGFTaXplKSkgeworICAgICAgZG91YmxlIGkgPSB1bnBhY2tGWFAxNl8xNihkYXRhQnVmZmVyKTsKKworICAgICAgaWYgKEZYUDE2X0VRKG1faSwgaSkpCisgICAgICAgIG1faVZlcmlmaWVkID0gdHJ1ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorICAgICAgICBTZXRJKG1faSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorICAgICAgcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgaWYgKCFtX2RWZXJpZmllZCkgeworICAgIHVpbnQzMl90IG1lc3NhZ2UgPSAwOworCisgICAgaWYgKG1fY29udHJvbE1vZGUgPT0ga1NwZWVkKQorICAgICAgbWVzc2FnZSA9IExNX0FQSV9TUERfREM7CisgICAgZWxzZSBpZiAobV9jb250cm9sTW9kZSA9PSBrUG9zaXRpb24pCisgICAgICBtZXNzYWdlID0gTE1fQVBJX1BPU19EQzsKKyAgICBlbHNlIGlmIChtX2NvbnRyb2xNb2RlID09IGtDdXJyZW50KQorICAgICAgbWVzc2FnZSA9IExNX0FQSV9JQ1RSTF9EQzsKKyAgICBlbHNlIHsKKyAgICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAorICAgICAgICAgIEluY29tcGF0aWJsZU1vZGUsCisgICAgICAgICAgIlBJRCBjb25zdGFudHMgb25seSBhcHBseSBpbiBTcGVlZCwgUG9zaXRpb24sIGFuZCBDdXJyZW50IG1vZGUiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZ2V0TWVzc2FnZShtZXNzYWdlLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLCAmZGF0YVNpemUpKSB7CisgICAgICBkb3VibGUgZCA9IHVucGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIpOworCisgICAgICBpZiAoRlhQMTZfRVEobV9kLCBkKSkKKyAgICAgICAgbV9kVmVyaWZpZWQgPSB0cnVlOworICAgICAgZWxzZQorICAgICAgICAvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisgICAgICAgIFNldEQobV9kKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisgICAgICByZXF1ZXN0TWVzc2FnZShtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICBpZiAoIW1fbmV1dHJhbE1vZGVWZXJpZmllZCkgeworICAgIGlmIChnZXRNZXNzYWdlKExNX0FQSV9DRkdfQlJBS0VfQ09BU1QsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkgeworICAgICAgTmV1dHJhbE1vZGUgbW9kZSA9IChOZXV0cmFsTW9kZSlkYXRhQnVmZmVyWzBdOworCisgICAgICBpZiAobW9kZSA9PSBtX25ldXRyYWxNb2RlKQorICAgICAgICBtX25ldXRyYWxNb2RlVmVyaWZpZWQgPSB0cnVlOworICAgICAgZWxzZQorICAgICAgICAvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisgICAgICAgIENvbmZpZ05ldXRyYWxNb2RlKG1fbmV1dHJhbE1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKyAgICAgIHJlcXVlc3RNZXNzYWdlKExNX0FQSV9DRkdfQlJBS0VfQ09BU1QpOworICAgIH0KKyAgfQorCisgIGlmICghbV9lbmNvZGVyQ29kZXNQZXJSZXZWZXJpZmllZCkgeworICAgIGlmIChnZXRNZXNzYWdlKExNX0FQSV9DRkdfRU5DX0xJTkVTLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpIHsKKyAgICAgIHVpbnQxNl90IGNvZGVzID0gdW5wYWNraW50MTZfdChkYXRhQnVmZmVyKTsKKworICAgICAgaWYgKGNvZGVzID09IG1fZW5jb2RlckNvZGVzUGVyUmV2KQorICAgICAgICBtX2VuY29kZXJDb2Rlc1BlclJldlZlcmlmaWVkID0gdHJ1ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorICAgICAgICBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYobV9lbmNvZGVyQ29kZXNQZXJSZXYpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKyAgICAgIHJlcXVlc3RNZXNzYWdlKExNX0FQSV9DRkdfRU5DX0xJTkVTKTsKKyAgICB9CisgIH0KKworICBpZiAoIW1fcG90ZW50aW9tZXRlclR1cm5zVmVyaWZpZWQpIHsKKyAgICBpZiAoZ2V0TWVzc2FnZShMTV9BUElfQ0ZHX1BPVF9UVVJOUywgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKSB7CisgICAgICB1aW50MTZfdCB0dXJucyA9IHVucGFja2ludDE2X3QoZGF0YUJ1ZmZlcik7CisKKyAgICAgIGlmICh0dXJucyA9PSBtX3BvdGVudGlvbWV0ZXJUdXJucykKKyAgICAgICAgbV9wb3RlbnRpb21ldGVyVHVybnNWZXJpZmllZCA9IHRydWU7CisgICAgICBlbHNlCisgICAgICAgIC8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKyAgICAgICAgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zKG1fcG90ZW50aW9tZXRlclR1cm5zKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisgICAgICByZXF1ZXN0TWVzc2FnZShMTV9BUElfQ0ZHX1BPVF9UVVJOUyk7CisgICAgfQorICB9CisKKyAgaWYgKCFtX2xpbWl0TW9kZVZlcmlmaWVkKSB7CisgICAgaWYgKGdldE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9NT0RFLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpIHsKKyAgICAgIExpbWl0TW9kZSBtb2RlID0gKExpbWl0TW9kZSlkYXRhQnVmZmVyWzBdOworCisgICAgICBpZiAobW9kZSA9PSBtX2xpbWl0TW9kZSkKKyAgICAgICAgbV9saW1pdE1vZGVWZXJpZmllZCA9IHRydWU7CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorICAgICAgICBDb25maWdMaW1pdE1vZGUobV9saW1pdE1vZGUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKyAgICAgIHJlcXVlc3RNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfTU9ERSk7CisgICAgfQorICB9CisKKyAgaWYgKCFtX2ZvcndhcmRMaW1pdFZlcmlmaWVkKSB7CisgICAgaWYgKGdldE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9GV0QsIENBTl9NU0dJRF9GVUxMX00sIGRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkgeworICAgICAgZG91YmxlIGxpbWl0ID0gdW5wYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlcik7CisKKyAgICAgIGlmIChGWFAxNl9FUShsaW1pdCwgbV9mb3J3YXJkTGltaXQpKQorICAgICAgICBtX2ZvcndhcmRMaW1pdFZlcmlmaWVkID0gdHJ1ZTsKKyAgICAgIGVsc2UgeworICAgICAgICAvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisgICAgICAgIENvbmZpZ0ZvcndhcmRMaW1pdChtX2ZvcndhcmRMaW1pdCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorICAgICAgcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9GV0QpOworICAgIH0KKyAgfQorCisgIGlmICghbV9yZXZlcnNlTGltaXRWZXJpZmllZCkgeworICAgIGlmIChnZXRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfUkVWLCBDQU5fTVNHSURfRlVMTF9NLCBkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpIHsKKyAgICAgIGRvdWJsZSBsaW1pdCA9IHVucGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIpOworCisgICAgICBpZiAoRlhQMTZfRVEobGltaXQsIG1fcmV2ZXJzZUxpbWl0KSkKKyAgICAgICAgbV9yZXZlcnNlTGltaXRWZXJpZmllZCA9IHRydWU7CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorICAgICAgICBDb25maWdSZXZlcnNlTGltaXQobV9yZXZlcnNlTGltaXQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKyAgICAgIHJlcXVlc3RNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfUkVWKTsKKyAgICB9CisgIH0KKworICBpZiAoIW1fbWF4T3V0cHV0Vm9sdGFnZVZlcmlmaWVkKSB7CisgICAgaWYgKGdldE1lc3NhZ2UoTE1fQVBJX0NGR19NQVhfVk9VVCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKSB7CisgICAgICBkb3VibGUgdm9sdGFnZSA9IHVucGFja0ZYUDhfOChkYXRhQnVmZmVyKTsKKworICAgICAgLy8gVGhlIHJldHVybmVkIG1heCBvdXRwdXQgdm9sdGFnZSBpcyBzb21ldGltZXMgc2xpZ2h0bHkgaGlnaGVyIG9yCisgICAgICAvLyBsb3dlciB0aGFuIHdoYXQgd2FzIHNlbnQuICBUaGlzIHNob3VsZCBub3QgdHJpZ2dlciByZXNlbmRpbmcKKyAgICAgIC8vIHRoZSBtZXNzYWdlLgorICAgICAgaWYgKHN0ZDo6YWJzKHZvbHRhZ2UgLSBtX21heE91dHB1dFZvbHRhZ2UpIDwgMC4xKQorICAgICAgICBtX21heE91dHB1dFZvbHRhZ2VWZXJpZmllZCA9IHRydWU7CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gSXQncyB3cm9uZyAtIHNldCBpdCBhZ2FpbgorICAgICAgICBDb25maWdNYXhPdXRwdXRWb2x0YWdlKG1fbWF4T3V0cHV0Vm9sdGFnZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorICAgICAgcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19NQVhfVk9VVCk7CisgICAgfQorICB9CisKKyAgaWYgKCFtX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkKSB7CisgICAgaWYgKG1fY29udHJvbE1vZGUgPT0ga1BlcmNlbnRWYnVzKSB7CisgICAgICBpZiAoZ2V0TWVzc2FnZShMTV9BUElfVk9MVF9TRVRfUkFNUCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpIHsKKyAgICAgICAgZG91YmxlIHJhdGUgPSB1bnBhY2tQZXJjZW50YWdlKGRhdGFCdWZmZXIpOworCisgICAgICAgIGlmIChGWFAxNl9FUShyYXRlLCBtX3ZvbHRhZ2VSYW1wUmF0ZSkpCisgICAgICAgICAgbV92b2x0YWdlUmFtcFJhdGVWZXJpZmllZCA9IHRydWU7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIEl0J3Mgd3JvbmcgLSBzZXQgaXQgYWdhaW4KKyAgICAgICAgICBTZXRWb2x0YWdlUmFtcFJhdGUobV92b2x0YWdlUmFtcFJhdGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBWZXJpZmljYXRpb24gaXMgbmVlZGVkIGJ1dCBub3QgYXZhaWxhYmxlIC0gcmVxdWVzdCBpdCBhZ2Fpbi4KKyAgICAgICAgcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX1ZPTFRfU0VUX1JBTVApOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9jb250cm9sTW9kZSA9PSBrVm9sdGFnZSkgeworICAgICAgaWYgKGdldE1lc3NhZ2UoTE1fQVBJX1ZDT01QX0NPTVBfUkFNUCwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpIHsKKyAgICAgICAgZG91YmxlIHJhdGUgPSB1bnBhY2tGWFA4XzgoZGF0YUJ1ZmZlcik7CisKKyAgICAgICAgaWYgKEZYUDhfRVEocmF0ZSwgbV92b2x0YWdlUmFtcFJhdGUpKQorICAgICAgICAgIG1fdm9sdGFnZVJhbXBSYXRlVmVyaWZpZWQgPSB0cnVlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisgICAgICAgICAgU2V0Vm9sdGFnZVJhbXBSYXRlKG1fdm9sdGFnZVJhbXBSYXRlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVmVyaWZpY2F0aW9uIGlzIG5lZWRlZCBidXQgbm90IGF2YWlsYWJsZSAtIHJlcXVlc3QgaXQgYWdhaW4uCisgICAgICAgIHJlcXVlc3RNZXNzYWdlKExNX0FQSV9WQ09NUF9DT01QX1JBTVApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghbV9mYXVsdFRpbWVWZXJpZmllZCkgeworICAgIGlmIChnZXRNZXNzYWdlKExNX0FQSV9DRkdfRkFVTFRfVElNRSwgQ0FOX01TR0lEX0ZVTExfTSwgZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKSB7CisgICAgICB1aW50MTZfdCBmYXVsdFRpbWUgPSB1bnBhY2tpbnQxNl90KGRhdGFCdWZmZXIpOworCisgICAgICBpZiAoKHVpbnQxNl90KShtX2ZhdWx0VGltZSAqIDEwMDAuMCkgPT0gZmF1bHRUaW1lKQorICAgICAgICBtX2ZhdWx0VGltZVZlcmlmaWVkID0gdHJ1ZTsKKyAgICAgIGVsc2UgeworICAgICAgICAvLyBJdCdzIHdyb25nIC0gc2V0IGl0IGFnYWluCisgICAgICAgIENvbmZpZ0ZhdWx0VGltZShtX2ZhdWx0VGltZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFZlcmlmaWNhdGlvbiBpcyBuZWVkZWQgYnV0IG5vdCBhdmFpbGFibGUgLSByZXF1ZXN0IGl0IGFnYWluLgorICAgICAgcmVxdWVzdE1lc3NhZ2UoTE1fQVBJX0NGR19GQVVMVF9USU1FKTsKKyAgICB9CisgIH0KKworICBpZiAoIW1fcmVjZWl2ZWRTdGF0dXNNZXNzYWdlMCB8fCAhbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UxIHx8CisgICAgICAhbV9yZWNlaXZlZFN0YXR1c01lc3NhZ2UyKSB7CisgICAgLy8gSWYgdGhlIHBlcmlvZGljIHN0YXR1cyBtZXNzYWdlcyBoYXZlbid0IGJlZW4gdmVyaWZpZWQgYXMgcmVjZWl2ZWQsCisgICAgLy8gcmVxdWVzdCBwZXJpb2RpYyBzdGF0dXMgbWVzc2FnZXMgYWdhaW4gYW5kIGF0dGVtcHQgdG8gdW5wYWNrIGFueQorICAgIC8vIGF2YWlsYWJsZSBvbmVzLgorICAgIHNldHVwUGVyaW9kaWNTdGF0dXMoKTsKKyAgICBHZXRUZW1wZXJhdHVyZSgpOworICAgIEdldFBvc2l0aW9uKCk7CisgICAgR2V0RmF1bHRzKCk7CisgIH0KK30KKworLyoqCisgKiBTZXQgdGhlIHJlZmVyZW5jZSBzb3VyY2UgZGV2aWNlIGZvciBzcGVlZCBjb250cm9sbGVyIG1vZGUuCisgKgorICogQ2hvb3NlIGVuY29kZXIgYXMgdGhlIHNvdXJjZSBvZiBzcGVlZCBmZWVkYmFjayB3aGVuIGluIHNwZWVkIGNvbnRyb2wgbW9kZS4KKyAqCisgKiBAcGFyYW0gcmVmZXJlbmNlIFNwZWNpZnkgYSBzcGVlZCByZWZlcmVuY2UuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRTcGVlZFJlZmVyZW5jZSh1aW50OF90IHJlZmVyZW5jZSkgeworICB1aW50OF90IGRhdGFCdWZmZXJbOF07CisKKyAgLy8gU2VuZCB0aGUgc3BlZWQgcmVmZXJlbmNlIHBhcmFtZXRlcgorICBkYXRhQnVmZmVyWzBdID0gcmVmZXJlbmNlOworICBzZW5kTWVzc2FnZShMTV9BUElfU1BEX1JFRiwgZGF0YUJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpKTsKKworICBtX3NwZWVkUmVmZXJlbmNlID0gcmVmZXJlbmNlOworICBtX3NwZWVkUmVmVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlZmVyZW5jZSBzb3VyY2UgZGV2aWNlIGZvciBzcGVlZCBjb250cm9sbGVyIG1vZGUuCisgKgorICogQHJldHVybiBBIHNwZWVkIHJlZmVyZW5jZSBpbmRpY2F0aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVmZXJlbmNlIGRldmljZQorICogZm9yIHNwZWVkIGNvbnRyb2xsZXIgbW9kZS4KKyAqLwordWludDhfdCBDQU5KYWd1YXI6OkdldFNwZWVkUmVmZXJlbmNlKCkgY29uc3QgeyByZXR1cm4gbV9zcGVlZFJlZmVyZW5jZTsgfQorCisvKioKKyAqIFNldCB0aGUgcmVmZXJlbmNlIHNvdXJjZSBkZXZpY2UgZm9yIHBvc2l0aW9uIGNvbnRyb2xsZXIgbW9kZS4KKyAqCisgKiBDaG9vc2UgYmV0d2VlbiB1c2luZyBhbmQgZW5jb2RlciBhbmQgdXNpbmcgYSBwb3RlbnRpb21ldGVyCisgKiBhcyB0aGUgc291cmNlIG9mIHBvc2l0aW9uIGZlZWRiYWNrIHdoZW4gaW4gcG9zaXRpb24gY29udHJvbCBtb2RlLgorICoKKyAqIEBwYXJhbSByZWZlcmVuY2UgU3BlY2lmeSBhIFBvc2l0aW9uUmVmZXJlbmNlLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0UG9zaXRpb25SZWZlcmVuY2UodWludDhfdCByZWZlcmVuY2UpIHsKKyAgdWludDhfdCBkYXRhQnVmZmVyWzhdOworCisgIC8vIFNlbmQgdGhlIHBvc2l0aW9uIHJlZmVyZW5jZSBwYXJhbWV0ZXIKKyAgZGF0YUJ1ZmZlclswXSA9IHJlZmVyZW5jZTsKKyAgc2VuZE1lc3NhZ2UoTE1fQVBJX1BPU19SRUYsIGRhdGFCdWZmZXIsIHNpemVvZih1aW50OF90KSk7CisKKyAgbV9wb3NpdGlvblJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKKyAgbV9wb3NSZWZWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIEdldCB0aGUgcmVmZXJlbmNlIHNvdXJjZSBkZXZpY2UgZm9yIHBvc2l0aW9uIGNvbnRyb2xsZXIgbW9kZS4KKyAqCisgKiBAcmV0dXJuIEEgUG9zaXRpb25SZWZlcmVuY2UgaW5kaWNhdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlZmVyZW5jZQorICogZGV2aWNlIGZvciBwb3NpdGlvbiBjb250cm9sbGVyIG1vZGUuCisgKi8KK3VpbnQ4X3QgQ0FOSmFndWFyOjpHZXRQb3NpdGlvblJlZmVyZW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb25SZWZlcmVuY2U7IH0KKworLyoqCisgKiBTZXQgdGhlIFAsIEksIGFuZCBEIGNvbnN0YW50cyBmb3IgdGhlIGNsb3NlZCBsb29wIG1vZGVzLgorICoKKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpIHsKKyAgU2V0UChwKTsKKyAgU2V0SShpKTsKKyAgU2V0RChkKTsKK30KKworLyoqCisgKiBTZXQgdGhlIFAgY29uc3RhbnQgZm9yIHRoZSBjbG9zZWQgbG9vcCBtb2Rlcy4KKyAqCisgKiBAcGFyYW0gcCBUaGUgcHJvcG9ydGlvbmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0UChkb3VibGUgcCkgeworICB1aW50OF90IGRhdGFCdWZmZXJbOF07CisgIHVpbnQ4X3QgZGF0YVNpemU7CisKKyAgc3dpdGNoIChtX2NvbnRyb2xNb2RlKSB7CisgICAgY2FzZSBrUGVyY2VudFZidXM6CisgICAgY2FzZSBrVm9sdGFnZToKKyAgICBjYXNlIGtGb2xsb3dlcjoKKyAgICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAorICAgICAgICAgIEluY29tcGF0aWJsZU1vZGUsCisgICAgICAgICAgIlBJRCBjb25zdGFudHMgb25seSBhcHBseSBpbiBTcGVlZCwgUG9zaXRpb24sIGFuZCBDdXJyZW50IG1vZGUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1NwZWVkOgorICAgICAgZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgcCk7CisgICAgICBzZW5kTWVzc2FnZShMTV9BUElfU1BEX1BDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtQb3NpdGlvbjoKKyAgICAgIGRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIHApOworICAgICAgc2VuZE1lc3NhZ2UoTE1fQVBJX1BPU19QQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ3VycmVudDoKKyAgICAgIGRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIHApOworICAgICAgc2VuZE1lc3NhZ2UoTE1fQVBJX0lDVFJMX1BDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisgICAgICBicmVhazsKKyAgfQorCisgIG1fcCA9IHA7CisgIG1fcFZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogU2V0IHRoZSBJIGNvbnN0YW50IGZvciB0aGUgY2xvc2VkIGxvb3AgbW9kZXMuCisgKgorICogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0SShkb3VibGUgaSkgeworICB1aW50OF90IGRhdGFCdWZmZXJbOF07CisgIHVpbnQ4X3QgZGF0YVNpemU7CisKKyAgc3dpdGNoIChtX2NvbnRyb2xNb2RlKSB7CisgICAgY2FzZSBrUGVyY2VudFZidXM6CisgICAgY2FzZSBrVm9sdGFnZToKKyAgICBjYXNlIGtGb2xsb3dlcjoKKyAgICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAorICAgICAgICAgIEluY29tcGF0aWJsZU1vZGUsCisgICAgICAgICAgIlBJRCBjb25zdGFudHMgb25seSBhcHBseSBpbiBTcGVlZCwgUG9zaXRpb24sIGFuZCBDdXJyZW50IG1vZGUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1NwZWVkOgorICAgICAgZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgaSk7CisgICAgICBzZW5kTWVzc2FnZShMTV9BUElfU1BEX0lDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtQb3NpdGlvbjoKKyAgICAgIGRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIGkpOworICAgICAgc2VuZE1lc3NhZ2UoTE1fQVBJX1BPU19JQywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ3VycmVudDoKKyAgICAgIGRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIGkpOworICAgICAgc2VuZE1lc3NhZ2UoTE1fQVBJX0lDVFJMX0lDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisgICAgICBicmVhazsKKyAgfQorCisgIG1faSA9IGk7CisgIG1faVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogU2V0IHRoZSBEIGNvbnN0YW50IGZvciB0aGUgY2xvc2VkIGxvb3AgbW9kZXMuCisgKgorICogQHBhcmFtIGQgVGhlIGRlcml2YXRpdmUgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXREKGRvdWJsZSBkKSB7CisgIHVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKyAgdWludDhfdCBkYXRhU2l6ZTsKKworICBzd2l0Y2ggKG1fY29udHJvbE1vZGUpIHsKKyAgICBjYXNlIGtQZXJjZW50VmJ1czoKKyAgICBjYXNlIGtWb2x0YWdlOgorICAgIGNhc2Uga0ZvbGxvd2VyOgorICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCisgICAgICAgICAgSW5jb21wYXRpYmxlTW9kZSwKKyAgICAgICAgICAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrU3BlZWQ6CisgICAgICBkYXRhU2l6ZSA9IHBhY2tGWFAxNl8xNihkYXRhQnVmZmVyLCBkKTsKKyAgICAgIHNlbmRNZXNzYWdlKExNX0FQSV9TUERfREMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1Bvc2l0aW9uOgorICAgICAgZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgZCk7CisgICAgICBzZW5kTWVzc2FnZShMTV9BUElfUE9TX0RDLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtDdXJyZW50OgorICAgICAgZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgZCk7CisgICAgICBzZW5kTWVzc2FnZShMTV9BUElfSUNUUkxfREMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgbV9kID0gZDsKKyAgbV9kVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBHZXQgdGhlIFByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBjb250cm9sbGVyLgorICoKKyAqIEByZXR1cm4gVGhlIHByb3BvcnRpb25hbCBnYWluLgorICovCitkb3VibGUgQ0FOSmFndWFyOjpHZXRQKCkgY29uc3QgeworICBpZiAobV9jb250cm9sTW9kZSA9PSBrUGVyY2VudFZidXMgfHwgbV9jb250cm9sTW9kZSA9PSBrVm9sdGFnZSkgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAorICAgICAgICBJbmNvbXBhdGlibGVNb2RlLAorICAgICAgICAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworICAgIHJldHVybiAwLjA7CisgIH0KKworICByZXR1cm4gbV9wOworfQorCisvKioKKyAqIEdldCB0aGUgSW50cmVncmFsIGdhaW4gb2YgdGhlIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiBUaGUgaW50ZWdyYWwgZ2Fpbi4KKyAqLworZG91YmxlIENBTkphZ3Vhcjo6R2V0SSgpIGNvbnN0IHsKKyAgaWYgKG1fY29udHJvbE1vZGUgPT0ga1BlcmNlbnRWYnVzIHx8IG1fY29udHJvbE1vZGUgPT0ga1ZvbHRhZ2UpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKKyAgICAgICAgSW5jb21wYXRpYmxlTW9kZSwKKyAgICAgICAgIlBJRCBjb25zdGFudHMgb25seSBhcHBseSBpbiBTcGVlZCwgUG9zaXRpb24sIGFuZCBDdXJyZW50IG1vZGUiKTsKKyAgICByZXR1cm4gMC4wOworICB9CisKKyAgcmV0dXJuIG1faTsKK30KKworLyoqCisgKiBHZXQgdGhlIERpZmZlcmVudGlhbCBnYWluIG9mIHRoZSBjb250cm9sbGVyLgorICoKKyAqIEByZXR1cm4gVGhlIGRpZmZlcmVudGlhbCBnYWluLgorICovCitkb3VibGUgQ0FOSmFndWFyOjpHZXREKCkgY29uc3QgeworICBpZiAobV9jb250cm9sTW9kZSA9PSBrUGVyY2VudFZidXMgfHwgbV9jb250cm9sTW9kZSA9PSBrVm9sdGFnZSkgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAorICAgICAgICBJbmNvbXBhdGlibGVNb2RlLAorICAgICAgICAiUElEIGNvbnN0YW50cyBvbmx5IGFwcGx5IGluIFNwZWVkLCBQb3NpdGlvbiwgYW5kIEN1cnJlbnQgbW9kZSIpOworICAgIHJldHVybiAwLjA7CisgIH0KKworICByZXR1cm4gbV9kOworfQorCisvKioKKyAqIEVuYWJsZSB0aGUgY2xvc2VkIGxvb3AgY29udHJvbGxlci4KKyAqCisgKiBTdGFydCBhY3R1YWxseSBjb250cm9sbGluZyB0aGUgb3V0cHV0IGJhc2VkIG9uIHRoZSBmZWVkYmFjay4KKyAqIElmIHN0YXJ0aW5nIGEgcG9zaXRpb24gY29udHJvbGxlciB3aXRoIGFuIGVuY29kZXIgcmVmZXJlbmNlLAorICogdXNlIHRoZSBlbmNvZGVySW5pdGlhbFBvc2l0aW9uIHBhcmFtZXRlciB0byBpbml0aWFsaXplIHRoZQorICogZW5jb2RlciBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gZW5jb2RlckluaXRpYWxQb3NpdGlvbiBFbmNvZGVyIHBvc2l0aW9uIHRvIHNldCBpZiBwb3NpdGlvbiB3aXRoCisgKiBlbmNvZGVyIHJlZmVyZW5jZS4gIElnbm9yZWQgb3RoZXJ3aXNlLgorICovCit2b2lkIENBTkphZ3Vhcjo6RW5hYmxlQ29udHJvbChkb3VibGUgZW5jb2RlckluaXRpYWxQb3NpdGlvbikgeworICB1aW50OF90IGRhdGFCdWZmZXJbOF07CisgIHVpbnQ4X3QgZGF0YVNpemUgPSAwOworCisgIHN3aXRjaCAobV9jb250cm9sTW9kZSkgeworICAgIGNhc2Uga1BlcmNlbnRWYnVzOgorICAgICAgc2VuZE1lc3NhZ2UoTE1fQVBJX1ZPTFRfVF9FTiwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrU3BlZWQ6CisgICAgICBzZW5kTWVzc2FnZShMTV9BUElfU1BEX1RfRU4sIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1Bvc2l0aW9uOgorICAgICAgZGF0YVNpemUgPSBwYWNrRlhQMTZfMTYoZGF0YUJ1ZmZlciwgZW5jb2RlckluaXRpYWxQb3NpdGlvbik7CisgICAgICBzZW5kTWVzc2FnZShMTV9BUElfUE9TX1RfRU4sIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga0N1cnJlbnQ6CisgICAgICBzZW5kTWVzc2FnZShMTV9BUElfSUNUUkxfVF9FTiwgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrVm9sdGFnZToKKyAgICAgIHNlbmRNZXNzYWdlKExNX0FQSV9WQ09NUF9UX0VOLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgSmFndWFyIG9ubHkgc3VwcG9ydHMgQ3VycmVudCwgVm9sdGFnZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvc2l0aW9uLCBTcGVlZCwgYW5kIFBlcmNlbnQgKFRocm90dGxlKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZXMuIik7CisgICAgICByZXR1cm47CisgIH0KKworICBtX2NvbnRyb2xFbmFibGVkID0gdHJ1ZTsKKyAgbV9jb250cm9sTW9kZVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogRGlzYWJsZSB0aGUgY2xvc2VkIGxvb3AgY29udHJvbGxlci4KKyAqCisgKiBTdG9wIGRyaXZpbmcgdGhlIG91dHB1dCBiYXNlZCBvbiB0aGUgZmVlZGJhY2suCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpEaXNhYmxlQ29udHJvbCgpIHsKKyAgdWludDhfdCBkYXRhQnVmZmVyWzhdOworICB1aW50OF90IGRhdGFTaXplID0gMDsKKworICAvLyBEaXNhYmxlIGFsbCBjb250cm9sCisgIHNlbmRNZXNzYWdlKExNX0FQSV9WT0xUX0RJUywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworICBzZW5kTWVzc2FnZShMTV9BUElfU1BEX0RJUywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworICBzZW5kTWVzc2FnZShMTV9BUElfUE9TX0RJUywgZGF0YUJ1ZmZlciwgZGF0YVNpemUpOworICBzZW5kTWVzc2FnZShMTV9BUElfSUNUUkxfRElTLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9WQ09NUF9ESVMsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKworICAvLyBTdG9wIGFsbCBwZXJpb2RpYyBzZXRwb2ludHMKKyAgc2VuZE1lc3NhZ2UoTE1fQVBJX1ZPTFRfVF9TRVQsIGRhdGFCdWZmZXIsIGRhdGFTaXplLAorICAgICAgICAgICAgICBDQU5fU0VORF9QRVJJT0RfU1RPUF9SRVBFQVRJTkcpOworICBzZW5kTWVzc2FnZShMTV9BUElfU1BEX1RfU0VULCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HKTsKKyAgc2VuZE1lc3NhZ2UoTE1fQVBJX1BPU19UX1NFVCwgZGF0YUJ1ZmZlciwgZGF0YVNpemUsCisgICAgICAgICAgICAgIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORyk7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9JQ1RSTF9UX1NFVCwgZGF0YUJ1ZmZlciwgZGF0YVNpemUsCisgICAgICAgICAgICAgIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORyk7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9WQ09NUF9UX1NFVCwgZGF0YUJ1ZmZlciwgZGF0YVNpemUsCisgICAgICAgICAgICAgIENBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORyk7CisKKyAgbV9jb250cm9sRW5hYmxlZCA9IGZhbHNlOworfQorCisvKioKKyAqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3Igdm9sdGFnZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGJ1cyB2b2x0YWdlCisgKiB3aXRob3V0IGFueSBwb3NpdGlvbiBvciBzcGVlZCBmZWVkYmFjay48YnI+CisgKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rCisgKiBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFBlcmNlbnRNb2RlKCkgeworICBTZXRDb250cm9sTW9kZShrUGVyY2VudFZidXMpOworICBTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisgIFNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKK30KKworLyoqCisgKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIHZvbHRhZ2UgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBidXMgdm9sdGFnZSwKKyAqIGFuZCBlbmFibGUgc3BlZWQgc2Vuc2luZyBmcm9tIGEgbm9uLXF1YWRyYXR1cmUgZW5jb2Rlci48YnI+CisgKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rCisgKiBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyAqCisgKiBAcGFyYW0gdGFnIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OkVuY29kZXIKKyAqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQZXJjZW50TW9kZShDQU5KYWd1YXI6OkVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KSB7CisgIFNldENvbnRyb2xNb2RlKGtQZXJjZW50VmJ1cyk7CisgIFNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKyAgU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX0VOQ09ERVIpOworICBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworfQorCisvKioKKyAqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3Igdm9sdGFnZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGJ1cyB2b2x0YWdlLAorICogYW5kIGVuYWJsZSBzcGVlZCBzZW5zaW5nIGZyb20gYSBub24tcXVhZHJhdHVyZSBlbmNvZGVyLjxicj4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsKKyAqIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbSB0YWcgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6UXVhZEVuY29kZXIKKyAqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQZXJjZW50TW9kZShDQU5KYWd1YXI6OlF1YWRFbmNvZGVyU3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvZGVzUGVyUmV2KSB7CisgIFNldENvbnRyb2xNb2RlKGtQZXJjZW50VmJ1cyk7CisgIFNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9FTkNPREVSKTsKKyAgU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX1FVQURfRU5DT0RFUik7CisgIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIHZvbHRhZ2UgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBidXMgdm9sdGFnZSwKKyogYW5kIGVuYWJsZSBwb3NpdGlvbiBzZW5zaW5nIGZyb20gYSBwb3RlbnRpb21ldGVyIGFuZCBubyBzcGVlZCBmZWVkYmFjay48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsKKyogQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBwb3RlbnRpb21ldGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OlBvdGVudGlvbWV0ZXIKKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0UGVyY2VudE1vZGUoQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyU3RydWN0KSB7CisgIFNldENvbnRyb2xNb2RlKGtQZXJjZW50VmJ1cyk7CisgIFNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9QT1QpOworICBTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisgIENvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucygxKTsKK30KKworLyoqCisgKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIGN1cnJlbnQgd2l0aCBhIFBJRCBsb29wLjxicj4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsKKyAqIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0Q3VycmVudE1vZGUoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgeworICBTZXRDb250cm9sTW9kZShrQ3VycmVudCk7CisgIFNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKyAgU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworICBTZXRQSUQocCwgaSwgZCk7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIGN1cnJlbnQgd2l0aCBhIFBJRCBsb29wLCBhbmQgZW5hYmxlIHNwZWVkCisqIHNlbnNpbmcgZnJvbSBhIG5vbi1xdWFkcmF0dXJlIGVuY29kZXIuPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rCisqIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKgorKiBAcGFyYW0gZW5jb2RlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpFbmNvZGVyCisqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGQgVGhlIGRpZmZlcmVudGlhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0Q3VycmVudE1vZGUoQ0FOSmFndWFyOjpFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSB7CisgIFNldENvbnRyb2xNb2RlKGtDdXJyZW50KTsKKyAgU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX05PTkUpOworICBTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfTk9ORSk7CisgIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7CisgIFNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3IgY3VycmVudCB3aXRoIGEgUElEIGxvb3AsIGFuZCBlbmFibGUgc3BlZWQgYW5kCisqIHBvc2l0aW9uIHNlbnNpbmcgZnJvbSBhIHF1YWRyYXR1cmUgZW5jb2Rlci48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsKKyogQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBlbmRvZXIgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6UXVhZEVuY29kZXIKKyogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRDdXJyZW50TW9kZShDQU5KYWd1YXI6OlF1YWRFbmNvZGVyU3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvZGVzUGVyUmV2LCBkb3VibGUgcCwgZG91YmxlIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQpIHsKKyAgU2V0Q29udHJvbE1vZGUoa0N1cnJlbnQpOworICBTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisgIFNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9RVUFEX0VOQ09ERVIpOworICBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworICBTZXRQSUQocCwgaSwgZCk7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIGN1cnJlbnQgd2l0aCBhIFBJRCBsb29wLCBhbmQgZW5hYmxlIHBvc2l0aW9uCisqIHNlbnNpbmcgZnJvbSBhIHBvdGVudGlvbWV0ZXIuPGJyPgorKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rCisqIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorKgorKiBAcGFyYW0gcG90ZW50aW9tZXRlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyCisqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBpIFRoZSBpbnRlZ3JhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGQgVGhlIGRpZmZlcmVudGlhbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0Q3VycmVudE1vZGUoQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyU3RydWN0LCBkb3VibGUgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaSwgZG91YmxlIGQpIHsKKyAgU2V0Q29udHJvbE1vZGUoa0N1cnJlbnQpOworICBTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfUE9UKTsKKyAgU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworICBDb25maWdQb3RlbnRpb21ldGVyVHVybnMoMSk7CisgIFNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisgKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIHNwZWVkIHdpdGggYSBmZWVkYmFjayBsb29wIGZyb20gYSBub24tcXVhZHJhdHVyZQorICogZW5jb2Rlci48YnI+CisgKiBBZnRlciBjYWxsaW5nIHRoaXMgeW91IG11c3QgY2FsbCB7QGxpbmsgQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woKX0gb3Ige0BsaW5rCisgKiBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZW5jb2RlciBUaGUgY29uc3RhbnQgQ0FOSmFndWFyOjpFbmNvZGVyCisgKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2Rlci4KKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICovCit2b2lkIENBTkphZ3Vhcjo6U2V0U3BlZWRNb2RlKENBTkphZ3Vhcjo6RW5jb2RlclN0cnVjdCwgdWludDE2X3QgY29kZXNQZXJSZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpIHsKKyAgU2V0Q29udHJvbE1vZGUoa1NwZWVkKTsKKyAgU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX05PTkUpOworICBTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisgIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7CisgIFNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgc3BlZWQgd2l0aCBhIGZlZWRiYWNrIGxvb3AgZnJvbSBhIHF1YWRyYXR1cmUKKyogZW5jb2Rlci48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsKKyogQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBlbmNvZGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OlF1YWRFbmNvZGVyCisqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyLgorKiBAcGFyYW0gcCBUaGUgcHJvcG9ydGlvbmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBkIFRoZSBkaWZmZXJlbnRpYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisqLwordm9pZCBDQU5KYWd1YXI6OlNldFNwZWVkTW9kZShDQU5KYWd1YXI6OlF1YWRFbmNvZGVyU3RydWN0LCB1aW50MTZfdCBjb2Rlc1BlclJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgeworICBTZXRDb250cm9sTW9kZShrU3BlZWQpOworICBTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisgIFNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9RVUFEX0VOQ09ERVIpOworICBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworICBTZXRQSUQocCwgaSwgZCk7Cit9CisKKy8qKgorICogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBwb3NpdGlvbiB3aXRoIGEgZmVlZGJhY2sgbG9vcCB1c2luZyBhbiBlbmNvZGVyLjxicj4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsKKyAqIENBTkphZ3VhciNFbmFibGVDb250cm9sKGRvdWJsZSl9IHRvIGVuYWJsZSB0aGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBlbmNvZGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OlF1YWRFbmNvZGVyCisgKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2Rlci4KKyAqIEBwYXJhbSBwIFRoZSBwcm9wb3J0aW9uYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gaSBUaGUgaW50ZWdyYWwgZ2FpbiBvZiB0aGUgSmFndWFyJ3MgUElEIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorICoKKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFBvc2l0aW9uTW9kZShDQU5KYWd1YXI6OlF1YWRFbmNvZGVyU3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb2Rlc1BlclJldiwgZG91YmxlIHAsIGRvdWJsZSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCkgeworICBTZXRDb250cm9sTW9kZShrUG9zaXRpb24pOworICBTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisgIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7CisgIFNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgcG9zaXRpb24gd2l0aCBhIGZlZWRiYWNrIGxvb3AgdXNpbmcgYQorKiBwb3RlbnRpb21ldGVyLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluaworKiBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyogQHBhcmFtIHAgVGhlIHByb3BvcnRpb25hbCBnYWluIG9mIHRoZSBKYWd1YXIncyBQSUQgY29udHJvbGxlci4KKyogQHBhcmFtIGkgVGhlIGludGVncmFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKiBAcGFyYW0gZCBUaGUgZGlmZmVyZW50aWFsIGdhaW4gb2YgdGhlIEphZ3VhcidzIFBJRCBjb250cm9sbGVyLgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRQb3NpdGlvbk1vZGUoQ0FOSmFndWFyOjpQb3RlbnRpb21ldGVyU3RydWN0LCBkb3VibGUgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGksIGRvdWJsZSBkKSB7CisgIFNldENvbnRyb2xNb2RlKGtQb3NpdGlvbik7CisgIFNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9QT1QpOworICBDb25maWdQb3RlbnRpb21ldGVyVHVybnMoMSk7CisgIFNldFBJRChwLCBpLCBkKTsKK30KKworLyoqCisqIEVuYWJsZSBjb250cm9sbGluZyB0aGUgbW90b3Igdm9sdGFnZSB3aXRob3V0IGFueSBwb3NpdGlvbiBvciBzcGVlZAorKiBmZWVkYmFjay48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsKKyogQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqLwordm9pZCBDQU5KYWd1YXI6OlNldFZvbHRhZ2VNb2RlKCkgeworICBTZXRDb250cm9sTW9kZShrVm9sdGFnZSk7CisgIFNldFBvc2l0aW9uUmVmZXJlbmNlKExNX1JFRl9OT05FKTsKKyAgU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciB2b2x0YWdlIHdpdGggc3BlZWQgZmVlZGJhY2sgZnJvbSBhCisqIG5vbi1xdWFkcmF0dXJlIGVuY29kZXIgYW5kIG5vIHBvc2l0aW9uIGZlZWRiYWNrLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluaworKiBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyoKKyogQHBhcmFtIGVuY29kZXIgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6RW5jb2RlcgorKiBAcGFyYW0gY29kZXNQZXJSZXYgVGhlIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBvbiB0aGUgZW5jb2RlcgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRWb2x0YWdlTW9kZShDQU5KYWd1YXI6OkVuY29kZXJTdHJ1Y3QsIHVpbnQxNl90IGNvZGVzUGVyUmV2KSB7CisgIFNldENvbnRyb2xNb2RlKGtWb2x0YWdlKTsKKyAgU2V0UG9zaXRpb25SZWZlcmVuY2UoTE1fUkVGX05PTkUpOworICBTZXRTcGVlZFJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisgIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldihjb2Rlc1BlclJldik7Cit9CisKKy8qKgorKiBFbmFibGUgY29udHJvbGxpbmcgdGhlIG1vdG9yIHZvbHRhZ2Ugd2l0aCBwb3NpdGlvbiBhbmQgc3BlZWQgZmVlZGJhY2sgZnJvbSBhCisqIHF1YWRyYXR1cmUgZW5jb2Rlci48YnI+CisqIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgbXVzdCBjYWxsIHtAbGluayBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbCgpfSBvciB7QGxpbmsKKyogQ0FOSmFndWFyI0VuYWJsZUNvbnRyb2woZG91YmxlKX0gdG8gZW5hYmxlIHRoZSBkZXZpY2UuCisqCisqIEBwYXJhbSBlbmNvZGVyIFRoZSBjb25zdGFudCBDQU5KYWd1YXI6OlF1YWRFbmNvZGVyCisqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgY291bnRzIHBlciByZXZvbHV0aW9uIG9uIHRoZSBlbmNvZGVyCisqLwordm9pZCBDQU5KYWd1YXI6OlNldFZvbHRhZ2VNb2RlKENBTkphZ3Vhcjo6UXVhZEVuY29kZXJTdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29kZXNQZXJSZXYpIHsKKyAgU2V0Q29udHJvbE1vZGUoa1ZvbHRhZ2UpOworICBTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfRU5DT0RFUik7CisgIFNldFNwZWVkUmVmZXJlbmNlKExNX1JFRl9RVUFEX0VOQ09ERVIpOworICBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYoY29kZXNQZXJSZXYpOworfQorCisvKioKKyogRW5hYmxlIGNvbnRyb2xsaW5nIHRoZSBtb3RvciB2b2x0YWdlIHdpdGggcG9zaXRpb24gZmVlZGJhY2sgZnJvbSBhCisqIHBvdGVudGlvbWV0ZXIgYW5kIG5vIHNwZWVkIGZlZWRiYWNrLjxicj4KKyogQWZ0ZXIgY2FsbGluZyB0aGlzIHlvdSBtdXN0IGNhbGwge0BsaW5rIENBTkphZ3VhciNFbmFibGVDb250cm9sKCl9IG9yIHtAbGluaworKiBDQU5KYWd1YXIjRW5hYmxlQ29udHJvbChkb3VibGUpfSB0byBlbmFibGUgdGhlIGRldmljZS4KKyoKKyogQHBhcmFtIHBvdGVudGlvbWV0ZXIgVGhlIGNvbnN0YW50IENBTkphZ3Vhcjo6UG90ZW50aW9tZXRlcgorKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRWb2x0YWdlTW9kZShDQU5KYWd1YXI6OlBvdGVudGlvbWV0ZXJTdHJ1Y3QpIHsKKyAgU2V0Q29udHJvbE1vZGUoa1ZvbHRhZ2UpOworICBTZXRQb3NpdGlvblJlZmVyZW5jZShMTV9SRUZfUE9UKTsKKyAgU2V0U3BlZWRSZWZlcmVuY2UoTE1fUkVGX05PTkUpOworICBDb25maWdQb3RlbnRpb21ldGVyVHVybnMoMSk7Cit9CisKKy8qKgorICogVXNlZCBpbnRlcm5hbGx5LiBJbiBvcmRlciB0byBzZXQgdGhlIGNvbnRyb2wgbW9kZSBzZWUgdGhlIG1ldGhvZHMgbGlzdGVkCisgKiBiZWxvdy4KKyAqIENoYW5nZSB0aGUgY29udHJvbCBtb2RlIG9mIHRoaXMgSmFndWFyIG9iamVjdC4KKyAqCisgKiBBZnRlciBjaGFuZ2luZyBtb2RlcywgY29uZmlndXJlIGFueSBQSUQgY29uc3RhbnRzIG9yIG90aGVyIHNldHRpbmdzIG5lZWRlZAorICogYW5kIHRoZW4gRW5hYmxlQ29udHJvbCgpIHRvIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kZSBvbiB0aGUgSmFndWFyLgorICoKKyAqIEBwYXJhbSBjb250cm9sTW9kZSBUaGUgbmV3IG1vZGUuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTZXRDb250cm9sTW9kZShDb250cm9sTW9kZSBjb250cm9sTW9kZSkgeworICAvLyBEaXNhYmxlIHRoZSBwcmV2aW91cyBtb2RlCisgIERpc2FibGVDb250cm9sKCk7CisKKyAgaWYgKGNvbnRyb2xNb2RlID09IGtGb2xsb3dlcikKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgSmFndWFyIG9ubHkgc3VwcG9ydHMgQ3VycmVudCwgVm9sdGFnZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3NpdGlvbiwgU3BlZWQsIGFuZCBQZXJjZW50IChUaHJvdHRsZSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2Rlcy4iKTsKKworICAvLyBVcGRhdGUgdGhlIGxvY2FsIG1vZGUKKyAgbV9jb250cm9sTW9kZSA9IGNvbnRyb2xNb2RlOworICBtX2NvbnRyb2xNb2RlVmVyaWZpZWQgPSBmYWxzZTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQ0FOSmFndWFyLCBtX2RldmljZU51bWJlciwKKyAgICAgICAgICAgIG1fY29udHJvbE1vZGUpOworfQorCisvKioKKyAqIEdldCB0aGUgYWN0aXZlIGNvbnRyb2wgbW9kZSBmcm9tIHRoZSBKYWd1YXIuCisgKgorICogQXNrIHRoZSBKYWcgd2hhdCBtb2RlIGl0IGlzIGluLgorICoKKyAqIEByZXR1cm4gQ29udHJvbE1vZGUgdGhhdCB0aGUgSmFnIGlzIGluLgorICovCitDQU5KYWd1YXI6OkNvbnRyb2xNb2RlIENBTkphZ3Vhcjo6R2V0Q29udHJvbE1vZGUoKSBjb25zdCB7CisgIHJldHVybiBtX2NvbnRyb2xNb2RlOworfQorCisvKioKKyAqIEdldCB0aGUgdm9sdGFnZSBhdCB0aGUgYmF0dGVyeSBpbnB1dCB0ZXJtaW5hbHMgb2YgdGhlIEphZ3Vhci4KKyAqCisgKiBAcmV0dXJuIFRoZSBidXMgdm9sdGFnZSBpbiB2b2x0cy4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXRCdXNWb2x0YWdlKCkgY29uc3QgeworICB1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworCisgIHJldHVybiBtX2J1c1ZvbHRhZ2U7Cit9CisKKy8qKgorICogR2V0IHRoZSB2b2x0YWdlIGJlaW5nIG91dHB1dCBmcm9tIHRoZSBtb3RvciB0ZXJtaW5hbHMgb2YgdGhlIEphZ3Vhci4KKyAqCisgKiBAcmV0dXJuIFRoZSBvdXRwdXQgdm9sdGFnZSBpbiB2b2x0cy4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXRPdXRwdXRWb2x0YWdlKCkgY29uc3QgeworICB1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworCisgIHJldHVybiBtX291dHB1dFZvbHRhZ2U7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHRocm91Z2ggdGhlIG1vdG9yIHRlcm1pbmFscyBvZiB0aGUgSmFndWFyLgorICoKKyAqIEByZXR1cm4gVGhlIG91dHB1dCBjdXJyZW50IGluIGFtcHMuCisgKi8KK2Zsb2F0IENBTkphZ3Vhcjo6R2V0T3V0cHV0Q3VycmVudCgpIGNvbnN0IHsKKyAgdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKworICByZXR1cm4gbV9vdXRwdXRDdXJyZW50OworfQorCisvKioKKyAqIEdldCB0aGUgaW50ZXJuYWwgdGVtcGVyYXR1cmUgb2YgdGhlIEphZ3Vhci4KKyAqCisgKiBAcmV0dXJuIFRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgSmFndWFyIGluIGRlZ3JlZXMgQ2Vsc2l1cy4KKyAqLworZmxvYXQgQ0FOSmFndWFyOjpHZXRUZW1wZXJhdHVyZSgpIGNvbnN0IHsKKyAgdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKworICByZXR1cm4gbV90ZW1wZXJhdHVyZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbmNvZGVyIG9yIHBvdGVudGlvbWV0ZXIuCisgKgorICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIG1vdG9yIGluIHJvdGF0aW9ucyBiYXNlZCBvbiB0aGUgY29uZmlndXJlZAorICogZmVlZGJhY2suCisgKiBAc2VlIENBTkphZ3VhciNDb25maWdQb3RlbnRpb21ldGVyVHVybnMoaW50KQorICogQHNlZSBDQU5KYWd1YXIjQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KGludCkKKyAqLworZG91YmxlIENBTkphZ3Vhcjo6R2V0UG9zaXRpb24oKSBjb25zdCB7CisgIHVwZGF0ZVBlcmlvZGljU3RhdHVzKCk7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisKKyAgcmV0dXJuIG1fcG9zaXRpb247Cit9CisKKy8qKgorICogR2V0IHRoZSBzcGVlZCBvZiB0aGUgZW5jb2Rlci4KKyAqCisgKiBAcmV0dXJuIFRoZSBzcGVlZCBvZiB0aGUgbW90b3IgaW4gUlBNIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGZlZWRiYWNrLgorICovCitkb3VibGUgQ0FOSmFndWFyOjpHZXRTcGVlZCgpIGNvbnN0IHsKKyAgdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKworICByZXR1cm4gbV9zcGVlZDsKK30KKworLyoqCisgKiBHZXQgdGhlIHN0YXR1cyBvZiB0aGUgZm9yd2FyZCBsaW1pdCBzd2l0Y2guCisgKgorICogQHJldHVybiBUaGUgbW90b3IgaXMgYWxsb3dlZCB0byB0dXJuIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiB3aGVuIHRydWUuCisgKi8KK2Jvb2wgQ0FOSmFndWFyOjpHZXRGb3J3YXJkTGltaXRPSygpIGNvbnN0IHsKKyAgdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKworICByZXR1cm4gbV9saW1pdHMgJiBrRm9yd2FyZExpbWl0OworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdHVzIG9mIHRoZSByZXZlcnNlIGxpbWl0IHN3aXRjaC4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3RvciBpcyBhbGxvd2VkIHRvIHR1cm4gaW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uIHdoZW4gdHJ1ZS4KKyAqLworYm9vbCBDQU5KYWd1YXI6OkdldFJldmVyc2VMaW1pdE9LKCkgY29uc3QgeworICB1cGRhdGVQZXJpb2RpY1N0YXR1cygpOworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworCisgIHJldHVybiBtX2xpbWl0cyAmIGtSZXZlcnNlTGltaXQ7Cit9CisKKy8qKgorICogR2V0IHRoZSBzdGF0dXMgb2YgYW55IGZhdWx0cyB0aGUgSmFndWFyIGhhcyBkZXRlY3RlZC4KKyAqCisgKiBAcmV0dXJuIEEgYml0LW1hc2sgb2YgZmF1bHRzIGRlZmluZWQgYnkgdGhlICJGYXVsdHMiIGVudW0uCisgKiBAc2VlICNrQ3VycmVudEZhdWx0CisgKiBAc2VlICNrQnVzVm9sdGFnZUZhdWx0CisgKiBAc2VlICNrVGVtcGVyYXR1cmVGYXVsdAorICogQHNlZSAja0dhdGVEcml2ZXJGYXVsdAorICovCit1aW50MTZfdCBDQU5KYWd1YXI6OkdldEZhdWx0cygpIGNvbnN0IHsKKyAgdXBkYXRlUGVyaW9kaWNTdGF0dXMoKTsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKworICByZXR1cm4gbV9mYXVsdHM7Cit9CisKKy8qKgorICogU2V0IHRoZSBtYXhpbXVtIHZvbHRhZ2UgY2hhbmdlIHJhdGUuCisgKgorICogV2hlbiBpbiBQZXJjZW50VmJ1cyBvciBWb2x0YWdlIG91dHB1dCBtb2RlLCB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgdm9sdGFnZQorICogY2hhbmdlcyBjYW4KKyAqIGJlIGxpbWl0ZWQgdG8gcmVkdWNlIGN1cnJlbnQgc3Bpa2VzLiAgU2V0IHRoaXMgdG8gMC4wIHRvIGRpc2FibGUgcmF0ZQorICogbGltaXRpbmcuCisgKgorICogQHBhcmFtIHJhbXBSYXRlIFRoZSBtYXhpbXVtIHJhdGUgb2Ygdm9sdGFnZSBjaGFuZ2UgaW4gUGVyY2VudCBWb2x0YWdlIG1vZGUgaW4KKyAqIFYvcy4KKyAqLwordm9pZCBDQU5KYWd1YXI6OlNldFZvbHRhZ2VSYW1wUmF0ZShkb3VibGUgcmFtcFJhdGUpIHsKKyAgdWludDhfdCBkYXRhQnVmZmVyWzhdOworICB1aW50OF90IGRhdGFTaXplOworICB1aW50MzJfdCBtZXNzYWdlOworCisgIHN3aXRjaCAobV9jb250cm9sTW9kZSkgeworICAgIGNhc2Uga1BlcmNlbnRWYnVzOgorICAgICAgZGF0YVNpemUgPSBwYWNrUGVyY2VudGFnZSgKKyAgICAgICAgICBkYXRhQnVmZmVyLCByYW1wUmF0ZSAvIChtX21heE91dHB1dFZvbHRhZ2UgKiBrQ29udHJvbGxlclJhdGUpKTsKKyAgICAgIG1lc3NhZ2UgPSBMTV9BUElfVk9MVF9TRVRfUkFNUDsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1ZvbHRhZ2U6CisgICAgICBkYXRhU2l6ZSA9IHBhY2tGWFA4XzgoZGF0YUJ1ZmZlciwgcmFtcFJhdGUgLyBrQ29udHJvbGxlclJhdGUpOworICAgICAgbWVzc2FnZSA9IExNX0FQSV9WQ09NUF9DT01QX1JBTVA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCisgICAgICAgICAgSW5jb21wYXRpYmxlTW9kZSwKKyAgICAgICAgICAiU2V0Vm9sdGFnZVJhbXBSYXRlIG9ubHkgYXBwbGllcyBpbiBWb2x0YWdlIGFuZCBQZXJjZW50IG1vZGUiKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIHNlbmRNZXNzYWdlKG1lc3NhZ2UsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKworICBtX3ZvbHRhZ2VSYW1wUmF0ZSA9IHJhbXBSYXRlOworICBtX3ZvbHRhZ2VSYW1wUmF0ZVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaXJtd2FyZSBydW5uaW5nIG9uIHRoZSBKYWd1YXIuCisgKgorICogQHJldHVybiBUaGUgZmlybXdhcmUgdmVyc2lvbi4gIDAgaWYgdGhlIGRldmljZSBkaWQgbm90IHJlc3BvbmQuCisgKi8KK3VpbnQzMl90IENBTkphZ3Vhcjo6R2V0RmlybXdhcmVWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9maXJtd2FyZVZlcnNpb247IH0KKworLyoqCisgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIEphZ3VhciBoYXJkd2FyZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBoYXJkd2FyZSB2ZXJzaW9uLiAxOiBKYWd1YXIsICAyOiBCbGFjayBKYWd1YXIKKyAqLwordWludDhfdCBDQU5KYWd1YXI6OkdldEhhcmR3YXJlVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1faGFyZHdhcmVWZXJzaW9uOyB9CisKKy8qKgorICogQ29uZmlndXJlIHdoYXQgdGhlIGNvbnRyb2xsZXIgZG9lcyB0byB0aGUgSC1CcmlkZ2Ugd2hlbiBuZXV0cmFsIChub3QgZHJpdmluZworICogdGhlIG91dHB1dCkuCisgKgorICogVGhpcyBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBqdW1wZXIgY29uZmlndXJhdGlvbiBmb3IgYnJha2Ugb3IgY29hc3QuCisgKgorICogQHBhcmFtIG1vZGUgU2VsZWN0IHRvIHVzZSB0aGUganVtcGVyIHNldHRpbmcgb3IgdG8gb3ZlcnJpZGUgaXQgdG8gY29hc3Qgb3IKKyAqIGJyYWtlLgorICovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnTmV1dHJhbE1vZGUoTmV1dHJhbE1vZGUgbW9kZSkgeworICB1aW50OF90IGRhdGFCdWZmZXJbOF07CisKKyAgLy8gU2V0IHRoZSBuZXV0cmFsIG1vZGUKKyAgc2VuZE1lc3NhZ2UoTE1fQVBJX0NGR19CUkFLRV9DT0FTVCwgZGF0YUJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpKTsKKworICBtX25ldXRyYWxNb2RlID0gbW9kZTsKKyAgbV9uZXV0cmFsTW9kZVZlcmlmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogQ29uZmlndXJlIGhvdyBtYW55IGNvZGVzIHBlciByZXZvbHV0aW9uIGFyZSBnZW5lcmF0ZWQgYnkgeW91ciBlbmNvZGVyLgorICoKKyAqIEBwYXJhbSBjb2Rlc1BlclJldiBUaGUgbnVtYmVyIG9mIGNvdW50cyBwZXIgcmV2b2x1dGlvbiBpbiAxWCBtb2RlLgorICovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnRW5jb2RlckNvZGVzUGVyUmV2KHVpbnQxNl90IGNvZGVzUGVyUmV2KSB7CisgIHVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKworICAvLyBTZXQgdGhlIGNvZGVzIHBlciByZXZvbHV0aW9uIG1vZGUKKyAgcGFja2ludDE2X3QoZGF0YUJ1ZmZlciwgY29kZXNQZXJSZXYpOworICBzZW5kTWVzc2FnZShMTV9BUElfQ0ZHX0VOQ19MSU5FUywgZGF0YUJ1ZmZlciwgc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgbV9lbmNvZGVyQ29kZXNQZXJSZXYgPSBjb2Rlc1BlclJldjsKKyAgbV9lbmNvZGVyQ29kZXNQZXJSZXZWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIHR1cm5zIG9uIHRoZSBwb3RlbnRpb21ldGVyLgorICoKKyAqIFRoZXJlIGlzIG5vIHNwZWNpYWwgc3VwcG9ydCBmb3IgY29udGludW91cyB0dXJuIHBvdGVudGlvbWV0ZXJzLgorICogT25seSBpbnRlZ2VyIG51bWJlcnMgb2YgdHVybnMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBAcGFyYW0gdHVybnMgVGhlIG51bWJlciBvZiB0dXJucyBvZiB0aGUgcG90ZW50aW9tZXRlci4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucyh1aW50MTZfdCB0dXJucykgeworICB1aW50OF90IGRhdGFCdWZmZXJbOF07CisgIHVpbnQ4X3QgZGF0YVNpemU7CisKKyAgLy8gU2V0IHRoZSBwb3QgdHVybnMKKyAgZGF0YVNpemUgPSBwYWNraW50MTZfdChkYXRhQnVmZmVyLCB0dXJucyk7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9DRkdfUE9UX1RVUk5TLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKyAgbV9wb3RlbnRpb21ldGVyVHVybnMgPSB0dXJuczsKKyAgbV9wb3RlbnRpb21ldGVyVHVybnNWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBTb2Z0IFBvc2l0aW9uIExpbWl0cyB3aGVuIGluIFBvc2l0aW9uIENvbnRyb2xsZXIgbW9kZS4KKyAqCisgKiBXaGVuIGNvbnRyb2xsaW5nIHBvc2l0aW9uLCB5b3UgY2FuIGFkZCBhZGRpdGlvbmFsIGxpbWl0cyBvbiB0b3Agb2YgdGhlIGxpbWl0Cisgc3dpdGNoIGlucHV0cworICogdGhhdCBhcmUgYmFzZWQgb24gdGhlIHBvc2l0aW9uIGZlZWRiYWNrLiAgSWYgdGhlIHBvc2l0aW9uIGxpbWl0IGlzIHJlYWNoZWQgb3IKKyB0aGUKKyAqIHN3aXRjaCBpcyBvcGVuZWQsIHRoYXQgZGlyZWN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuCisgKgorCisgKiBAcGFyYW0gZm9yd2FyZExpbWl0UG9zaXRpb24gVGhlIHBvc2l0aW9uIHRoYXQgaWYgZXhjZWVkZWQgd2lsbCBkaXNhYmxlIHRoZQorIGZvcndhcmQgZGlyZWN0aW9uLgorICogQHBhcmFtIHJldmVyc2VMaW1pdFBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0aGF0IGlmIGV4Y2VlZGVkIHdpbGwgZGlzYWJsZSB0aGUKKyByZXZlcnNlIGRpcmVjdGlvbi4KKyAqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ1NvZnRQb3NpdGlvbkxpbWl0cyhkb3VibGUgZm9yd2FyZExpbWl0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByZXZlcnNlTGltaXRQb3NpdGlvbikgeworICBDb25maWdMaW1pdE1vZGUoa0xpbWl0TW9kZV9Tb2Z0UG9zaXRpb25MaW1pdHMpOworICBDb25maWdGb3J3YXJkTGltaXQoZm9yd2FyZExpbWl0UG9zaXRpb24pOworICBDb25maWdSZXZlcnNlTGltaXQocmV2ZXJzZUxpbWl0UG9zaXRpb24pOworfQorCisvKioKKyAqIERpc2FibGUgU29mdCBQb3NpdGlvbiBMaW1pdHMgaWYgcHJldmlvdXNseSBlbmFibGVkLgorICoKKyAqIFNvZnQgUG9zaXRpb24gTGltaXRzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LgorICovCit2b2lkIENBTkphZ3Vhcjo6RGlzYWJsZVNvZnRQb3NpdGlvbkxpbWl0cygpIHsKKyAgQ29uZmlnTGltaXRNb2RlKGtMaW1pdE1vZGVfU3dpdGNoSW5wdXRzT25seSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBsaW1pdCBtb2RlIGZvciBwb3NpdGlvbiBjb250cm9sIG1vZGUuCisgKgorICogVXNlIENvbmZpZ1NvZnRQb3NpdGlvbkxpbWl0cyBvciBEaXNhYmxlU29mdFBvc2l0aW9uTGltaXRzIHRvIHNldCB0aGlzCisgKiBhdXRvbWF0aWNhbGx5LgorICovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnTGltaXRNb2RlKExpbWl0TW9kZSBtb2RlKSB7CisgIHVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKworICBkYXRhQnVmZmVyWzBdID0gbW9kZTsKKyAgc2VuZE1lc3NhZ2UoTE1fQVBJX0NGR19MSU1JVF9NT0RFLCBkYXRhQnVmZmVyLCBzaXplb2YodWludDhfdCkpOworCisgIG1fbGltaXRNb2RlID0gbW9kZTsKKyAgbV9saW1pdE1vZGVWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyogU2V0IHRoZSBwb3NpdGlvbiB0aGF0IGlmIGV4Y2VlZGVkIHdpbGwgZGlzYWJsZSB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisqCisqIFVzZSBDb25maWdTb2Z0UG9zaXRpb25MaW1pdHMgdG8gc2V0IHRoaXMgYW5kIHRoZSBsaW1pdCBtb2RlIGF1dG9tYXRpY2FsbHkuCisqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ0ZvcndhcmRMaW1pdChkb3VibGUgZm9yd2FyZExpbWl0UG9zaXRpb24pIHsKKyAgdWludDhfdCBkYXRhQnVmZmVyWzhdOworICB1aW50OF90IGRhdGFTaXplOworCisgIGRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIGZvcndhcmRMaW1pdFBvc2l0aW9uKTsKKyAgZGF0YUJ1ZmZlcltkYXRhU2l6ZSsrXSA9IDE7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfRldELCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKyAgbV9mb3J3YXJkTGltaXQgPSBmb3J3YXJkTGltaXRQb3NpdGlvbjsKKyAgbV9mb3J3YXJkTGltaXRWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyogU2V0IHRoZSBwb3NpdGlvbiB0aGF0IGlmIGV4Y2VlZGVkIHdpbGwgZGlzYWJsZSB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uCisqCisqIFVzZSBDb25maWdTb2Z0UG9zaXRpb25MaW1pdHMgdG8gc2V0IHRoaXMgYW5kIHRoZSBsaW1pdCBtb2RlIGF1dG9tYXRpY2FsbHkuCisqLwordm9pZCBDQU5KYWd1YXI6OkNvbmZpZ1JldmVyc2VMaW1pdChkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pIHsKKyAgdWludDhfdCBkYXRhQnVmZmVyWzhdOworICB1aW50OF90IGRhdGFTaXplOworCisgIGRhdGFTaXplID0gcGFja0ZYUDE2XzE2KGRhdGFCdWZmZXIsIHJldmVyc2VMaW1pdFBvc2l0aW9uKTsKKyAgZGF0YUJ1ZmZlcltkYXRhU2l6ZSsrXSA9IDA7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9DRkdfTElNSVRfUkVWLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKyAgbV9yZXZlcnNlTGltaXQgPSByZXZlcnNlTGltaXRQb3NpdGlvbjsKKyAgbV9yZXZlcnNlTGltaXRWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgbWF4aW11bSB2b2x0YWdlIHRoYXQgdGhlIEphZ3VhciB3aWxsIGV2ZXIgb3V0cHV0LgorICoKKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbGltaXQgdGhlIG1heGltdW0gb3V0cHV0IHZvbHRhZ2UgaW4gYWxsIG1vZGVzIHNvIHRoYXQKKyAqIG1vdG9ycyB3aGljaCBjYW5ub3Qgd2l0aHN0YW5kIGZ1bGwgYnVzIHZvbHRhZ2UgY2FuIGJlIHVzZWQgc2FmZWx5LgorICoKKyAqIEBwYXJhbSB2b2x0YWdlIFRoZSBtYXhpbXVtIHZvbHRhZ2Ugb3V0cHV0IGJ5IHRoZSBKYWd1YXIuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpDb25maWdNYXhPdXRwdXRWb2x0YWdlKGRvdWJsZSB2b2x0YWdlKSB7CisgIHVpbnQ4X3QgZGF0YUJ1ZmZlcls4XTsKKyAgdWludDhfdCBkYXRhU2l6ZTsKKworICBkYXRhU2l6ZSA9IHBhY2tGWFA4XzgoZGF0YUJ1ZmZlciwgdm9sdGFnZSk7CisgIHNlbmRNZXNzYWdlKExNX0FQSV9DRkdfTUFYX1ZPVVQsIGRhdGFCdWZmZXIsIGRhdGFTaXplKTsKKworICBtX21heE91dHB1dFZvbHRhZ2UgPSB2b2x0YWdlOworICBtX21heE91dHB1dFZvbHRhZ2VWZXJpZmllZCA9IGZhbHNlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBob3cgbG9uZyB0aGUgSmFndWFyIHdhaXRzIGluIHRoZSBjYXNlIG9mIGEgZmF1bHQgYmVmb3JlIHJlc3VtaW5nCisgKiBvcGVyYXRpb24uCisgKgorICogRmF1bHRzIGluY2x1ZGUgb3ZlciB0ZW1lcmF0dXJlLCBvdmVyIGN1cnJlbnQsIGFuZCBidXMgdW5kZXIgdm9sdGFnZS4KKyAqIFRoZSBkZWZhdWx0IGlzIDMuMCBzZWNvbmRzLCBidXQgY2FuIGJlIHJlZHVjZWQgdG8gYXMgbG93IGFzIDAuNSBzZWNvbmRzLgorICoKKyAqIEBwYXJhbSBmYXVsdFRpbWUgVGhlIHRpbWUgdG8gd2FpdCBiZWZvcmUgcmVzdW1pbmcgb3BlcmF0aW9uLCBpbiBzZWNvbmRzLgorICovCit2b2lkIENBTkphZ3Vhcjo6Q29uZmlnRmF1bHRUaW1lKGZsb2F0IGZhdWx0VGltZSkgeworICB1aW50OF90IGRhdGFCdWZmZXJbOF07CisgIHVpbnQ4X3QgZGF0YVNpemU7CisKKyAgaWYgKGZhdWx0VGltZSA8IDAuNSkKKyAgICBmYXVsdFRpbWUgPSAwLjU7CisgIGVsc2UgaWYgKGZhdWx0VGltZSA+IDMuMCkKKyAgICBmYXVsdFRpbWUgPSAzLjA7CisKKyAgLy8gTWVzc2FnZSB0YWtlcyBtcworICBkYXRhU2l6ZSA9IHBhY2tpbnQxNl90KGRhdGFCdWZmZXIsIChpbnQxNl90KShmYXVsdFRpbWUgKiAxMDAwLjApKTsKKyAgc2VuZE1lc3NhZ2UoTE1fQVBJX0NGR19GQVVMVF9USU1FLCBkYXRhQnVmZmVyLCBkYXRhU2l6ZSk7CisKKyAgbV9mYXVsdFRpbWUgPSBmYXVsdFRpbWU7CisgIG1fZmF1bHRUaW1lVmVyaWZpZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBVcGRhdGUgYWxsIHRoZSBtb3RvcnMgdGhhdCBoYXZlIHBlbmRpbmcgc2V0cyBpbiB0aGUgc3luY0dyb3VwLgorICoKKyAqIEBwYXJhbSBzeW5jR3JvdXAgQSBiaXRtYXNrIG9mIGdyb3VwcyB0byBnZW5lcmF0ZSBzeW5jaHJvbm91cyBvdXRwdXQuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpVcGRhdGVTeW5jR3JvdXAodWludDhfdCBzeW5jR3JvdXApIHsKKyAgc2VuZE1lc3NhZ2VIZWxwZXIoQ0FOX01TR0lEX0FQSV9TWU5DLCAmc3luY0dyb3VwLCBzaXplb2Yoc3luY0dyb3VwKSwKKyAgICAgICAgICAgICAgICAgICAgQ0FOX1NFTkRfUEVSSU9EX05PX1JFUEVBVCk7Cit9CisKK3ZvaWQgQ0FOSmFndWFyOjpTZXRFeHBpcmF0aW9uKGZsb2F0IHRpbWVvdXQpIHsKKyAgaWYgKG1fc2FmZXR5SGVscGVyKSBtX3NhZmV0eUhlbHBlci0+U2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKK30KKworZmxvYXQgQ0FOSmFndWFyOjpHZXRFeHBpcmF0aW9uKCkgY29uc3QgeworICBpZiAoIW1fc2FmZXR5SGVscGVyKSByZXR1cm4gMC4wOworICByZXR1cm4gbV9zYWZldHlIZWxwZXItPkdldEV4cGlyYXRpb24oKTsKK30KKworYm9vbCBDQU5KYWd1YXI6OklzQWxpdmUoKSBjb25zdCB7CisgIGlmICghbV9zYWZldHlIZWxwZXIpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc0FsaXZlKCk7Cit9CisKK2Jvb2wgQ0FOSmFndWFyOjpJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCB7CisgIGlmICghbV9zYWZldHlIZWxwZXIpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc1NhZmV0eUVuYWJsZWQoKTsKK30KKwordm9pZCBDQU5KYWd1YXI6OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSB7CisgIGlmIChtX3NhZmV0eUhlbHBlcikgbV9zYWZldHlIZWxwZXItPlNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgQ0FOSmFndWFyOjpHZXREZXNjcmlwdGlvbihzdGQ6Om9zdHJpbmdzdHJlYW0mIGRlc2MpIGNvbnN0IHsKKyAgZGVzYyA8PCAiQ0FOSmFndWFyIElEICIgPDwgbV9kZXZpY2VOdW1iZXI7Cit9CisKK3VpbnQ4X3QgQ0FOSmFndWFyOjpHZXREZXZpY2VJRCgpIGNvbnN0IHsgcmV0dXJuIG1fZGV2aWNlTnVtYmVyOyB9CisKKy8qKgorICogQ29tbW9uIGludGVyZmFjZSBmb3Igc3RvcHBpbmcgdGhlIG1vdG9yCisgKiBQYXJ0IG9mIHRoZSBNb3RvclNhZmV0eSBpbnRlcmZhY2UKKyAqCisgKiBAZGVwcmVjYXRlZCBDYWxsIERpc2FibGVDb250cm9sIGluc3RlYWQuCisgKi8KK3ZvaWQgQ0FOSmFndWFyOjpTdG9wTW90b3IoKSB7IERpc2FibGVDb250cm9sKCk7IH0KKworLyoqCisqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGludmVydGluZyBkaXJlY3Rpb24gb2YgYSBzcGVlZCBjb250cm9sbGVyLgorKiBPbmx5IHdvcmtzIGluIFBlcmNlbnRWYnVzLCBzcGVlZCwgYW5kIFZvbHRhZ2UgbW9kZXMuCisqIEBwYXJhbSBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQKKyovCit2b2lkIENBTkphZ3Vhcjo6U2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSB7IG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7IH0KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciB0aGUgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCisgKgorICovCitib29sIENBTkphZ3Vhcjo6R2V0SW52ZXJ0ZWQoKSBjb25zdCB7IHJldHVybiBtX2lzSW52ZXJ0ZWQ7IH0KKwordm9pZCBDQU5KYWd1YXI6OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIHsKKyAgaWYoa2V5ID09ICJNb2RlIiAmJiB2YWx1ZS0+SXNEb3VibGUoKSkgU2V0Q29udHJvbE1vZGUoc3RhdGljX2Nhc3Q8Q0FOU3BlZWRDb250cm9sbGVyOjpDb250cm9sTW9kZT4odmFsdWUtPkdldERvdWJsZSgpKSk7CisgIGlmKElzTW9kZVBJRChtX2NvbnRyb2xNb2RlKSAmJiB2YWx1ZS0+SXNEb3VibGUoKSkgeworICAgIGlmKGtleSA9PSAicCIpIFNldFAodmFsdWUtPkdldERvdWJsZSgpKTsKKyAgICBpZihrZXkgPT0gImkiKSBTZXRJKHZhbHVlLT5HZXREb3VibGUoKSk7CisgICAgaWYoa2V5ID09ICJkIikgU2V0RCh2YWx1ZS0+R2V0RG91YmxlKCkpOworICB9CisgIGlmKGtleSA9PSAiRW5hYmxlZCIgJiYgdmFsdWUtPklzQm9vbGVhbigpKSB7CisgICAgICBpZiAodmFsdWUtPkdldEJvb2xlYW4oKSkgeworICAgICAgICBFbmFibGVDb250cm9sKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBEaXNhYmxlQ29udHJvbCgpOworICAgICAgfQorICB9CisgIGlmKGtleSA9PSAiVmFsdWUiICYmIHZhbHVlLT5Jc0RvdWJsZSgpKSBTZXQodmFsdWUtPkdldERvdWJsZSgpKTsKK30KKworYm9vbCBDQU5KYWd1YXI6OklzTW9kZVBJRChDQU5TcGVlZENvbnRyb2xsZXI6OkNvbnRyb2xNb2RlIG1vZGUpIGNvbnN0IHsKKyAgcmV0dXJuIG1vZGUgPT0ga0N1cnJlbnQgfHwgbW9kZSA9PSBrU3BlZWQgfHwgbW9kZSA9PSBrUG9zaXRpb247Cit9CisKK3ZvaWQgQ0FOSmFndWFyOjpVcGRhdGVUYWJsZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlB1dFN0cmluZygiflRZUEV+IiwgIkNBTlNwZWVkQ29udHJvbGxlciIpOworICAgIG1fdGFibGUtPlB1dFN0cmluZygiVHlwZSIsICJDQU5KYWd1YXIiKTsKKyAgICBtX3RhYmxlLT5QdXRTdHJpbmcoIk1vZGUiLCBHZXRNb2RlTmFtZShtX2NvbnRyb2xNb2RlKSk7CisgICAgaWYgKElzTW9kZVBJRChtX2NvbnRyb2xNb2RlKSkgeworICAgICAgICBtX3RhYmxlLT5QdXROdW1iZXIoInAiLCBHZXRQKCkpOworICAgICAgICBtX3RhYmxlLT5QdXROdW1iZXIoImkiLCBHZXRJKCkpOworICAgICAgICBtX3RhYmxlLT5QdXROdW1iZXIoImQiLCBHZXREKCkpOworICAgIH0KKyAgICBtX3RhYmxlLT5QdXRCb29sZWFuKCJFbmFibGVkIiwgbV9jb250cm9sRW5hYmxlZCk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldCgpKTsKKyAgfQorfQorCit2b2lkIENBTkphZ3Vhcjo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPkFkZFRhYmxlTGlzdGVuZXIodGhpcywgdHJ1ZSk7CisgIH0KK30KKwordm9pZCBDQU5KYWd1YXI6OlN0b3BMaXZlV2luZG93TW9kZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgQ0FOSmFndWFyOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiAiQ0FOU3BlZWRDb250cm9sbGVyIjsKK30KKwordm9pZCBDQU5KYWd1YXI6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworICBtX3RhYmxlID0gc3ViVGFibGU7CisgIFVwZGF0ZVRhYmxlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IENBTkphZ3Vhcjo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvQ0FOVGFsb24uY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0NBTlRhbG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTM3MjEyCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0NBTlRhbG9uLmNwcApAQCAtMCwwICsxLDE3NTAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ0FOVGFsb24uaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIHVzbGVlcAorI2luY2x1ZGUgPHNzdHJlYW0+CisvKioKKyAqIE51bWJlciBvZiBhZGMgZW5naW5lZXJpbmcgdW5pdHMgcGVyIDAgdG8gMy4zViBzd2VlcC4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzY2FsaW5nIEFuYWxvZyBQb3NpdGlvbiBpbiByb3RhdGlvbnMvUlBNLgorICovCitjb25zdCBkb3VibGUga05hdGl2ZUFkY1VuaXRzUGVyUm90YXRpb24gPSAxMDI0LjA7CisvKioKKyAqIE51bWJlciBvZiBwdWxzZSB3aWR0aCBlbmdpbmVlcmluZyB1bml0cyBwZXIgZnVsbCByb3RhdGlvbi4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzY2FsaW5nIFB1bHNlIFdpZHRoIERlY29kZWQgUG9zaXRpb24gaW4gcm90YXRpb25zL1JQTS4KKyAqLworY29uc3QgZG91YmxlIGtOYXRpdmVQd2RVbml0c1BlclJvdGF0aW9uID0gNDA5Ni4wOworLyoqCisgKiBOdW1iZXIgb2YgbWludXRlcyBwZXIgMTAwbXMgdW5pdC4gIFVzZWZ1bCBmb3Igc2NhbGluZyB2ZWxvY2l0aWVzCisgKiBtZWFzdXJlZCBieSBUYWxvbidzIDEwMG1zIHRpbWViYXNlIHRvIHJvdGF0aW9ucyBwZXIgbWludXRlLgorICovCitjb25zdCBkb3VibGUga01pbnV0ZXNQZXIxMDBtc1VuaXQgPSAxLjAvNjAwLjA7CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIHRoZSBDQU5UYWxvbiBkZXZpY2UuCisgKiBAcGFyYW0gZGV2aWNlTnVtYmVyIFRoZSBDQU4gSUQgb2YgdGhlIFRhbG9uIFNSWAorICovCitDQU5UYWxvbjo6Q0FOVGFsb24oaW50IGRldmljZU51bWJlcikKKyAgICA6IG1fZGV2aWNlTnVtYmVyKGRldmljZU51bWJlciksCisgICAgICBtX2ltcGwobmV3IENhblRhbG9uU1JYKGRldmljZU51bWJlcikpLAorICAgICAgbV9zYWZldHlIZWxwZXIobmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpKSB7CisgIEFwcGx5Q29udHJvbE1vZGUobV9jb250cm9sTW9kZSk7CisgIG1faW1wbC0+U2V0UHJvZmlsZVNsb3RTZWxlY3QobV9wcm9maWxlKTsKKyAgbV9pc0ludmVydGVkID0gZmFsc2U7Cit9CisvKioKKyAqIENvbnN0cnVjdG9yIGZvciB0aGUgQ0FOVGFsb24gZGV2aWNlLgorICogQHBhcmFtIGRldmljZU51bWJlciBUaGUgQ0FOIElEIG9mIHRoZSBUYWxvbiBTUlgKKyAqIEBwYXJhbSBjb250cm9sUGVyaW9kTXMgVGhlIHBlcmlvZCBpbiBtcyB0byBzZW5kIHRoZSBDQU4gY29udHJvbCBmcmFtZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kIGlzIGJvdW5kZWQgdG8gWzFtcyw5NW1zXS4KKyAqLworQ0FOVGFsb246OkNBTlRhbG9uKGludCBkZXZpY2VOdW1iZXIsIGludCBjb250cm9sUGVyaW9kTXMpCisgICAgOiBtX2RldmljZU51bWJlcihkZXZpY2VOdW1iZXIpLAorICAgICAgbV9pbXBsKG5ldyBDYW5UYWxvblNSWChkZXZpY2VOdW1iZXIsY29udHJvbFBlcmlvZE1zKSksCisgICAgICBtX3NhZmV0eUhlbHBlcihuZXcgTW90b3JTYWZldHlIZWxwZXIodGhpcykpIHsKKyAgQXBwbHlDb250cm9sTW9kZShtX2NvbnRyb2xNb2RlKTsKKyAgbV9pbXBsLT5TZXRQcm9maWxlU2xvdFNlbGVjdChtX3Byb2ZpbGUpOworfQorCitDQU5UYWxvbjo6fkNBTlRhbG9uKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSBtX3RhYmxlLT5SZW1vdmVUYWJsZUxpc3RlbmVyKHRoaXMpOworICBpZiAobV9oYXNCZWVuTW92ZWQpIHJldHVybjsKKyAgRGlzYWJsZSgpOworfQorCisvKioKKyogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorKgorKiBAZGVwcmVjYXRlZCBDYWxsIFNldCBpbnN0ZWFkLgorKgorKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUGVyY2VudFZidXMgdmFsdWUgYXMgd2FzIGNvbXB1dGVkIGJ5IHRoZQorKiBQSURDb250cm9sbGVyCisqLwordm9pZCBDQU5UYWxvbjo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KSB7CisgIGlmIChHZXRDb250cm9sTW9kZSgpID09IGtQZXJjZW50VmJ1cykgeworICAgIFNldChvdXRwdXQpOworICB9IGVsc2UgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBJRCBvbmx5IHN1cHBvcnRlZCBpbiBQZXJjZW50VmJ1cyBtb2RlIik7CisgIH0KK30KKworLyoqCisgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBzZW5zb3IgdmFsdWUuIEVxdWl2YWxlbnQgdG8gR2V0KCkuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCBzZW5zb3IgdmFsdWUgb2YgdGhlIFRhbG9uLgorICovCitkb3VibGUgQ0FOVGFsb246OlBJREdldCgpIHsgcmV0dXJuIEdldCgpOyB9CisKKy8qKgorICogR2V0cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIFRhbG9uICh1c3VhbGx5IGEgc2Vuc29yIHZhbHVlKS4KKyAqCisgKiBJbiBDdXJyZW50IG1vZGU6IHJldHVybnMgb3V0cHV0IGN1cnJlbnQuCisgKiBJbiBTcGVlZCBtb2RlOiByZXR1cm5zIGN1cnJlbnQgc3BlZWQuCisgKiBJbiBQb3NpdGlvbiBtb2RlOiByZXR1cm5zIGN1cnJlbnQgc2Vuc29yIHBvc2l0aW9uLgorICogSW4gUGVyY2VudFZidXMgYW5kIEZvbGxvd2VyIG1vZGVzOiByZXR1cm5zIGN1cnJlbnQgYXBwbGllZCB0aHJvdHRsZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlbnNvciB2YWx1ZSBvZiB0aGUgVGFsb24uCisgKi8KK2Zsb2F0IENBTlRhbG9uOjpHZXQoKSBjb25zdCB7CisgIGludCB2YWx1ZTsKKyAgc3dpdGNoIChtX2NvbnRyb2xNb2RlKSB7CisgICAgY2FzZSBrVm9sdGFnZToKKyAgICAgIHJldHVybiBHZXRPdXRwdXRWb2x0YWdlKCk7CisgICAgY2FzZSBrQ3VycmVudDoKKyAgICAgIHJldHVybiBHZXRPdXRwdXRDdXJyZW50KCk7CisgICAgY2FzZSBrU3BlZWQ6CisgICAgICBtX2ltcGwtPkdldFNlbnNvclZlbG9jaXR5KHZhbHVlKTsKKyAgICAgIHJldHVybiBTY2FsZU5hdGl2ZVVuaXRzVG9ScG0obV9mZWVkYmFja0RldmljZSwgdmFsdWUpOworICAgIGNhc2Uga1Bvc2l0aW9uOgorICAgICAgbV9pbXBsLT5HZXRTZW5zb3JQb3NpdGlvbih2YWx1ZSk7CisgICAgICByZXR1cm4gU2NhbGVOYXRpdmVVbml0c1RvUm90YXRpb25zKG1fZmVlZGJhY2tEZXZpY2UsIHZhbHVlKTsKKyAgICBjYXNlIGtQZXJjZW50VmJ1czoKKyAgICBjYXNlIGtGb2xsb3dlcjoKKyAgICBkZWZhdWx0OgorICAgICAgbV9pbXBsLT5HZXRBcHBsaWVkVGhyb3R0bGUodmFsdWUpOworICAgICAgcmV0dXJuIChmbG9hdCl2YWx1ZSAvIDEwMjMuMDsKKyAgfQorfQorCisvKioKKyAqIFNldHMgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBvbiB0aGUgdGFsb24sIGRlcGVuZGluZyBvbiB0aGUgbW9kZS4KKyAqCisgKiBJbiBQZXJjZW50VmJ1cywgdGhlIG91dHB1dCBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMCwgd2l0aCAwLjAgYXMgc3RvcHBlZC4KKyAqIEluIFZvbHRhZ2UgbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIHZvbHRzLgorICogSW4gQ3VycmVudCBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gYW1wZXJlcy4KKyAqIEluIFNwZWVkIG1vZGUsIG91dHB1dCB2YWx1ZSBpcyBpbiBwb3NpdGlvbiBjaGFuZ2UgLyAxMG1zLgorICogSW4gUG9zaXRpb24gbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIGVuY29kZXIgdGlja3Mgb3IgYW4gYW5hbG9nIHZhbHVlLAorICogICBkZXBlbmRpbmcgb24gdGhlIHNlbnNvci4KKyAqIEluIEZvbGxvd2VyIG1vZGUsIHRoZSBvdXRwdXQgdmFsdWUgaXMgdGhlIGludGVnZXIgZGV2aWNlIElEIG9mIHRoZSB0YWxvbiB0bworICogZHVwbGljYXRlLgorICoKKyAqIEBwYXJhbSBvdXRwdXRWYWx1ZSBUaGUgc2V0cG9pbnQgdmFsdWUsIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwKSB7CisgIC8qIGZlZWQgc2FmZXR5IGhlbHBlciBzaW5jZSBjYWxsZXIganVzdCB1cGRhdGVkIG91ciBvdXRwdXQgKi8KKyAgbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKKyAgaWYgKG1fY29udHJvbEVuYWJsZWQpIHsKKyAgICBtX3NldFBvaW50ID0gdmFsdWU7ICAvKiBjYWNoZSBzZXQgcG9pbnQgZm9yIEdldFNldHBvaW50KCkgKi8KKyAgICBDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKyAgICBzd2l0Y2ggKG1fY29udHJvbE1vZGUpIHsKKyAgICAgIGNhc2UgQ0FOU3BlZWRDb250cm9sbGVyOjprUGVyY2VudFZidXM6IHsKKyAgICAgICAgbV9pbXBsLT5TZXQobV9pc0ludmVydGVkID8gLXZhbHVlIDogdmFsdWUpOworICAgICAgICBzdGF0dXMgPSBDVFJfT0tBWTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIENBTlNwZWVkQ29udHJvbGxlcjo6a0ZvbGxvd2VyOiB7CisgICAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0RGVtYW5kKChpbnQpdmFsdWUpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgQ0FOU3BlZWRDb250cm9sbGVyOjprVm9sdGFnZTogeworICAgICAgICAvLyBWb2x0YWdlIGlzIGFuIDguOCBmaXhlZCBwb2ludCBudW1iZXIuCisgICAgICAgIGludCB2b2x0cyA9IGludCgobV9pc0ludmVydGVkID8gLXZhbHVlIDogdmFsdWUpICogMjU2KTsKKyAgICAgICAgc3RhdHVzID0gbV9pbXBsLT5TZXREZW1hbmQodm9sdHMpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgQ0FOU3BlZWRDb250cm9sbGVyOjprU3BlZWQ6CisgICAgICAgIC8qIGlmIHRoZSBjYWxsZXIgaGFzIHByb3ZpZGVkIHNjYWxpbmcgaW5mbywgYXBwbHkgaXQgKi8KKyAgICAgICAgc3RhdHVzID0gbV9pbXBsLT5TZXREZW1hbmQoU2NhbGVWZWxvY2l0eVRvTmF0aXZlVW5pdHMobV9mZWVkYmFja0RldmljZSwgbV9pc0ludmVydGVkID8gLXZhbHVlIDogdmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENBTlNwZWVkQ29udHJvbGxlcjo6a1Bvc2l0aW9uOgorICAgICAgICBzdGF0dXMgPSBtX2ltcGwtPlNldERlbWFuZChTY2FsZVJvdGF0aW9uc1RvTmF0aXZlVW5pdHMobV9mZWVkYmFja0RldmljZSwgdmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENBTlNwZWVkQ29udHJvbGxlcjo6a0N1cnJlbnQ6IHsKKyAgICAgICAgZG91YmxlIG1pbGxpYW1wZXJlcyA9IChtX2lzSW52ZXJ0ZWQgPyAtdmFsdWUgOiB2YWx1ZSkgKiAxMDAwLjA7IC8qIG1BKi8KKyAgICAgICAgc3RhdHVzID0gbV9pbXBsLT5TZXREZW1hbmQobWlsbGlhbXBlcmVzKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKKyAgICAgICAgICAgIEluY29tcGF0aWJsZU1vZGUsCisgICAgICAgICAgICAiVGhlIENBTiBUYWxvbiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29udHJvbCBtb2RlLiIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgfQorCisgICAgc3RhdHVzID0gbV9pbXBsLT5TZXRNb2RlU2VsZWN0KG1fc2VuZE1vZGUpOworCisgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogU2V0cyB0aGUgc2V0cG9pbnQgdG8gdmFsdWUuIEVxdWl2YWxlbnQgdG8gU2V0KCkuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldFNldHBvaW50KGZsb2F0IHZhbHVlKSB7IFNldCh2YWx1ZSk7IH0KKworLyoqCisgKiBSZXNldHMgdGhlIGludGVncmFsIHRlcm0gYW5kIGRpc2FibGVzIHRoZSBjb250cm9sbGVyLgorICovCit2b2lkIENBTlRhbG9uOjpSZXNldCgpIHsKKyAgQ2xlYXJJYWNjdW0oKTsKKyAgRGlzYWJsZSgpOworfQorCisvKioKKyAqIERpc2FibGVzIGNvbnRyb2wgb2YgdGhlIHRhbG9uLCBjYXVzaW5nIHRoZSBtb3RvciB0byBicmFrZSBvciBjb2FzdAorICogZGVwZW5kaW5nIG9uIGl0cyBtb2RlIChzZWUgdGhlIFRhbG9uIFNSWCBTb2Z0d2FyZSBSZWZlcmVuY2UgbWFudWFsCisgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCisgKi8KK3ZvaWQgQ0FOVGFsb246OkRpc2FibGUoKSB7CisgIG1faW1wbC0+U2V0TW9kZVNlbGVjdCgoaW50KUNBTlRhbG9uOjprRGlzYWJsZWQpOworICBtX2NvbnRyb2xFbmFibGVkID0gZmFsc2U7Cit9CisKKy8qKgorICogRW5hYmxlcyBjb250cm9sIG9mIHRoZSBUYWxvbiwgYWxsb3dpbmcgdGhlIG1vdG9yIHRvIG1vdmUuCisgKi8KK3ZvaWQgQ0FOVGFsb246OkVuYWJsZUNvbnRyb2woKSB7CisgIFNldENvbnRyb2xNb2RlKG1fY29udHJvbE1vZGUpOworICBtX2NvbnRyb2xFbmFibGVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBFbmFibGVzIGNvbnRyb2wgb2YgdGhlIFRhbG9uLCBhbGxvd2luZyB0aGUgbW90b3IgdG8gbW92ZS4KKyAqLwordm9pZCBDQU5UYWxvbjo6RW5hYmxlKCkgeyBFbmFibGVDb250cm9sKCk7IH0KKworLyoqCisgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIFRhbG9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICovCitib29sIENBTlRhbG9uOjpJc0NvbnRyb2xFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbV9jb250cm9sRW5hYmxlZDsgfQorCisvKioKKyAqIEByZXR1cm4gV2hldGhlciB0aGUgVGFsb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgKi8KK2Jvb2wgQ0FOVGFsb246OklzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIElzQ29udHJvbEVuYWJsZWQoKTsgfQorCisvKioKKyAqIEBwYXJhbSBwIFByb3BvcnRpb25hbCBjb25zdGFudCB0byB1c2UgaW4gUElEIGxvb3AuCisgKiBAc2VlIFNlbGVjdFByb2ZpbGVTbG90IHRvIGNob29zZSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBnYWlucy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0UChkb3VibGUgcCkgeworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFBnYWluKG1fcHJvZmlsZSwgcCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgaW50ZWdyYXRpb24gY29uc3RhbnQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcm9maWxlLgorICoKKyAqIEBwYXJhbSBpIEludGVncmF0aW9uIGNvbnN0YW50IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIFBJRCBwcm9maWxlLgorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldEkoZG91YmxlIGkpIHsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRJZ2FpbihtX3Byb2ZpbGUsIGkpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKworLyoqCisgKiBTZXQgdGhlIGRlcml2YXRpdmUgY29uc3RhbnQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcm9maWxlLgorICoKKyAqIEBwYXJhbSBkIERlcml2YXRpdmUgY29uc3RhbnQgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgUElEIHByb2ZpbGUuCisgKiBAc2VlIFNlbGVjdFByb2ZpbGVTbG90IHRvIGNob29zZSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBnYWlucy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0RChkb3VibGUgZCkgeworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldERnYWluKG1fcHJvZmlsZSwgZCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorLyoqCisgKiBTZXQgdGhlIGZlZWRmb3J3YXJkIHZhbHVlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvZmlsZS4KKyAqCisgKiBAcGFyYW0gZiBGZWVkZm9yd2FyZCBjb25zdGFudCBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBQSUQgcHJvZmlsZS4KKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRGKGRvdWJsZSBmKSB7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0RmdhaW4obV9wcm9maWxlLCBmKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisvKioKKyAqIFNldCB0aGUgSXpvbmUgdG8gYSBub256ZXJvIHZhbHVlIHRvIGF1dG8gY2xlYXIgdGhlIGludGVncmFsIGFjY3VtdWxhdG9yCisgKiAgICAgd2hlbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQ2xvc2VMb29wRXJyb3IgZXhjZWVkcyBJem9uZS4KKyAqCisgKiBAc2VlIFNlbGVjdFByb2ZpbGVTbG90IHRvIGNob29zZSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBnYWlucy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0SXpvbmUodW5zaWduZWQgaXopIHsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRJem9uZShtX3Byb2ZpbGUsIGl6KTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisvKioKKyAqIFNSWCBoYXMgdHdvIGF2YWlsYWJsZSBzbG90cyBmb3IgUElELgorICogQHBhcmFtIHNsb3RJZHggb25lIG9yIHplcm8gZGVwZW5kaW5nIG9uIHdoaWNoIHNsb3QgY2FsbGVyIHdhbnRzLgorICovCit2b2lkIENBTlRhbG9uOjpTZWxlY3RQcm9maWxlU2xvdChpbnQgc2xvdElkeCkgeworICBtX3Byb2ZpbGUgPSAoc2xvdElkeCA9PSAwKSA/IDAgOiAxOyAvKiBvbmx5IGdldCB0d28gc2xvdHMgZm9yIG5vdyAqLworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFByb2ZpbGVTbG90U2VsZWN0KG1fcHJvZmlsZSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorLyoqCisgKiBTZXRzIGNvbnRyb2wgdmFsdWVzIGZvciBjbG9zZWQgbG9vcCBjb250cm9sLgorICoKKyAqIEBwYXJhbSBwIFByb3BvcnRpb25hbCBjb25zdGFudC4KKyAqIEBwYXJhbSBpIEludGVncmF0aW9uIGNvbnN0YW50LgorICogQHBhcmFtIGQgRGlmZmVyZW50aWFsIGNvbnN0YW50LgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgRi1nYWluLiAgQ29uc2lkZXJhYmxlIHBhc3NpbmcgYSB6ZXJvIGZvciBmCisgKiB1c2luZworICogdGhlIGZvdXItcGFyYW1ldGVyIGZ1bmN0aW9uLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgeworICBTZXRQKHApOworICBTZXRJKGkpOworICBTZXREKGQpOworfQorLyoqCisgKiBTZXRzIGNvbnRyb2wgdmFsdWVzIGZvciBjbG9zZWQgbG9vcCBjb250cm9sLgorICoKKyAqIEBwYXJhbSBwIFByb3BvcnRpb25hbCBjb25zdGFudC4KKyAqIEBwYXJhbSBpIEludGVncmF0aW9uIGNvbnN0YW50LgorICogQHBhcmFtIGQgRGlmZmVyZW50aWFsIGNvbnN0YW50LgorICogQHBhcmFtIGYgRmVlZGZvcndhcmQgY29uc3RhbnQuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZikgeworICBTZXRQKHApOworICBTZXRJKGkpOworICBTZXREKGQpOworICBTZXRGKGYpOworfQorLyoqCisgKiBTZWxlY3QgdGhlIGZlZWRiYWNrIGRldmljZSB0byB1c2UgaW4gY2xvc2VkLWxvb3AKKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0RmVlZGJhY2tEZXZpY2UoRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UpIHsKKyAgLyogc2F2ZSB0aGUgc2VsZWN0aW9uIHNvIHRoYXQgZnV0dXJlIHNldHRlcnMvZ2V0dGVycyBrbm93IHdoaWNoIHNjYWxhcnMgdG8gYXBwbHkgKi8KKyAgbV9mZWVkYmFja0RldmljZSA9IGZlZWRiYWNrRGV2aWNlOworICAvKiBwYXNzIGZlZWRiYWNrIHRvIGFjdHVhbCBDQU4gZnJhbWUgKi8KKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRGZWVkYmFja0RldmljZVNlbGVjdCgoaW50KWZlZWRiYWNrRGV2aWNlKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisvKioKKyAqIFNlbGVjdCB0aGUgZmVlZGJhY2sgZGV2aWNlIHRvIHVzZSBpbiBjbG9zZWQtbG9vcAorICovCit2b2lkIENBTlRhbG9uOjpTZXRTdGF0dXNGcmFtZVJhdGVNcyhTdGF0dXNGcmFtZVJhdGUgc3RhdGVGcmFtZSwgaW50IHBlcmlvZE1zKSB7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0U3RhdHVzRnJhbWVSYXRlKChpbnQpc3RhdGVGcmFtZSwgcGVyaW9kTXMpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgcHJvcG9ydGlvbmFsIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gZG91YmxlIHByb3BvcnRpb25hbCBjb25zdGFudCBmb3IgY3VycmVudCBwcm9maWxlLgorICogQHNlZSBTZWxlY3RQcm9maWxlU2xvdCB0byBjaG9vc2UgYmV0d2VlbiB0aGUgdHdvIHNldHMgb2YgZ2FpbnMuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0UCgpIGNvbnN0IHsKKyAgQ2FuVGFsb25TUlg6OnBhcmFtX3QgcGFyYW0gPSBtX3Byb2ZpbGUgPyBDYW5UYWxvblNSWDo6ZVByb2ZpbGVQYXJhbVNsb3QxX1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDYW5UYWxvblNSWDo6ZVByb2ZpbGVQYXJhbVNsb3QwX1A7CisgIC8vIFVwZGF0ZSB0aGUgaW5mbyBpbiBtX2ltcGwuCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+UmVxdWVzdFBhcmFtKHBhcmFtKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHVzbGVlcChrRGVsYXlGb3JTb2xpY2l0ZWRTaWduYWxzVXMpOyAvKiBzbWFsbCB5aWVsZCBmb3IgZ2V0dGluZyByZXNwb25zZSAqLworICBkb3VibGUgcDsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXRQZ2FpbihtX3Byb2ZpbGUsIHApOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldEkoKSBjb25zdCB7CisgIENhblRhbG9uU1JYOjpwYXJhbV90IHBhcmFtID0gbV9wcm9maWxlID8gQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MV9JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MF9JOworICAvLyBVcGRhdGUgdGhlIGluZm8gaW4gbV9pbXBsLgorICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbShwYXJhbSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICB1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsgLyogc21hbGwgeWllbGQgZm9yIGdldHRpbmcgcmVzcG9uc2UgKi8KKworICBkb3VibGUgaTsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXRJZ2FpbihtX3Byb2ZpbGUsIGkpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqIEBzZWUgU2VsZWN0UHJvZmlsZVNsb3QgdG8gY2hvb3NlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGdhaW5zLgorICovCitkb3VibGUgQ0FOVGFsb246OkdldEQoKSBjb25zdCB7CisgIENhblRhbG9uU1JYOjpwYXJhbV90IHBhcmFtID0gbV9wcm9maWxlID8gQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MV9ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MF9EOworICAvLyBVcGRhdGUgdGhlIGluZm8gaW4gbV9pbXBsLgorICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbShwYXJhbSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICB1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsgLyogc21hbGwgeWllbGQgZm9yIGdldHRpbmcgcmVzcG9uc2UgKi8KKworICBkb3VibGUgZDsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXREZ2FpbihtX3Byb2ZpbGUsIGQpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgcmV0dXJuIGQ7Cit9CisvKioKKyAqCisgKiBAc2VlIFNlbGVjdFByb2ZpbGVTbG90IHRvIGNob29zZSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBnYWlucy4KKyAqLworZG91YmxlIENBTlRhbG9uOjpHZXRGKCkgY29uc3QgeworICBDYW5UYWxvblNSWDo6cGFyYW1fdCBwYXJhbSA9IG1fcHJvZmlsZSA/IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDFfRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENhblRhbG9uU1JYOjplUHJvZmlsZVBhcmFtU2xvdDBfRjsKKyAgLy8gVXBkYXRlIHRoZSBpbmZvIGluIG1faW1wbC4KKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0ocGFyYW0pOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKworICB1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsgLyogc21hbGwgeWllbGQgZm9yIGdldHRpbmcgcmVzcG9uc2UgKi8KKyAgZG91YmxlIGY7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RmdhaW4obV9wcm9maWxlLCBmKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHJldHVybiBmOworfQorLyoqCisgKiBAc2VlIFNlbGVjdFByb2ZpbGVTbG90IHRvIGNob29zZSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBnYWlucy4KKyAqLworaW50IENBTlRhbG9uOjpHZXRJem9uZSgpIGNvbnN0IHsKKyAgQ2FuVGFsb25TUlg6OnBhcmFtX3QgcGFyYW0gPSBtX3Byb2ZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDYW5UYWxvblNSWDo6ZVByb2ZpbGVQYXJhbVNsb3QxX0lab25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MF9JWm9uZTsKKyAgLy8gVXBkYXRlIHRoZSBpbmZvIGluIG1faW1wbC4KKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0ocGFyYW0pOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgdXNsZWVwKGtEZWxheUZvclNvbGljaXRlZFNpZ25hbHNVcyk7CisKKyAgaW50IGl6OworICBzdGF0dXMgPSBtX2ltcGwtPkdldEl6b25lKG1fcHJvZmlsZSwgaXopOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgcmV0dXJuIGl6OworfQorCisvKioKKyAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2V0cG9pbnQ7IGllLCB3aGF0ZXZlciB3YXMgbGFzdCBwYXNzZWQgdG8gU2V0KCkuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0U2V0cG9pbnQoKSBjb25zdCB7IHJldHVybiBtX3NldFBvaW50OyB9CisKKy8qKgorICogUmV0dXJucyB0aGUgdm9sdGFnZSBjb21pbmcgaW4gZnJvbSB0aGUgYmF0dGVyeS4KKyAqCisgKiBAcmV0dXJuIFRoZSBpbnB1dCB2b2x0YWdlIGluIHZvbHRzLgorICovCitmbG9hdCBDQU5UYWxvbjo6R2V0QnVzVm9sdGFnZSgpIGNvbnN0IHsKKyAgZG91YmxlIHZvbHRhZ2U7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0QmF0dGVyeVYodm9sdGFnZSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICByZXR1cm4gdm9sdGFnZTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSB2b2x0YWdlIGJlaW5nIG91dHB1dCBieSB0aGUgVGFsb24sIGluIFZvbHRzLgorICovCitmbG9hdCBDQU5UYWxvbjo6R2V0T3V0cHV0Vm9sdGFnZSgpIGNvbnN0IHsKKyAgaW50IHRocm90dGxlMTE7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0QXBwbGllZFRocm90dGxlKHRocm90dGxlMTEpOworICBmbG9hdCB2b2x0YWdlID0gR2V0QnVzVm9sdGFnZSgpICogKGZsb2F0KHRocm90dGxlMTEpIC8gMTAyMy4wKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHJldHVybiB2b2x0YWdlOworfQorCisvKioKKyAqICBSZXR1cm5zIHRoZSBjdXJyZW50IGdvaW5nIHRocm91Z2ggdGhlIFRhbG9uLCBpbiBBbXBlcmVzLgorICovCitmbG9hdCBDQU5UYWxvbjo6R2V0T3V0cHV0Q3VycmVudCgpIGNvbnN0IHsKKyAgZG91YmxlIGN1cnJlbnQ7CisKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRDdXJyZW50KGN1cnJlbnQpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKworICByZXR1cm4gY3VycmVudDsKK30KKworLyoqCisgKiAgUmV0dXJucyB0ZW1wZXJhdHVyZSBvZiBUYWxvbiwgaW4gZGVncmVlcyBDZWxzaXVzLgorICovCitmbG9hdCBDQU5UYWxvbjo6R2V0VGVtcGVyYXR1cmUoKSBjb25zdCB7CisgIGRvdWJsZSB0ZW1wOworCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0VGVtcCh0ZW1wKTsKKyAgaWYgKHRlbXAgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICByZXR1cm4gdGVtcDsKK30KKy8qKgorICogU2V0IHRoZSBwb3NpdGlvbiB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgc2Vuc29yLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHplcm8taW5nCisgKiBxdWFkcmF0dXJlIGVuY29kZXJzLgorICogQ29udGludW91cyBzZW5zb3JzIChsaWtlIGFuYWxvZyBlbmNvZGVyZXMpIGNhbiBhbHNvIHBhcnRpYWxseSBiZSBzZXQgKHRoZQorICogcG9ydGlvbiBvZiB0aGUgcG9zdGlvbiBiYXNlZCBvbiBvdmVyZmxvd3MpLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRQb3NpdGlvbihkb3VibGUgcG9zKSB7CisgIGludDMyX3QgbmF0aXZlUG9zID0gU2NhbGVSb3RhdGlvbnNUb05hdGl2ZVVuaXRzKG1fZmVlZGJhY2tEZXZpY2UsIHBvcyk7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0U2Vuc29yUG9zaXRpb24obmF0aXZlUG9zKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKgorICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIHNlbnNvciBjdXJyZW50bHkgcHJvdmlkaW5nIGZlZWRiYWNrLgorICogICAgICAgV2hlbiB1c2luZyBhbmFsb2cgc2Vuc29ycywgMCB1bml0cyBjb3JyZXNwb25kcyB0byAwViwgMTAyMworICogdW5pdHMgY29ycmVzcG9uZHMgdG8gMy4zVgorICogICAgICAgV2hlbiB1c2luZyBhbiBhbmFsb2cgZW5jb2RlciAod3JhcHBpbmcgYXJvdW5kIDEwMjMgPT4gMCBpcworICogcG9zc2libGUpIHRoZSB1bml0cyBhcmUgc3RpbGwgMy4zViBwZXIgMTAyMyB1bml0cy4KKyAqICAgICAgIFdoZW4gdXNpbmcgcXVhZHJhdHVyZSwgZWFjaCB1bml0IGlzIGEgcXVhZHJhdHVyZSBlZGdlICg0WCkKKyAqIG1vZGUuCisgKi8KK2RvdWJsZSBDQU5UYWxvbjo6R2V0UG9zaXRpb24oKSBjb25zdCB7CisgIGludDMyX3QgcG9zaXRpb247CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0U2Vuc29yUG9zaXRpb24ocG9zaXRpb24pOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgcmV0dXJuIFNjYWxlTmF0aXZlVW5pdHNUb1JvdGF0aW9ucyhtX2ZlZWRiYWNrRGV2aWNlLCBwb3NpdGlvbik7Cit9CisvKioKKyAqIElmIHNlbnNvciBhbmQgbW90b3IgYXJlIG91dCBvZiBwaGFzZSwgc2Vuc29yIGNhbiBiZSBpbnZlcnRlZAorICogKHBvc2l0aW9uIGFuZCB2ZWxvY2l0eSBtdWx0aXBsaWVkIGJ5IC0xKS4KKyAqIEBzZWUgR2V0UG9zaXRpb24gYW5kIEBzZWUgR2V0U3BlZWQuCisgKi8KK3ZvaWQgQ0FOVGFsb246OlNldFNlbnNvckRpcmVjdGlvbihib29sIHJldmVyc2VTZW5zb3IpIHsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRSZXZGZWVkYmFja1NlbnNvcihyZXZlcnNlU2Vuc29yID8gMSA6IDApOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKy8qKgorICogRmxpcHMgdGhlIHNpZ24gKG11bHRpcGxpZXMgYnkgbmVnYXRpdmUgb25lKSB0aGUgdGhyb3R0bGUgdmFsdWVzIGdvaW5nIGludG8KKyAqIHRoZSBtb3RvciBvbiB0aGUgdGFsb24gaW4gY2xvc2VkIGxvb3AgbW9kZXMuICBUeXBpY2FsbHkgdGhlIGFwcGxpY2F0aW9uCisgKiBzaG91bGQgdXNlIFNldFNlbnNvckRpcmVjdGlvbiB0byBrZWVwIHNlbnNvciBhbmQgbW90b3IgaW4gcGhhc2UuCisgKiBAc2VlIFNldFNlbnNvckRpcmVjdGlvbgorICogSG93ZXZlciB0aGlzIHJvdXRpbmUgaXMgaGVscGZ1bCBmb3IgcmV2ZXJzaW5nIHRoZSBtb3RvciBkaXJlY3Rpb24KKyAqIHdoZW4gVGFsb24gaXMgaW4gc2xhdmUgbW9kZSwgb3Igd2hlbiB1c2luZyBhIHNpbmdsZS1kaXJlY3Rpb24gcG9zaXRpb24KKyAqIHNlbnNvciBpbiBhIGNsb3NlZC1sb29wIG1vZGUuCisgKgorICogQHBhcmFtIHJldmVyc2VPdXRwdXQgVHJ1ZSBpZiBtb3RvciBvdXRwdXQgc2hvdWxkIGJlIGZsaXBwZWQ7IEZhbHNlIGlmIG5vdC4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0Q2xvc2VkTG9vcE91dHB1dERpcmVjdGlvbihib29sIHJldmVyc2VPdXRwdXQpIHsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRSZXZNb3REdXJpbmdDbG9zZUxvb3BFbihyZXZlcnNlT3V0cHV0ID8gMSA6IDApOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBlcnJvciBpbiB0aGUgY29udHJvbGxlci4KKyAqCisgKiBAcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNldHBvaW50IGFuZCB0aGUgc2Vuc29yIHZhbHVlLgorICovCitpbnQgQ0FOVGFsb246OkdldENsb3NlZExvb3BFcnJvcigpIGNvbnN0IHsKKyAgaW50IGVycm9yOworICAvKiByZXRyaWV2ZSB0aGUgY2xvc2VkIGxvb3AgZXJyb3IgaW4gbmF0aXZlIHVuaXRzICovCisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0Q2xvc2VMb29wRXJyKGVycm9yKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKy8qKgorICogU2V0IHRoZSBhbGxvd2FibGUgY2xvc2VkIGxvb3AgZXJyb3IuCisgKiBAcGFyYW0gYWxsb3dhYmxlQ2xvc2VMb29wRXJyb3IgYWxsb3dhYmxlIGNsb3NlZCBsb29wIGVycm9yIGZvciBzZWxlY3RlZCBwcm9maWxlLgorICogICAgICAgbUEgZm9yIEN1cmVudCBjbG9zZWQgbG9vcC4KKyAqICAgICAgIFRhbG9uIE5hdGl2ZSBVbml0cyBmb3IgcG9zaXRpb24gYW5kIHZlbG9jaXR5LgorICovCit2b2lkIENBTlRhbG9uOjpTZXRBbGxvd2FibGVDbG9zZWRMb29wRXJyKHVpbnQzMl90IGFsbG93YWJsZUNsb3NlTG9vcEVycm9yKQoreworICAvKiBncmFiIHBhcmFtIGVudW0gKi8KKyAgQ2FuVGFsb25TUlg6OnBhcmFtX3QgcGFyYW07CisgIGlmIChtX3Byb2ZpbGUgPT0gMSkgeworICAgIHBhcmFtID0gQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MV9BbGxvd2FibGVDbG9zZWRMb29wRXJyOworICB9IGVsc2UgeworICAgIHBhcmFtID0gQ2FuVGFsb25TUlg6OmVQcm9maWxlUGFyYW1TbG90MF9BbGxvd2FibGVDbG9zZWRMb29wRXJyOworICB9CisgIC8qIHNlbmQgYWxsb3dhYmxlIGNsb3NlIGxvb3AgZXIgaW4gbmF0aXZlIHVuaXRzICovCisgIENvbmZpZ1NldFBhcmFtZXRlcihwYXJhbSwgYWxsb3dhYmxlQ2xvc2VMb29wRXJyb3IpOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKgorICogQHJldHVybnMgVGhlIHNwZWVkIG9mIHRoZSBzZW5zb3IgY3VycmVudGx5IHByb3ZpZGluZyBmZWVkYmFjay4KKyAqCisgKiBUaGUgc3BlZWQgdW5pdHMgd2lsbCBiZSBpbiB0aGUgc2Vuc29yJ3MgbmF0aXZlIHRpY2tzIHBlciAxMDBtcy4KKyAqCisgKiBGb3IgYW5hbG9nIHNlbnNvcnMsIDMuM1YgY29ycmVzcG9uZHMgdG8gMTAyMyB1bml0cy4KKyAqICAgICBTbyBhIHNwZWVkIG9mIDIwMCBlcXVhdGVzIHRvIH4wLjY0NSBkViBwZXIgMTAwbXMgb3IgNi40NTEgZFYgcGVyCisgKiBzZWNvbmQuCisgKiAgICAgSWYgdGhpcyBpcyBhbiBhbmFsb2cgZW5jb2RlciwgdGhhdCBsaWtlbHkgbWVhbnMgMS45NTQ4IHJvdGF0aW9ucworICogcGVyIHNlYy4KKyAqIEZvciBxdWFkcmF0dXJlIGVuY29kZXJzLCBlYWNoIHVuaXQgY29ycmVzcG9uZHMgYSBxdWFkcmF0dXJlIGVkZ2UgKDRYKS4KKyAqICAgICBTbyBhIDI1MCBjb3VudCBlbmNvZGVyIHdpbGwgcHJvZHVjZSAxMDAwIGVkZ2UgZXZlbnRzIHBlcgorICogcm90YXRpb24uCisgKiAgICAgQW4gZXhhbXBsZSBzcGVlZCBvZiAyMDAgd291bGQgdGhlbiBlcXVhdGUgdG8gMjAlIG9mIGEgcm90YXRpb24KKyAqIHBlciAxMDBtcywKKyAqICAgICBvciAxMCByb3RhdGlvbnMgcGVyIHNlY29uZC4KKyAqLworZG91YmxlIENBTlRhbG9uOjpHZXRTcGVlZCgpIGNvbnN0IHsKKyAgaW50MzJfdCBzcGVlZDsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRTZW5zb3JWZWxvY2l0eShzcGVlZCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICByZXR1cm4gU2NhbGVOYXRpdmVVbml0c1RvUnBtKG1fZmVlZGJhY2tEZXZpY2UsIHNwZWVkKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHdoYXRldmVyIGlzIGluIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbiwgcmVnYXJkbGVzcyBvZgorICogd2hldGhlciBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KKyAqCisgKiBAcmV0dXJucyBUaGUgMjRiaXQgYW5hbG9nIHZhbHVlLiAgVGhlIGJvdHRvbSB0ZW4gYml0cyBpcyB0aGUgQURDICgwIC0gMTAyMykKKyAqICAgICAgICAgIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KKyAqICAgICAgICAgIFRoZSB1cHBlciAxNCBiaXRzIHRyYWNrcyB0aGUgb3ZlcmZsb3dzIGFuZAorICogdW5kZXJmbG93cyAoY29udGludW91cyBzZW5zb3IpLgorICovCitpbnQgQ0FOVGFsb246OkdldEFuYWxvZ0luKCkgY29uc3QgeworICBpbnQgcG9zaXRpb247CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0QW5hbG9nSW5XaXRoT3YocG9zaXRpb24pOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgcmV0dXJuIHBvc2l0aW9uOworfQorCit2b2lkIENBTlRhbG9uOjpTZXRBbmFsb2dQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24pIHsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRQYXJhbShDYW5UYWxvblNSWDo6ZUFpblBvc2l0aW9uLCBuZXdQb3NpdGlvbik7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorLyoqCisgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHdoYXRldmVyIGlzIGluIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbiwgcmVnYXJkbGVzcyBvZgorICogd2hldGhlciBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KKyAqCisgKiBAcmV0dXJucyBUaGUgQURDICgwIC0gMTAyMykgb24gYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24uCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0QW5hbG9nSW5SYXcoKSBjb25zdCB7IHJldHVybiBHZXRBbmFsb2dJbigpICYgMHgzRkY7IH0KKy8qKgorICogR2V0IHRoZSBwb3NpdGlvbiBvZiB3aGF0ZXZlciBpcyBpbiB0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24sIHJlZ2FyZGxlc3Mgb2YKKyAqIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCisgKgorICogQHJldHVybnMgVGhlIHZhbHVlICgwIC0gMTAyMykgb24gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLgorICovCitpbnQgQ0FOVGFsb246OkdldEFuYWxvZ0luVmVsKCkgY29uc3QgeworICBpbnQgdmVsOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEFuYWxvZ0luVmVsKHZlbCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICByZXR1cm4gdmVsOworfQorCisvKioKKyAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgorICoKKyAqIEByZXR1cm5zIFRoZSB2YWx1ZSAoMCAtIDEwMjMpIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRFbmNQb3NpdGlvbigpIGNvbnN0IHsKKyAgaW50IHBvc2l0aW9uOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldEVuY1Bvc2l0aW9uKHBvc2l0aW9uKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHJldHVybiBwb3NpdGlvbjsKK30KK3ZvaWQgQ0FOVGFsb246OlNldEVuY1Bvc2l0aW9uKGludCBuZXdQb3NpdGlvbikgeworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldFBhcmFtKENhblRhbG9uU1JYOjplRW5jUG9zaXRpb24sIG5ld1Bvc2l0aW9uKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBwb3NpdGlvbiBvZiB3aGF0ZXZlciBpcyBpbiB0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24sIHJlZ2FyZGxlc3Mgb2YKKyAqIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCisgKgorICogQHJldHVybnMgVGhlIHZhbHVlICgwIC0gMTAyMykgb24gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLgorICovCitpbnQgQ0FOVGFsb246OkdldEVuY1ZlbCgpIGNvbnN0IHsKKyAgaW50IHZlbDsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRFbmNWZWwodmVsKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHJldHVybiB2ZWw7Cit9CitpbnQgQ0FOVGFsb246OkdldFB1bHNlV2lkdGhQb3NpdGlvbigpIGNvbnN0IHsKKyAgaW50IHBhcmFtOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFB1bHNlV2lkdGhQb3NpdGlvbihwYXJhbSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpCisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiBwYXJhbTsKK30KK3ZvaWQgQ0FOVGFsb246OlNldFB1bHNlV2lkdGhQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24pCit7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UGFyYW0oQ2FuVGFsb25TUlg6OmVQd2RQb3NpdGlvbiwgbmV3UG9zaXRpb24pOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KK2ludCBDQU5UYWxvbjo6R2V0UHVsc2VXaWR0aFZlbG9jaXR5KCljb25zdAoreworICBpbnQgcGFyYW07CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0UHVsc2VXaWR0aFZlbG9jaXR5KHBhcmFtKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHBhcmFtOworfQoraW50IENBTlRhbG9uOjpHZXRQdWxzZVdpZHRoUmlzZVRvRmFsbFVzKCljb25zdAoreworICBpbnQgcGFyYW07CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0UHVsc2VXaWR0aFJpc2VUb0ZhbGxVcyhwYXJhbSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpCisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiBwYXJhbTsKK30KK2ludCBDQU5UYWxvbjo6R2V0UHVsc2VXaWR0aFJpc2VUb1Jpc2VVcygpY29uc3QKK3sKKyAgaW50IHBhcmFtOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFB1bHNlV2lkdGhSaXNlVG9SaXNlVXMocGFyYW0pOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKQorICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcGFyYW07Cit9CisvKioKKyAqIEBwYXJhbSB3aGljaCBmZWVkYmFjayBzZW5zb3IgdG8gY2hlY2sgaXQgaWYgaXMgY29ubmVjdGVkLgorICogQHJldHVybiBzdGF0dXMgb2YgY2FsbGVyJ3Mgc3BlY2lmaWVkIHNlbnNvciB0eXBlLgorICovCitDQU5UYWxvbjo6RmVlZGJhY2tEZXZpY2VTdGF0dXMgQ0FOVGFsb246OklzU2Vuc29yUHJlc2VudChGZWVkYmFja0RldmljZSBmZWVkYmFja0RldmljZSljb25zdAoreworICBGZWVkYmFja0RldmljZVN0YXR1cyByZXR2YWwgPSBGZWVkYmFja1N0YXR1c1Vua25vd247CisgIGludCBwYXJhbTsKKyAgLyogZGV0ZWN0aW5nIHNlbnNvciBoZWFsdGggZGVwZW5kcyBvbiB3aGljaCBzZW5zb3IgY2FsbGVyIGNhcmVzIGFib3V0ICovCisgIHN3aXRjaCAoZmVlZGJhY2tEZXZpY2UpIHsKKyAgICBjYXNlIFF1YWRFbmNvZGVyOgorICAgIGNhc2UgQW5hbG9nUG90OgorICAgIGNhc2UgQW5hbG9nRW5jb2RlcjoKKyAgICBjYXNlIEVuY1Jpc2luZzoKKyAgICBjYXNlIEVuY0ZhbGxpbmc6CisgICAgICAvKiBubyByZWFsIGdvb2Qgd2F5IHRvIHRlbGwgaWYgdGhlc2Ugc2Vuc29yCisgICAgICAgIGFyZSBhY3R1YWxseSBwcmVzZW50IHNvIHJldHVybiBzdGF0dXMgdW5rbm93bi4gKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUHVsc2VXaWR0aDoKKyAgICBjYXNlIEN0cmVNYWdFbmNvZGVyX1JlbGF0aXZlOgorICAgIGNhc2UgQ3RyZU1hZ0VuY29kZXJfQWJzb2x1dGU6CisgICAgICAvKiBhbGwgb2YgdGhlc2UgcmVxdWlyZSBwdWxzZSB3aWR0aCBzaWduYWwgdG8gYmUgcHJlc2VudC4gKi8KKyAgICAgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+SXNQdWxzZVdpZHRoU2Vuc29yUHJlc2VudChwYXJhbSk7CisgICAgICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgICAgIC8qIHdlJ3JlIG5vdCBnZXR0aW5nIHN0YXR1cyBpbmZvLCBzaWduYWwgdW5rbm93biBzdGF0dXMgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHBhcmFtIGlzIHVwZGF0ZWQgKi8KKyAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgLyogcHVsc2Ugc2lnbmFsIGlzIHByZXNlbnQsIHNlbnNvciBtdXN0IGJlIHdvcmtpbmcgc2luY2UgaXQgYWx3YXlzCisgICAgICAgICAgICBnZW5lcmF0ZXMgYSBwdWxzZSB3YXZlZm9ybS4qLworICAgICAgICAgIHJldHZhbCA9IEZlZWRiYWNrU3RhdHVzUHJlc2VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBubyBwdWxzZSBwcmVzZW50LCBzZW5zb3IgZGlzY29ubmVjdGVkICovCisgICAgICAgICAgcmV0dmFsID0gRmVlZGJhY2tTdGF0dXNOb3RQcmVzZW50OworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBAcmV0dXJuIElPIGxldmVsIG9mIFFVQURBIHBpbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRQaW5TdGF0ZVF1YWRBKCkgY29uc3QgeworICBpbnQgcmV0dmFsOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFF1YWRBcGluKHJldHZhbCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICByZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBAcmV0dXJuIElPIGxldmVsIG9mIFFVQURCIHBpbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRQaW5TdGF0ZVF1YWRCKCkgY29uc3QgeworICBpbnQgcmV0dmFsOworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPkdldFF1YWRCcGluKHJldHZhbCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICByZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBAcmV0dXJuIElPIGxldmVsIG9mIFFVQUQgSW5kZXggcGluLgorICovCitpbnQgQ0FOVGFsb246OkdldFBpblN0YXRlUXVhZElkeCgpIGNvbnN0IHsKKyAgaW50IHJldHZhbDsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRRdWFkSWR4cGluKHJldHZhbCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICByZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBAcmV0dXJuICcxJyBpZmYgZm9yd2FyZCBsaW1pdCBzd2l0Y2ggaXMgY2xvc2VkLCAwIGlmZiBzd2l0Y2ggaXMgb3Blbi4KKyAqIFRoaXMgZnVuY3Rpb24gd29ya3MgcmVnYXJkbGVzcyBpZiBsaW1pdCBzd2l0Y2ggZmVhdHVyZSBpcyBlbmFibGVkLgorICovCitpbnQgQ0FOVGFsb246OklzRndkTGltaXRTd2l0Y2hDbG9zZWQoKSBjb25zdCB7CisgIGludCByZXR2YWw7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0TGltaXRTd2l0Y2hDbG9zZWRGb3IoCisgICAgICByZXR2YWwpOyAvKiByZW5hbWUgdGhpcyBmdW5jLCAnMScgPT4gb3BlbiwgJzAnID0+IGNsb3NlZCAqLworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgcmV0dXJuIHJldHZhbCA/IDAgOiAxOworfQorLyoqCisgKiBAcmV0dXJuICcxJyBpZmYgcmV2ZXJzZSBsaW1pdCBzd2l0Y2ggaXMgY2xvc2VkLCAwIGlmZiBzd2l0Y2ggaXMgb3Blbi4KKyAqIFRoaXMgZnVuY3Rpb24gd29ya3MgcmVnYXJkbGVzcyBpZiBsaW1pdCBzd2l0Y2ggZmVhdHVyZSBpcyBlbmFibGVkLgorICovCitpbnQgQ0FOVGFsb246OklzUmV2TGltaXRTd2l0Y2hDbG9zZWQoKSBjb25zdCB7CisgIGludCByZXR2YWw7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+R2V0TGltaXRTd2l0Y2hDbG9zZWRSZXYoCisgICAgICByZXR2YWwpOyAvKiByZW5hbWUgdGhpcyBmdW5jLCAnMScgPT4gb3BlbiwgJzAnID0+IGNsb3NlZCAqLworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgcmV0dXJuIHJldHZhbCA/IDAgOiAxOworfQorLyoKKyAqIFNpbXBsZSBhY2Nlc3NvciBmb3IgdHJhY2tlZCByaXNlIGV2ZW50c28gaW5kZXggcGluLgorICogQHJldHVybiBudW1iZXIgb2YgcmlzaW5nIGVkZ2VzIG9uIGlkeCBwaW4uCisgKi8KK2ludCBDQU5UYWxvbjo6R2V0TnVtYmVyT2ZRdWFkSWR4UmlzZXMoKSBjb25zdCB7CisgIGludCByaXNlczsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRFbmNJbmRleFJpc2VFdmVudHMoCisgICAgICByaXNlcyk7IC8qIHJlbmFtZSB0aGlzIGZ1bmMsICcxJyA9PiBvcGVuLCAnMCcgPT4gY2xvc2VkICovCisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICByZXR1cm4gcmlzZXM7Cit9CisvKgorICogQHBhcmFtIHJpc2VzIGludGVncmFsIHZhbHVlIHRvIHNldCBpbnRvIGluZGV4LXJpc2VzIHJlZ2lzdGVyLiAgR3JlYXQgd2F5IHRvCisgKiB6ZXJvIHRoZSBpbmRleCBjb3VudC4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0TnVtYmVyT2ZRdWFkSWR4UmlzZXMoaW50IHJpc2VzKSB7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UGFyYW0oCisgICAgICBDYW5UYWxvblNSWDo6ZUVuY0luZGV4UmlzZUV2ZW50cywKKyAgICAgIHJpc2VzKTsgLyogcmVuYW1lIHRoaXMgZnVuYywgJzEnID0+IG9wZW4sICcwJyA9PiBjbG9zZWQgKi8KKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK2Jvb2wgQ0FOVGFsb246OkdldEZvcndhcmRMaW1pdE9LKCkgY29uc3QgeworICBpbnQgbGltU3dpdCA9IDA7CisgIGludCBzb2Z0TGltID0gMDsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gQ1RSX09LQVk7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfRm9yU29mdExpbShzb2Z0TGltKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfRm9yTGltKGxpbVN3aXQpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgLyogSWYgZWl0aGVyIGZhdWx0IGlzIGFzc2VydGVkLCBzaWduYWwgY2FsbGVyIHdlIGFyZSBkaXNhYmxlZCAod2l0aCBmYWxzZT8pICovCisgIHJldHVybiAoc29mdExpbSB8IGxpbVN3aXQpID8gZmFsc2UgOiB0cnVlOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK2Jvb2wgQ0FOVGFsb246OkdldFJldmVyc2VMaW1pdE9LKCkgY29uc3QgeworICBpbnQgbGltU3dpdCA9IDA7CisgIGludCBzb2Z0TGltID0gMDsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gQ1RSX09LQVk7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfUmV2U29mdExpbShzb2Z0TGltKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfUmV2TGltKGxpbVN3aXQpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KKyAgLyogSWYgZWl0aGVyIGZhdWx0IGlzIGFzc2VydGVkLCBzaWduYWwgY2FsbGVyIHdlIGFyZSBkaXNhYmxlZCAod2l0aCBmYWxzZT8pICovCisgIHJldHVybiAoc29mdExpbSB8IGxpbVN3aXQpID8gZmFsc2UgOiB0cnVlOworfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3VpbnQxNl90IENBTlRhbG9uOjpHZXRGYXVsdHMoKSBjb25zdCB7CisgIHVpbnQxNl90IHJldHZhbCA9IDA7CisgIGludCB2YWw7CisgIENUUl9Db2RlIHN0YXR1cyA9IENUUl9PS0FZOworCisgIC8qIHRlbXBlcmF0dXJlICovCisgIHZhbCA9IDA7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfT3ZlclRlbXAodmFsKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprVGVtcGVyYXR1cmVGYXVsdCA6IDA7CisKKyAgLyogdm9sdGFnZSAqLworICB2YWwgPSAwOworICBzdGF0dXMgPSBtX2ltcGwtPkdldEZhdWx0X1VuZGVyVm9sdGFnZSh2YWwpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKQorICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR2YWwgfD0gKHZhbCkgPyBDQU5TcGVlZENvbnRyb2xsZXI6OmtCdXNWb2x0YWdlRmF1bHQgOiAwOworCisgIC8qIGZ3ZC1saW1pdC1zd2l0Y2ggKi8KKyAgdmFsID0gMDsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXRGYXVsdF9Gb3JMaW0odmFsKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprRndkTGltaXRTd2l0Y2ggOiAwOworCisgIC8qIHJldi1saW1pdC1zd2l0Y2ggKi8KKyAgdmFsID0gMDsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXRGYXVsdF9SZXZMaW0odmFsKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprUmV2TGltaXRTd2l0Y2ggOiAwOworCisgIC8qIGZ3ZC1zb2Z0LWxpbWl0ICovCisgIHZhbCA9IDA7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfRm9yU29mdExpbSh2YWwpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKQorICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR2YWwgfD0gKHZhbCkgPyBDQU5TcGVlZENvbnRyb2xsZXI6OmtGd2RTb2Z0TGltaXQgOiAwOworCisgIC8qIHJldi1zb2Z0LWxpbWl0ICovCisgIHZhbCA9IDA7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0RmF1bHRfUmV2U29mdExpbSh2YWwpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKQorICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR2YWwgfD0gKHZhbCkgPyBDQU5TcGVlZENvbnRyb2xsZXI6OmtSZXZTb2Z0TGltaXQgOiAwOworCisgIHJldHVybiByZXR2YWw7Cit9Cit1aW50MTZfdCBDQU5UYWxvbjo6R2V0U3RpY2t5RmF1bHRzKCkgY29uc3QgeworICB1aW50MTZfdCByZXR2YWwgPSAwOworICBpbnQgdmFsOworICBDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKworICAvKiB0ZW1wZXJhdHVyZSAqLworICB2YWwgPSAwOworICBzdGF0dXMgPSBtX2ltcGwtPkdldFN0Y2t5RmF1bHRfT3ZlclRlbXAodmFsKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprVGVtcGVyYXR1cmVGYXVsdCA6IDA7CisKKyAgLyogdm9sdGFnZSAqLworICB2YWwgPSAwOworICBzdGF0dXMgPSBtX2ltcGwtPkdldFN0Y2t5RmF1bHRfVW5kZXJWb2x0YWdlKHZhbCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpCisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHZhbCB8PSAodmFsKSA/IENBTlNwZWVkQ29udHJvbGxlcjo6a0J1c1ZvbHRhZ2VGYXVsdCA6IDA7CisKKyAgLyogZndkLWxpbWl0LXN3aXRjaCAqLworICB2YWwgPSAwOworICBzdGF0dXMgPSBtX2ltcGwtPkdldFN0Y2t5RmF1bHRfRm9yTGltKHZhbCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpCisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHZhbCB8PSAodmFsKSA/IENBTlNwZWVkQ29udHJvbGxlcjo6a0Z3ZExpbWl0U3dpdGNoIDogMDsKKworICAvKiByZXYtbGltaXQtc3dpdGNoICovCisgIHZhbCA9IDA7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0U3Rja3lGYXVsdF9SZXZMaW0odmFsKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprUmV2TGltaXRTd2l0Y2ggOiAwOworCisgIC8qIGZ3ZC1zb2Z0LWxpbWl0ICovCisgIHZhbCA9IDA7CisgIHN0YXR1cyA9IG1faW1wbC0+R2V0U3Rja3lGYXVsdF9Gb3JTb2Z0TGltKHZhbCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpCisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHZhbCB8PSAodmFsKSA/IENBTlNwZWVkQ29udHJvbGxlcjo6a0Z3ZFNvZnRMaW1pdCA6IDA7CisKKyAgLyogcmV2LXNvZnQtbGltaXQgKi8KKyAgdmFsID0gMDsKKyAgc3RhdHVzID0gbV9pbXBsLT5HZXRTdGNreUZhdWx0X1JldlNvZnRMaW0odmFsKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dmFsIHw9ICh2YWwpID8gQ0FOU3BlZWRDb250cm9sbGVyOjprUmV2U29mdExpbWl0IDogMDsKKworICByZXR1cm4gcmV0dmFsOworfQordm9pZCBDQU5UYWxvbjo6Q2xlYXJTdGlja3lGYXVsdHMoKSB7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+Q2xlYXJTdGlja3lGYXVsdHMoKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBtYXhpbXVtIHZvbHRhZ2UgY2hhbmdlIHJhdGUuICBUaGlzIHJhbXAgcmF0ZSBpcyBpbiBhZmZlY3QgcmVnYXJkbGVzcworICogb2Ygd2hpY2ggY29udHJvbCBtb2RlCisgKiB0aGUgVEFMT04gaXMgaW4uCisgKgorICogV2hlbiBpbiBQZXJjZW50VmJ1cyBvciBWb2x0YWdlIG91dHB1dCBtb2RlLCB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgdm9sdGFnZQorICogY2hhbmdlcyBjYW4KKyAqIGJlIGxpbWl0ZWQgdG8gcmVkdWNlIGN1cnJlbnQgc3Bpa2VzLiAgU2V0IHRoaXMgdG8gMC4wIHRvIGRpc2FibGUgcmF0ZQorICogbGltaXRpbmcuCisgKgorICogQHBhcmFtIHJhbXBSYXRlIFRoZSBtYXhpbXVtIHJhdGUgb2Ygdm9sdGFnZSBjaGFuZ2UgaW4gUGVyY2VudCBWb2x0YWdlIG1vZGUgaW4KKyAqIFYvcy4KKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0Vm9sdGFnZVJhbXBSYXRlKGRvdWJsZSByYW1wUmF0ZSkgeworICAvKiBDYWxsZXIgaXMgZXhwcmVzc2luZyByYW1wIGFzIFZvbHRhZ2UgcGVyIHNlYywgYXNzdW1pbmcgMTJWIGlzIGZ1bGwuCisgICAgICAgICAgVGFsb24ncyB0aHJvdHRsZSByYW1wIGlzIGluIGRUaHJvdC9kMTBtcy4gIDEwMjMgaXMgZnVsbCBmd2QsIC0xMDIzIGlzCisgICAgIGZ1bGwgcmV2LiAqLworICBkb3VibGUgcmFtcFJhdGVkVGhyb3RQZXIxMG1zID0gKHJhbXBSYXRlICogMTAyMy4wIC8gMTIuMCkgLyAxMDA7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+U2V0UmFtcFRocm90dGxlKChpbnQpcmFtcFJhdGVkVGhyb3RQZXIxMG1zKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9Cit2b2lkIENBTlRhbG9uOjpTZXRWb2x0YWdlQ29tcGVuc2F0aW9uUmFtcFJhdGUoZG91YmxlIHJhbXBSYXRlKSB7CisgIC8qIHdoZW4gaW4gdm9sdGFnZSBjb21wZW5zYXRpb24gbW9kZSwgdGhlIHZvbHRhZ2UgY29tcGVuc2F0aW9uIHJhdGUKKyAgICBkaXJlY3RseSBjYXBzIHRoZSBjaGFuZ2UgaW4gdGFyZ2V0IHZvbHRhZ2UgKi8KKyAgQ1RSX0NvZGUgc3RhdHVzID0gQ1RSX09LQVk7CisgIHN0YXR1cyA9IG1faW1wbC0+U2V0Vm9sdGFnZUNvbXBlbnNhdGlvblJhdGUocmFtcFJhdGUgLyAxMDAwKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisvKioKKyAqIFNldHMgYSB2b2x0YWdlIGNoYW5nZSByYXRlIHRoYXQgYXBwbGllcyBvbmx5IHdoZW4gYSBjbG9zZSBsb29wIGNvbnRvcmwgbW9kZQorICogaXMgZW5hYmxlZC4KKyAqIFRoaXMgYWxsb3dzIGNsb3NlIGxvb3Agc3BlY2lmaWMgcmFtcCBiZWhhdmlvci4KKyAqCisgKiBAcGFyYW0gcmFtcFJhdGUgVGhlIG1heGltdW0gcmF0ZSBvZiB2b2x0YWdlIGNoYW5nZSBpbiBQZXJjZW50IFZvbHRhZ2UgbW9kZSBpbgorICogVi9zLgorICovCit2b2lkIENBTlRhbG9uOjpTZXRDbG9zZUxvb3BSYW1wUmF0ZShkb3VibGUgcmFtcFJhdGUpIHsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRDbG9zZUxvb3BSYW1wUmF0ZSgKKyAgICAgIG1fcHJvZmlsZSwgcmFtcFJhdGUgKiAxMDIzLjAgLyAxMi4wIC8gMTAwMC4wKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgdmVyc2lvbiBvZiB0aGUgZmlybXdhcmUgcnVubmluZyBvbiB0aGUgVGFsb24KKyAqLwordWludDMyX3QgQ0FOVGFsb246OkdldEZpcm13YXJlVmVyc2lvbigpIGNvbnN0IHsKKyAgaW50IGZpcm13YXJlVmVyc2lvbjsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5SZXF1ZXN0UGFyYW0oQ2FuVGFsb25TUlg6OmVGaXJtVmVycyk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICB1c2xlZXAoa0RlbGF5Rm9yU29saWNpdGVkU2lnbmFsc1VzKTsKKyAgc3RhdHVzID0KKyAgICAgIG1faW1wbC0+R2V0UGFyYW1SZXNwb25zZUludDMyKENhblRhbG9uU1JYOjplRmlybVZlcnMsIGZpcm13YXJlVmVyc2lvbik7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorCisgIC8qIG9ubHkgc2VudCBvbmNlIG9uIGJvb3QgKi8KKyAgLy8gQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRGaXJtVmVycyhmaXJtd2FyZVZlcnNpb24pOworICAvLyBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgIC8vICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgLy99CisKKyAgcmV0dXJuIGZpcm13YXJlVmVyc2lvbjsKK30KKy8qKgorICogQHJldHVybiBUaGUgYWNjdW11bGF0b3IgZm9yIEkgZ2Fpbi4KKyAqLworaW50IENBTlRhbG9uOjpHZXRJYWNjdW0oKSBjb25zdCB7CisgIENUUl9Db2RlIHN0YXR1cyA9IG1faW1wbC0+UmVxdWVzdFBhcmFtKENhblRhbG9uU1JYOjplUGlkSWFjY3VtKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHVzbGVlcChrRGVsYXlGb3JTb2xpY2l0ZWRTaWduYWxzVXMpOyAvKiBzbWFsbCB5aWVsZCBmb3IgZ2V0dGluZyByZXNwb25zZSAqLworICBpbnQgaWFjY3VtOworICBzdGF0dXMgPSBtX2ltcGwtPkdldFBhcmFtUmVzcG9uc2VJbnQzMihDYW5UYWxvblNSWDo6ZVBpZElhY2N1bSwgaWFjY3VtKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHJldHVybiBpYWNjdW07Cit9CisvKioKKyAqIENsZWFyIHRoZSBhY2N1bXVsYXRvciBmb3IgSSBnYWluLgorICovCit2b2lkIENBTlRhbG9uOjpDbGVhcklhY2N1bSgpIHsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5TZXRQYXJhbShDYW5UYWxvblNSWDo6ZVBpZElhY2N1bSwgMCk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ05ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG1vZGUpIHsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gQ1RSX09LQVk7CisgIHN3aXRjaCAobW9kZSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBrTmV1dHJhbE1vZGVfSnVtcGVyOiAvKiB1c2UgZGVmYXVsdCBzZXR0aW5nIGluIGZsYXNoIGJhc2VkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJkYXNoL0JyYWtlQ2FsIGJ1dHRvbiBzZWxlY3Rpb24gKi8KKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVCcmFrZVR5cGUoCisgICAgICAgICAgQ2FuVGFsb25TUlg6OmtCcmFrZU92ZXJyaWRlX1VzZURlZmF1bHRzRnJvbUZsYXNoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga05ldXRyYWxNb2RlX0JyYWtlOgorICAgICAgc3RhdHVzID0gbV9pbXBsLT5TZXRPdmVycmlkZUJyYWtlVHlwZSgKKyAgICAgICAgICBDYW5UYWxvblNSWDo6a0JyYWtlT3ZlcnJpZGVfT3ZlcnJpZGVCcmFrZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtOZXV0cmFsTW9kZV9Db2FzdDoKKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVCcmFrZVR5cGUoCisgICAgICAgICAgQ2FuVGFsb25TUlg6OmtCcmFrZU92ZXJyaWRlX092ZXJyaWRlQ29hc3QpOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisvKioKKyAqIEByZXR1cm4gbm9uemVybyBpZiBicmFrZSBpcyBlbmFibGVkIGR1cmluZyBuZXV0cmFsLiAgWmVybyBpZiBjb2FzdCBpcyBlbmFibGVkCisgKiBkdXJpbmcgbmV1dHJhbC4KKyAqLworaW50IENBTlRhbG9uOjpHZXRCcmFrZUVuYWJsZUR1cmluZ05ldXRyYWwoKSBjb25zdCB7CisgIGludCBicmFrZUVuID0gMDsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gbV9pbXBsLT5HZXRCcmFrZUlzRW5hYmxlZChicmFrZUVuKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHJldHVybiBicmFrZUVuOworfQorLyoqCisgKiBDb25maWd1cmUgaG93IG1hbnkgY29kZXMgcGVyIHJldm9sdXRpb24gYXJlIGdlbmVyYXRlZCBieSB5b3VyIGVuY29kZXIuCisgKgorICogQHBhcmFtIGNvZGVzUGVyUmV2IFRoZSBudW1iZXIgb2YgY291bnRzIHBlciByZXZvbHV0aW9uLgorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYodWludDE2X3QgY29kZXNQZXJSZXYpIHsKKyAgLyogZmlyc3Qgc2F2ZSB0aGUgc2NhbGFyIHNvIHRoYXQgYWxsIGdldHRlcnMvc2V0dGVyIHdvcmsgYXMgdGhlIHVzZXIgZXhwZWN0cyAqLworICBtX2NvZGVzUGVyUmV2ID0gY29kZXNQZXJSZXY7CisgIC8qIG5leHQgc2VuZCB0aGUgc2NhbGFyIHRvIHRoZSBUYWxvbiBvdmVyIENBTi4gIFRoaXMgaXMgc28gdGhhdCB0aGUgVGFsb24gY2FuIHJlcG9ydAorICAgIGl0IHRvIHdob2V2ZXIgbmVlZHMgaXQsIGxpa2UgdGhlIHdlYmRhc2guICBEb24ndCBib3RoZXIgY2hlY2tpbmcgdGhlIHJldHVybiwKKyAgICB0aGlzIGlzIG9ubHkgZm9yIGluc3RydW1lbnRhdGlvbiBhbmQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgVGFsb24gZnVuY3Rpb25hbGl0eS4gKi8KKyAgKHZvaWQpbV9pbXBsLT5TZXRQYXJhbShDYW5UYWxvblNSWDo6ZU51bWJlckVuY29kZXJDUFIsIG1fY29kZXNQZXJSZXYpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIHR1cm5zIG9uIHRoZSBwb3RlbnRpb21ldGVyLgorICoKKyAqIEBwYXJhbSB0dXJucyBUaGUgbnVtYmVyIG9mIHR1cm5zIG9mIHRoZSBwb3RlbnRpb21ldGVyLgorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdQb3RlbnRpb21ldGVyVHVybnModWludDE2X3QgdHVybnMpIHsKKyAgLyogZmlyc3Qgc2F2ZSB0aGUgc2NhbGFyIHNvIHRoYXQgYWxsIGdldHRlcnMvc2V0dGVyIHdvcmsgYXMgdGhlIHVzZXIgZXhwZWN0cyAqLworICBtX251bVBvdFR1cm5zID0gdHVybnM7CisgIC8qIG5leHQgc2VuZCB0aGUgc2NhbGFyIHRvIHRoZSBUYWxvbiBvdmVyIENBTi4gIFRoaXMgaXMgc28gdGhhdCB0aGUgVGFsb24gY2FuIHJlcG9ydAorICAgIGl0IHRvIHdob2V2ZXIgbmVlZHMgaXQsIGxpa2UgdGhlIHdlYmRhc2guICBEb24ndCBib3RoZXIgY2hlY2tpbmcgdGhlIHJldHVybiwKKyAgICB0aGlzIGlzIG9ubHkgZm9yIGluc3RydW1lbnRhdGlvbiBhbmQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgVGFsb24gZnVuY3Rpb25hbGl0eS4gKi8KKyAgKHZvaWQpbV9pbXBsLT5TZXRQYXJhbShDYW5UYWxvblNSWDo6ZU51bWJlclBvdFR1cm5zLCBtX251bVBvdFR1cm5zKTsKK30KKworLyoqCisgKiBAZGVwcmVjYXRlZCBub3QgaW1wbGVtZW50ZWQKKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnU29mdFBvc2l0aW9uTGltaXRzKGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmV2ZXJzZUxpbWl0UG9zaXRpb24pIHsKKyAgQ29uZmlnTGltaXRNb2RlKGtMaW1pdE1vZGVfU29mdFBvc2l0aW9uTGltaXRzKTsKKyAgQ29uZmlnRm9yd2FyZExpbWl0KGZvcndhcmRMaW1pdFBvc2l0aW9uKTsKKyAgQ29uZmlnUmV2ZXJzZUxpbWl0KHJldmVyc2VMaW1pdFBvc2l0aW9uKTsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCit2b2lkIENBTlRhbG9uOjpEaXNhYmxlU29mdFBvc2l0aW9uTGltaXRzKCkgeworICBDb25maWdMaW1pdE1vZGUoa0xpbWl0TW9kZV9Td2l0Y2hJbnB1dHNPbmx5KTsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICogQ29uZmlndXJlcyB0aGUgc29mdCBsaW1pdCBlbmFibGUgKHdlYXIgbGV2ZWxlZCBwZXJzaXN0ZW50IG1lbW9yeSkuCisgKiBBbHNvIHNldHMgdGhlIGxpbWl0IHN3aXRjaCBvdmVycmlkZXMuCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ0xpbWl0TW9kZShMaW1pdE1vZGUgbW9kZSkgeworICBDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBrTGltaXRNb2RlX1N3aXRjaElucHV0c09ubHk6IC8qKiBPbmx5IHVzZSBzd2l0Y2hlcyBmb3IgbGltaXRzICovCisgICAgICAvKiB0dXJuIE9GRiBib3RoIGxpbWl0cy4gU1JYIGhhcyBpbmRpdmlkdWFsIGVuYWJsZXMgYW5kIHBvbGFyaXR5IGZvciBlYWNoCisgICAgICAgKiBsaW1pdCBzd2l0Y2guKi8KKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0Rm9yd2FyZFNvZnRFbmFibGUoZmFsc2UpOworICAgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIH0KKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0UmV2ZXJzZVNvZnRFbmFibGUoZmFsc2UpOworICAgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIH0KKyAgICAgIC8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKAorICAgICAgICAgIENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRW5hYmxlUmV2KTsKKyAgICAgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIGtMaW1pdE1vZGVfU29mdFBvc2l0aW9uTGltaXRzOiAvKiogVXNlIGJvdGggc3dpdGNoZXMgYW5kIHNvZnQgbGltaXRzICovCisgICAgICAvKiB0dXJuIG9uIGJvdGggbGltaXRzLiBTUlggaGFzIGluZGl2aWR1YWwgZW5hYmxlcyBhbmQgcG9sYXJpdHkgZm9yIGVhY2gKKyAgICAgICAqIGxpbWl0IHN3aXRjaC4qLworICAgICAgc3RhdHVzID0gbV9pbXBsLT5TZXRGb3J3YXJkU29mdEVuYWJsZSh0cnVlKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICB9CisgICAgICBzdGF0dXMgPSBtX2ltcGwtPlNldFJldmVyc2VTb2Z0RW5hYmxlKHRydWUpOworICAgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIH0KKyAgICAgIC8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKAorICAgICAgICAgIENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9FbmFibGVGd2RfRW5hYmxlUmV2KTsKKyAgICAgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2Uga0xpbWl0TW9kZV9TcnhEaXNhYmxlU3dpdGNoSW5wdXRzOiAvKiogZGlzYWJsZSBib3RoIGxpbWl0IHN3aXRjaGVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0IGxpbWl0cyAqLworICAgICAgLyogdHVybiBvbiBib3RoIGxpbWl0cy4gU1JYIGhhcyBpbmRpdmlkdWFsIGVuYWJsZXMgYW5kIHBvbGFyaXR5IGZvciBlYWNoCisgICAgICAgKiBsaW1pdCBzd2l0Y2guKi8KKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0Rm9yd2FyZFNvZnRFbmFibGUoZmFsc2UpOworICAgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIH0KKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0UmV2ZXJzZVNvZnRFbmFibGUoZmFsc2UpOworICAgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIH0KKyAgICAgIC8qIG92ZXJyaWRlIGVuYWJsZSB0aGUgbGltaXQgc3dpdGNoZXMsIHRoaXMgY2lyY3VtdmVudHMgdGhlIHdlYmRhc2ggKi8KKyAgICAgIHN0YXR1cyA9IG1faW1wbC0+U2V0T3ZlcnJpZGVMaW1pdFN3aXRjaEVuKAorICAgICAgICAgIENhblRhbG9uU1JYOjprTGltaXRTd2l0Y2hPdmVycmlkZV9EaXNhYmxlRndkX0Rpc2FibGVSZXYpOworICAgICAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnRm9yd2FyZExpbWl0KGRvdWJsZSBmb3J3YXJkTGltaXRQb3NpdGlvbikgeworICBDVFJfQ29kZSBzdGF0dXMgPSBDVFJfT0tBWTsKKyAgaW50MzJfdCBuYXRpdmVMaW1pdFBvcyA9IFNjYWxlUm90YXRpb25zVG9OYXRpdmVVbml0cyhtX2ZlZWRiYWNrRGV2aWNlLCBmb3J3YXJkTGltaXRQb3NpdGlvbik7CisgIHN0YXR1cyA9IG1faW1wbC0+U2V0Rm9yd2FyZFNvZnRMaW1pdChuYXRpdmVMaW1pdFBvcyk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorLyoqCisgKiBDaGFuZ2UgdGhlIGZ3ZCBsaW1pdCBzd2l0Y2ggc2V0dGluZyB0byBub3JtYWxseSBvcGVuIG9yIGNsb3NlZC4KKyAqIFRhbG9uIHdpbGwgZGlzYWJsZSBtb21lbnRhcmlsbHkgaWYgdGhlIFRhbG9uJ3MgY3VycmVudCBzZXR0aW5nCisgKiBpcyBkaXNzaW1pbGFyIHRvIHRoZSBjYWxsZXIncyByZXF1ZXN0ZWQgc2V0dGluZy4KKyAqCisgKiBTaW5jZSBUYWxvbiBzYXZlcyBzZXR0aW5nIHRvIGZsYXNoIHRoaXMgc2hvdWxkIG9ubHkgYWZmZWN0CisgKiBhIGdpdmVuIFRhbG9uIGluaXRpYWxseSBkdXJpbmcgcm9ib3QgaW5zdGFsbC4KKyAqCisgKiBAcGFyYW0gbm9ybWFsbHlPcGVuIHRydWUgZm9yIG5vcm1hbGx5IG9wZW4uICBmYWxzZSBmb3Igbm9ybWFsbHkgY2xvc2VkLgorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdGd2RMaW1pdFN3aXRjaE5vcm1hbGx5T3Blbihib29sIG5vcm1hbGx5T3BlbikgeworICBDVFJfQ29kZSBzdGF0dXMgPQorICAgICAgbV9pbXBsLT5TZXRQYXJhbShDYW5UYWxvblNSWDo6ZU9uQm9vdF9MaW1pdFN3aXRjaF9Gb3J3YXJkX05vcm1hbGx5Q2xvc2VkLAorICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxseU9wZW4gPyAwIDogMSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorLyoqCisgKiBDaGFuZ2UgdGhlIHJldiBsaW1pdCBzd2l0Y2ggc2V0dGluZyB0byBub3JtYWxseSBvcGVuIG9yIGNsb3NlZC4KKyAqIFRhbG9uIHdpbGwgZGlzYWJsZSBtb21lbnRhcmlsbHkgaWYgdGhlIFRhbG9uJ3MgY3VycmVudCBzZXR0aW5nCisgKiBpcyBkaXNzaW1pbGFyIHRvIHRoZSBjYWxsZXIncyByZXF1ZXN0ZWQgc2V0dGluZy4KKyAqCisgKiBTaW5jZSBUYWxvbiBzYXZlcyBzZXR0aW5nIHRvIGZsYXNoIHRoaXMgc2hvdWxkIG9ubHkgYWZmZWN0CisgKiBhIGdpdmVuIFRhbG9uIGluaXRpYWxseSBkdXJpbmcgcm9ib3QgaW5zdGFsbC4KKyAqCisgKiBAcGFyYW0gbm9ybWFsbHlPcGVuIHRydWUgZm9yIG5vcm1hbGx5IG9wZW4uICBmYWxzZSBmb3Igbm9ybWFsbHkgY2xvc2VkLgorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdSZXZMaW1pdFN3aXRjaE5vcm1hbGx5T3Blbihib29sIG5vcm1hbGx5T3BlbikgeworICBDVFJfQ29kZSBzdGF0dXMgPQorICAgICAgbV9pbXBsLT5TZXRQYXJhbShDYW5UYWxvblNSWDo6ZU9uQm9vdF9MaW1pdFN3aXRjaF9SZXZlcnNlX05vcm1hbGx5Q2xvc2VkLAorICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxseU9wZW4gPyAwIDogMSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdSZXZlcnNlTGltaXQoZG91YmxlIHJldmVyc2VMaW1pdFBvc2l0aW9uKSB7CisgIENUUl9Db2RlIHN0YXR1cyA9IENUUl9PS0FZOworICBpbnQzMl90IG5hdGl2ZUxpbWl0UG9zID0gU2NhbGVSb3RhdGlvbnNUb05hdGl2ZVVuaXRzKG1fZmVlZGJhY2tEZXZpY2UsIHJldmVyc2VMaW1pdFBvc2l0aW9uKTsKKyAgc3RhdHVzID0gbV9pbXBsLT5TZXRSZXZlcnNlU29mdExpbWl0KG5hdGl2ZUxpbWl0UG9zKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ01heE91dHB1dFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpIHsKKyAgLyogY29uZmlnIHBlYWsgdGhyb3R0bGUgd2hlbiBpbiBjbG9zZWQtbG9vcCBtb2RlIGluIHRoZSBmd2QgYW5kIHJldiBkaXJlY3Rpb24uICovCisgIENvbmZpZ1BlYWtPdXRwdXRWb2x0YWdlKHZvbHRhZ2UsIC12b2x0YWdlKTsKK30KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ1BlYWtPdXRwdXRWb2x0YWdlKGRvdWJsZSBmb3J3YXJkVm9sdGFnZSxkb3VibGUgcmV2ZXJzZVZvbHRhZ2UpIHsKKyAgLyogYm91bmRzIGNoZWNraW5nICovCisgIGlmIChmb3J3YXJkVm9sdGFnZSA+IDEyKQorICAgIGZvcndhcmRWb2x0YWdlID0gMTI7CisgIGVsc2UgaWYgKGZvcndhcmRWb2x0YWdlIDwgMCkKKyAgICBmb3J3YXJkVm9sdGFnZSA9IDA7CisgIGlmIChyZXZlcnNlVm9sdGFnZSA+IDApCisgICAgcmV2ZXJzZVZvbHRhZ2UgPSAwOworICBlbHNlIGlmIChyZXZlcnNlVm9sdGFnZSA8IC0xMikKKyAgICByZXZlcnNlVm9sdGFnZSA9IC0xMjsKKyAgLyogY29uZmlnIGNhbGxzICovCisgIENvbmZpZ1NldFBhcmFtZXRlcihDYW5UYWxvblNSWDo6ZVBlYWtQb3NPdXRwdXQsIDEwMjMgKiBmb3J3YXJkVm9sdGFnZSAvIDEyLjApOworICBDb25maWdTZXRQYXJhbWV0ZXIoQ2FuVGFsb25TUlg6OmVQZWFrTmVnT3V0cHV0LCAxMDIzICogcmV2ZXJzZVZvbHRhZ2UgLyAxMi4wKTsKK30KK3ZvaWQgQ0FOVGFsb246OkNvbmZpZ05vbWluYWxPdXRwdXRWb2x0YWdlKGRvdWJsZSBmb3J3YXJkVm9sdGFnZSxkb3VibGUgcmV2ZXJzZVZvbHRhZ2UpIHsKKyAgLyogYm91bmRzIGNoZWNraW5nICovCisgIGlmIChmb3J3YXJkVm9sdGFnZSA+IDEyKQorICAgIGZvcndhcmRWb2x0YWdlID0gMTI7CisgIGVsc2UgaWYgKGZvcndhcmRWb2x0YWdlIDwgMCkKKyAgICBmb3J3YXJkVm9sdGFnZSA9IDA7CisgIGlmIChyZXZlcnNlVm9sdGFnZSA+IDApCisgICAgcmV2ZXJzZVZvbHRhZ2UgPSAwOworICBlbHNlIGlmIChyZXZlcnNlVm9sdGFnZSA8IC0xMikKKyAgICByZXZlcnNlVm9sdGFnZSA9IC0xMjsKKyAgLyogY29uZmlnIGNhbGxzICovCisgIENvbmZpZ1NldFBhcmFtZXRlcihDYW5UYWxvblNSWDo6ZU5vbWluYWxQb3NPdXRwdXQsMTAyMypmb3J3YXJkVm9sdGFnZS8xMi4wKTsKKyAgQ29uZmlnU2V0UGFyYW1ldGVyKENhblRhbG9uU1JYOjplTm9taW5hbE5lZ091dHB1dCwxMDIzKnJldmVyc2VWb2x0YWdlLzEyLjApOworfQorLyoqCisgKiBHZW5lcmFsIHNldCBmcmFtZS4gIFNpbmNlIHRoZSBwYXJhbWV0ZXIgaXMgYSBnZW5lcmFsIGludGVncmFsIHR5cGUsIHRoaXMgY2FuCisgKiBiZSB1c2VkIGZvciB0ZXN0aW5nIGZ1dHVyZSBmZWF0dXJlcy4KKyAqLwordm9pZCBDQU5UYWxvbjo6Q29uZmlnU2V0UGFyYW1ldGVyKHVpbnQzMl90IHBhcmFtRW51bSwgZG91YmxlIHZhbHVlKSB7CisgIENUUl9Db2RlIHN0YXR1czsKKyAgLyogY29uZmlnIHBlYWsgdGhyb3R0bGUgd2hlbiBpbiBjbG9zZWQtbG9vcCBtb2RlIGluIHRoZSBwb3NpdGl2ZSBkaXJlY3Rpb24uICovCisgIHN0YXR1cyA9IG1faW1wbC0+U2V0UGFyYW0oKENhblRhbG9uU1JYOjpwYXJhbV90KXBhcmFtRW51bSx2YWx1ZSk7CisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorLyoqCisgKiBHZW5lcmFsIGdldCBmcmFtZS4gIFNpbmNlIHRoZSBwYXJhbWV0ZXIgaXMgYSBnZW5lcmFsIGludGVncmFsIHR5cGUsIHRoaXMgY2FuCisgKiBiZSB1c2VkIGZvciB0ZXN0aW5nIGZ1dHVyZSBmZWF0dXJlcy4KKyAqLworYm9vbCBDQU5UYWxvbjo6R2V0UGFyYW1ldGVyKHVpbnQzMl90IHBhcmFtRW51bSwgZG91YmxlICYgZHZhbHVlKSBjb25zdCB7CisgIGJvb2wgcmV0dmFsID0gdHJ1ZTsKKyAgLyogc2VuZCB0aGUgcmVxdWVzdCBmcmFtZSAqLworICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlJlcXVlc3RQYXJhbSgoQ2FuVGFsb25TUlg6OnBhcmFtX3QpcGFyYW1FbnVtKTsKKyAgaWYgKHN0YXR1cyAhPSBDVFJfT0tBWSkgeworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAgIHJldHZhbCA9IGZhbHNlOworICB9CisgIC8qIHNtYWxsIHlpZWxkIGZvciBnZXR0aW5nIHJlc3BvbnNlICovCisgIHVzbGVlcChrRGVsYXlGb3JTb2xpY2l0ZWRTaWduYWxzVXMpOworICAvKiBnZXQgdGhlIGxhc3QgcmVjZWl2ZWQgdXBkYXRlICovCisgIHN0YXR1cyA9IG1faW1wbC0+R2V0UGFyYW1SZXNwb25zZSgoQ2FuVGFsb25TUlg6OnBhcmFtX3QpcGFyYW1FbnVtLCBkdmFsdWUpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgcmV0dmFsID0gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBUT0RPIGRvY3VtZW50YXRpb24gKHNlZSBDQU5KYWd1YXIuY3BwKQorICovCit2b2lkIENBTlRhbG9uOjpDb25maWdGYXVsdFRpbWUoZmxvYXQgZmF1bHRUaW1lKSB7CisgIC8qIFNSWCBkb2VzIG5vdCBoYXZlIGZhdWx0IHRpbWUuICBTUlggbW90b3IgZHJpdmUgaXMgb25seSBkaXNhYmxlZCBmb3Igc29mdAorICAgKiBsaW1pdHMgYW5kIGxpbWl0LXN3aXRjaCBmYXVsdHMuICovCisgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJGYXVsdCBUaW1lIG5vdCBzdXBwb3J0ZWQuIik7Cit9CisKKy8qKgorICogRml4dXAgdGhlIHNlbmRNb2RlIHNvIFNldCgpIHNlcmlhbGl6ZXMgdGhlIGNvcnJlY3QgZGVtYW5kIHZhbHVlLgorICogQWxzbyBmaWxscyB0aGUgbW9kZVNlbGVjZXQgaW4gdGhlIGNvbnRyb2wgZnJhbWUgdG8gZGlzYWJsZWQuCisgKiBAcGFyYW0gbW9kZSBDb250cm9sIG1vZGUgdG8gdWx0aW1hdGVseSBlbnRlciBvbmNlIHVzZXIgY2FsbHMgU2V0KCkuCisgKiBAc2VlIFNldCgpCisgKi8KK3ZvaWQgQ0FOVGFsb246OkFwcGx5Q29udHJvbE1vZGUoQ0FOU3BlZWRDb250cm9sbGVyOjpDb250cm9sTW9kZSBtb2RlKSB7CisgIG1fY29udHJvbE1vZGUgPSBtb2RlOworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQ0FOVGFsb25TUlgsIG1fZGV2aWNlTnVtYmVyICsgMSwKKyAgICAgICAgICAgIG1vZGUpOworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIGtQZXJjZW50VmJ1czoKKyAgICAgIG1fc2VuZE1vZGUgPSBrVGhyb3R0bGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtDdXJyZW50OgorICAgICAgbV9zZW5kTW9kZSA9IGtDdXJyZW50TW9kZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1NwZWVkOgorICAgICAgbV9zZW5kTW9kZSA9IGtTcGVlZE1vZGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtQb3NpdGlvbjoKKyAgICAgIG1fc2VuZE1vZGUgPSBrUG9zaXRpb25Nb2RlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrVm9sdGFnZToKKyAgICAgIG1fc2VuZE1vZGUgPSBrVm9sdGFnZU1vZGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtGb2xsb3dlcjoKKyAgICAgIG1fc2VuZE1vZGUgPSBrRm9sbG93ZXJNb2RlOworICAgICAgYnJlYWs7CisgIH0KKyAgLy8gS2VlcCB0aGUgdGFsb24gZGlzYWJsZWQgdW50aWwgU2V0KCkgaXMgY2FsbGVkLgorICBDVFJfQ29kZSBzdGF0dXMgPSBtX2ltcGwtPlNldE1vZGVTZWxlY3QoKGludClrRGlzYWJsZWQpOworICBpZiAoc3RhdHVzICE9IENUUl9PS0FZKSB7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKy8qKgorICogVE9ETyBkb2N1bWVudGF0aW9uIChzZWUgQ0FOSmFndWFyLmNwcCkKKyAqLwordm9pZCBDQU5UYWxvbjo6U2V0Q29udHJvbE1vZGUoQ0FOU3BlZWRDb250cm9sbGVyOjpDb250cm9sTW9kZSBtb2RlKSB7CisgIGlmIChtX2NvbnRyb2xNb2RlID09IG1vZGUpIHsKKyAgICAvKiB3ZSBhbHJlYWR5IGFyZSBpbiB0aGlzIG1vZGUsIGRvbid0IHBlcmZvcm0gZGlzYWJsZSB3b3JrYXJvdW5kICovCisgIH0gZWxzZSB7CisgICAgQXBwbHlDb250cm9sTW9kZShtb2RlKTsKKyAgfQorfQorCisvKioKKyAqIFRPRE8gZG9jdW1lbnRhdGlvbiAoc2VlIENBTkphZ3Vhci5jcHApCisgKi8KK0NBTlNwZWVkQ29udHJvbGxlcjo6Q29udHJvbE1vZGUgQ0FOVGFsb246OkdldENvbnRyb2xNb2RlKCkgY29uc3QgeworICByZXR1cm4gbV9jb250cm9sTW9kZTsKK30KKwordm9pZCBDQU5UYWxvbjo6U2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSB7CisgIG1fc2FmZXR5SGVscGVyLT5TZXRFeHBpcmF0aW9uKHRpbWVvdXQpOworfQorCitmbG9hdCBDQU5UYWxvbjo6R2V0RXhwaXJhdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7Cit9CisKK2Jvb2wgQ0FOVGFsb246OklzQWxpdmUoKSBjb25zdCB7IHJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNBbGl2ZSgpOyB9CisKK2Jvb2wgQ0FOVGFsb246OklzU2FmZXR5RW5hYmxlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc1NhZmV0eUVuYWJsZWQoKTsKK30KKwordm9pZCBDQU5UYWxvbjo6U2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpIHsKKyAgbV9zYWZldHlIZWxwZXItPlNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgQ0FOVGFsb246OkdldERlc2NyaXB0aW9uKHN0ZDo6b3N0cmluZ3N0cmVhbSYgZGVzYykgY29uc3QgeworICBkZXNjIDw8ICJDQU5UYWxvbiBJRCAiIDw8ICBtX2RldmljZU51bWJlcjsKK30KKy8qKgorICogQHBhcmFtIGRldlRvTG9va3VwIEZlZWRiYWNrRGV2aWNlIHRvIGxvb2t1cCB0aGUgc2NhbGFyIGZvci4gIEJlY2F1c2UgVGFsb24KKyAqICAgICAgICAgICAgYWxsb3dzIG11bHRpcGxlIHNlbnNvcnMgdG8gYmUgYXR0YWNoZWQgc2ltdWx0YW5lb3VzbHksIGNhbGxlciBtdXN0CisgKiAgICAgICAgICAgIHNwZWNpZnkgd2hpY2ggc2Vuc29yIHRvIGxvb2t1cC4KKyAqIEByZXR1cm4gICAgVGhlIG51bWJlciBvZiBuYXRpdmUgVGFsb24gdW5pdHMgcGVyIHJvdGF0aW9uIG9mIHRoZSBzZWxlY3RlZCBzZW5zb3IuCisgKiAgICAgICAgICAgIFplcm8gaWYgdGhlIG5lY2Vzc2FyeSBzZW5zb3IgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KKyAqIEBzZWUgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2CisgKiBAc2VlIENvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucworICovCitkb3VibGUgQ0FOVGFsb246OkdldE5hdGl2ZVVuaXRzUGVyUm90YXRpb25TY2FsYXIoRmVlZGJhY2tEZXZpY2UgZGV2VG9Mb29rdXApY29uc3QKK3sKKyAgYm9vbCBzY2FsaW5nQXZhaWwgPSBmYWxzZTsKKyAgQ1RSX0NvZGUgc3RhdHVzID0gQ1RSX09LQVk7CisgIGRvdWJsZSByZXR2YWwgPSAwOworICBzd2l0Y2ggKGRldlRvTG9va3VwKSB7CisgICAgY2FzZSBRdWFkRW5jb2RlcjoKKyAgICB7IC8qIFdoZW4gY2FsbGVyIHdhbnRzIHRvIGxvb2t1cCBRdWFkcmF0dXJlLCB0aGUgUUVJIG1heSBiZSBpbiAxeCBpZiB0aGUgc2VsZWN0ZWQgZmVlZGJhY2sgaXMgZWRnZSBjb3VudGVyLgorICAgICAgICogQWRkaXRpb25hbGx5IGlmIHRoZSBxdWFkcmF0dXJlIHNvdXJjZSBpcyB0aGUgQ1RSRSBNYWcgZW5jb2RlciwgdGhlbiB0aGUgQ1BSIGlzIGtub3duLgorICAgICAgICogVGhpcyBpcyBuaWNlIGluIHRoYXQgdGhlIGNhbGxpbmcgYXBwIGRvZXMgbm90IHJlcXVpcmUga25vd2luZyB0aGUgQ1BSIGF0IGFsbC4KKyAgICAgICAqIFNvIGRvIGJvdGggY2hlY2tzIGhlcmUuCisgICAgICAgKi8KKyAgICAgIGludDMyX3QgcWVpUHVsc2VQZXJDb3VudCA9IDQ7IC8qIGRlZmF1bHQgdG8gNHggKi8KKyAgICAgIHN3aXRjaCAobV9mZWVkYmFja0RldmljZSkgeworICAgICAgICBjYXNlIEN0cmVNYWdFbmNvZGVyX1JlbGF0aXZlOgorICAgICAgICBjYXNlIEN0cmVNYWdFbmNvZGVyX0Fic29sdXRlOgorICAgICAgICAgIC8qIHdlIGFzc3VtZSB0aGUgcXVhZHJhdHVyZSBzaWduYWwgY29tZXMgZnJvbSB0aGUgTWFnRW5jLAorICAgICAgICAgICAgb2Ygd2hpY2ggd2Uga25vdyB0aGUgQ1BSIGFscmVhZHkgKi8KKyAgICAgICAgICByZXR2YWwgPSBrTmF0aXZlUHdkVW5pdHNQZXJSb3RhdGlvbjsKKyAgICAgICAgICBzY2FsaW5nQXZhaWwgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVuY1Jpc2luZzogLyogVGFsb24ncyBRRUkgaXMgc2V0dXAgZm9yIDF4LCBzbyBwZXJmb3JtIDF4IG1hdGggKi8KKyAgICAgICAgY2FzZSBFbmNGYWxsaW5nOgorICAgICAgICAgIHFlaVB1bHNlUGVyQ291bnQgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF1YWRFbmNvZGVyOiAvKiBUYWxvbidzIFFFSSBpcyA0eCAqLworICAgICAgICBkZWZhdWx0OiAvKiBwdWxzZSB3aWR0aCBhbmQgZXZlcnl0aGluZyBlbHNlLCBhc3N1bWUgaXRzIHJlZ3VsYXIgcXVhZCB1c2UuICovCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoc2NhbGluZ0F2YWlsKSB7CisgICAgICAgIC8qIGFscmVhZHkgZGVkdWNlZCB0aGUgc2NhbGFyIGFib3ZlLCB3ZSdyZSBkb25lLiAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogd2UgY291bGRuJ3QgZGVkdWNlIHRoZSBzY2FsYXIganVzdCBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uICovCisgICAgICAgIGlmICgwID09IG1fY29kZXNQZXJSZXYpIHsKKyAgICAgICAgICAvKiBjYWxsZXIgaGFzIG5ldmVyIHNldCB0aGUgQ1BSLiAgTW9zdCBsaWtlbHkgY2FsbGVyCisgICAgICAgICAgICBpcyBqdXN0IHVzaW5nIGVuZ2luZWVyaW5nIHVuaXRzIHNvIGZhbGwgdG8gdGhlCisgICAgICAgICAgICBib3R0b20gb2YgdGhpcyBmdW5jLiovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogVGFsb24gZXhwZWN0cyBQUFIgdW5pdHMgKi8KKyAgICAgICAgICByZXR2YWwgPSBxZWlQdWxzZVBlckNvdW50ICogbV9jb2Rlc1BlclJldjsKKyAgICAgICAgICBzY2FsaW5nQXZhaWwgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfSAgYnJlYWs7CisgICAgY2FzZSBFbmNSaXNpbmc6CisgICAgY2FzZSBFbmNGYWxsaW5nOgorICAgICAgaWYgKDAgPT0gbV9jb2Rlc1BlclJldikgeworICAgICAgICAvKiBjYWxsZXIgaGFzIG5ldmVyIHNldCB0aGUgQ1BSLiAgTW9zdCBsaWtlbHkgY2FsbGVyCisgICAgICAgICAgaXMganVzdCB1c2luZyBlbmdpbmVlcmluZyB1bml0cyBzbyBmYWxsIHRvIHRoZQorICAgICAgICAgIGJvdHRvbSBvZiB0aGlzIGZ1bmMuKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRhbG9uIGV4cGVjdHMgUFBSIHVuaXRzICovCisgICAgICAgIHJldHZhbCA9IDEgKiBtX2NvZGVzUGVyUmV2OworICAgICAgICBzY2FsaW5nQXZhaWwgPSB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBbmFsb2dQb3Q6CisgICAgY2FzZSBBbmFsb2dFbmNvZGVyOgorICAgICAgaWYgKDAgPT0gbV9udW1Qb3RUdXJucykgeworICAgICAgICAvKiBjYWxsZXIgaGFzIG5ldmVyIHNldCB0aGUgQ1BSLiAgTW9zdCBsaWtlbHkgY2FsbGVyCisgICAgICAgICAgaXMganVzdCB1c2luZyBlbmdpbmVlcmluZyB1bml0cyBzbyBmYWxsIHRvIHRoZQorICAgICAgICAgIGJvdHRvbSBvZiB0aGlzIGZ1bmMuKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHZhbCA9IChkb3VibGUpa05hdGl2ZUFkY1VuaXRzUGVyUm90YXRpb24gLyBtX251bVBvdFR1cm5zOworICAgICAgICBzY2FsaW5nQXZhaWwgPSB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDdHJlTWFnRW5jb2Rlcl9SZWxhdGl2ZToKKyAgICBjYXNlIEN0cmVNYWdFbmNvZGVyX0Fic29sdXRlOgorICAgIGNhc2UgUHVsc2VXaWR0aDoKKyAgICAgIHJldHZhbCA9IGtOYXRpdmVQd2RVbml0c1BlclJvdGF0aW9uOworICAgICAgc2NhbGluZ0F2YWlsID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICB9CisgIC8qIGhhbmRsZSBhbnkgZGV0ZWN0ZWQgZXJyb3JzICovCisgIGlmIChzdGF0dXMgIT0gQ1RSX09LQVkpIHsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorICAvKiBpZiBzY2FsaW5nIGluZm9ybWF0aW9uIGlzIG5vdCBwb3NzaWJsZSwgc2lnbmFsIGNhbGxlcgorICAgIGJ5IHJldHVybmluZyB6ZXJvICovCisgIGlmIChmYWxzZSA9PSBzY2FsaW5nQXZhaWwpCisgICAgcmV0dmFsID0gMDsKKyAgcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogQHBhcmFtIGZ1bGxSb3RhdGlvbnMgICBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2Ygcm90YXRpb25zIG9mIHNlbGVjdGVkIGZlZWRiYWNrIHNlbnNvci4KKyAqICAgICAgICAgICAgICBJZiB1c2VyIGhhcyBuZXZlciBjYWxsZWQgdGhlIGNvbmZpZyByb3V0aW5lIGZvciB0aGUgc2VsZWN0ZWQgc2Vuc29yLCB0aGVuIHRoZSBjYWxsZXIKKyAqICAgICAgICAgICAgICBpcyBsaWtlbHkgcGFzc2luZyByb3RhdGlvbnMgaW4gZW5naW5lZXJpbmcgdW5pdHMgYWxyZWFkeSwgaW4gd2hpY2ggY2FzZSBpdCBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIGFzIGlzLgorICogICAgICAgICAgICAgIEBzZWUgQ29uZmlnUG90ZW50aW9tZXRlclR1cm5zCisgKiAgICAgICAgICAgICAgQHNlZSBDb25maWdFbmNvZGVyQ29kZXNQZXJSZXYKKyAqIEByZXR1cm4gZnVsbFJvdGF0aW9ucyBpbiBuYXRpdmUgZW5naW5lZXJpbmcgdW5pdHMgb2YgdGhlIFRhbG9uIFNSWCBmaXJtd2FyZS4KKyAqLworaW50MzJfdCBDQU5UYWxvbjo6U2NhbGVSb3RhdGlvbnNUb05hdGl2ZVVuaXRzKEZlZWRiYWNrRGV2aWNlIGRldlRvTG9va3VwLGRvdWJsZSBmdWxsUm90YXRpb25zKWNvbnN0Cit7CisgIC8qIGZpcnN0IGFzc3VtZSB3ZSBkb24ndCBoYXZlIGNvbmZpZyBpbmZvLCBwcmVwIHRoZSBkZWZhdWx0IHJldHVybiAqLworICBpbnQzMl90IHJldHZhbCA9IChpbnQzMl90KWZ1bGxSb3RhdGlvbnM7CisgIC8qIHJldHJpZXZlIHNjYWxpbmcgaW5mbyAqLworICBkb3VibGUgc2NhbGFyID0gR2V0TmF0aXZlVW5pdHNQZXJSb3RhdGlvblNjYWxhcihkZXZUb0xvb2t1cCk7CisgIC8qIGFwcGx5IHNjYWxhciBpZiBpdHMgYXZhaWxhYmxlICovCisgIGlmIChzY2FsYXIgPiAwKQorICAgIHJldHZhbCA9IChpbnQzMl90KShmdWxsUm90YXRpb25zKnNjYWxhcik7CisgIHJldHVybiByZXR2YWw7Cit9CisvKioKKyAqIEBwYXJhbSBycG0gICBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2Ygcm90YXRpb25zIHBlciBtaW51dGUgb2Ygc2VsZWN0ZWQgZmVlZGJhY2sgc2Vuc29yLgorICogICAgICAgICAgICAgIElmIHVzZXIgaGFzIG5ldmVyIGNhbGxlZCB0aGUgY29uZmlnIHJvdXRpbmUgZm9yIHRoZSBzZWxlY3RlZCBzZW5zb3IsIHRoZW4gdGhlIGNhbGxlcgorICogICAgICAgICAgICAgIGlzIGxpa2VseSBwYXNzaW5nIHJvdGF0aW9ucyBpbiBlbmdpbmVlcmluZyB1bml0cyBhbHJlYWR5LCBpbiB3aGljaCBjYXNlIGl0IGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgYXMgaXMuCisgKiAgICAgICAgICAgICAgQHNlZSBDb25maWdQb3RlbnRpb21ldGVyVHVybnMKKyAqICAgICAgICAgICAgICBAc2VlIENvbmZpZ0VuY29kZXJDb2Rlc1BlclJldgorICogQHJldHVybiBzZW5zb3IgdmVsb2NpdHkgaW4gbmF0aXZlIGVuZ2luZWVyaW5nIHVuaXRzIG9mIHRoZSBUYWxvbiBTUlggZmlybXdhcmUuCisgKi8KK2ludDMyX3QgQ0FOVGFsb246OlNjYWxlVmVsb2NpdHlUb05hdGl2ZVVuaXRzKEZlZWRiYWNrRGV2aWNlIGRldlRvTG9va3VwLGRvdWJsZSBycG0pY29uc3QKK3sKKyAgLyogZmlyc3QgYXNzdW1lIHdlIGRvbid0IGhhdmUgY29uZmlnIGluZm8sIHByZXAgdGhlIGRlZmF1bHQgcmV0dXJuICovCisgIGludDMyX3QgcmV0dmFsID0gKGludDMyX3QpcnBtOworICAvKiByZXRyaWV2ZSBzY2FsaW5nIGluZm8gKi8KKyAgZG91YmxlIHNjYWxhciA9IEdldE5hdGl2ZVVuaXRzUGVyUm90YXRpb25TY2FsYXIoZGV2VG9Mb29rdXApOworICAvKiBhcHBseSBzY2FsYXIgaWYgaXRzIGF2YWlsYWJsZSAqLworICBpZiAoc2NhbGFyID4gMCkKKyAgICByZXR2YWwgPSAoaW50MzJfdCkocnBtICoga01pbnV0ZXNQZXIxMDBtc1VuaXQgKiBzY2FsYXIpOworICByZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBAcGFyYW0gbmF0aXZlUG9zICAgaW50ZWdyYWwgcG9zaXRpb24gb2YgdGhlIGZlZWRiYWNrIHNlbnNvciBpbiBuYXRpdmUgVGFsb24gU1JYIHVuaXRzLgorICogICAgICAgICAgICAgIElmIHVzZXIgaGFzIG5ldmVyIGNhbGxlZCB0aGUgY29uZmlnIHJvdXRpbmUgZm9yIHRoZSBzZWxlY3RlZCBzZW5zb3IsIHRoZW4gdGhlIHJldHVybgorICogICAgICAgICAgICAgIHdpbGwgYmUgaW4gVEFMT04gU1JYIHVuaXRzIGFzIHdlbGwgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIGluIHRoZSAyMDE1IHNlYXNvbi4KKyAqICAgICAgICAgICAgICBAc2VlIENvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucworICogICAgICAgICAgICAgIEBzZWUgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2CisgKiBAcmV0dXJuIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIG9mIHJvdGF0aW9ucywgdW5sZXNzIGNvbmZpZyB3YXMgbmV2ZXIgcGVyZm9ybWVkLgorICovCitkb3VibGUgQ0FOVGFsb246OlNjYWxlTmF0aXZlVW5pdHNUb1JvdGF0aW9ucyhGZWVkYmFja0RldmljZSBkZXZUb0xvb2t1cCxpbnQzMl90IG5hdGl2ZVBvcyljb25zdAoreworICAvKiBmaXJzdCBhc3N1bWUgd2UgZG9uJ3QgaGF2ZSBjb25maWcgaW5mbywgcHJlcCB0aGUgZGVmYXVsdCByZXR1cm4gKi8KKyAgZG91YmxlIHJldHZhbCA9IChkb3VibGUpbmF0aXZlUG9zOworICAvKiByZXRyaWV2ZSBzY2FsaW5nIGluZm8gKi8KKyAgZG91YmxlIHNjYWxhciA9IEdldE5hdGl2ZVVuaXRzUGVyUm90YXRpb25TY2FsYXIoZGV2VG9Mb29rdXApOworICAvKiBhcHBseSBzY2FsYXIgaWYgaXRzIGF2YWlsYWJsZSAqLworICBpZiAoc2NhbGFyID4gMCkKKyAgICByZXR2YWwgPSAoKGRvdWJsZSluYXRpdmVQb3MpIC8gc2NhbGFyOworICByZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBAcGFyYW0gbmF0aXZlVmVsICAgaW50ZWdyYWwgdmVsb2NpdHkgb2YgdGhlIGZlZWRiYWNrIHNlbnNvciBpbiBuYXRpdmUgVGFsb24gU1JYIHVuaXRzLgorICogICAgICAgICAgICAgIElmIHVzZXIgaGFzIG5ldmVyIGNhbGxlZCB0aGUgY29uZmlnIHJvdXRpbmUgZm9yIHRoZSBzZWxlY3RlZCBzZW5zb3IsIHRoZW4gdGhlIHJldHVybgorICogICAgICAgICAgICAgIHdpbGwgYmUgaW4gVEFMT04gU1JYIHVuaXRzIGFzIHdlbGwgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIGluIHRoZSAyMDE1IHNlYXNvbi4KKyAqICAgICAgICAgICAgICBAc2VlIENvbmZpZ1BvdGVudGlvbWV0ZXJUdXJucworICogICAgICAgICAgICAgIEBzZWUgQ29uZmlnRW5jb2RlckNvZGVzUGVyUmV2CisgKiBAcmV0dXJuIGRvdWJsZSBwcmVjaXNpb24gb2Ygc2Vuc29yIHZlbG9jaXR5IGluIFJQTSwgdW5sZXNzIGNvbmZpZyB3YXMgbmV2ZXIgcGVyZm9ybWVkLgorICovCitkb3VibGUgQ0FOVGFsb246OlNjYWxlTmF0aXZlVW5pdHNUb1JwbShGZWVkYmFja0RldmljZSBkZXZUb0xvb2t1cCwgaW50MzJfdCBuYXRpdmVWZWwpY29uc3QKK3sKKyAgLyogZmlyc3QgYXNzdW1lIHdlIGRvbid0IGhhdmUgY29uZmlnIGluZm8sIHByZXAgdGhlIGRlZmF1bHQgcmV0dXJuICovCisgIGRvdWJsZSByZXR2YWwgPSAoZG91YmxlKW5hdGl2ZVZlbDsKKyAgLyogcmV0cmlldmUgc2NhbGluZyBpbmZvICovCisgIGRvdWJsZSBzY2FsYXIgPSBHZXROYXRpdmVVbml0c1BlclJvdGF0aW9uU2NhbGFyKGRldlRvTG9va3VwKTsKKyAgLyogYXBwbHkgc2NhbGFyIGlmIGl0cyBhdmFpbGFibGUgKi8KKyAgaWYgKHNjYWxhciA+IDApCisgICAgcmV0dmFsID0gKGRvdWJsZSkobmF0aXZlVmVsKSAvIChzY2FsYXIqa01pbnV0ZXNQZXIxMDBtc1VuaXQpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIEVuYWJsZXMgVGFsb24gU1JYIHRvIGF1dG9tYXRpY2FsbHkgemVybyB0aGUgU2Vuc29yIFBvc2l0aW9uIHdoZW5ldmVyIGFuCisgKiBlZGdlIGlzIGRldGVjdGVkIG9uIHRoZSBpbmRleCBzaWduYWwuCisgKiBAcGFyYW0gZW5hYmxlICAgICBib29sZWFuIGlucHV0LCBwYXNzIHRydWUgdG8gZW5hYmxlIGZlYXR1cmUgb3IgZmFsc2UgdG8gZGlzYWJsZS4KKyAqIEBwYXJhbSByaXNpbmdFZGdlICAgYm9vbGVhbiBpbnB1dCwgcGFzcyB0cnVlIHRvIGNsZWFyIHRoZSBwb3NpdGlvbiBvbiByaXNpbmcgZWRnZSwKKyAqICAgICAgICAgIHBhc3MgZmFsc2UgdG8gY2xlYXIgdGhlIHBvc2l0aW9uIG9uIGZhbGxpbmcgZWRnZS4KKyAqLwordm9pZCBDQU5UYWxvbjo6RW5hYmxlWmVyb1NlbnNvclBvc2l0aW9uT25JbmRleChib29sIGVuYWJsZSwgYm9vbCByaXNpbmdFZGdlKQoreworICBpZiAoZW5hYmxlKSB7CisgICAgLyogZW5hYmxlIHRoZSBmZWF0dXJlLCB1cGRhdGUgdGhlIGVkZ2UgcG9sYXJpdHkgZmlyc3QgdG8gZW5zdXJlCisgICAgICBpdCBpcyBjb3JyZWN0IGJlZm9yZSB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLiAqLworICAgIENvbmZpZ1NldFBhcmFtZXRlcihDYW5UYWxvblNSWDo6ZVF1YWRJZHhQb2xhcml0eSxyaXNpbmdFZGdlICA/IDEgOiAwKTsKKyAgICBDb25maWdTZXRQYXJhbWV0ZXIoQ2FuVGFsb25TUlg6OmVDbGVhclBvc2l0aW9uT25JZHgsMSk7CisgIH0gZWxzZSB7CisgICAgLyogZGlzYWJsZSB0aGUgZmVhdHVyZSBmaXJzdCwgdGhlbiB1cGRhdGUgdGhlIGVkZ2UgcG9sYXJpdHkuICovCisgICAgQ29uZmlnU2V0UGFyYW1ldGVyKENhblRhbG9uU1JYOjplQ2xlYXJQb3NpdGlvbk9uSWR4LDApOworICAgIENvbmZpZ1NldFBhcmFtZXRlcihDYW5UYWxvblNSWDo6ZVF1YWRJZHhQb2xhcml0eSxyaXNpbmdFZGdlICA/IDEgOiAwKTsKKyAgfQorfQorLyoqCisqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGludmVydGluZyBkaXJlY3Rpb24gb2YgYSBzcGVlZCBjb250cm9sbGVyLgorKiBPbmx5IHdvcmtzIGluIFBlcmNlbnRWYnVzLCBzcGVlZCwgYW5kIFZvbHRhZ2UgbW9kZXMuCisqIEBwYXJhbSBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCisqLwordm9pZCBDQU5UYWxvbjo6U2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSB7IG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7IH0KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciB0aGUgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCisgKgorICovCitib29sIENBTlRhbG9uOjpHZXRJbnZlcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJbnZlcnRlZDsgfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHN0b3BwaW5nIHRoZSBtb3RvcgorICogUGFydCBvZiB0aGUgTW90b3JTYWZldHkgaW50ZXJmYWNlCisgKgorICogQGRlcHJlY2F0ZWQgQ2FsbCBEaXNhYmxlIGluc3RlYWQuCisqLwordm9pZCBDQU5UYWxvbjo6U3RvcE1vdG9yKCkgeyBEaXNhYmxlKCk7IH0KKwordm9pZCBDQU5UYWxvbjo6VmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSB7CisgIGlmKGtleSA9PSAiTW9kZSIgJiYgdmFsdWUtPklzRG91YmxlKCkpIFNldENvbnRyb2xNb2RlKHN0YXRpY19jYXN0PENBTlNwZWVkQ29udHJvbGxlcjo6Q29udHJvbE1vZGU+KHZhbHVlLT5HZXREb3VibGUoKSkpOworICBpZihrZXkgPT0gInAiICYmIHZhbHVlLT5Jc0RvdWJsZSgpKSBTZXRQKHZhbHVlLT5HZXREb3VibGUoKSk7CisgIGlmKGtleSA9PSAiaSIgJiYgdmFsdWUtPklzRG91YmxlKCkpIFNldEkodmFsdWUtPkdldERvdWJsZSgpKTsKKyAgaWYoa2V5ID09ICJkIiAmJiB2YWx1ZS0+SXNEb3VibGUoKSkgU2V0RCh2YWx1ZS0+R2V0RG91YmxlKCkpOworICBpZihrZXkgPT0gImYiICYmIHZhbHVlLT5Jc0RvdWJsZSgpKSBTZXRGKHZhbHVlLT5HZXREb3VibGUoKSk7CisgIGlmKGtleSA9PSAiRW5hYmxlZCIgJiYgdmFsdWUtPklzQm9vbGVhbigpKSB7CisgICAgICBpZiAodmFsdWUtPkdldEJvb2xlYW4oKSkgeworICAgICAgICBFbmFibGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERpc2FibGUoKTsKKyAgICAgIH0KKyAgfQorICBpZihrZXkgPT0gIlZhbHVlIiAmJiB2YWx1ZS0+SXNEb3VibGUoKSkgU2V0KHZhbHVlLT5HZXREb3VibGUoKSk7Cit9CisKK2Jvb2wgQ0FOVGFsb246OklzTW9kZVBJRChDQU5TcGVlZENvbnRyb2xsZXI6OkNvbnRyb2xNb2RlIG1vZGUpIGNvbnN0IHsKKyAgcmV0dXJuIG1vZGUgPT0ga0N1cnJlbnQgfHwgbW9kZSA9PSBrU3BlZWQgfHwgbW9kZSA9PSBrUG9zaXRpb247Cit9CisKK3ZvaWQgQ0FOVGFsb246OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0U3RyaW5nKCJ+VFlQRX4iLCAiQ0FOU3BlZWRDb250cm9sbGVyIik7CisgICAgbV90YWJsZS0+UHV0U3RyaW5nKCJUeXBlIiwgIkNBTlRhbG9uIik7CisgICAgbV90YWJsZS0+UHV0U3RyaW5nKCJNb2RlIiwgR2V0TW9kZU5hbWUobV9jb250cm9sTW9kZSkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigicCIsIEdldFAoKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJpIiwgR2V0SSgpKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoImQiLCBHZXREKCkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiZiIsIEdldEYoKSk7CisgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiRW5hYmxlZCIsIElzQ29udHJvbEVuYWJsZWQoKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldCgpKTsKKyAgfQorfQorCit2b2lkIENBTlRhbG9uOjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+QWRkVGFibGVMaXN0ZW5lcih0aGlzLCB0cnVlKTsKKyAgfQorfQorCit2b2lkIENBTlRhbG9uOjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5SZW1vdmVUYWJsZUxpc3RlbmVyKHRoaXMpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIENBTlRhbG9uOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiAiQ0FOU3BlZWRDb250cm9sbGVyIjsKK30KKwordm9pZCBDQU5UYWxvbjo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSB7CisgIG1fdGFibGUgPSBzdWJUYWJsZTsKKyAgVXBkYXRlVGFibGUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gQ0FOVGFsb246OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0NhbWVyYVNlcnZlci5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvQ2FtZXJhU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjMxOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0NhbWVyYVNlcnZlci5jcHAKQEAgLTAsMCArMSwyNjAgQEAKKyNpbmNsdWRlICJDYW1lcmFTZXJ2ZXIuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworY29uc3RleHByIHVpbnQ4X3QgQ2FtZXJhU2VydmVyOjprTWFnaWNOdW1iZXJbXTsKKworQ2FtZXJhU2VydmVyKiBDYW1lcmFTZXJ2ZXI6OkdldEluc3RhbmNlKCkgeworICBzdGF0aWMgQ2FtZXJhU2VydmVyIGluc3RhbmNlOworICByZXR1cm4gJmluc3RhbmNlOworfQorCitDYW1lcmFTZXJ2ZXI6OkNhbWVyYVNlcnZlcigpCisgICAgOiBtX2NhbWVyYSgpLAorICAgICAgbV9zZXJ2ZXJUaHJlYWQoJkNhbWVyYVNlcnZlcjo6U2VydmUsIHRoaXMpLAorICAgICAgbV9jYXB0dXJlVGhyZWFkKCksCisgICAgICBtX2ltYWdlTXV0ZXgoKSwKKyAgICAgIG1fbmV3SW1hZ2VWYXJpYWJsZSgpLAorICAgICAgbV9kYXRhUG9vbCgzKSwKKyAgICAgIG1fcXVhbGl0eSg1MCksCisgICAgICBtX2F1dG9DYXB0dXJlU3RhcnRlZChmYWxzZSksCisgICAgICBtX2h3Q2xpZW50KHRydWUpLAorICAgICAgbV9pbWFnZURhdGEobnVsbHB0ciwgMCwgMCwgZmFsc2UpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIG1fZGF0YVBvb2wucHVzaF9iYWNrKG5ldyB1aW50OF90W2tNYXhJbWFnZVNpemVdKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2ZXI6OkZyZWVJbWFnZURhdGEoCisgICAgc3RkOjp0dXBsZTx1aW50OF90KiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2w+IGltYWdlRGF0YSkgeworICBpZiAoc3RkOjpnZXQ8Mz4oaW1hZ2VEYXRhKSkKKyAgICBpbWFxRGlzcG9zZShzdGQ6OmdldDwwPihpbWFnZURhdGEpKTsKKyAgZWxzZSBpZiAoc3RkOjpnZXQ8MD4oaW1hZ2VEYXRhKSAhPSBudWxscHRyKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX2ltYWdlTXV0ZXgpOworICAgIG1fZGF0YVBvb2wucHVzaF9iYWNrKHN0ZDo6Z2V0PDA+KGltYWdlRGF0YSkpOworICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmVyOjpTZXRJbWFnZURhdGEodWludDhfdCogZGF0YSwgdW5zaWduZWQgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdGFydCwgYm9vbCBpbWFxRGF0YSkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBsb2NrKG1faW1hZ2VNdXRleCk7CisgIEZyZWVJbWFnZURhdGEobV9pbWFnZURhdGEpOworICBtX2ltYWdlRGF0YSA9IHN0ZDo6bWFrZV90dXBsZShkYXRhLCBzaXplLCBzdGFydCwgaW1hcURhdGEpOworICBtX25ld0ltYWdlVmFyaWFibGUubm90aWZ5X2FsbCgpOworfQorCit2b2lkIENhbWVyYVNlcnZlcjo6U2V0SW1hZ2UoSW1hZ2UgY29uc3QqIGltYWdlKSB7CisgIHVuc2lnbmVkIGludCBkYXRhU2l6ZSA9IDA7CisgIHVpbnQ4X3QqIGRhdGEgPQorICAgICAgKHVpbnQ4X3QqKWltYXFGbGF0dGVuKGltYWdlLCBJTUFRX0ZMQVRURU5fSU1BR0UsIElNQVFfQ09NUFJFU1NJT05fSlBFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAqIG1fcXVhbGl0eSwgJmRhdGFTaXplKTsKKworICAvLyBJZiB3ZSdyZSB1c2luZyBhIEhXIGNhbWVyYSwgdGhlbiBmaW5kIHRoZSBzdGFydCBvZiB0aGUgZGF0YQorICBib29sIGh3Q2xpZW50OworICB7CisgICAgLy8gTWFrZSBhIGxvY2FsIGNvcHkgb2YgdGhlIGh3Q2xpZW50IHZhcmlhYmxlIHNvIHRoYXQgd2UgY2FuIHNhZmVseSB1c2UgaXQuCisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX2ltYWdlTXV0ZXgpOworICAgIGh3Q2xpZW50ID0gbV9od0NsaWVudDsKKyAgfQorICB1bnNpZ25lZCBpbnQgc3RhcnQgPSAwOworICBpZiAoaHdDbGllbnQpIHsKKyAgICB3aGlsZSAoc3RhcnQgPCBkYXRhU2l6ZSAtIDEpIHsKKyAgICAgIGlmIChkYXRhW3N0YXJ0XSA9PSAweEZGICYmIGRhdGFbc3RhcnQgKyAxXSA9PSAweEQ4KQorICAgICAgICBicmVhazsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RhcnQrKzsKKyAgICB9CisgIH0KKyAgZGF0YVNpemUgLT0gc3RhcnQ7CisKKyAgd3BpX2Fzc2VydChkYXRhU2l6ZSA+IDIpOworICBTZXRJbWFnZURhdGEoZGF0YSwgZGF0YVNpemUsIHN0YXJ0LCB0cnVlKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2ZXI6OkF1dG9DYXB0dXJlKCkgeworICBJbWFnZSogZnJhbWUgPSBpbWFxQ3JlYXRlSW1hZ2UoSU1BUV9JTUFHRV9SR0IsIDApOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgYm9vbCBod0NsaWVudDsKKyAgICB1aW50OF90KiBkYXRhID0gbnVsbHB0cjsKKyAgICB7CisgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBsb2NrKG1faW1hZ2VNdXRleCk7CisgICAgICBod0NsaWVudCA9IG1faHdDbGllbnQ7CisgICAgICBpZiAoaHdDbGllbnQpIHsKKyAgICAgICAgZGF0YSA9IG1fZGF0YVBvb2wuYmFjaygpOworICAgICAgICBtX2RhdGFQb29sLnBvcF9iYWNrKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGh3Q2xpZW50KSB7CisgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IG1fY2FtZXJhLT5HZXRJbWFnZURhdGEoZGF0YSwga01heEltYWdlU2l6ZSk7CisgICAgICBTZXRJbWFnZURhdGEoZGF0YSwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fY2FtZXJhLT5HZXRJbWFnZShmcmFtZSk7CisgICAgICBTZXRJbWFnZShmcmFtZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmVyOjpTdGFydEF1dG9tYXRpY0NhcHR1cmUoY2hhciBjb25zdCogY2FtZXJhTmFtZSkgeworICBzdGQ6OnNoYXJlZF9wdHI8VVNCQ2FtZXJhPiBjYW1lcmEgPQorICAgICAgc3RkOjptYWtlX3NoYXJlZDxVU0JDYW1lcmE+KGNhbWVyYU5hbWUsIHRydWUpOworICBjYW1lcmEtPk9wZW5DYW1lcmEoKTsKKyAgU3RhcnRBdXRvbWF0aWNDYXB0dXJlKGNhbWVyYSk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmVyOjpTdGFydEF1dG9tYXRpY0NhcHR1cmUoc3RkOjpzaGFyZWRfcHRyPFVTQkNhbWVyYT4gY2FtZXJhKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9pbWFnZU11dGV4KTsKKyAgaWYgKG1fYXV0b0NhcHR1cmVTdGFydGVkKSByZXR1cm47CisKKyAgbV9jYW1lcmEgPSBjYW1lcmE7CisgIG1fY2FtZXJhLT5TdGFydENhcHR1cmUoKTsKKworICBtX2NhcHR1cmVUaHJlYWQgPSBzdGQ6OnRocmVhZCgmQ2FtZXJhU2VydmVyOjpBdXRvQ2FwdHVyZSwgdGhpcyk7CisgIG1fY2FwdHVyZVRocmVhZC5kZXRhY2goKTsKKyAgbV9hdXRvQ2FwdHVyZVN0YXJ0ZWQgPSB0cnVlOworfQorCitib29sIENhbWVyYVNlcnZlcjo6SXNBdXRvQ2FwdHVyZVN0YXJ0ZWQoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9pbWFnZU11dGV4KTsKKyAgcmV0dXJuIG1fYXV0b0NhcHR1cmVTdGFydGVkOworfQorCit2b2lkIENhbWVyYVNlcnZlcjo6U2V0U2l6ZSh1bnNpZ25lZCBpbnQgc2l6ZSkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBsb2NrKG1faW1hZ2VNdXRleCk7CisgIGlmICghbV9jYW1lcmEpIHJldHVybjsKKyAgaWYgKHNpemUgPT0ga1NpemUxNjB4MTIwKQorICAgIG1fY2FtZXJhLT5TZXRTaXplKDE2MCwgMTIwKTsKKyAgZWxzZSBpZiAoc2l6ZSA9PSBrU2l6ZTMyMHgyNDApCisgICAgbV9jYW1lcmEtPlNldFNpemUoMzIwLCAyNDApOworICBlbHNlIGlmIChzaXplID09IGtTaXplNjQweDQ4MCkKKyAgICBtX2NhbWVyYS0+U2V0U2l6ZSg2NDAsIDQ4MCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmVyOjpTZXRRdWFsaXR5KHVuc2lnbmVkIGludCBxdWFsaXR5KSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9pbWFnZU11dGV4KTsKKyAgbV9xdWFsaXR5ID0gcXVhbGl0eSA+IDEwMCA/IDEwMCA6IHF1YWxpdHk7Cit9CisKK3Vuc2lnbmVkIGludCBDYW1lcmFTZXJ2ZXI6OkdldFF1YWxpdHkoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9pbWFnZU11dGV4KTsKKyAgcmV0dXJuIG1fcXVhbGl0eTsKK30KKwordm9pZCBDYW1lcmFTZXJ2ZXI6OlNlcnZlKCkgeworICBpbnQgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisKKyAgaWYgKHNvY2sgPT0gLTEpIHsKKyAgICB3cGlfc2V0RXJybm9FcnJvcigpOworICAgIHJldHVybjsKKyAgfQorCisgIGludCByZXVzZUFkZHIgPSAxOworICBpZiAoc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZyZXVzZUFkZHIsCisgICAgICAgICAgICAgICAgIHNpemVvZihyZXVzZUFkZHIpKSA9PSAtMSkKKyAgICB3cGlfc2V0RXJybm9FcnJvcigpOworCisgIHNvY2thZGRyX2luIGFkZHJlc3MsIGNsaWVudEFkZHJlc3M7CisKKyAgbWVtc2V0KCZhZGRyZXNzLCAwLCBzaXplb2YoYWRkcmVzcykpOworICBhZGRyZXNzLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBhZGRyZXNzLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICBhZGRyZXNzLnNpbl9wb3J0ID0gaHRvbnMoa1BvcnQpOworCisgIGlmIChiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCBzaXplb2YoYWRkcmVzcykpID09IC0xKQorICAgIHdwaV9zZXRFcnJub0Vycm9yKCk7CisKKyAgaWYgKGxpc3Rlbihzb2NrLCAxMCkgPT0gLTEpIHdwaV9zZXRFcnJub0Vycm9yKCk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzb2NrbGVuX3QgY2xpZW50QWRkcmVzc0xlbiA9IHNpemVvZihjbGllbnRBZGRyZXNzKTsKKworICAgIGludCBjb25uID0KKyAgICAgICAgYWNjZXB0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAmY2xpZW50QWRkcmVzc0xlbik7CisgICAgaWYgKGNvbm4gPT0gLTEpIHsKKyAgICAgIHdwaV9zZXRFcnJub0Vycm9yKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBSZXF1ZXN0IHJlcTsKKyAgICBpZiAocmVhZChjb25uLCAmcmVxLCBzaXplb2YocmVxKSkgPT0gLTEpIHsKKyAgICAgIHdwaV9zZXRFcnJub0Vycm9yKCk7CisgICAgICBjbG9zZShjb25uKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXEuZnBzID0gbnRvaGwocmVxLmZwcyk7CisgICAgICByZXEuY29tcHJlc3Npb24gPSBudG9obChyZXEuY29tcHJlc3Npb24pOworICAgICAgcmVxLnNpemUgPSBudG9obChyZXEuc2l6ZSk7CisgICAgfQorCisgICAgLy8gVE9ETzogU3VwcG9ydCB0aGUgU1cgQ29tcHJlc3Npb24uIFRoZSByZXN0IG9mIHRoZSBjb2RlIGJlbG93IHdpbGwgd29yayBhcworICAgIC8vIHRob3VnaCB0aGlzCisgICAgLy8gY2hlY2sgaXNuJ3QgaGVyZQorICAgIGlmIChyZXEuY29tcHJlc3Npb24gIT0ga0hhcmR3YXJlQ29tcHJlc3Npb24pIHsKKyAgICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNob29zZSBcIlVTQiBDYW1lcmEgSFdcIiBvbiB0aGUgZGFzaGJvYXJkIik7CisgICAgICBjbG9zZShjb25uKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHsKKyAgICAgIC8vIFdhaXQgZm9yIHRoZSBjYW1lcmEgdG8gYmUgc2V0dworICAgICAgc3RkOjp1bmlxdWVfbG9jazxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9pbWFnZU11dGV4KTsKKyAgICAgIGlmICghbV9jYW1lcmEpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJDYW1lcmEgbm90IHlldCByZWFkeSwgYXdhaXRpbmcgZmlyc3QgaW1hZ2UiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgbV9uZXdJbWFnZVZhcmlhYmxlLndhaXQobG9jayk7CisgICAgICB9CisgICAgICBtX2h3Q2xpZW50ID0gcmVxLmNvbXByZXNzaW9uID09IGtIYXJkd2FyZUNvbXByZXNzaW9uOworICAgICAgaWYgKCFtX2h3Q2xpZW50KQorICAgICAgICBTZXRRdWFsaXR5KDEwMCAtIHJlcS5jb21wcmVzc2lvbik7CisgICAgICBlbHNlIGlmIChtX2NhbWVyYSkKKyAgICAgICAgbV9jYW1lcmEtPlNldEZQUyhyZXEuZnBzKTsKKyAgICAgIFNldFNpemUocmVxLnNpemUpOworICAgIH0KKworICAgIGF1dG8gcGVyaW9kID0gc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcygxMDAwMDAwKSAvIHJlcS5mcHM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gc3RhcnRUaW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgICBzdGQ6OnR1cGxlPHVpbnQ4X3QqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYm9vbD4gaW1hZ2VEYXRhOworICAgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX2ltYWdlTXV0ZXgpOworICAgICAgICBtX25ld0ltYWdlVmFyaWFibGUud2FpdChsb2NrKTsKKyAgICAgICAgaW1hZ2VEYXRhID0gbV9pbWFnZURhdGE7CisgICAgICAgIG1faW1hZ2VEYXRhID0gc3RkOjptYWtlX3R1cGxlPHVpbnQ4X3QqPihudWxscHRyLCAwLCAwLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIHVuc2lnbmVkIGludCBzaXplID0gc3RkOjpnZXQ8MT4oaW1hZ2VEYXRhKTsKKyAgICAgIHVuc2lnbmVkIGludCBuZXRTaXplID0gaHRvbmwoc2l6ZSk7CisgICAgICB1bnNpZ25lZCBpbnQgc3RhcnQgPSBzdGQ6OmdldDwyPihpbWFnZURhdGEpOworICAgICAgdWludDhfdCogZGF0YSA9IHN0ZDo6Z2V0PDA+KGltYWdlRGF0YSk7CisKKyAgICAgIGlmIChkYXRhID09IG51bGxwdHIpIGNvbnRpbnVlOworCisgICAgICBpZiAod3JpdGUoY29ubiwga01hZ2ljTnVtYmVyLCBzaXplb2Yoa01hZ2ljTnVtYmVyKSkgPT0gLTEpIHsKKyAgICAgICAgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgKKyAgICAgICAgICAgICJbQ2FtZXJhU2VydmVyXSBFcnJvciBzZW5kaW5nIG1hZ2ljIG51bWJlciIpOworICAgICAgICBGcmVlSW1hZ2VEYXRhKGltYWdlRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHdyaXRlKGNvbm4sICZuZXRTaXplLCBzaXplb2YobmV0U2l6ZSkpID09IC0xKSB7CisgICAgICAgIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIltDYW1lcmFTZXJ2ZXJdIEVycm9yIHNlbmRpbmcgaW1hZ2Ugc2l6ZSIpOworICAgICAgICBGcmVlSW1hZ2VEYXRhKGltYWdlRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHdyaXRlKGNvbm4sICZkYXRhW3N0YXJ0XSwgc2l6ZW9mKHVpbnQ4X3QpICogc2l6ZSkgPT0gLTEpIHsKKyAgICAgICAgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgiW0NhbWVyYVNlcnZlcl0gRXJyb3Igc2VuZGluZyBpbWFnZSBkYXRhIik7CisgICAgICAgIEZyZWVJbWFnZURhdGEoaW1hZ2VEYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBGcmVlSW1hZ2VEYXRhKGltYWdlRGF0YSk7CisgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyBwZXJpb2QpOworICAgIH0KKyAgICBjbG9zZShjb25uKTsKKyAgfQorICBjbG9zZShzb2NrKTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9Db21wcmVzc29yLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9Db21wcmVzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWI4OWUwCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0NvbXByZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogQ29tcHJlc3Nvci5jcHAKKyAqLworCisjaW5jbHVkZSAiQ29tcHJlc3Nvci5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisvKioKKyAqIENvbnN0cnVjdG9yCisgKgorICogQHBhcmFtIG1vZHVsZSBUaGUgUENNIElEIHRvIHVzZSAoMC02MikKKyAqLworQ29tcHJlc3Nvcjo6Q29tcHJlc3Nvcih1aW50OF90IHBjbUlEKSB7CisgIG1fcGNtX3BvaW50ZXIgPSBpbml0aWFsaXplQ29tcHJlc3NvcihwY21JRCk7CisgIFNldENsb3NlZExvb3BDb250cm9sKHRydWUpOworfQorCisvKioKKyAqICBTdGFydHMgY2xvc2VkLWxvb3AgY29udHJvbC4gTm90ZSB0aGF0IGNsb3NlZCBsb29wIGNvbnRyb2wgaXMgZW5hYmxlZCBieQorICogZGVmYXVsdC4KKyAqLwordm9pZCBDb21wcmVzc29yOjpTdGFydCgpIHsgU2V0Q2xvc2VkTG9vcENvbnRyb2wodHJ1ZSk7IH0KKworLyoqCisgKiAgU3RvcHMgY2xvc2VkLWxvb3AgY29udHJvbC4gTm90ZSB0aGF0IGNsb3NlZCBsb29wIGNvbnRyb2wgaXMgZW5hYmxlZCBieQorICogZGVmYXVsdC4KKyAqLwordm9pZCBDb21wcmVzc29yOjpTdG9wKCkgeyBTZXRDbG9zZWRMb29wQ29udHJvbChmYWxzZSk7IH0KKworLyoqCisgKiBDaGVjayBpZiBjb21wcmVzc29yIG91dHB1dCBpcyBhY3RpdmUKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcHJlc3NvciBpcyBvbgorICovCitib29sIENvbXByZXNzb3I6OkVuYWJsZWQoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCB2YWx1ZTsKKworICB2YWx1ZSA9IGdldENvbXByZXNzb3IobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIHdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgcHJlc3N1cmUgc3dpdGNoIGlzIHRyaWdnZXJlZAorICogQHJldHVybiB0cnVlIGlmIHByZXNzdXJlIGlzIGxvdworICovCitib29sIENvbXByZXNzb3I6OkdldFByZXNzdXJlU3dpdGNoVmFsdWUoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCB2YWx1ZTsKKworICB2YWx1ZSA9IGdldFByZXNzdXJlU3dpdGNoKG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogUXVlcnkgaG93IG11Y2ggY3VycmVudCB0aGUgY29tcHJlc3NvciBpcyBkcmF3aW5nCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRocm91Z2ggdGhlIGNvbXByZXNzb3IsIGluIGFtcHMKKyAqLworZmxvYXQgQ29tcHJlc3Nvcjo6R2V0Q29tcHJlc3NvckN1cnJlbnQoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZmxvYXQgdmFsdWU7CisKKyAgdmFsdWUgPSBnZXRDb21wcmVzc29yQ3VycmVudChtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworICB9CisKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljYWxseSB0dXJuaW5nIHRoZSBjb21wcmVzc29yIG9uIHdoZW4gdGhlCisgKiBwcmVzc3VyZSBpcyBsb3cuCisgKiBAcGFyYW0gb24gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGNsb3NlZCBsb29wIGNvbnRyb2wgb2YgdGhlIGNvbXByZXNzb3IuIEZhbHNlCisgKiB0byBkaXNhYmxlLgorICovCit2b2lkIENvbXByZXNzb3I6OlNldENsb3NlZExvb3BDb250cm9sKGJvb2wgb24pIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIHNldENsb3NlZExvb3BDb250cm9sKG1fcGNtX3BvaW50ZXIsIG9uLCAmc3RhdHVzKTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wcmVzc29yIHdpbGwgYXV0b21hdGljYWxseSB0dXJuIG9uIHdoZW4gdGhlCisgKiBwcmVzc3VyZSBpcyBsb3cuCisgKiBAcmV0dXJuIFRydWUgaWYgY2xvc2VkIGxvb3AgY29udHJvbCBvZiB0aGUgY29tcHJlc3NvciBpcyBlbmFibGVkLiBGYWxzZSBpZgorICogZGlzYWJsZWQuCisgKi8KK2Jvb2wgQ29tcHJlc3Nvcjo6R2V0Q2xvc2VkTG9vcENvbnRyb2woKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCB2YWx1ZTsKKworICB2YWx1ZSA9IGdldENsb3NlZExvb3BDb250cm9sKG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBoaWdoIGN1cnJlbnQgZHJhdy4KKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBDb21wcmVzc29yIERyaXZlIGlzCisgKiAJCQlkaXNhYmxlZCBkdWUgdG8gY29tcHJlc3NvciBjdXJyZW50IGJlaW5nIHRvbyBoaWdoLgorICovCitib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGJvb2wgdmFsdWU7CisKKyAgdmFsdWUgPSBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdChtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworICB9CisKKyAgcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBRdWVyeSBpZiB0aGUgY29tcHJlc3NvciBvdXRwdXQgaGFzIGJlZW4gZGlzYWJsZWQgZHVlIHRvIGhpZ2ggY3VycmVudCBkcmF3CisgKiAoc3RpY2t5KS4KKyAqIEEgc3RpY2t5IGZhdWx0IHdpbGwgbm90IGNsZWFyIG9uIGRldmljZSByZWJvb3QsIGl0IG11c3QgYmUgY2xlYXJlZCB0aHJvdWdoCisgKiBjb2RlIG9yIHRoZSB3ZWJkYXNoLgorICogQHJldHVybiB0cnVlIGlmIFBDTSBzdGlja3kgZmF1bHQgaXMgc2V0IDogQ29tcHJlc3NvciBEcml2ZSBpcworICogCQkJZGlzYWJsZWQgZHVlIHRvIGNvbXByZXNzb3IgY3VycmVudCBiZWluZyB0b28gaGlnaC4KKyAqLworYm9vbCBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdCgpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBib29sIHZhbHVlOworCisgIHZhbHVlID0gZ2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIHdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKy8qKgorICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBhIHNob3J0IGNpcmN1aXQKKyAqIChzdGlja3kpLgorICogQSBzdGlja3kgZmF1bHQgd2lsbCBub3QgY2xlYXIgb24gZGV2aWNlIHJlYm9vdCwgaXQgbXVzdCBiZSBjbGVhcmVkIHRocm91Z2gKKyAqIGNvZGUgb3IgdGhlIHdlYmRhc2guCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQgOiBDb21wcmVzc29yIG91dHB1dAorICogCQkJYXBwZWFycyB0byBiZSBzaG9ydGVkLgorICovCitib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCB2YWx1ZTsKKworICB2YWx1ZSA9IGdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQobV9wY21fcG9pbnRlciwgJnN0YXR1cyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIHdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKy8qKgorICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBhIHNob3J0IGNpcmN1aXQuCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIGlzIGluIGZhdWx0IHN0YXRlIDogQ29tcHJlc3NvciBvdXRwdXQKKyAqIAkJCWFwcGVhcnMgdG8gYmUgc2hvcnRlZC4KKyAqLworYm9vbCBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGJvb2wgdmFsdWU7CisKKyAgdmFsdWUgPSBnZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisvKioKKyAqIFF1ZXJ5IGlmIHRoZSBjb21wcmVzc29yIG91dHB1dCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgd2lyZWQgKHN0aWNreSkuCisgKiBBIHN0aWNreSBmYXVsdCB3aWxsIG5vdCBjbGVhciBvbiBkZXZpY2UgcmVib290LCBpdCBtdXN0IGJlIGNsZWFyZWQgdGhyb3VnaAorICogY29kZSBvciB0aGUgd2ViZGFzaC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldCA6IENvbXByZXNzb3IgZG9lcyBub3QKKyAqIAkJCWFwcGVhciB0byBiZSB3aXJlZCwgaS5lLiBjb21wcmVzc29yIGlzCisgKiAJCQlub3QgZHJhd2luZyBlbm91Z2ggY3VycmVudC4KKyAqLworYm9vbCBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCB2YWx1ZTsKKworICB2YWx1ZSA9IGdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdChtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworICB9CisKKyAgcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBRdWVyeSBpZiB0aGUgY29tcHJlc3NvciBvdXRwdXQgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHdpcmVkLgorICogQHJldHVybiB0cnVlIGlmIFBDTSBpcyBpbiBmYXVsdCBzdGF0ZSA6IENvbXByZXNzb3IgZG9lcyBub3QKKyAqIAkJCWFwcGVhciB0byBiZSB3aXJlZCwgaS5lLiBjb21wcmVzc29yIGlzCisgKiAJCQlub3QgZHJhd2luZyBlbm91Z2ggY3VycmVudC4KKyAqLworYm9vbCBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCB2YWx1ZTsKKworICB2YWx1ZSA9IGdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdChtX3BjbV9wb2ludGVyLCAmc3RhdHVzKTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOworICB9CisKKyAgcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBDbGVhciBBTEwgc3RpY2t5IGZhdWx0cyBpbnNpZGUgUENNIHRoYXQgQ29tcHJlc3NvciBpcyB3aXJlZCB0by4KKyAqCisgKiBJZiBhIHN0aWNreSBmYXVsdCBpcyBzZXQsIHRoZW4gaXQgd2lsbCBiZSBwZXJzaXN0ZW50bHkgY2xlYXJlZC4gIENvbXByZXNzb3IKKyAqIGRyaXZlCisgKiAJCW1heWJlIG1vbWVudGFyaWx5IGRpc2FibGUgd2hpbGUgZmxhZ3MgYXJlIGJlaW5nIGNsZWFyZWQuIENhcmUKKyAqIHNob3VsZCBiZQorICogCQl0YWtlbiB0byBub3QgY2FsbCB0aGlzIHRvbyBmcmVxdWVudGx5LCBvdGhlcndpc2Ugbm9ybWFsCisgKiBjb21wcmVzc29yCisgKiAJCWZ1bmN0aW9uYWxpdHkgbWF5IGJlIHByZXZlbnRlZC4KKyAqCisgKiBJZiBubyBzdGlja3kgZmF1bHRzIGFyZSBzZXQgdGhlbiB0aGlzIGNhbGwgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAqLwordm9pZCBDb21wcmVzc29yOjpDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIGNsZWFyQWxsUENNU3RpY2t5RmF1bHRzKG1fcGNtX3BvaW50ZXIsICZzdGF0dXMpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7CisgIH0KK30KK3ZvaWQgQ29tcHJlc3Nvcjo6VXBkYXRlVGFibGUoKSB7CisgIGlmIChtX3RhYmxlKSB7CisgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiRW5hYmxlZCIsIEVuYWJsZWQoKSk7CisgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiUHJlc3N1cmUgc3dpdGNoIiwgR2V0UHJlc3N1cmVTd2l0Y2hWYWx1ZSgpKTsKKyAgfQorfQorCit2b2lkIENvbXByZXNzb3I6OlN0YXJ0TGl2ZVdpbmRvd01vZGUoKSB7fQorCit2b2lkIENvbXByZXNzb3I6OlN0b3BMaXZlV2luZG93TW9kZSgpIHt9CisKK3N0ZDo6c3RyaW5nIENvbXByZXNzb3I6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsgcmV0dXJuICJDb21wcmVzc29yIjsgfQorCit2b2lkIENvbXByZXNzb3I6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworICBtX3RhYmxlID0gc3ViVGFibGU7CisgIFVwZGF0ZVRhYmxlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IENvbXByZXNzb3I6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQorCit2b2lkIENvbXByZXNzb3I6OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSB7CisgIGlmICghdmFsdWUtPklzQm9vbGVhbigpKSByZXR1cm47CisgIGlmICh2YWx1ZS0+R2V0Qm9vbGVhbigpKQorICAgIFN0YXJ0KCk7CisgIGVsc2UKKyAgICBTdG9wKCk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvQ29udHJvbGxlclBvd2VyLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9Db250cm9sbGVyUG93ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNTA4YWYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvQ29udHJvbGxlclBvd2VyLmNwcApAQCAtMCwwICsxLDE3NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ29udHJvbGxlclBvd2VyLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxIQUwvUG93ZXIuaHBwPgorI2luY2x1ZGUgPEhBTC9IQUwuaHBwPgorI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorCisvKioKKyAqIEdldCB0aGUgaW5wdXQgdm9sdGFnZSB0byB0aGUgcm9ib3QgY29udHJvbGxlcgorICogQHJldHVybiBUaGUgY29udHJvbGxlciBpbnB1dCB2b2x0YWdlIHZhbHVlIGluIFZvbHRzCisgKi8KK2RvdWJsZSBDb250cm9sbGVyUG93ZXI6OkdldElucHV0Vm9sdGFnZSgpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBkb3VibGUgcmV0VmFsID0gZ2V0VmluVm9sdGFnZSgmc3RhdHVzKTsKKyAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBpbnB1dCBjdXJyZW50IHRvIHRoZSByb2JvdCBjb250cm9sbGVyCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIGlucHV0IGN1cnJlbnQgdmFsdWUgaW4gQW1wcworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRJbnB1dEN1cnJlbnQoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZG91YmxlIHJldFZhbCA9IGdldFZpbkN1cnJlbnQoJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgNlYgcmFpbAorICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTZWKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGRvdWJsZSByZXRWYWwgPSBnZXRVc2VyVm9sdGFnZTZWKCZzdGF0dXMpOworICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoZSA2ViByYWlsCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDZWIHJhaWwgb3V0cHV0IGN1cnJlbnQgdmFsdWUgaW4gQW1wcworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRDdXJyZW50NlYoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZG91YmxlIHJldFZhbCA9IGdldFVzZXJDdXJyZW50NlYoJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNlYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhCisgKiBjb250cm9sbGVyCisgKiBicm93bm91dCwgYSBzaG9ydCBjaXJjdWl0IG9uIHRoZSByYWlsLCBvciBjb250cm9sbGVyIG92ZXItdm9sdGFnZQorICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIGVuYWJsZWQgdmFsdWUuIFRydWUgZm9yIGVuYWJsZWQuCisgKi8KK2Jvb2wgQ29udHJvbGxlclBvd2VyOjpHZXRFbmFibGVkNlYoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCByZXRWYWwgPSBnZXRVc2VyQWN0aXZlNlYoJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgY291bnQgb2YgdGhlIHRvdGFsIGN1cnJlbnQgZmF1bHRzIG9uIHRoZSA2ViByYWlsIHNpbmNlIHRoZSBjb250cm9sbGVyCisgKiBoYXMgYm9vdGVkCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzLgorICovCitpbnQgQ29udHJvbGxlclBvd2VyOjpHZXRGYXVsdENvdW50NlYoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgaW50IHJldFZhbCA9IGdldFVzZXJDdXJyZW50RmF1bHRzNlYoJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgNVYgcmFpbAorICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTVWKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGRvdWJsZSByZXRWYWwgPSBnZXRVc2VyVm9sdGFnZTVWKCZzdGF0dXMpOworICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoZSA1ViByYWlsCisgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDVWIHJhaWwgb3V0cHV0IGN1cnJlbnQgdmFsdWUgaW4gQW1wcworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRDdXJyZW50NVYoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZG91YmxlIHJldFZhbCA9IGdldFVzZXJDdXJyZW50NVYoJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNVYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhCisgKiBjb250cm9sbGVyCisgKiBicm93bm91dCwgYSBzaG9ydCBjaXJjdWl0IG9uIHRoZSByYWlsLCBvciBjb250cm9sbGVyIG92ZXItdm9sdGFnZQorICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIGVuYWJsZWQgdmFsdWUuIFRydWUgZm9yIGVuYWJsZWQuCisgKi8KK2Jvb2wgQ29udHJvbGxlclBvd2VyOjpHZXRFbmFibGVkNVYoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCByZXRWYWwgPSBnZXRVc2VyQWN0aXZlNVYoJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgY291bnQgb2YgdGhlIHRvdGFsIGN1cnJlbnQgZmF1bHRzIG9uIHRoZSA1ViByYWlsIHNpbmNlIHRoZSBjb250cm9sbGVyCisgKiBoYXMgYm9vdGVkCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCisgKi8KK2ludCBDb250cm9sbGVyUG93ZXI6OkdldEZhdWx0Q291bnQ1VigpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQgcmV0VmFsID0gZ2V0VXNlckN1cnJlbnRGYXVsdHM1Vigmc3RhdHVzKTsKKyAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSAzLjNWIHJhaWwKKyAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKKyAqLworZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTNWMygpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBkb3VibGUgcmV0VmFsID0gZ2V0VXNlclZvbHRhZ2UzVjMoJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgb2YgdGhlIDMuM1YgcmFpbAorICogQHJldHVybiBUaGUgY29udHJvbGxlciAzLjNWIHJhaWwgb3V0cHV0IGN1cnJlbnQgdmFsdWUgaW4gQW1wcworICovCitkb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRDdXJyZW50M1YzKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGRvdWJsZSByZXRWYWwgPSBnZXRVc2VyQ3VycmVudDNWMygmc3RhdHVzKTsKKyAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSAzLjNWIHJhaWwuIFRoZSByYWlsIG1heSBiZSBkaXNhYmxlZCBkdWUgdG8gYQorICogY29udHJvbGxlcgorICogYnJvd25vdXQsIGEgc2hvcnQgY2lyY3VpdCBvbiB0aGUgcmFpbCwgb3IgY29udHJvbGxlciBvdmVyLXZvbHRhZ2UKKyAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIGVuYWJsZWQgdmFsdWUuIFRydWUgZm9yIGVuYWJsZWQuCisgKi8KK2Jvb2wgQ29udHJvbGxlclBvd2VyOjpHZXRFbmFibGVkM1YzKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGJvb2wgcmV0VmFsID0gZ2V0VXNlckFjdGl2ZTNWMygmc3RhdHVzKTsKKyAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDMuM1YgcmFpbCBzaW5jZSB0aGUKKyAqIGNvbnRyb2xsZXIgaGFzIGJvb3RlZAorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZhdWx0cworICovCitpbnQgQ29udHJvbGxlclBvd2VyOjpHZXRGYXVsdENvdW50M1YzKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGludCByZXRWYWwgPSBnZXRVc2VyQ3VycmVudEZhdWx0czNWMygmc3RhdHVzKTsKKyAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0NvdW50ZXIuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0NvdW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNzBkZTUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvQ291bnRlci5jcHAKQEAgLTAsMCArMSw1OTAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyLmgiCisjaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjb3VudGVyIHdoZXJlIG5vIHNvdXJjZXMgYXJlIHNlbGVjdGVkLgorICogVGhleSBhbGwgbXVzdCBiZSBzZWxlY3RlZCBieSBjYWxsaW5nIGZ1bmN0aW9ucyB0byBzcGVjaWZ5IHRoZSB1cHNvdXJjZSBhbmQKKyAqIHRoZSBkb3duc291cmNlCisgKiBpbmRlcGVuZGVudGx5LgorICoKKyAqIFRoaXMgY3JlYXRlcyBhIENoaXBPYmplY3QgY291bnRlciBhbmQgaW5pdGlhbGl6ZXMgc3RhdHVzIHZhcmlhYmxlcworICogYXBwcm9wcmlhdGVseS4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIG1vZGUgVGhlIGNvdW50ZXIgbW9kZQorICovCitDb3VudGVyOjpDb3VudGVyKE1vZGUgbW9kZSkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIG1fY291bnRlciA9IGluaXRpYWxpemVDb3VudGVyKG1vZGUsICZtX2luZGV4LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgU2V0TWF4UGVyaW9kKC41KTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQ291bnRlciwgbV9pbmRleCwgbW9kZSk7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY291bnRlciBmcm9tIGEgRGlnaXRhbCBTb3VyY2UgKHN1Y2ggYXMgYSBEaWdpdGFsCisgKiBJbnB1dCkuCisgKiBUaGlzIGlzIHVzZWQgaWYgYW4gZXhpc3RpbmcgZGlnaXRhbCBpbnB1dCBpcyB0byBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgb3RoZXIKKyAqIG9iamVjdHMgc3VjaAorICogYXMgZW5jb2RlcnMgb3IgaWYgdGhlIERpZ2l0YWwgU291cmNlIGlzIG5vdCBhIERpZ2l0YWwgSW5wdXQgY2hhbm5lbCAoc3VjaCBhcworICogYW4gQW5hbG9nIFRyaWdnZXIpLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKiBAcGFyYW0gc291cmNlIEEgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgRGlnaXRhbFNvdXJjZSBvYmplY3QuIEl0IHdpbGwgYmUgc2V0CisgKiBhcyB0aGUgVXAgU291cmNlLgorICovCitDb3VudGVyOjpDb3VudGVyKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSkgOiBDb3VudGVyKGtUd29QdWxzZSkgeworICBTZXRVcFNvdXJjZShzb3VyY2UpOworICBDbGVhckRvd25Tb3VyY2UoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjb3VudGVyIGZyb20gYSBEaWdpdGFsIFNvdXJjZSAoc3VjaCBhcyBhIERpZ2l0YWwKKyAqIElucHV0KS4KKyAqIFRoaXMgaXMgdXNlZCBpZiBhbiBleGlzdGluZyBkaWdpdGFsIGlucHV0IGlzIHRvIGJlIHNoYXJlZCBieSBtdWx0aXBsZSBvdGhlcgorICogb2JqZWN0cyBzdWNoCisgKiBhcyBlbmNvZGVycyBvciBpZiB0aGUgRGlnaXRhbCBTb3VyY2UgaXMgbm90IGEgRGlnaXRhbCBJbnB1dCBjaGFubmVsIChzdWNoIGFzCisgKiBhbiBBbmFsb2cgVHJpZ2dlcikuCisgKgorICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KKyAqIEBwYXJhbSBzb3VyY2UgQSBwb2ludGVyIHRvIHRoZSBleGlzdGluZyBEaWdpdGFsU291cmNlIG9iamVjdC4gSXQgd2lsbCBiZQorICogc2V0IGFzIHRoZSBVcCBTb3VyY2UuCisgKi8KK0NvdW50ZXI6OkNvdW50ZXIoc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+IHNvdXJjZSkgOiBDb3VudGVyKGtUd29QdWxzZSkgeworICBTZXRVcFNvdXJjZShzb3VyY2UpOworICBDbGVhckRvd25Tb3VyY2UoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4KKyAqIENyZWF0ZSBhbiB1cC1Db3VudGVyIGluc3RhbmNlIGdpdmVuIGEgY2hhbm5lbC4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERJTyBjaGFubmVsIHRvIHVzZSBhcyB0aGUgdXAgc291cmNlLiAwLTkgYXJlIG9uLWJvYXJkLAorICogMTAtMjUgYXJlIG9uIHRoZSBNWFAKKyAqLworQ291bnRlcjo6Q291bnRlcihpbnQzMl90IGNoYW5uZWwpIDogQ291bnRlcihrVHdvUHVsc2UpIHsKKyAgU2V0VXBTb3VyY2UoY2hhbm5lbCk7CisgIENsZWFyRG93blNvdXJjZSgpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIENvdW50ZXIgb2JqZWN0LgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgc2ltcGxlIHVwLUNvdW50ZXIgZ2l2ZW4gYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBVc2UgdGhlIHRyaWdnZXIgc3RhdGUgb3V0cHV0IGZyb20gdGhlIGFuYWxvZyB0cmlnZ2VyLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKiBAcGFyYW0gdHJpZ2dlciBUaGUgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgQW5hbG9nVHJpZ2dlciBvYmplY3QuCisgKi8KK0RFUFJFQ0FURUQoIlVzZSBwYXNzLWJ5LXJlZmVyZW5jZSBpbnN0ZWFkLiIpCitDb3VudGVyOjpDb3VudGVyKEFuYWxvZ1RyaWdnZXIgKnRyaWdnZXIpIDogQ291bnRlcihrVHdvUHVsc2UpIHsKKyAgU2V0VXBTb3VyY2UodHJpZ2dlci0+Q3JlYXRlT3V0cHV0KGtTdGF0ZSkpOworICBDbGVhckRvd25Tb3VyY2UoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4KKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIHNpbXBsZSB1cC1Db3VudGVyIGdpdmVuIGFuIGFuYWxvZyB0cmlnZ2VyLgorICogVXNlIHRoZSB0cmlnZ2VyIHN0YXRlIG91dHB1dCBmcm9tIHRoZSBhbmFsb2cgdHJpZ2dlci4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICogQHBhcmFtIHRyaWdnZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgQW5hbG9nVHJpZ2dlciBvYmplY3QuCisgKi8KK0NvdW50ZXI6OkNvdW50ZXIoY29uc3QgQW5hbG9nVHJpZ2dlciAmdHJpZ2dlcikgOiBDb3VudGVyKGtUd29QdWxzZSkgeworICBTZXRVcFNvdXJjZSh0cmlnZ2VyLkNyZWF0ZU91dHB1dChrU3RhdGUpKTsKKyAgQ2xlYXJEb3duU291cmNlKCk7Cit9CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgQ291bnRlciBvYmplY3QuCisgKiBDcmVhdGVzIGEgZnVsbCB1cC1kb3duIGNvdW50ZXIgZ2l2ZW4gdHdvIERpZ2l0YWwgU291cmNlcworICogQHBhcmFtIGVuY29kaW5nVHlwZSBUaGUgcXVhZHJhdHVyZSBkZWNvZGluZyBtb2RlICgxeCBvciAyeCkKKyAqIEBwYXJhbSB1cFNvdXJjZSBUaGUgcG9pbnRlciB0byB0aGUgRGlnaXRhbFNvdXJjZSB0byBzZXQgYXMgdGhlIHVwIHNvdXJjZQorICogQHBhcmFtIGRvd25Tb3VyY2UgVGhlIHBvaW50ZXIgdG8gdGhlIERpZ2l0YWxTb3VyY2UgdG8gc2V0IGFzIHRoZSBkb3duIHNvdXJjZQorICogQHBhcmFtIGludmVydGVkIFRydWUgdG8gaW52ZXJ0IHRoZSBvdXRwdXQgKHJldmVyc2UgdGhlIGRpcmVjdGlvbikKKyAqLworQ291bnRlcjo6Q291bnRlcihFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlLCBEaWdpdGFsU291cmNlICp1cFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgRGlnaXRhbFNvdXJjZSAqZG93blNvdXJjZSwgYm9vbCBpbnZlcnRlZCkKKyAgICA6IENvdW50ZXIoZW5jb2RpbmdUeXBlLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4odXBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bGxEZWxldGVyPERpZ2l0YWxTb3VyY2U+KCkpLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4oZG93blNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVsbERlbGV0ZXI8RGlnaXRhbFNvdXJjZT4oKSksCisgICAgICAgICAgICAgIGludmVydGVkKSB7fQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIENvdW50ZXIgb2JqZWN0LgorICogQ3JlYXRlcyBhIGZ1bGwgdXAtZG93biBjb3VudGVyIGdpdmVuIHR3byBEaWdpdGFsIFNvdXJjZXMKKyAqIEBwYXJhbSBlbmNvZGluZ1R5cGUgVGhlIHF1YWRyYXR1cmUgZGVjb2RpbmcgbW9kZSAoMXggb3IgMngpCisgKiBAcGFyYW0gdXBTb3VyY2UgVGhlIHBvaW50ZXIgdG8gdGhlIERpZ2l0YWxTb3VyY2UgdG8gc2V0IGFzIHRoZSB1cCBzb3VyY2UKKyAqIEBwYXJhbSBkb3duU291cmNlIFRoZSBwb2ludGVyIHRvIHRoZSBEaWdpdGFsU291cmNlIHRvIHNldCBhcyB0aGUgZG93biBzb3VyY2UKKyAqIEBwYXJhbSBpbnZlcnRlZCBUcnVlIHRvIGludmVydCB0aGUgb3V0cHV0IChyZXZlcnNlIHRoZSBkaXJlY3Rpb24pCisgKi8KK0NvdW50ZXI6OkNvdW50ZXIoRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+IHVwU291cmNlLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gZG93blNvdXJjZSwgYm9vbCBpbnZlcnRlZCkKKyAgICA6IENvdW50ZXIoa0V4dGVybmFsRGlyZWN0aW9uKSB7CisgIGlmIChlbmNvZGluZ1R5cGUgIT0gazFYICYmIGVuY29kaW5nVHlwZSAhPSBrMlgpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKKyAgICAgICAgUGFyYW1ldGVyT3V0T2ZSYW5nZSwKKyAgICAgICAgIkNvdW50ZXIgb25seSBzdXBwb3J0cyAxWCBhbmQgMlggcXVhZHJhdHVyZSBkZWNvZGluZy4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgU2V0VXBTb3VyY2UodXBTb3VyY2UpOworICBTZXREb3duU291cmNlKGRvd25Tb3VyY2UpOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisKKyAgaWYgKGVuY29kaW5nVHlwZSA9PSBrMVgpIHsKKyAgICBTZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOworICAgIHNldENvdW50ZXJBdmVyYWdlU2l6ZShtX2NvdW50ZXIsIDEsICZzdGF0dXMpOworICB9IGVsc2UgeworICAgIFNldFVwU291cmNlRWRnZSh0cnVlLCB0cnVlKTsKKyAgICBzZXRDb3VudGVyQXZlcmFnZVNpemUobV9jb3VudGVyLCAyLCAmc3RhdHVzKTsKKyAgfQorCisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICBTZXREb3duU291cmNlRWRnZShpbnZlcnRlZCwgdHJ1ZSk7Cit9CisKKy8qKgorICogRGVsZXRlIHRoZSBDb3VudGVyIG9iamVjdC4KKyAqLworQ291bnRlcjo6fkNvdW50ZXIoKSB7CisgIFNldFVwZGF0ZVdoZW5FbXB0eSh0cnVlKTsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGZyZWVDb3VudGVyKG1fY291bnRlciwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICBtX2NvdW50ZXIgPSBudWxscHRyOworfQorCisvKioKKyAqIFNldCB0aGUgdXBzb3VyY2UgZm9yIHRoZSBjb3VudGVyIGFzIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIERJTyBjaGFubmVsIHRvIHVzZSBhcyB0aGUgdXAgc291cmNlLiAwLTkgYXJlIG9uLWJvYXJkLAorICogMTAtMjUgYXJlIG9uIHRoZSBNWFAKKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcFNvdXJjZShpbnQzMl90IGNoYW5uZWwpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBTZXRVcFNvdXJjZShzdGQ6Om1ha2Vfc2hhcmVkPERpZ2l0YWxJbnB1dD4oY2hhbm5lbCkpOworfQorCisvKioKKyAqIFNldCB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIGJlIGFuIGFuYWxvZyB0cmlnZ2VyLgorICogQHBhcmFtIGFuYWxvZ1RyaWdnZXIgVGhlIGFuYWxvZyB0cmlnZ2VyIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBVcCBTb3VyY2UKKyAqIEBwYXJhbSB0cmlnZ2VyVHlwZSBUaGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0IHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBjb3VudGVyLgorICovCit2b2lkIENvdW50ZXI6OlNldFVwU291cmNlKEFuYWxvZ1RyaWdnZXIgKmFuYWxvZ1RyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKSB7CisgIFNldFVwU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyPihhbmFsb2dUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsRGVsZXRlcjxBbmFsb2dUcmlnZ2VyPigpKSwKKyAgICAgICAgICAgICAgdHJpZ2dlclR5cGUpOworfQorCisvKioKKyAqIFNldCB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIGJlIGFuIGFuYWxvZyB0cmlnZ2VyLgorICogQHBhcmFtIGFuYWxvZ1RyaWdnZXIgVGhlIGFuYWxvZyB0cmlnZ2VyIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBVcCBTb3VyY2UKKyAqIEBwYXJhbSB0cmlnZ2VyVHlwZSBUaGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0IHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBjb3VudGVyLgorICovCit2b2lkIENvdW50ZXI6OlNldFVwU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyPiBhbmFsb2dUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIFNldFVwU291cmNlKGFuYWxvZ1RyaWdnZXItPkNyZWF0ZU91dHB1dCh0cmlnZ2VyVHlwZSkpOworfQorCisvKioKKyAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCB1cC4KKyAqIFNldCB0aGUgdXAgY291bnRpbmcgRGlnaXRhbFNvdXJjZS4KKyAqIEBwYXJhbSBzb3VyY2UgUG9pbnRlciB0byB0aGUgRGlnaXRhbFNvdXJjZSBvYmplY3QgdG8gc2V0IGFzIHRoZSB1cCBzb3VyY2UKKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcFNvdXJjZShzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gc291cmNlKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgbV91cFNvdXJjZSA9IHNvdXJjZTsKKyAgaWYgKG1fdXBTb3VyY2UtPlN0YXR1c0lzRmF0YWwoKSkgeworICAgIENsb25lRXJyb3IoKm1fdXBTb3VyY2UpOworICB9IGVsc2UgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBzZXRDb3VudGVyVXBTb3VyY2UobV9jb3VudGVyLCBzb3VyY2UtPkdldENoYW5uZWxGb3JSb3V0aW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSwgJnN0YXR1cyk7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKwordm9pZCBDb3VudGVyOjpTZXRVcFNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UpIHsKKyAgU2V0VXBTb3VyY2UoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4oc291cmNlLCBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IHRoYXQgY2F1c2VzIHRoZSBjb3VudGVyIHRvIGNvdW50IHVwLgorICogU2V0IHRoZSB1cCBjb3VudGluZyBEaWdpdGFsU291cmNlLgorICogQHBhcmFtIHNvdXJjZSBSZWZlcmVuY2UgdG8gdGhlIERpZ2l0YWxTb3VyY2Ugb2JqZWN0IHRvIHNldCBhcyB0aGUgdXAgc291cmNlCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBTb3VyY2UoRGlnaXRhbFNvdXJjZSAmc291cmNlKSB7CisgIFNldFVwU291cmNlKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+KCZzb3VyY2UsIE51bGxEZWxldGVyPERpZ2l0YWxTb3VyY2U+KCkpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGVkZ2Ugc2Vuc2l0aXZpdHkgb24gYW4gdXAgY291bnRpbmcgc291cmNlLgorICogU2V0IHRoZSB1cCBzb3VyY2UgdG8gZWl0aGVyIGRldGVjdCByaXNpbmcgZWRnZXMgb3IgZmFsbGluZyBlZGdlcyBvciBib3RoLgorICogQHBhcmFtIHJpc2luZ0VkZ2UgVHJ1ZSB0byB0cmlnZ2VyIG9uIHJpc2luZyBlZGdlcworICogQHBhcmFtIGZhbGxpbmdFZGdlIFRydWUgdG8gdHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2VzCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIGlmIChtX3VwU291cmNlID09IG51bGxwdHIpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKKyAgICAgICAgTnVsbFBhcmFtZXRlciwKKyAgICAgICAgIk11c3Qgc2V0IG5vbi1udWxscHRyIFVwU291cmNlIGJlZm9yZSBzZXR0aW5nIFVwU291cmNlRWRnZSIpOworICB9CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0Q291bnRlclVwU291cmNlRWRnZShtX2NvdW50ZXIsIHJpc2luZ0VkZ2UsIGZhbGxpbmdFZGdlLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRGlzYWJsZSB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIHRoZSBjb3VudGVyLgorICovCit2b2lkIENvdW50ZXI6OkNsZWFyVXBTb3VyY2UoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgbV91cFNvdXJjZS5yZXNldCgpOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGNsZWFyQ291bnRlclVwU291cmNlKG1fY291bnRlciwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gYmUgYSBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgRElPIGNoYW5uZWwgdG8gdXNlIGFzIHRoZSB1cCBzb3VyY2UuIDAtOSBhcmUgb24tYm9hcmQsCisgKiAxMC0yNSBhcmUgb24gdGhlIE1YUAorICovCit2b2lkIENvdW50ZXI6OlNldERvd25Tb3VyY2UoaW50MzJfdCBjaGFubmVsKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgU2V0RG93blNvdXJjZShzdGQ6Om1ha2Vfc2hhcmVkPERpZ2l0YWxJbnB1dD4oY2hhbm5lbCkpOworfQorCisvKioKKyAqIFNldCB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gYmUgYW4gYW5hbG9nIHRyaWdnZXIuCisgKiBAcGFyYW0gYW5hbG9nVHJpZ2dlciBUaGUgYW5hbG9nIHRyaWdnZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIERvd24KKyAqIFNvdXJjZQorICogQHBhcmFtIHRyaWdnZXJUeXBlIFRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGNvdW50ZXIuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShBbmFsb2dUcmlnZ2VyICphbmFsb2dUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKSB7CisgIFNldERvd25Tb3VyY2Uoc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ1RyaWdnZXI+KGFuYWxvZ1RyaWdnZXIsIE51bGxEZWxldGVyPEFuYWxvZ1RyaWdnZXI+KCkpLCB0cmlnZ2VyVHlwZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBkb3duIGNvdW50aW5nIHNvdXJjZSB0byBiZSBhbiBhbmFsb2cgdHJpZ2dlci4KKyAqIEBwYXJhbSBhbmFsb2dUcmlnZ2VyIFRoZSBhbmFsb2cgdHJpZ2dlciBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgRG93bgorICogU291cmNlCisgKiBAcGFyYW0gdHJpZ2dlclR5cGUgVGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgY291bnRlci4KKyAqLwordm9pZCBDb3VudGVyOjpTZXREb3duU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyPiBhbmFsb2dUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgU2V0RG93blNvdXJjZShhbmFsb2dUcmlnZ2VyLT5DcmVhdGVPdXRwdXQodHJpZ2dlclR5cGUpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHNvdXJjZSBvYmplY3QgdGhhdCBjYXVzZXMgdGhlIGNvdW50ZXIgdG8gY291bnQgZG93bi4KKyAqIFNldCB0aGUgZG93biBjb3VudGluZyBEaWdpdGFsU291cmNlLgorICogQHBhcmFtIHNvdXJjZSBQb2ludGVyIHRvIHRoZSBEaWdpdGFsU291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIGRvd24gc291cmNlCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gc291cmNlKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgbV9kb3duU291cmNlID0gc291cmNlOworICBpZiAobV9kb3duU291cmNlLT5TdGF0dXNJc0ZhdGFsKCkpIHsKKyAgICBDbG9uZUVycm9yKCptX2Rvd25Tb3VyY2UpOworICB9IGVsc2UgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBzZXRDb3VudGVyRG93blNvdXJjZShtX2NvdW50ZXIsIHNvdXJjZS0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPkdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCksICZzdGF0dXMpOworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisKK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UpIHsKKyAgU2V0RG93blNvdXJjZShzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4oc291cmNlLCBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IHRoYXQgY2F1c2VzIHRoZSBjb3VudGVyIHRvIGNvdW50IGRvd24uCisgKiBTZXQgdGhlIGRvd24gY291bnRpbmcgRGlnaXRhbFNvdXJjZS4KKyAqIEBwYXJhbSBzb3VyY2UgUmVmZXJlbmNlIHRvIHRoZSBEaWdpdGFsU291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIGRvd24gc291cmNlCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlICZzb3VyY2UpIHsKKyAgU2V0RG93blNvdXJjZShzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4oJnNvdXJjZSwgTnVsbERlbGV0ZXI8RGlnaXRhbFNvdXJjZT4oKSkpOworfQorCisvKioKKyAqIFNldCB0aGUgZWRnZSBzZW5zaXRpdml0eSBvbiBhIGRvd24gY291bnRpbmcgc291cmNlLgorICogU2V0IHRoZSBkb3duIHNvdXJjZSB0byBlaXRoZXIgZGV0ZWN0IHJpc2luZyBlZGdlcyBvciBmYWxsaW5nIGVkZ2VzLgorICogQHBhcmFtIHJpc2luZ0VkZ2UgVHJ1ZSB0byB0cmlnZ2VyIG9uIHJpc2luZyBlZGdlcworICogQHBhcmFtIGZhbGxpbmdFZGdlIFRydWUgdG8gdHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2VzCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZUVkZ2UoYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaWYgKG1fZG93blNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCisgICAgICAgIE51bGxQYXJhbWV0ZXIsCisgICAgICAgICJNdXN0IHNldCBub24tbnVsbHB0ciBEb3duU291cmNlIGJlZm9yZSBzZXR0aW5nIERvd25Tb3VyY2VFZGdlIik7CisgIH0KKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXRDb3VudGVyRG93blNvdXJjZUVkZ2UobV9jb3VudGVyLCByaXNpbmdFZGdlLCBmYWxsaW5nRWRnZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIERpc2FibGUgdGhlIGRvd24gY291bnRpbmcgc291cmNlIHRvIHRoZSBjb3VudGVyLgorICovCit2b2lkIENvdW50ZXI6OkNsZWFyRG93blNvdXJjZSgpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBtX2Rvd25Tb3VyY2UucmVzZXQoKTsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBjbGVhckNvdW50ZXJEb3duU291cmNlKG1fY291bnRlciwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCBzdGFuZGFyZCB1cCAvIGRvd24gY291bnRpbmcgbW9kZSBvbiB0aGlzIGNvdW50ZXIuCisgKiBVcCBhbmQgZG93biBjb3VudHMgYXJlIHNvdXJjZWQgaW5kZXBlbmRlbnRseSBmcm9tIHR3byBpbnB1dHMuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0VXBEb3duQ291bnRlck1vZGUoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXRDb3VudGVyVXBEb3duTW9kZShtX2NvdW50ZXIsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgZXh0ZXJuYWwgZGlyZWN0aW9uIG1vZGUgb24gdGhpcyBjb3VudGVyLgorICogQ291bnRzIGFyZSBzb3VyY2VkIG9uIHRoZSBVcCBjb3VudGVyIGlucHV0LgorICogVGhlIERvd24gY291bnRlciBpbnB1dCByZXByZXNlbnRzIHRoZSBkaXJlY3Rpb24gdG8gY291bnQuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0RXh0ZXJuYWxEaXJlY3Rpb25Nb2RlKCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0Q291bnRlckV4dGVybmFsRGlyZWN0aW9uTW9kZShtX2NvdW50ZXIsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBTZXQgU2VtaS1wZXJpb2QgbW9kZSBvbiB0aGlzIGNvdW50ZXIuCisgKiBDb3VudHMgdXAgb24gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0U2VtaVBlcmlvZE1vZGUoYm9vbCBoaWdoU2VtaVBlcmlvZCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0Q291bnRlclNlbWlQZXJpb2RNb2RlKG1fY291bnRlciwgaGlnaFNlbWlQZXJpb2QsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNvdW50ZXIgdG8gY291bnQgaW4gdXAgb3IgZG93biBiYXNlZCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dAorICogcHVsc2UuCisgKiBUaGlzIG1vZGUgaXMgbW9zdCB1c2VmdWwgZm9yIGRpcmVjdGlvbiBzZW5zaXRpdmUgZ2VhciB0b290aCBzZW5zb3JzLgorICogQHBhcmFtIHRocmVzaG9sZCBUaGUgcHVsc2UgbGVuZ3RoIGJleW9uZCB3aGljaCB0aGUgY291bnRlciBjb3VudHMgdGhlCisgKiBvcHBvc2l0ZSBkaXJlY3Rpb24uICBVbml0cyBhcmUgc2Vjb25kcy4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRQdWxzZUxlbmd0aE1vZGUoZmxvYXQgdGhyZXNob2xkKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXRDb3VudGVyUHVsc2VMZW5ndGhNb2RlKG1fY291bnRlciwgdGhyZXNob2xkLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIKKyAqIHRvCisgKiBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKKyAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KKyAqIEByZXR1cm4gU2FtcGxlc1RvQXZlcmFnZSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYmVpbmcgYXZlcmFnZWQgKGZyb20gMSB0byAxMjcpCisgKi8KK2ludCBDb3VudGVyOjpHZXRTYW1wbGVzVG9BdmVyYWdlKCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGludDMyX3Qgc2FtcGxlcyA9IGdldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKG1fY291bnRlciwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gc2FtcGxlczsKK30KKworLyoqCisgKiBTZXQgdGhlIFNhbXBsZXMgdG8gQXZlcmFnZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9mIHRoZSB0aW1lcgorICogdG8KKyAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgorICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgorICogQHBhcmFtIHNhbXBsZXNUb0F2ZXJhZ2UgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGF2ZXJhZ2UgZnJvbSAxIHRvIDEyNy4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRTYW1wbGVzVG9BdmVyYWdlKGludCBzYW1wbGVzVG9BdmVyYWdlKSB7CisgIGlmIChzYW1wbGVzVG9BdmVyYWdlIDwgMSB8fCBzYW1wbGVzVG9BdmVyYWdlID4gMTI3KSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCisgICAgICAgIFBhcmFtZXRlck91dE9mUmFuZ2UsCisgICAgICAgICJBdmVyYWdlIGNvdW50ZXIgdmFsdWVzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjciKTsKKyAgfQorICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKG1fY291bnRlciwgc2FtcGxlc1RvQXZlcmFnZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFJlYWQgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZS4KKyAqIFJlYWQgdGhlIHZhbHVlIGF0IHRoaXMgaW5zdGFudC4gSXQgbWF5IHN0aWxsIGJlIHJ1bm5pbmcsIHNvIGl0IHJlZmxlY3RzIHRoZQorICogY3VycmVudCB2YWx1ZS4gTmV4dAorICogdGltZSBpdCBpcyByZWFkLCBpdCBtaWdodCBoYXZlIGEgZGlmZmVyZW50IHZhbHVlLgorICovCitpbnQzMl90IENvdW50ZXI6OkdldCgpIGNvbnN0IHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgaW50MzJfdCB2YWx1ZSA9IGdldENvdW50ZXIobV9jb3VudGVyLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBSZXNldCB0aGUgQ291bnRlciB0byB6ZXJvLgorICogU2V0IHRoZSBjb3VudGVyIHZhbHVlIHRvIHplcm8uIFRoaXMgZG9lc24ndCBlZmZlY3QgdGhlIHJ1bm5pbmcgc3RhdGUgb2YgdGhlCisgKiBjb3VudGVyLCBqdXN0IHNldHMKKyAqIHRoZSBjdXJyZW50IHZhbHVlIHRvIHplcm8uCisgKi8KK3ZvaWQgQ291bnRlcjo6UmVzZXQoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICByZXNldENvdW50ZXIobV9jb3VudGVyLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBQZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IGNvdW50LgorICogUmV0dXJucyB0aGUgdGltZSBpbnRlcnZhbCBvZiB0aGUgbW9zdCByZWNlbnQgY291bnQuIFRoaXMgY2FuIGJlIHVzZWQgZm9yCisgKiB2ZWxvY2l0eSBjYWxjdWxhdGlvbnMKKyAqIHRvIGRldGVybWluZSBzaGFmdCBzcGVlZC4KKyAqIEByZXR1cm5zIFRoZSBwZXJpb2QgYmV0d2VlbiB0aGUgbGFzdCB0d28gcHVsc2VzIGluIHVuaXRzIG9mIHNlY29uZHMuCisgKi8KK2RvdWJsZSBDb3VudGVyOjpHZXRQZXJpb2QoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZG91YmxlIHZhbHVlID0gZ2V0Q291bnRlclBlcmlvZChtX2NvdW50ZXIsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFNldCB0aGUgbWF4aW11bSBwZXJpb2Qgd2hlcmUgdGhlIGRldmljZSBpcyBzdGlsbCBjb25zaWRlcmVkICJtb3ZpbmciLgorICogU2V0cyB0aGUgbWF4aW11bSBwZXJpb2Qgd2hlcmUgdGhlIGRldmljZSBpcyBjb25zaWRlcmVkIG1vdmluZy4gVGhpcyB2YWx1ZSBpcworICogdXNlZCB0byBkZXRlcm1pbmUKKyAqIHRoZSAic3RvcHBlZCIgc3RhdGUgb2YgdGhlIGNvdW50ZXIgdXNpbmcgdGhlIEdldFN0b3BwZWQgbWV0aG9kLgorICogQHBhcmFtIG1heFBlcmlvZCBUaGUgbWF4aW11bSBwZXJpb2Qgd2hlcmUgdGhlIGNvdW50ZWQgZGV2aWNlIGlzIGNvbnNpZGVyZWQKKyAqIG1vdmluZyBpbgorICogc2Vjb25kcy4KKyAqLwordm9pZCBDb3VudGVyOjpTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0Q291bnRlck1heFBlcmlvZChtX2NvdW50ZXIsIG1heFBlcmlvZCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNlbGVjdCB3aGV0aGVyIHlvdSB3YW50IHRvIGNvbnRpbnVlIHVwZGF0aW5nIHRoZSBldmVudCB0aW1lciBvdXRwdXQgd2hlbgorICogdGhlcmUgYXJlIG5vIHNhbXBsZXMgY2FwdHVyZWQuCisgKiBUaGUgb3V0cHV0IG9mIHRoZSBldmVudCB0aW1lciBoYXMgYSBidWZmZXIgb2YgcGVyaW9kcyB0aGF0IGFyZSBhdmVyYWdlZCBhbmQKKyAqIHBvc3RlZCB0bworICogYSByZWdpc3RlciBvbiB0aGUgRlBHQS4gIFdoZW4gdGhlIHRpbWVyIGRldGVjdHMgdGhhdCB0aGUgZXZlbnQgc291cmNlIGhhcworICogc3RvcHBlZAorICogKGJhc2VkIG9uIHRoZSBNYXhQZXJpb2QpIHRoZSBidWZmZXIgb2Ygc2FtcGxlcyB0byBiZSBhdmVyYWdlZCBpcyBlbXB0aWVkLiAgSWYKKyAqIHlvdQorICogZW5hYmxlIHRoZSB1cGRhdGUgd2hlbiBlbXB0eSwgeW91IHdpbGwgYmUgbm90aWZpZWQgb2YgdGhlIHN0b3BwZWQgc291cmNlIGFuZAorICogdGhlIGV2ZW50CisgKiB0aW1lIHdpbGwgcmVwb3J0IDAgc2FtcGxlcy4gIElmIHlvdSBkaXNhYmxlIHVwZGF0ZSB3aGVuIGVtcHR5LCB0aGUgbW9zdAorICogcmVjZW50IGF2ZXJhZ2UKKyAqIHdpbGwgcmVtYWluIG9uIHRoZSBvdXRwdXQgdW50aWwgYSBuZXcgc2FtcGxlIGlzIGFjcXVpcmVkLiAgWW91IHdpbGwgbmV2ZXIgc2VlCisgKiAwIHNhbXBsZXMKKyAqIG91dHB1dCAoZXhjZXB0IHdoZW4gdGhlcmUgaGF2ZSBiZWVuIG5vIGV2ZW50cyBzaW5jZSBhbiBGUEdBIHJlc2V0KSBhbmQgeW91CisgKiB3aWxsIGxpa2VseSBub3QKKyAqIHNlZSB0aGUgc3RvcHBlZCBiaXQgYmVjb21lIHRydWUgKHNpbmNlIGl0IGlzIHVwZGF0ZWQgYXQgdGhlIGVuZCBvZiBhbiBhdmVyYWdlCisgKiBhbmQgdGhlcmUgYXJlCisgKiBubyBzYW1wbGVzIHRvIGF2ZXJhZ2UpLgorICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSB0byBlbmFibGUgdXBkYXRlIHdoZW4gZW1wdHkKKyAqLwordm9pZCBDb3VudGVyOjpTZXRVcGRhdGVXaGVuRW1wdHkoYm9vbCBlbmFibGVkKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXRDb3VudGVyVXBkYXRlV2hlbkVtcHR5KG1fY291bnRlciwgZW5hYmxlZCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgY2xvY2sgaXMgc3RvcHBlZC4KKyAqIERldGVybWluZSBpZiB0aGUgY2xvY2tlZCBpbnB1dCBpcyBzdG9wcGVkIGJhc2VkIG9uIHRoZSBNYXhQZXJpb2QgdmFsdWUgc2V0CisgKiB1c2luZyB0aGUKKyAqIFNldE1heFBlcmlvZCBtZXRob2QuIElmIHRoZSBjbG9jayBleGNlZWRzIHRoZSBNYXhQZXJpb2QsIHRoZW4gdGhlIGRldmljZSAoYW5kCisgKiBjb3VudGVyKSBhcmUKKyAqIGFzc3VtZWQgdG8gYmUgc3RvcHBlZCBhbmQgaXQgcmV0dXJucyB0cnVlLgorICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vc3QgcmVjZW50IGNvdW50ZXIgcGVyaW9kIGV4Y2VlZHMgdGhlIE1heFBlcmlvZAorICogdmFsdWUgc2V0IGJ5CisgKiBTZXRNYXhQZXJpb2QuCisgKi8KK2Jvb2wgQ291bnRlcjo6R2V0U3RvcHBlZCgpIGNvbnN0IHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGJvb2wgdmFsdWUgPSBnZXRDb3VudGVyU3RvcHBlZChtX2NvdW50ZXIsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgY291bnRlciB2YWx1ZSBjaGFuZ2VkLgorICogQHJldHVybiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGNvdW50ZXIgdmFsdWUgY2hhbmdlZC4KKyAqLworYm9vbCBDb3VudGVyOjpHZXREaXJlY3Rpb24oKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBib29sIHZhbHVlID0gZ2V0Q291bnRlckRpcmVjdGlvbihtX2NvdW50ZXIsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIFNldCB0aGUgQ291bnRlciB0byByZXR1cm4gcmV2ZXJzZWQgc2Vuc2luZyBvbiB0aGUgZGlyZWN0aW9uLgorICogVGhpcyBhbGxvd3MgY291bnRlcnMgdG8gY2hhbmdlIHRoZSBkaXJlY3Rpb24gdGhleSBhcmUgY291bnRpbmcgaW4gdGhlIGNhc2Ugb2YKKyAqIDFYIGFuZCAyWAorICogcXVhZHJhdHVyZSBlbmNvZGluZyBvbmx5LiBBbnkgb3RoZXIgY291bnRlciBtb2RlIGlzbid0IHN1cHBvcnRlZC4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHRydWUgaWYgdGhlIHZhbHVlIGNvdW50ZWQgc2hvdWxkIGJlIG5lZ2F0ZWQuCisgKi8KK3ZvaWQgQ291bnRlcjo6U2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNldENvdW50ZXJSZXZlcnNlRGlyZWN0aW9uKG1fY291bnRlciwgcmV2ZXJzZURpcmVjdGlvbiwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCit2b2lkIENvdW50ZXI6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldCgpKTsKKyAgfQorfQorCit2b2lkIENvdW50ZXI6OlN0YXJ0TGl2ZVdpbmRvd01vZGUoKSB7fQorCit2b2lkIENvdW50ZXI6OlN0b3BMaXZlV2luZG93TW9kZSgpIHt9CisKK3N0ZDo6c3RyaW5nIENvdW50ZXI6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsgcmV0dXJuICJDb3VudGVyIjsgfQorCit2b2lkIENvdW50ZXI6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworICBtX3RhYmxlID0gc3ViVGFibGU7CisgIFVwZGF0ZVRhYmxlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IENvdW50ZXI6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0RpZ2l0YWxHbGl0Y2hGaWx0ZXIuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0RpZ2l0YWxHbGl0Y2hGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTQ3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvRGlnaXRhbEdsaXRjaEZpbHRlci5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFycmF5PgorCisjaW5jbHVkZSAiRGlnaXRhbEdsaXRjaEZpbHRlci5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiRW5jb2Rlci5oIgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisKK3N0ZDo6YXJyYXk8Ym9vbCwgMz4gRGlnaXRhbEdsaXRjaEZpbHRlcjo6bV9maWx0ZXJBbGxvY2F0ZWQgPSB7e2ZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlfX07Citwcmlvcml0eV9tdXRleCBEaWdpdGFsR2xpdGNoRmlsdGVyOjptX211dGV4OworCitEaWdpdGFsR2xpdGNoRmlsdGVyOjpEaWdpdGFsR2xpdGNoRmlsdGVyKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgIGF1dG8gaW5kZXggPQorICAgICAgc3RkOjpmaW5kKG1fZmlsdGVyQWxsb2NhdGVkLmJlZ2luKCksIG1fZmlsdGVyQWxsb2NhdGVkLmVuZCgpLCBmYWxzZSk7CisgIHdwaV9hc3NlcnQoaW5kZXggIT0gbV9maWx0ZXJBbGxvY2F0ZWQuZW5kKCkpOworCisgIG1fY2hhbm5lbEluZGV4ID0gc3RkOjpkaXN0YW5jZShtX2ZpbHRlckFsbG9jYXRlZC5iZWdpbigpLCBpbmRleCk7CisgICppbmRleCA9IHRydWU7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxGaWx0ZXIsIG1fY2hhbm5lbEluZGV4KTsKK30KKworRGlnaXRhbEdsaXRjaEZpbHRlcjo6fkRpZ2l0YWxHbGl0Y2hGaWx0ZXIoKSB7CisgIGlmIChtX2NoYW5uZWxJbmRleCA+PSAwKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICAgIG1fZmlsdGVyQWxsb2NhdGVkW21fY2hhbm5lbEluZGV4XSA9IGZhbHNlOworICB9Cit9CisKKy8qKgorICogQXNzaWducyB0aGUgRGlnaXRhbFNvdXJjZSB0byB0aGlzIGdsaXRjaCBmaWx0ZXIuCisgKgorICogQHBhcmFtIGlucHV0IFRoZSBEaWdpdGFsU291cmNlIHRvIGFkZC4KKyAqLwordm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpBZGQoRGlnaXRhbFNvdXJjZSAqaW5wdXQpIHsKKyAgRG9BZGQoaW5wdXQsIG1fY2hhbm5lbEluZGV4ICsgMSk7Cit9CisKK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6RG9BZGQoRGlnaXRhbFNvdXJjZSAqaW5wdXQsIGludCByZXF1ZXN0ZWRfaW5kZXgpIHsKKyAgLy8gU29tZSBzb3VyY2VzIGZyb20gQ291bnRlcnMgYW5kIEVuY29kZXJzIGFyZSBudWxsLiAgQnkgcHVzaGluZyB0aGUgY2hlY2sKKyAgLy8gaGVyZSwgd2UgY2F0Y2ggdGhlIGlzc3VlIG1vcmUgZ2VuZXJhbGx5LgorICBpZiAoaW5wdXQpIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgc2V0RmlsdGVyU2VsZWN0KG1fZGlnaXRhbF9wb3J0c1tpbnB1dC0+R2V0Q2hhbm5lbEZvclJvdXRpbmcoKV0sCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9pbmRleCwgJnN0YXR1cyk7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IHdlIHNldCBpdCBjb3JyZWN0bHkuCisgICAgaW50IGFjdHVhbF9pbmRleCA9IGdldEZpbHRlclNlbGVjdCgKKyAgICAgICAgbV9kaWdpdGFsX3BvcnRzW2lucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpXSwgJnN0YXR1cyk7CisgICAgd3BpX2Fzc2VydEVxdWFsKGFjdHVhbF9pbmRleCwgcmVxdWVzdGVkX2luZGV4KTsKKworICAgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsSW5wdXQsCisgICAgICAgICAgICAgIGlucHV0LT5HZXRDaGFubmVsRm9yUm91dGluZygpKTsKKyAgfQorfQorCisvKioKKyAqIEFzc2lnbnMgdGhlIEVuY29kZXIgdG8gdGhpcyBnbGl0Y2ggZmlsdGVyLgorICoKKyAqIEBwYXJhbSBpbnB1dCBUaGUgRW5jb2RlciB0byBhZGQuCisgKi8KK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6QWRkKEVuY29kZXIgKmlucHV0KSB7CisgIEFkZChpbnB1dC0+bV9hU291cmNlLmdldCgpKTsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGQoaW5wdXQtPm1fYlNvdXJjZS5nZXQoKSk7Cit9CisKKy8qKgorICogQXNzaWducyB0aGUgQ291bnRlciB0byB0aGlzIGdsaXRjaCBmaWx0ZXIuCisgKgorICogQHBhcmFtIGlucHV0IFRoZSBDb3VudGVyIHRvIGFkZC4KKyAqLwordm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpBZGQoQ291bnRlciAqaW5wdXQpIHsKKyAgQWRkKGlucHV0LT5tX3VwU291cmNlLmdldCgpKTsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGQoaW5wdXQtPm1fZG93blNvdXJjZS5nZXQoKSk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIGRpZ2l0YWwgaW5wdXQgZnJvbSB0aGlzIGZpbHRlci4KKyAqCisgKiBSZW1vdmVzIHRoZSBEaWdpdGFsU291cmNlIGZyb20gdGhpcyBnbGl0Y2ggZmlsdGVyIGFuZCByZS1hc3NpZ25zIGl0IHRvCisgKiB0aGUgZGVmYXVsdCBmaWx0ZXIuCisgKgorICogQHBhcmFtIGlucHV0IFRoZSBEaWdpdGFsU291cmNlIHRvIHJlbW92ZS4KKyAqLwordm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpSZW1vdmUoRGlnaXRhbFNvdXJjZSAqaW5wdXQpIHsKKyAgRG9BZGQoaW5wdXQsIDApOworfQorCisvKioKKyAqIFJlbW92ZXMgYW4gZW5jb2RlciBmcm9tIHRoaXMgZmlsdGVyLgorICoKKyAqIFJlbW92ZXMgdGhlIEVuY29kZXIgZnJvbSB0aGlzIGdsaXRjaCBmaWx0ZXIgYW5kIHJlLWFzc2lnbnMgaXQgdG8KKyAqIHRoZSBkZWZhdWx0IGZpbHRlci4KKyAqCisgKiBAcGFyYW0gaW5wdXQgVGhlIEVuY29kZXIgdG8gcmVtb3ZlLgorICovCit2b2lkIERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OlJlbW92ZShFbmNvZGVyICppbnB1dCkgeworICBSZW1vdmUoaW5wdXQtPm1fYVNvdXJjZS5nZXQoKSk7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgUmVtb3ZlKGlucHV0LT5tX2JTb3VyY2UuZ2V0KCkpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBjb3VudGVyIGZyb20gdGhpcyBmaWx0ZXIuCisgKgorICogUmVtb3ZlcyB0aGUgQ291bnRlciBmcm9tIHRoaXMgZ2xpdGNoIGZpbHRlciBhbmQgcmUtYXNzaWducyBpdCB0bworICogdGhlIGRlZmF1bHQgZmlsdGVyLgorICoKKyAqIEBwYXJhbSBpbnB1dCBUaGUgQ291bnRlciB0byByZW1vdmUuCisgKi8KK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6UmVtb3ZlKENvdW50ZXIgKmlucHV0KSB7CisgIFJlbW92ZShpbnB1dC0+bV91cFNvdXJjZS5nZXQoKSk7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgUmVtb3ZlKGlucHV0LT5tX2Rvd25Tb3VyY2UuZ2V0KCkpOworfQorCisvKioKKyAqIFNldHMgdGhlIG51bWJlciBvZiBjeWNsZXMgdGhhdCB0aGUgaW5wdXQgbXVzdCBub3QgY2hhbmdlIHN0YXRlIGZvci4KKyAqCisgKiBAcGFyYW0gZnBnYV9jeWNsZXMgVGhlIG51bWJlciBvZiBGUEdBIGN5Y2xlcy4KKyAqLwordm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpTZXRQZXJpb2RDeWNsZXModWludDMyX3QgZnBnYV9jeWNsZXMpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXRGaWx0ZXJQZXJpb2QobV9jaGFubmVsSW5kZXgsIGZwZ2FfY3ljbGVzLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHRoYXQgdGhlIGlucHV0IG11c3Qgbm90IGNoYW5nZSBzdGF0ZSBmb3IuCisgKgorICogQHBhcmFtIG5hbm9zZWNvbmRzIFRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMuCisgKi8KK3ZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6U2V0UGVyaW9kTmFub1NlY29uZHModWludDY0X3QgbmFub3NlY29uZHMpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICB1aW50MzJfdCBmcGdhX2N5Y2xlcyA9CisgICAgICBuYW5vc2Vjb25kcyAqIGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQgLyA0IC8gMTAwMDsKKyAgc2V0RmlsdGVyUGVyaW9kKG1fY2hhbm5lbEluZGV4LCBmcGdhX2N5Y2xlcywgJnN0YXR1cyk7CisKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyB0aGF0IHRoZSBpbnB1dCBtdXN0IG5vdCBjaGFuZ2Ugc3RhdGUgZm9yLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjeWNsZXMuCisgKi8KK3VpbnQzMl90IERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkdldFBlcmlvZEN5Y2xlcygpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICB1aW50MzJfdCBmcGdhX2N5Y2xlcyA9IGdldEZpbHRlclBlcmlvZChtX2NoYW5uZWxJbmRleCwgJnN0YXR1cyk7CisKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgcmV0dXJuIGZwZ2FfY3ljbGVzOworfQorCisvKioKKyAqIEdldHMgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyB0aGF0IHRoZSBpbnB1dCBtdXN0IG5vdCBjaGFuZ2Ugc3RhdGUgZm9yLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcy4KKyAqLwordWludDY0X3QgRGlnaXRhbEdsaXRjaEZpbHRlcjo6R2V0UGVyaW9kTmFub1NlY29uZHMoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgdWludDMyX3QgZnBnYV9jeWNsZXMgPSBnZXRGaWx0ZXJQZXJpb2QobV9jaGFubmVsSW5kZXgsICZzdGF0dXMpOworCisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZnBnYV9jeWNsZXMpICogMTAwMEwgLworICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQgLyA0KTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9EaWdpdGFsSW5wdXQuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0RpZ2l0YWxJbnB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiOTZmNQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9EaWdpdGFsSW5wdXQuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgRGlnaXRhbCBJbnB1dCBjbGFzcy4KKyAqIENyZWF0ZXMgYSBkaWdpdGFsIGlucHV0IGdpdmVuIGEgY2hhbm5lbC4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgRElPIGNoYW5uZWwgMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitEaWdpdGFsSW5wdXQ6OkRpZ2l0YWxJbnB1dCh1aW50MzJfdCBjaGFubmVsKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKKworICBpZiAoIUNoZWNrRGlnaXRhbENoYW5uZWwoY2hhbm5lbCkpIHsKKyAgICBidWYgPDwgIkRpZ2l0YWwgQ2hhbm5lbCAiIDw8IGNoYW5uZWw7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmLnN0cigpKTsKKyAgICBtX2NoYW5uZWwgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7CisgICAgcmV0dXJuOworICB9CisgIG1fY2hhbm5lbCA9IGNoYW5uZWw7CisKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBhbGxvY2F0ZURJTyhtX2RpZ2l0YWxfcG9ydHNbY2hhbm5lbF0sIHRydWUsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkRpZ2l0YWxJbnB1dCIsIGNoYW5uZWwsIHRoaXMpOworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRGlnaXRhbElucHV0LCBjaGFubmVsKTsKK30KKworLyoqCisgKiBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIERpZ2l0YWwgSW5wdXQgY2xhc3MuCisgKi8KK0RpZ2l0YWxJbnB1dDo6fkRpZ2l0YWxJbnB1dCgpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpZiAobV9pbnRlcnJ1cHQgIT0gbnVsbHB0cikgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBjbGVhbkludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAgIG1faW50ZXJydXB0ID0gbnVsbHB0cjsKKyAgICBtX2ludGVycnVwdHMtPkZyZWUobV9pbnRlcnJ1cHRJbmRleCk7CisgIH0KKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGZyZWVESU8obV9kaWdpdGFsX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIGZyb20gYSBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCisgKiBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgZGlnaXRhbCBpbnB1dCBjaGFubmVsIGZyb20gdGhlIEZQR0EuCisgKi8KK2Jvb2wgRGlnaXRhbElucHV0OjpHZXQoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBib29sIHZhbHVlID0gZ2V0RElPKG1fZGlnaXRhbF9wb3J0c1ttX2NoYW5uZWxdLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBHUElPIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KKyAqLwordWludDMyX3QgRGlnaXRhbElucHV0OjpHZXRDaGFubmVsKCkgY29uc3QgeyByZXR1cm4gbV9jaGFubmVsOyB9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgY2hhbm5lbCBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCit1aW50MzJfdCBEaWdpdGFsSW5wdXQ6OkdldENoYW5uZWxGb3JSb3V0aW5nKCkgY29uc3QgeyByZXR1cm4gR2V0Q2hhbm5lbCgpOyB9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgbW9kdWxlIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK3VpbnQzMl90IERpZ2l0YWxJbnB1dDo6R2V0TW9kdWxlRm9yUm91dGluZygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworLyoqCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBhbmFsb2cgdHJpZ2dlciBmaWVsZCBvZiBhIHJvdXRpbmcgbXV4LgorICovCitib29sIERpZ2l0YWxJbnB1dDo6R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCit2b2lkIERpZ2l0YWxJbnB1dDo6VXBkYXRlVGFibGUoKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXRCb29sZWFuKCJWYWx1ZSIsIEdldCgpKTsKKyAgfQorfQorCit2b2lkIERpZ2l0YWxJbnB1dDo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHt9CisKK3ZvaWQgRGlnaXRhbElucHV0OjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7fQorCitzdGQ6OnN0cmluZyBEaWdpdGFsSW5wdXQ6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJEaWdpdGFsSW5wdXQiOworfQorCit2b2lkIERpZ2l0YWxJbnB1dDo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSB7CisgIG1fdGFibGUgPSBzdWJUYWJsZTsKKyAgVXBkYXRlVGFibGUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gRGlnaXRhbElucHV0OjpHZXRUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGU7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9EaWdpdGFsT3V0cHV0LmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9EaWdpdGFsT3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzRmOTNiCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0RpZ2l0YWxPdXRwdXQuY3BwCkBAIC0wLDAgKzEsMjMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRpZ2l0YWxPdXRwdXQuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgZGlnaXRhbCBvdXRwdXQuCisgKiBDcmVhdGUgYSBkaWdpdGFsIG91dHB1dCBnaXZlbiBhIGNoYW5uZWwuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGRpZ2l0YWwgY2hhbm5lbCAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUAorICogcG9ydAorICovCitEaWdpdGFsT3V0cHV0OjpEaWdpdGFsT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOworCisgIG1fcHdtR2VuZXJhdG9yID0gKHZvaWQgKilzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7CisgIGlmICghQ2hlY2tEaWdpdGFsQ2hhbm5lbChjaGFubmVsKSkgeworICAgIGJ1ZiA8PCAiRGlnaXRhbCBDaGFubmVsICIgPDwgY2hhbm5lbDsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYuc3RyKCkpOworICAgIG1fY2hhbm5lbCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9jaGFubmVsID0gY2hhbm5lbDsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGFsbG9jYXRlRElPKG1fZGlnaXRhbF9wb3J0c1tjaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRGlnaXRhbE91dHB1dCwgY2hhbm5lbCk7Cit9CisKKy8qKgorICogRnJlZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGRpZ2l0YWwgb3V0cHV0LgorICovCitEaWdpdGFsT3V0cHV0Ojp+RGlnaXRhbE91dHB1dCgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICAvLyBEaXNhYmxlIHRoZSBQV00gaW4gY2FzZSBpdCB3YXMgcnVubmluZy4KKyAgRGlzYWJsZVBXTSgpOworCisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZnJlZURJTyhtX2RpZ2l0YWxfcG9ydHNbbV9jaGFubmVsXSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBkaWdpdGFsIG91dHB1dC4KKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBkaWdpdGFsIG91dHB1dCB0byBlaXRoZXIgb25lICh0cnVlKSBvciB6ZXJvIChmYWxzZSkuCisgKiBAcGFyYW0gdmFsdWUgMSAodHJ1ZSkgZm9yIGhpZ2gsIDAgKGZhbHNlKSBmb3IgZGlzYWJsZWQKKyAqLwordm9pZCBEaWdpdGFsT3V0cHV0OjpTZXQodWludDMyX3QgdmFsdWUpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0RElPKG1fZGlnaXRhbF9wb3J0c1ttX2NoYW5uZWxdLCB2YWx1ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEByZXR1cm4gVGhlIEdQSU8gY2hhbm5lbCBudW1iZXIgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgorICovCit1aW50MzJfdCBEaWdpdGFsT3V0cHV0OjpHZXRDaGFubmVsKCkgY29uc3QgeyByZXR1cm4gbV9jaGFubmVsOyB9CisKKy8qKgorICogT3V0cHV0IGEgc2luZ2xlIHB1bHNlIG9uIHRoZSBkaWdpdGFsIG91dHB1dCBsaW5lLgorICogU2VuZCBhIHNpbmdsZSBwdWxzZSBvbiB0aGUgZGlnaXRhbCBvdXRwdXQgbGluZSB3aGVyZSB0aGUgcHVsc2UgZHVyYXRpb24gaXMKKyAqIHNwZWNpZmllZCBpbiBzZWNvbmRzLgorICogTWF4aW11bSBwdWxzZSBsZW5ndGggaXMgMC4wMDE2IHNlY29uZHMuCisgKiBAcGFyYW0gbGVuZ3RoIFRoZSBwdWxzZWxlbmd0aCBpbiBzZWNvbmRzCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6UHVsc2UoZmxvYXQgbGVuZ3RoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHB1bHNlKG1fZGlnaXRhbF9wb3J0c1ttX2NoYW5uZWxdLCBsZW5ndGgsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIHB1bHNlIGlzIHN0aWxsIGdvaW5nLgorICogRGV0ZXJtaW5lIGlmIGEgcHJldmlvdXNseSBzdGFydGVkIHB1bHNlIGlzIHN0aWxsIGdvaW5nLgorICovCitib29sIERpZ2l0YWxPdXRwdXQ6OklzUHVsc2luZygpIGNvbnN0IHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOworCisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCB2YWx1ZSA9IGlzUHVsc2luZyhtX2RpZ2l0YWxfcG9ydHNbbV9jaGFubmVsXSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBQV00gZnJlcXVlbmN5IG9mIHRoZSBQV00gb3V0cHV0IG9uIGEgRGlnaXRhbCBPdXRwdXQgbGluZS4KKyAqCisgKiBUaGUgdmFsaWQgcmFuZ2UgaXMgZnJvbSAwLjYgSHogdG8gMTkga0h6LiAgVGhlIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGlzCisgKiBsb2dhcml0aG1pYy4KKyAqCisgKiBUaGVyZSBpcyBvbmx5IG9uZSBQV00gZnJlcXVlbmN5IGZvciBhbGwgZGlnaXRhbCBjaGFubmVscy4KKyAqCisgKiBAcGFyYW0gcmF0ZSBUaGUgZnJlcXVlbmN5IHRvIG91dHB1dCBhbGwgZGlnaXRhbCBvdXRwdXQgUFdNIHNpZ25hbHMuCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6U2V0UFdNUmF0ZShmbG9hdCByYXRlKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNldFBXTVJhdGUocmF0ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEVuYWJsZSBhIFBXTSBPdXRwdXQgb24gdGhpcyBsaW5lLgorICoKKyAqIEFsbG9jYXRlIG9uZSBvZiB0aGUgNiBETyBQV00gZ2VuZXJhdG9yIHJlc291cmNlcyBmcm9tIHRoaXMgbW9kdWxlLgorICoKKyAqIFN1cHBseSB0aGUgaW5pdGlhbCBkdXR5LWN5Y2xlIHRvIG91dHB1dCBzbyBhcyB0byBhdm9pZCBhIGdsaXRjaCB3aGVuIGZpcnN0CisgKiBzdGFydGluZy4KKyAqCisgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgZHV0eSBjeWNsZSBpcyA4LWJpdCBmb3IgbG93IGZyZXF1ZW5jaWVzICgxa0h6IG9yIGxlc3MpCisgKiBidXQgaXMgcmVkdWNlZCB0aGUgaGlnaGVyIHRoZSBmcmVxdWVuY3kgb2YgdGhlIFBXTSBzaWduYWwgaXMuCisgKgorICogQHBhcmFtIGluaXRpYWxEdXR5Q3ljbGUgVGhlIGR1dHktY3ljbGUgdG8gc3RhcnQgZ2VuZXJhdGluZy4gWzAuLjFdCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6RW5hYmxlUFdNKGZsb2F0IGluaXRpYWxEdXR5Q3ljbGUpIHsKKyAgaWYgKG1fcHdtR2VuZXJhdG9yICE9ICh2b2lkICopc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSByZXR1cm47CisKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgbV9wd21HZW5lcmF0b3IgPSBhbGxvY2F0ZVBXTSgmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBzZXRQV01EdXR5Q3ljbGUobV9wd21HZW5lcmF0b3IsIGluaXRpYWxEdXR5Q3ljbGUsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIHNldFBXTU91dHB1dENoYW5uZWwobV9wd21HZW5lcmF0b3IsIG1fY2hhbm5lbCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENoYW5nZSB0aGlzIGxpbmUgZnJvbSBhIFBXTSBvdXRwdXQgYmFjayB0byBhIHN0YXRpYyBEaWdpdGFsIE91dHB1dCBsaW5lLgorICoKKyAqIEZyZWUgdXAgb25lIG9mIHRoZSA2IERPIFBXTSBnZW5lcmF0b3IgcmVzb3VyY2VzIHRoYXQgd2VyZSBpbiB1c2UuCisgKi8KK3ZvaWQgRGlnaXRhbE91dHB1dDo6RGlzYWJsZVBXTSgpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpZiAobV9wd21HZW5lcmF0b3IgPT0gKHZvaWQgKilzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpIHJldHVybjsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisKKyAgLy8gRGlzYWJsZSB0aGUgb3V0cHV0IGJ5IHJvdXRpbmcgdG8gYSBkZWFkIGJpdC4KKyAgc2V0UFdNT3V0cHV0Q2hhbm5lbChtX3B3bUdlbmVyYXRvciwga0RpZ2l0YWxDaGFubmVscywgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIGZyZWVQV00obV9wd21HZW5lcmF0b3IsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICBtX3B3bUdlbmVyYXRvciA9ICh2b2lkICopc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOworfQorCisvKioKKyAqIENoYW5nZSB0aGUgZHV0eS1jeWNsZSB0aGF0IGlzIGJlaW5nIGdlbmVyYXRlZCBvbiB0aGUgbGluZS4KKyAqCisgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgZHV0eSBjeWNsZSBpcyA4LWJpdCBmb3IgbG93IGZyZXF1ZW5jaWVzICgxa0h6IG9yIGxlc3MpCisgKiBidXQgaXMgcmVkdWNlZCB0aGUgaGlnaGVyIHRoZSBmcmVxdWVuY3kgb2YgdGhlIFBXTSBzaWduYWwgaXMuCisgKgorICogQHBhcmFtIGR1dHlDeWNsZSBUaGUgZHV0eS1jeWNsZSB0byBjaGFuZ2UgdG8uIFswLi4xXQorICovCit2b2lkIERpZ2l0YWxPdXRwdXQ6OlVwZGF0ZUR1dHlDeWNsZShmbG9hdCBkdXR5Q3ljbGUpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0UFdNRHV0eUN5Y2xlKG1fcHdtR2VuZXJhdG9yLCBkdXR5Q3ljbGUsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBjaGFubmVsIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK3VpbnQzMl90IERpZ2l0YWxPdXRwdXQ6OkdldENoYW5uZWxGb3JSb3V0aW5nKCkgY29uc3QgeyByZXR1cm4gR2V0Q2hhbm5lbCgpOyB9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgbW9kdWxlIGZpZWxkIG9mIGEgcm91dGluZyBtdXguCisgKi8KK3VpbnQzMl90IERpZ2l0YWxPdXRwdXQ6OkdldE1vZHVsZUZvclJvdXRpbmcoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKy8qKgorICogQHJldHVybiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgYW5hbG9nIHRyaWdnZXIgZmllbGQgb2YgYSByb3V0aW5nIG11eC4KKyAqLworYm9vbCBEaWdpdGFsT3V0cHV0OjpHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKK3ZvaWQgRGlnaXRhbE91dHB1dDo6VmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIHsKKyAgaWYgKCF2YWx1ZS0+SXNCb29sZWFuKCkpIHJldHVybjsKKyAgU2V0KHZhbHVlLT5HZXRCb29sZWFuKCkpOworfQorCit2b2lkIERpZ2l0YWxPdXRwdXQ6OlVwZGF0ZVRhYmxlKCkge30KKwordm9pZCBEaWdpdGFsT3V0cHV0OjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+QWRkVGFibGVMaXN0ZW5lcigiVmFsdWUiLCB0aGlzLCB0cnVlKTsKKyAgfQorfQorCit2b2lkIERpZ2l0YWxPdXRwdXQ6OlN0b3BMaXZlV2luZG93TW9kZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgRGlnaXRhbE91dHB1dDo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworICByZXR1cm4gIkRpZ2l0YWwgT3V0cHV0IjsKK30KKwordm9pZCBEaWdpdGFsT3V0cHV0OjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YlRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBEaWdpdGFsT3V0cHV0OjpHZXRUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGU7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9Eb3VibGVTb2xlbm9pZC5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvRG91YmxlU29sZW5vaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjI5NDMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvRG91YmxlU29sZW5vaWQuY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRvdWJsZVNvbGVub2lkLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICogVXNlcyB0aGUgZGVmYXVsdCBQQ00gSUQgb2YgMAorICogQHBhcmFtIGZvcndhcmRDaGFubmVsIFRoZSBmb3J3YXJkIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSBQQ00gKDAuLjcpLgorICogQHBhcmFtIHJldmVyc2VDaGFubmVsIFRoZSByZXZlcnNlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSBQQ00gKDAuLjcpLgorICovCitEb3VibGVTb2xlbm9pZDo6RG91YmxlU29sZW5vaWQodWludDMyX3QgZm9yd2FyZENoYW5uZWwsIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKQorICAgIDogRG91YmxlU29sZW5vaWQoR2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKCksIGZvcndhcmRDaGFubmVsLCByZXZlcnNlQ2hhbm5lbCkge30KKworLyoqCisgKiBDb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gbW9kdWxlTnVtYmVyIFRoZSBDQU4gSUQgb2YgdGhlIFBDTS4KKyAqIEBwYXJhbSBmb3J3YXJkQ2hhbm5lbCBUaGUgZm9yd2FyZCBjaGFubmVsIG9uIHRoZSBQQ00gdG8gY29udHJvbCAoMC4uNykuCisgKiBAcGFyYW0gcmV2ZXJzZUNoYW5uZWwgVGhlIHJldmVyc2UgY2hhbm5lbCBvbiB0aGUgUENNIHRvIGNvbnRyb2wgKDAuLjcpLgorICovCitEb3VibGVTb2xlbm9pZDo6RG91YmxlU29sZW5vaWQodWludDhfdCBtb2R1bGVOdW1iZXIsIHVpbnQzMl90IGZvcndhcmRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJldmVyc2VDaGFubmVsKQorICAgIDogU29sZW5vaWRCYXNlKG1vZHVsZU51bWJlciksCisgICAgICBtX2ZvcndhcmRDaGFubmVsKGZvcndhcmRDaGFubmVsKSwKKyAgICAgIG1fcmV2ZXJzZUNoYW5uZWwocmV2ZXJzZUNoYW5uZWwpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOworICBpZiAoIUNoZWNrU29sZW5vaWRNb2R1bGUobV9tb2R1bGVOdW1iZXIpKSB7CisgICAgYnVmIDw8ICJTb2xlbm9pZCBNb2R1bGUgIiA8PCBtX21vZHVsZU51bWJlcjsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChNb2R1bGVJbmRleE91dE9mUmFuZ2UsIGJ1Zi5zdHIoKSk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghQ2hlY2tTb2xlbm9pZENoYW5uZWwobV9mb3J3YXJkQ2hhbm5lbCkpIHsKKyAgICBidWYgPDwgIlNvbGVub2lkIE1vZHVsZSAiIDw8IG1fZm9yd2FyZENoYW5uZWw7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmLnN0cigpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFDaGVja1NvbGVub2lkQ2hhbm5lbChtX3JldmVyc2VDaGFubmVsKSkgeworICAgIGJ1ZiA8PCAiU29sZW5vaWQgTW9kdWxlICIgPDwgbV9yZXZlcnNlQ2hhbm5lbDsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYuc3RyKCkpOworICAgIHJldHVybjsKKyAgfQorICBSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QoCisgICAgICBtX2FsbG9jYXRlZCwgbV9tYXhNb2R1bGVzICogbV9tYXhQb3J0cyk7CisKKyAgYnVmIDw8ICJTb2xlbm9pZCAiIDw8IG1fZm9yd2FyZENoYW5uZWwgPDwgIiAoTW9kdWxlOiAiIDw8IG1fbW9kdWxlTnVtYmVyCisgICAgICA8PCAiKSI7CisgIGlmIChtX2FsbG9jYXRlZC0+QWxsb2NhdGUoCisgICAgICAgICAgbV9tb2R1bGVOdW1iZXIgKiBrU29sZW5vaWRDaGFubmVscyArIG1fZm9yd2FyZENoYW5uZWwsIGJ1Zi5zdHIoKSkgPT0KKyAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkgeworICAgIENsb25lRXJyb3IoKm1fYWxsb2NhdGVkKTsKKyAgICByZXR1cm47CisgIH0KKworICBidWYgPDwgIlNvbGVub2lkICIgPDwgbV9yZXZlcnNlQ2hhbm5lbCA8PCAiIChNb2R1bGU6ICIgPDwgbV9tb2R1bGVOdW1iZXIKKyAgICAgIDw8ICIpIjsKKyAgaWYgKG1fYWxsb2NhdGVkLT5BbGxvY2F0ZSgKKyAgICAgICAgICBtX21vZHVsZU51bWJlciAqIGtTb2xlbm9pZENoYW5uZWxzICsgbV9yZXZlcnNlQ2hhbm5lbCwgYnVmLnN0cigpKSA9PQorICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CisgICAgQ2xvbmVFcnJvcigqbV9hbGxvY2F0ZWQpOworICAgIHJldHVybjsKKyAgfQorCisgIG1fZm9yd2FyZE1hc2sgPSAxIDw8IG1fZm9yd2FyZENoYW5uZWw7CisgIG1fcmV2ZXJzZU1hc2sgPSAxIDw8IG1fcmV2ZXJzZUNoYW5uZWw7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgbV9mb3J3YXJkQ2hhbm5lbCwKKyAgICAgICAgICAgIG1fbW9kdWxlTnVtYmVyKTsKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1NvbGVub2lkLCBtX3JldmVyc2VDaGFubmVsLAorICAgICAgICAgICAgbV9tb2R1bGVOdW1iZXIpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRBY3R1YXRvcigiRG91YmxlU29sZW5vaWQiLCBtX21vZHVsZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb3J3YXJkQ2hhbm5lbCwgdGhpcyk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworRG91YmxlU29sZW5vaWQ6On5Eb3VibGVTb2xlbm9pZCgpIHsKKyAgaWYgKENoZWNrU29sZW5vaWRNb2R1bGUobV9tb2R1bGVOdW1iZXIpKSB7CisgICAgbV9hbGxvY2F0ZWQtPkZyZWUobV9tb2R1bGVOdW1iZXIgKiBrU29sZW5vaWRDaGFubmVscyArIG1fZm9yd2FyZENoYW5uZWwpOworICAgIG1fYWxsb2NhdGVkLT5GcmVlKG1fbW9kdWxlTnVtYmVyICoga1NvbGVub2lkQ2hhbm5lbHMgKyBtX3JldmVyc2VDaGFubmVsKTsKKyAgfQorICBpZiAobV90YWJsZSAhPSBudWxscHRyKSBtX3RhYmxlLT5SZW1vdmVUYWJsZUxpc3RlbmVyKHRoaXMpOworfQorCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBzb2xlbm9pZC4KKyAqCisgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCAoT2ZmLCBGb3J3YXJkIG9yIFJldmVyc2UpCisgKi8KK3ZvaWQgRG91YmxlU29sZW5vaWQ6OlNldChWYWx1ZSB2YWx1ZSkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIHVpbnQ4X3QgcmF3VmFsdWUgPSAweDAwOworCisgIHN3aXRjaCAodmFsdWUpIHsKKyAgICBjYXNlIGtPZmY6CisgICAgICByYXdWYWx1ZSA9IDB4MDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtGb3J3YXJkOgorICAgICAgcmF3VmFsdWUgPSBtX2ZvcndhcmRNYXNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrUmV2ZXJzZToKKyAgICAgIHJhd1ZhbHVlID0gbV9yZXZlcnNlTWFzazsKKyAgICAgIGJyZWFrOworICB9CisKKyAgU29sZW5vaWRCYXNlOjpTZXQocmF3VmFsdWUsIG1fZm9yd2FyZE1hc2sgfCBtX3JldmVyc2VNYXNrLCBtX21vZHVsZU51bWJlcik7Cit9CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCisgKi8KK0RvdWJsZVNvbGVub2lkOjpWYWx1ZSBEb3VibGVTb2xlbm9pZDo6R2V0KCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4ga09mZjsKKyAgdWludDhfdCB2YWx1ZSA9IEdldEFsbChtX21vZHVsZU51bWJlcik7CisKKyAgaWYgKHZhbHVlICYgbV9mb3J3YXJkTWFzaykgcmV0dXJuIGtGb3J3YXJkOworICBpZiAodmFsdWUgJiBtX3JldmVyc2VNYXNrKSByZXR1cm4ga1JldmVyc2U7CisgIHJldHVybiBrT2ZmOworfQorLyoqCisgKiBDaGVjayBpZiB0aGUgZm9yd2FyZCBzb2xlbm9pZCBpcyBibGFja2xpc3RlZC4KKyAqIAkJSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAorICogCQlkaXNhYmxlZCB1bnRpbCBwb3dlciBjeWNsZSwgb3IgdW50aWwgZmF1bHRzIGFyZSBjbGVhcmVkLgorICogCQlAc2VlIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKKyAqCisgKiBAcmV0dXJuIElmIHNvbGVub2lkIGlzIGRpc2FibGVkIGR1ZSB0byBzaG9ydC4KKyAqLworYm9vbCBEb3VibGVTb2xlbm9pZDo6SXNGd2RTb2xlbm9pZEJsYWNrTGlzdGVkKCkgY29uc3QgeworICBpbnQgYmxhY2tMaXN0ID0gR2V0UENNU29sZW5vaWRCbGFja0xpc3QobV9tb2R1bGVOdW1iZXIpOworICByZXR1cm4gKGJsYWNrTGlzdCAmIG1fZm9yd2FyZE1hc2spID8gMSA6IDA7Cit9CisvKioKKyAqIENoZWNrIGlmIHRoZSByZXZlcnNlIHNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLgorICogCQlJZiBhIHNvbGVub2lkIGlzIHNob3J0ZWQsIGl0IGlzIGFkZGVkIHRvIHRoZSBibGFja2xpc3QgYW5kCisgKiAJCWRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCisgKiAJCUBzZWUgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKQorICoKKyAqIEByZXR1cm4gSWYgc29sZW5vaWQgaXMgZGlzYWJsZWQgZHVlIHRvIHNob3J0LgorICovCitib29sIERvdWJsZVNvbGVub2lkOjpJc1JldlNvbGVub2lkQmxhY2tMaXN0ZWQoKSBjb25zdCB7CisgIGludCBibGFja0xpc3QgPSBHZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdChtX21vZHVsZU51bWJlcik7CisgIHJldHVybiAoYmxhY2tMaXN0ICYgbV9yZXZlcnNlTWFzaykgPyAxIDogMDsKK30KKwordm9pZCBEb3VibGVTb2xlbm9pZDo6VmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOZXcpIHsKKyAgaWYgKCF2YWx1ZS0+SXNTdHJpbmcoKSkgcmV0dXJuOworICBWYWx1ZSBsdmFsdWUgPSBrT2ZmOworICBpZiAodmFsdWUtPkdldFN0cmluZygpID09ICJGb3J3YXJkIikKKyAgICBsdmFsdWUgPSBrRm9yd2FyZDsKKyAgZWxzZSBpZiAodmFsdWUtPkdldFN0cmluZygpID09ICJSZXZlcnNlIikKKyAgICBsdmFsdWUgPSBrUmV2ZXJzZTsKKyAgU2V0KGx2YWx1ZSk7Cit9CisKK3ZvaWQgRG91YmxlU29sZW5vaWQ6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0U3RyaW5nKAorICAgICAgICAiVmFsdWUiLCAoR2V0KCkgPT0ga0ZvcndhcmQgPyAiRm9yd2FyZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEdldCgpID09IGtSZXZlcnNlID8gIlJldmVyc2UiIDogIk9mZiIpKSk7CisgIH0KK30KKwordm9pZCBEb3VibGVTb2xlbm9pZDo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsKKyAgU2V0KGtPZmYpOworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+QWRkVGFibGVMaXN0ZW5lcigiVmFsdWUiLCB0aGlzLCB0cnVlKTsKKyAgfQorfQorCit2b2lkIERvdWJsZVNvbGVub2lkOjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7CisgIFNldChrT2ZmKTsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgRG91YmxlU29sZW5vaWQ6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJEb3VibGUgU29sZW5vaWQiOworfQorCit2b2lkIERvdWJsZVNvbGVub2lkOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YlRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBEb3VibGVTb2xlbm9pZDo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvRHJpdmVyU3RhdGlvbi5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvRHJpdmVyU3RhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1YTk4NwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9Ecml2ZXJTdGF0aW9uLmNwcApAQCAtMCwwICsxLDUzNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgiCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiTG9nLmhwcCIKKworLy8gc2V0IHRoZSBsb2dnaW5nIGxldmVsCitUTG9nTGV2ZWwgZHNMb2dMZXZlbCA9IGxvZ0RFQlVHOworY29uc3QgZG91YmxlIEpPWVNUSUNLX1VOUExVR0dFRF9NRVNTQUdFX0lOVEVSVkFMID0gMS4wOworCisjZGVmaW5lIERTX0xPRyhsZXZlbCkgICAgIFwKKyAgaWYgKGxldmVsID4gZHNMb2dMZXZlbCkgXAorICAgIDsgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAgIFwKKyAgTG9nKCkuR2V0KGxldmVsKQorCitjb25zdCB1aW50MzJfdCBEcml2ZXJTdGF0aW9uOjprSm95c3RpY2tQb3J0czsKKworLyoqCisgKiBEcml2ZXJTdGF0aW9uIGNvbnN0cnVjdG9yLgorICoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgb25jZSB0aGUgZmlyc3QgdGltZSBHZXRJbnN0YW5jZSgpIGlzIGNhbGxlZAorICovCitEcml2ZXJTdGF0aW9uOjpEcml2ZXJTdGF0aW9uKCkgeworICAvLyBBbGwgam95c3RpY2tzIHNob3VsZCBkZWZhdWx0IHRvIGhhdmluZyB6ZXJvIGF4ZXMsIHBvdnMgYW5kIGJ1dHRvbnMsIHNvCisgIC8vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGRvZXNuJ3QgZ2V0IHNlbnQgdG8gc3BlZWQgY29udHJvbGxlcnMuCisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwga0pveXN0aWNrUG9ydHM7IGkrKykgeworICAgIG1fam95c3RpY2tBeGVzW2ldLmNvdW50ID0gMDsKKyAgICBtX2pveXN0aWNrUE9Wc1tpXS5jb3VudCA9IDA7CisgICAgbV9qb3lzdGlja0J1dHRvbnNbaV0uY291bnQgPSAwOworICAgIG1fam95c3RpY2tEZXNjcmlwdG9yW2ldLmlzWGJveCA9IDA7CisgICAgbV9qb3lzdGlja0Rlc2NyaXB0b3JbaV0udHlwZSA9IC0xOworICAgIG1fam95c3RpY2tEZXNjcmlwdG9yW2ldLm5hbWVbMF0gPSAnXDAnOworICB9CisgIC8vIFJlZ2lzdGVyIHRoYXQgc2VtYXBob3JlIHdpdGggdGhlIG5ldHdvcmsgY29tbXVuaWNhdGlvbnMgdGFzay4KKyAgLy8gSXQgd2lsbCBzaWduYWwgd2hlbiBuZXcgcGFja2V0IGRhdGEgaXMgYXZhaWxhYmxlLgorICBIQUxTZXROZXdEYXRhU2VtKCZtX3BhY2tldERhdGFBdmFpbGFibGVDb25kKTsKKworICBBZGRUb1NpbmdsZXRvbkxpc3QoKTsKKworICBtX3Rhc2sgPSBUYXNrKCJEcml2ZXJTdGF0aW9uIiwgJkRyaXZlclN0YXRpb246OlJ1biwgdGhpcyk7Cit9CisKK0RyaXZlclN0YXRpb246On5Ecml2ZXJTdGF0aW9uKCkgeworICBtX2lzUnVubmluZyA9IGZhbHNlOworICBtX3Rhc2suam9pbigpOworCisgIC8vIFVucmVnaXN0ZXIgb3VyIHNlbWFwaG9yZS4KKyAgSEFMU2V0TmV3RGF0YVNlbShudWxscHRyKTsKK30KKwordm9pZCBEcml2ZXJTdGF0aW9uOjpSdW4oKSB7CisgIG1faXNSdW5uaW5nID0gdHJ1ZTsKKyAgaW50IHBlcmlvZCA9IDA7CisgIHdoaWxlIChtX2lzUnVubmluZykgeworICAgIHsKKyAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9wYWNrZXREYXRhQXZhaWxhYmxlTXV0ZXgpOworICAgICAgbV9wYWNrZXREYXRhQXZhaWxhYmxlQ29uZC53YWl0KGxvY2spOworICAgIH0KKyAgICBHZXREYXRhKCk7CisgICAgbV93YWl0Rm9yRGF0YUNvbmQubm90aWZ5X2FsbCgpOworCisgICAgaWYgKCsrcGVyaW9kID49IDQpIHsKKyAgICAgIE1vdG9yU2FmZXR5SGVscGVyOjpDaGVja01vdG9ycygpOworICAgICAgcGVyaW9kID0gMDsKKyAgICB9CisgICAgaWYgKG1fdXNlckluRGlzYWJsZWQpIEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoKTsKKyAgICBpZiAobV91c2VySW5BdXRvbm9tb3VzKQorICAgICAgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1BdXRvbm9tb3VzKCk7CisgICAgaWYgKG1fdXNlckluVGVsZW9wKSBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCgpOworICAgIGlmIChtX3VzZXJJblRlc3QpIEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCgpOworICB9Cit9CisKKy8qKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc2luZ2xldG9uIERyaXZlclN0YXRpb24uCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIERTIGluc3RhbmNlCisgKi8KK0RyaXZlclN0YXRpb24gJkRyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCkgeworICBzdGF0aWMgRHJpdmVyU3RhdGlvbiBpbnN0YW5jZTsKKyAgcmV0dXJuIGluc3RhbmNlOworfQorCisvKioKKyAqIENvcHkgZGF0YSBmcm9tIHRoZSBEUyB0YXNrIGZvciB0aGUgdXNlci4KKyAqIElmIG5vIG5ldyBkYXRhIGV4aXN0cywgaXQgd2lsbCBqdXN0IGJlIHJldHVybmVkLCBvdGhlcndpc2UKKyAqIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIERTIHBvbGxpbmcgbG9vcC4KKyAqLwordm9pZCBEcml2ZXJTdGF0aW9uOjpHZXREYXRhKCkgeworICAvLyBHZXQgdGhlIHN0YXR1cyBvZiBhbGwgb2YgdGhlIGpveXN0aWNrcworICBmb3IgKHVpbnQ4X3Qgc3RpY2sgPSAwOyBzdGljayA8IGtKb3lzdGlja1BvcnRzOyBzdGljaysrKSB7CisgICAgSEFMR2V0Sm95c3RpY2tBeGVzKHN0aWNrLCAmbV9qb3lzdGlja0F4ZXNbc3RpY2tdKTsKKyAgICBIQUxHZXRKb3lzdGlja1BPVnMoc3RpY2ssICZtX2pveXN0aWNrUE9Wc1tzdGlja10pOworICAgIEhBTEdldEpveXN0aWNrQnV0dG9ucyhzdGljaywgJm1fam95c3RpY2tCdXR0b25zW3N0aWNrXSk7CisgICAgSEFMR2V0Sm95c3RpY2tEZXNjcmlwdG9yKHN0aWNrLCAmbV9qb3lzdGlja0Rlc2NyaXB0b3Jbc3RpY2tdKTsKKyAgfQorICBtX25ld0NvbnRyb2xEYXRhLmdpdmUoKTsKK30KKworLyoqCisgKiBSZWFkIHRoZSBiYXR0ZXJ5IHZvbHRhZ2UuCisgKgorICogQHJldHVybiBUaGUgYmF0dGVyeSB2b2x0YWdlIGluIFZvbHRzLgorICovCitmbG9hdCBEcml2ZXJTdGF0aW9uOjpHZXRCYXR0ZXJ5Vm9sdGFnZSgpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBmbG9hdCB2b2x0YWdlID0gZ2V0VmluVm9sdGFnZSgmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCAiZ2V0VmluVm9sdGFnZSIpOworCisgIHJldHVybiB2b2x0YWdlOworfQorCisvKioKKyAqIFJlcG9ydHMgZXJyb3JzIHJlbGF0ZWQgdG8gdW5wbHVnZ2VkIGpveXN0aWNrcworICogVGhyb3R0bGVzIHRoZSBlcnJvcnMgc28gdGhhdCB0aGV5IGRvbid0IG92ZXJ3aGVsbSB0aGUgRFMKKyAqLwordm9pZCBEcml2ZXJTdGF0aW9uOjpSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKHN0ZDo6c3RyaW5nIG1lc3NhZ2UpIHsKKyAgZG91YmxlIGN1cnJlbnRUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKKyAgaWYgKGN1cnJlbnRUaW1lID4gbV9uZXh0TWVzc2FnZVRpbWUpIHsKKyAgICBSZXBvcnRFcnJvcihtZXNzYWdlKTsKKyAgICBtX25leHRNZXNzYWdlVGltZSA9IGN1cnJlbnRUaW1lICsgSk9ZU1RJQ0tfVU5QTFVHR0VEX01FU1NBR0VfSU5URVJWQUw7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXhlcyBvbiBhIGdpdmVuIGpveXN0aWNrIHBvcnQKKyAqCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHBvcnQgbnVtYmVyCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXhlcyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCisgKi8KK2ludCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0F4aXNDb3VudCh1aW50MzJfdCBzdGljaykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgSEFMSm95c3RpY2tBeGVzIGpveXN0aWNrQXhlczsKKyAgSEFMR2V0Sm95c3RpY2tBeGVzKHN0aWNrLCAmam95c3RpY2tBeGVzKTsKKyAgcmV0dXJuIGpveXN0aWNrQXhlcy5jb3VudDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBqb3lzdGljayBhdCB0aGUgZ2l2ZW4gcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGpveXN0aWNrIGF0IHRoZSBnaXZlbiBwb3J0CisgKi8KK3N0ZDo6c3RyaW5nIERyaXZlclN0YXRpb246OkdldEpveXN0aWNrTmFtZSh1aW50MzJfdCBzdGljaykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgIH0KKyAgc3RkOjpzdHJpbmcgcmV0VmFsKG1fam95c3RpY2tEZXNjcmlwdG9yWzBdLm5hbWUpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgb2Ygam95c3RpY2sgYXQgYSBnaXZlbiBwb3J0CisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgorICogQHJldHVybiBUaGUgSElEIHR5cGUgb2Ygam95c3RpY2sgYXQgdGhlIGdpdmVuIHBvcnQKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldEpveXN0aWNrVHlwZSh1aW50MzJfdCBzdGljaykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAoaW50KW1fam95c3RpY2tEZXNjcmlwdG9yW3N0aWNrXS50eXBlOworfQorCisvKioKKyAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNvbnRyb2xsZXIgaXMgYW4geGJveCBjb250cm9sbGVyLgorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gQSBib29sZWFuIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgY29udHJvbGxlciBpcyBhbiB4Ym94IGNvbnRyb2xsZXIuCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6R2V0Sm95c3RpY2tJc1hib3godWludDMyX3Qgc3RpY2spIGNvbnN0IHsKKyAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gKGJvb2wpbV9qb3lzdGlja0Rlc2NyaXB0b3Jbc3RpY2tdLmlzWGJveDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSB0eXBlcyBvZiBBeGVzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIgYW5kIHRoZSB0YXJnZXQgYXhpcworICogQHJldHVybiBXaGF0IHR5cGUgb2YgYXhpcyB0aGUgYXhpcyBpcyByZXBvcnRpbmcgdG8gYmUKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldEpveXN0aWNrQXhpc1R5cGUodWludDMyX3Qgc3RpY2ssIHVpbnQ4X3QgYXhpcykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBtX2pveXN0aWNrRGVzY3JpcHRvcltzdGlja10uYXhpc1R5cGVzW2F4aXNdOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBQT1ZzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBQT1ZzIG9uIHRoZSBpbmRpY2F0ZWQgam95c3RpY2sKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldFN0aWNrUE9WQ291bnQodWludDMyX3Qgc3RpY2spIGNvbnN0IHsKKyAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgIHJldHVybiAwOworICB9CisgIEhBTEpveXN0aWNrUE9WcyBqb3lzdGlja1BPVnM7CisgIEhBTEdldEpveXN0aWNrUE9WcyhzdGljaywgJmpveXN0aWNrUE9Wcyk7CisgIHJldHVybiBqb3lzdGlja1BPVnMuY291bnQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gYSBnaXZlbiBqb3lzdGljayBwb3J0CisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gdGhlIGluZGljYXRlZCBqb3lzdGljaworICovCitpbnQgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tCdXR0b25Db3VudCh1aW50MzJfdCBzdGljaykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgSEFMSm95c3RpY2tCdXR0b25zIGpveXN0aWNrQnV0dG9uczsKKyAgSEFMR2V0Sm95c3RpY2tCdXR0b25zKHN0aWNrLCAmam95c3RpY2tCdXR0b25zKTsKKyAgcmV0dXJuIGpveXN0aWNrQnV0dG9ucy5jb3VudDsKK30KKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBheGlzIG9uIGEgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgorICogQHBhcmFtIGF4aXMgVGhlIGFuYWxvZyBheGlzIHZhbHVlIHRvIHJlYWQgZnJvbSB0aGUgam95c3RpY2suCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXhpcyBvbiB0aGUgam95c3RpY2suCisgKi8KK2Zsb2F0IERyaXZlclN0YXRpb246OkdldFN0aWNrQXhpcyh1aW50MzJfdCBzdGljaywgdWludDMyX3QgYXhpcykgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYXhpcyA+PSBtX2pveXN0aWNrQXhlc1tzdGlja10uY291bnQpIHsKKyAgICBpZiAoYXhpcyA+PSBrTWF4Sm95c3RpY2tBeGVzKQorICAgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrQXhpcyk7CisgICAgZWxzZQorICAgICAgUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcigKKyAgICAgICAgICAiV0FSTklORzogSm95c3RpY2sgQXhpcyBtaXNzaW5nLCBjaGVjayBpZiBhbGwgY29udHJvbGxlcnMgYXJlICIKKyAgICAgICAgICAicGx1Z2dlZCBpblxuIik7CisgICAgcmV0dXJuIDAuMGY7CisgIH0KKworICBpbnQ4X3QgdmFsdWUgPSBtX2pveXN0aWNrQXhlc1tzdGlja10uYXhlc1theGlzXTsKKworICBpZiAodmFsdWUgPCAwKSB7CisgICAgcmV0dXJuIHZhbHVlIC8gMTI4LjBmOworICB9IGVsc2UgeworICAgIHJldHVybiB2YWx1ZSAvIDEyNy4wZjsKKyAgfQorfQorCisvKioKKyAqIEdldCB0aGUgc3RhdGUgb2YgYSBQT1Ygb24gdGhlIGpveXN0aWNrLgorICoKKyAqIEByZXR1cm4gdGhlIGFuZ2xlIG9mIHRoZSBQT1YgaW4gZGVncmVlcywgb3IgLTEgaWYgdGhlIFBPViBpcyBub3QgcHJlc3NlZC4KKyAqLworaW50IERyaXZlclN0YXRpb246OkdldFN0aWNrUE9WKHVpbnQzMl90IHN0aWNrLCB1aW50MzJfdCBwb3YpIHsKKyAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChwb3YgPj0gbV9qb3lzdGlja1BPVnNbc3RpY2tdLmNvdW50KSB7CisgICAgaWYgKHBvdiA+PSBrTWF4Sm95c3RpY2tQT1ZzKQorICAgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrQXhpcyk7CisgICAgZWxzZQorICAgICAgUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcigKKyAgICAgICAgICAiV0FSTklORzogSm95c3RpY2sgUE9WIG1pc3NpbmcsIGNoZWNrIGlmIGFsbCBjb250cm9sbGVycyBhcmUgcGx1Z2dlZCAiCisgICAgICAgICAgImluXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gbV9qb3lzdGlja1BPVnNbc3RpY2tdLnBvdnNbcG92XTsKK30KKworLyoqCisgKiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbnMgb24gdGhlIGpveXN0aWNrLgorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgdG8gcmVhZC4KKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b25zIG9uIHRoZSBqb3lzdGljay4KKyAqLwordWludDMyX3QgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tCdXR0b25zKHVpbnQzMl90IHN0aWNrKSBjb25zdCB7CisgIGlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykgeworICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10uYnV0dG9uczsKK30KKworLyoqCisgKiBUaGUgc3RhdGUgb2Ygb25lIGpveXN0aWNrIGJ1dHRvbi4gQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMS4KKyAqCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHRvIHJlYWQuCisgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gaW5kZXgsIGJlZ2lubmluZyBhdCAxLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGpveXN0aWNrIGJ1dHRvbi4KKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0J1dHRvbih1aW50MzJfdCBzdGljaywgdWludDhfdCBidXR0b24pIHsKKyAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChidXR0b24gPiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10uY291bnQpIHsKKyAgICBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKAorICAgICAgICAiV0FSTklORzogSm95c3RpY2sgQnV0dG9uIG1pc3NpbmcsIGNoZWNrIGlmIGFsbCBjb250cm9sbGVycyBhcmUgIgorICAgICAgICAicGx1Z2dlZCBpblxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChidXR0b24gPT0gMCkgeworICAgIFJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3IoCisgICAgICAgICJFUlJPUjogQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMSBpbiBXUElMaWIgZm9yIEMrKyBhbmQgSmF2YSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gKCgweDEgPDwgKGJ1dHRvbiAtIDEpKSAmIG1fam95c3RpY2tCdXR0b25zW3N0aWNrXS5idXR0b25zKSAhPSAwOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBEUyBoYXMgZW5hYmxlZCB0aGUgcm9ib3QKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgZW5hYmxlZCBhbmQgdGhlIERTIGlzIGNvbm5lY3RlZAorICovCitib29sIERyaXZlclN0YXRpb246OklzRW5hYmxlZCgpIGNvbnN0IHsKKyAgSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gY29udHJvbFdvcmQuZW5hYmxlZCAmJiBjb250cm9sV29yZC5kc0F0dGFjaGVkOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSByb2JvdCBpcyBkaXNhYmxlZAorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBleHBsaWNpdGx5IGRpc2FibGVkIG9yIHRoZSBEUyBpcyBub3QgY29ubmVjdGVkCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNEaXNhYmxlZCgpIGNvbnN0IHsKKyAgSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gIShjb250cm9sV29yZC5lbmFibGVkICYmIGNvbnRyb2xXb3JkLmRzQXR0YWNoZWQpOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBEUyBpcyBjb21tYW5kaW5nIGF1dG9ub21vdXMgbW9kZQorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBiZWluZyBjb21tYW5kZWQgdG8gYmUgaW4gYXV0b25vbW91cyBtb2RlCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNBdXRvbm9tb3VzKCkgY29uc3QgeworICBIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKyAgbWVtc2V0KCZjb250cm9sV29yZCwgMCwgc2l6ZW9mKGNvbnRyb2xXb3JkKSk7CisgIEhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisgIHJldHVybiBjb250cm9sV29yZC5hdXRvbm9tb3VzOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBEUyBpcyBjb21tYW5kaW5nIHRlbGVvcCBtb2RlCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGJlaW5nIGNvbW1hbmRlZCB0byBiZSBpbiB0ZWxlb3AgbW9kZQorICovCitib29sIERyaXZlclN0YXRpb246OklzT3BlcmF0b3JDb250cm9sKCkgY29uc3QgeworICBIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKyAgbWVtc2V0KCZjb250cm9sV29yZCwgMCwgc2l6ZW9mKGNvbnRyb2xXb3JkKSk7CisgIEhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisgIHJldHVybiAhKGNvbnRyb2xXb3JkLmF1dG9ub21vdXMgfHwgY29udHJvbFdvcmQudGVzdCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIERTIGlzIGNvbW1hbmRpbmcgdGVzdCBtb2RlCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGJlaW5nIGNvbW1hbmRlZCB0byBiZSBpbiB0ZXN0IG1vZGUKKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc1Rlc3QoKSBjb25zdCB7CisgIEhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gY29udHJvbFdvcmQudGVzdDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRFMgaXMgYXR0YWNoZWQKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgRFMgaXMgY29ubmVjdGVkIHRvIHRoZSByb2JvdAorICovCitib29sIERyaXZlclN0YXRpb246OklzRFNBdHRhY2hlZCgpIGNvbnN0IHsKKyAgSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gY29udHJvbFdvcmQuZHNBdHRhY2hlZDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRlBHQSBvdXRwdXRzIGFyZSBlbmFibGVkLiBUaGUgb3V0cHV0cyBtYXkgYmUgZGlzYWJsZWQgaWYgdGhlCisgKiByb2JvdCBpcyBkaXNhYmxlZAorICogb3IgZS1zdG9wcGVkLCB0aGUgd2F0Y2hkb2cgaGFzIGV4cGlyZWQsIG9yIGlmIHRoZSByb2JvUklPIGJyb3ducyBvdXQuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIEZQR0Egb3V0cHV0cyBhcmUgZW5hYmxlZC4KKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc1N5c0FjdGl2ZSgpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBib29sIHJldFZhbCA9IEhBTEdldFN5c3RlbUFjdGl2ZSgmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHN5c3RlbSBpcyBicm93bmVkIG91dC4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3lzdGVtIGlzIGJyb3duZWQgb3V0CisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNTeXNCcm93bmVkT3V0KCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGJvb2wgcmV0VmFsID0gSEFMR2V0QnJvd25lZE91dCgmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogSGFzIGEgbmV3IGNvbnRyb2wgcGFja2V0IGZyb20gdGhlIGRyaXZlciBzdGF0aW9uIGFycml2ZWQgc2luY2UgdGhlIGxhc3QgdGltZQorICogdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkPworICogV2FybmluZzogSWYgeW91IGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIG1vcmUgdGhhbiBvbmUgcGxhY2UgYXQgdGhlIHNhbWUgdGltZSwKKyAqIHlvdSB3aWxsIG5vdCBnZXQgdGhlIGdldCB0aGUgaW50ZW5kZWQgYmVoYXZpb3VyLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250cm9sIGRhdGEgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsLgorICovCitib29sIERyaXZlclN0YXRpb246OklzTmV3Q29udHJvbERhdGEoKSBjb25zdCB7CisgIHJldHVybiBtX25ld0NvbnRyb2xEYXRhLnRyeVRha2UoKSA9PSBmYWxzZTsKK30KKworLyoqCisgKiBJcyB0aGUgZHJpdmVyIHN0YXRpb24gYXR0YWNoZWQgdG8gYSBGaWVsZCBNYW5hZ2VtZW50IFN5c3RlbT8KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgY29tcGV0aW5nIG9uIGEgZmllbGQgYmVpbmcgY29udHJvbGxlZCBieSBhIEZpZWxkCisgKiBNYW5hZ2VtZW50IFN5c3RlbQorICovCitib29sIERyaXZlclN0YXRpb246OklzRk1TQXR0YWNoZWQoKSBjb25zdCB7CisgIEhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gY29udHJvbFdvcmQuZm1zQXR0YWNoZWQ7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBhbGxpYW5jZSB0aGF0IHRoZSBkcml2ZXIgc3RhdGlvbiBzYXlzIGl0IGlzIG9uLgorICogVGhpcyBjb3VsZCByZXR1cm4ga1JlZCBvciBrQmx1ZQorICogQHJldHVybiBUaGUgQWxsaWFuY2UgZW51bSAoa1JlZCwga0JsdWUgb3Iga0ludmFsaWQpCisgKi8KK0RyaXZlclN0YXRpb246OkFsbGlhbmNlIERyaXZlclN0YXRpb246OkdldEFsbGlhbmNlKCkgY29uc3QgeworICBIQUxBbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZVN0YXRpb25JRDsKKyAgSEFMR2V0QWxsaWFuY2VTdGF0aW9uKCZhbGxpYW5jZVN0YXRpb25JRCk7CisgIHN3aXRjaCAoYWxsaWFuY2VTdGF0aW9uSUQpIHsKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQxOgorICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDI6CisgICAgY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMzoKKyAgICAgIHJldHVybiBrUmVkOworICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUxOgorICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUyOgorICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUzOgorICAgICAgcmV0dXJuIGtCbHVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4ga0ludmFsaWQ7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGRyaXZlciBzdGF0aW9uIGxvY2F0aW9uIG9uIHRoZSBmaWVsZAorICogVGhpcyBjb3VsZCByZXR1cm4gMSwgMiwgb3IgMworICogQHJldHVybiBUaGUgbG9jYXRpb24gb2YgdGhlIGRyaXZlciBzdGF0aW9uICgxLTMsIDAgZm9yIGludmFsaWQpCisgKi8KK3VpbnQzMl90IERyaXZlclN0YXRpb246OkdldExvY2F0aW9uKCkgY29uc3QgeworICBIQUxBbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZVN0YXRpb25JRDsKKyAgSEFMR2V0QWxsaWFuY2VTdGF0aW9uKCZhbGxpYW5jZVN0YXRpb25JRCk7CisgIHN3aXRjaCAoYWxsaWFuY2VTdGF0aW9uSUQpIHsKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQxOgorICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUxOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMjoKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMjoKKyAgICAgIHJldHVybiAyOworICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDM6CisgICAgY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTM6CisgICAgICByZXR1cm4gMzsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworLyoqCisgKiBXYWl0IHVudGlsIGEgbmV3IHBhY2tldCBjb21lcyBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbgorICogVGhpcyBibG9ja3Mgb24gYSBzZW1hcGhvcmUsIHNvIHRoZSB3YWl0aW5nIGlzIGVmZmljaWVudC4KKyAqIFRoaXMgaXMgYSBnb29kIHdheSB0byBkZWxheSBwcm9jZXNzaW5nIHVudGlsIHRoZXJlIGlzIG5ldyBkcml2ZXIgc3RhdGlvbiBkYXRhCisgKiB0byBhY3Qgb24KKyAqLwordm9pZCBEcml2ZXJTdGF0aW9uOjpXYWl0Rm9yRGF0YSgpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxwcmlvcml0eV9tdXRleD4gbG9jayhtX3dhaXRGb3JEYXRhTXV0ZXgpOworICBtX3dhaXRGb3JEYXRhQ29uZC53YWl0KGxvY2spOworfQorCisvKioKKyAqIFJldHVybiB0aGUgYXBwcm94aW1hdGUgbWF0Y2ggdGltZQorICogVGhlIEZNUyBkb2VzIG5vdCBzZW5kIGFuIG9mZmljaWFsIG1hdGNoIHRpbWUgdG8gdGhlIHJvYm90cywgYnV0IGRvZXMgc2VuZCBhbgorICogYXBwcm94aW1hdGUgbWF0Y2ggdGltZS4KKyAqIFRoZSB2YWx1ZSB3aWxsIGNvdW50IGRvd24gdGhlIHRpbWUgcmVtYWluaW5nIGluIHRoZSBjdXJyZW50IHBlcmlvZCAoYXV0byBvcgorICogdGVsZW9wKS4KKyAqIFdhcm5pbmc6IFRoaXMgaXMgbm90IGFuIG9mZmljaWFsIHRpbWUgKHNvIGl0IGNhbm5vdCBiZSB1c2VkIHRvIGRpc3B1dGUgcmVmCisgKiBjYWxscyBvciBndWFyYW50ZWUgdGhhdCBhIGZ1bmN0aW9uCisgKiB3aWxsIHRyaWdnZXIgYmVmb3JlIHRoZSBtYXRjaCBlbmRzKQorICogVGhlIFByYWN0aWNlIE1hdGNoIGZ1bmN0aW9uIG9mIHRoZSBEUyBhcHByb3hpbWF0ZXMgdGhlIGJlaGF2aW91ciBzZWVuIG9uIHRoZQorICogZmllbGQuCisgKiBAcmV0dXJuIFRpbWUgcmVtYWluaW5nIGluIGN1cnJlbnQgbWF0Y2ggcGVyaW9kIChhdXRvIG9yIHRlbGVvcCkKKyAqLworZG91YmxlIERyaXZlclN0YXRpb246OkdldE1hdGNoVGltZSgpIGNvbnN0IHsKKyAgZmxvYXQgbWF0Y2hUaW1lOworICBIQUxHZXRNYXRjaFRpbWUoJm1hdGNoVGltZSk7CisgIHJldHVybiAoZG91YmxlKW1hdGNoVGltZTsKK30KKworLyoqCisgKiBSZXBvcnQgYW4gZXJyb3IgdG8gdGhlIERyaXZlclN0YXRpb24gbWVzc2FnZXMgd2luZG93LgorICogVGhlIGVycm9yIGlzIGFsc28gcHJpbnRlZCB0byB0aGUgcHJvZ3JhbSBjb25zb2xlLgorICovCit2b2lkIERyaXZlclN0YXRpb246OlJlcG9ydEVycm9yKHN0ZDo6c3RyaW5nIGVycm9yKSB7CisgIHN0ZDo6Y291dCA8PCBlcnJvciA8PCBzdGQ6OmVuZGw7CisKKyAgSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgIEhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisgIGlmIChjb250cm9sV29yZC5kc0F0dGFjaGVkKSB7CisgICAgSEFMU2V0RXJyb3JEYXRhKGVycm9yLmNfc3RyKCksIGVycm9yLnNpemUoKSwgMCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9FbmNvZGVyLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9FbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmExMmRmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0VuY29kZXIuY3BwCkBAIC0wLDAgKzEsNTYxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisjaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiCisjaW5jbHVkZSAiUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgRW5jb2RlcnMuCisgKiBUaGlzIGNvZGUgYWxsb2NhdGVzIHJlc291cmNlcyBmb3IgRW5jb2RlcnMgYW5kIGlzIGNvbW1vbiB0byBhbGwgY29uc3RydWN0b3JzLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gSWYgdHJ1ZSwgY291bnRzIGRvd24gaW5zdGVhZCBvZiB1cCAodGhpcyBpcyBhbGwKKyAqIHJlbGF0aXZlKQorICogQHBhcmFtIGVuY29kaW5nVHlwZSBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFgKKyAqIGRlY29kaW5nLiBJZiA0WCBpcworICogc2VsZWN0ZWQsIHRoZW4gYW4gZW5jb2RlciBGUEdBIG9iamVjdCBpcyB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgY291bnRzIHdpbGwgYmUKKyAqIDR4IHRoZSBlbmNvZGVyCisgKiBzcGVjJ2QgdmFsdWUgc2luY2UgYWxsIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyBhcmUgY291bnRlZC4gSWYgMVggb3IgMlggYXJlCisgKiBzZWxlY3RlZCB0aGVuCisgKiBhIGNvdW50ZXIgb2JqZWN0IHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkKKyAqIG1hdGNoIHRoZSBzcGVjJ2QgY291bnQKKyAqIG9yIGJlIGRvdWJsZSAoMngpIHRoZSBzcGVjJ2QgY291bnQuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6SW5pdEVuY29kZXIoYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKSB7CisgIG1fZW5jb2RpbmdUeXBlID0gZW5jb2RpbmdUeXBlOworICBzd2l0Y2ggKGVuY29kaW5nVHlwZSkgeworICAgIGNhc2UgazRYOiB7CisgICAgICBtX2VuY29kaW5nU2NhbGUgPSA0OworICAgICAgaWYgKG1fYVNvdXJjZS0+U3RhdHVzSXNGYXRhbCgpKSB7CisgICAgICAgIENsb25lRXJyb3IoKm1fYVNvdXJjZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChtX2JTb3VyY2UtPlN0YXR1c0lzRmF0YWwoKSkgeworICAgICAgICBDbG9uZUVycm9yKCptX2JTb3VyY2UpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgICBtX2VuY29kZXIgPSBpbml0aWFsaXplRW5jb2RlcigKKyAgICAgICAgICBtX2FTb3VyY2UtPkdldE1vZHVsZUZvclJvdXRpbmcoKSwgbV9hU291cmNlLT5HZXRDaGFubmVsRm9yUm91dGluZygpLAorICAgICAgICAgIG1fYVNvdXJjZS0+R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSwKKyAgICAgICAgICBtX2JTb3VyY2UtPkdldE1vZHVsZUZvclJvdXRpbmcoKSwgbV9iU291cmNlLT5HZXRDaGFubmVsRm9yUm91dGluZygpLAorICAgICAgICAgIG1fYlNvdXJjZS0+R2V0QW5hbG9nVHJpZ2dlckZvclJvdXRpbmcoKSwgcmV2ZXJzZURpcmVjdGlvbiwgJm1faW5kZXgsCisgICAgICAgICAgJnN0YXR1cyk7CisgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIG1fY291bnRlciA9IG51bGxwdHI7CisgICAgICBTZXRNYXhQZXJpb2QoLjUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgazFYOgorICAgIGNhc2UgazJYOiB7CisgICAgICBtX2VuY29kaW5nU2NhbGUgPSBlbmNvZGluZ1R5cGUgPT0gazFYID8gMSA6IDI7CisgICAgICBtX2NvdW50ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvdW50ZXI+KG1fZW5jb2RpbmdUeXBlLCBtX2FTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iU291cmNlLCByZXZlcnNlRGlyZWN0aW9uKTsKKyAgICAgIG1faW5kZXggPSBtX2NvdW50ZXItPkdldEZQR0FJbmRleCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dCgtMSwgIkludmFsaWQgZW5jb2RpbmdUeXBlIGFyZ3VtZW50Iik7CisgICAgICBicmVhazsKKyAgfQorCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9FbmNvZGVyLCBtX2luZGV4LCBlbmNvZGluZ1R5cGUpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkVuY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hU291cmNlLT5HZXRDaGFubmVsRm9yUm91dGluZygpLCB0aGlzKTsKK30KKworLyoqCisgKiBFbmNvZGVyIGNvbnN0cnVjdG9yLgorICogQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhIGFuZCBiIGNoYW5uZWxzLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKgorICogQHBhcmFtIGFDaGFubmVsIFRoZSBhIGNoYW5uZWwgRElPIGNoYW5uZWwuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUKKyAqIE1YUCBwb3J0CisgKiBAcGFyYW0gYkNoYW5uZWwgVGhlIGIgY2hhbm5lbCBESU8gY2hhbm5lbC4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZQorICogTVhQIHBvcnQKKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZCBpbnZlcnRzCisgKiB0aGUgb3V0cHV0IHZhbHVlcworICogaWYgbmVjZXNzYXJ5IHNvIGZvcndhcmQgcmVwcmVzZW50cyBwb3NpdGl2ZSB2YWx1ZXMuCisgKiBAcGFyYW0gZW5jb2RpbmdUeXBlIGVpdGhlciBrMVgsIGsyWCwgb3IgazRYIHRvIGluZGljYXRlIDFYLCAyWCBvciA0WAorICogZGVjb2RpbmcuIElmIDRYIGlzCisgKiBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0Egb2JqZWN0IGlzIHVzZWQgYW5kIHRoZSByZXR1cm5lZCBjb3VudHMgd2lsbCBiZQorICogNHggdGhlIGVuY29kZXIKKyAqIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIGFyZSBjb3VudGVkLiBJZiAxWCBvciAyWCBhcmUKKyAqIHNlbGVjdGVkIHRoZW4KKyAqIGEgY291bnRlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBlaXRoZXIgZXhhY3RseQorICogbWF0Y2ggdGhlIHNwZWMnZCBjb3VudAorICogb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KKyAqLworRW5jb2Rlcjo6RW5jb2Rlcih1aW50MzJfdCBhQ2hhbm5lbCwgdWludDMyX3QgYkNoYW5uZWwsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSkgeworICBtX2FTb3VyY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPERpZ2l0YWxJbnB1dD4oYUNoYW5uZWwpOworICBtX2JTb3VyY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPERpZ2l0YWxJbnB1dD4oYkNoYW5uZWwpOworICBJbml0RW5jb2RlcihyZXZlcnNlRGlyZWN0aW9uLCBlbmNvZGluZ1R5cGUpOworfQorCisvKioKKyAqIEVuY29kZXIgY29uc3RydWN0b3IuCisgKiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMgYXMgZGlnaXRhbCBpbnB1dHMuIFRoaXMgaXMgdXNlZCBpbgorICogdGhlIGNhc2Ugd2hlcmUgdGhlIGRpZ2l0YWwgaW5wdXRzIGFyZSBzaGFyZWQuIFRoZSBFbmNvZGVyIGNsYXNzIHdpbGwgbm90CisgKiBhbGxvY2F0ZSB0aGUgZGlnaXRhbCBpbnB1dHMgYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKgorICogQHBhcmFtIGFTb3VyY2UgVGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYSBjaGFubmVsLgorICogQHBhcmFtIGJTb3VyY2UgdGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYiBjaGFubmVsLgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGVuY29kZXIgYW5kIGludmVydHMKKyAqIHRoZSBvdXRwdXQgdmFsdWVzCisgKiBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZCByZXByZXNlbnRzIHBvc2l0aXZlIHZhbHVlcy4KKyAqIEBwYXJhbSBlbmNvZGluZ1R5cGUgZWl0aGVyIGsxWCwgazJYLCBvciBrNFggdG8gaW5kaWNhdGUgMVgsIDJYIG9yIDRYCisgKiBkZWNvZGluZy4gSWYgNFggaXMKKyAqIHNlbGVjdGVkLCB0aGVuIGFuIGVuY29kZXIgRlBHQSBvYmplY3QgaXMgdXNlZCBhbmQgdGhlIHJldHVybmVkIGNvdW50cyB3aWxsIGJlCisgKiA0eCB0aGUgZW5jb2RlcgorICogc3BlYydkIHZhbHVlIHNpbmNlIGFsbCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZQorICogc2VsZWN0ZWQgdGhlbgorICogYSBjb3VudGVyIG9iamVjdCB3aWxsIGJlIHVzZWQgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGVpdGhlciBleGFjdGx5CisgKiBtYXRjaCB0aGUgc3BlYydkIGNvdW50CisgKiBvciBiZSBkb3VibGUgKDJ4KSB0aGUgc3BlYydkIGNvdW50LgorICovCitFbmNvZGVyOjpFbmNvZGVyKERpZ2l0YWxTb3VyY2UgKmFTb3VyY2UsIERpZ2l0YWxTb3VyY2UgKmJTb3VyY2UsCisgICAgICAgICAgICAgICAgIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSkKKyAgICA6IG1fYVNvdXJjZShhU291cmNlLCBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSwKKyAgICAgIG1fYlNvdXJjZShiU291cmNlLCBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSB7CisgIGlmIChtX2FTb3VyY2UgPT0gbnVsbHB0ciB8fCBtX2JTb3VyY2UgPT0gbnVsbHB0cikKKyAgICB3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisgIGVsc2UKKyAgICBJbml0RW5jb2RlcihyZXZlcnNlRGlyZWN0aW9uLCBlbmNvZGluZ1R5cGUpOworfQorCitFbmNvZGVyOjpFbmNvZGVyKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBhU291cmNlLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gYlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKQorICAgIDogbV9hU291cmNlKGFTb3VyY2UpLCBtX2JTb3VyY2UoYlNvdXJjZSkgeworICBpZiAobV9hU291cmNlID09IG51bGxwdHIgfHwgbV9iU291cmNlID09IG51bGxwdHIpCisgICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworICBlbHNlCisgICAgSW5pdEVuY29kZXIocmV2ZXJzZURpcmVjdGlvbiwgZW5jb2RpbmdUeXBlKTsKK30KKworLyoqCisgKiBFbmNvZGVyIGNvbnN0cnVjdG9yLgorICogQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhIGFuZCBiIGNoYW5uZWxzIGFzIGRpZ2l0YWwgaW5wdXRzLiBUaGlzIGlzIHVzZWQgaW4KKyAqIHRoZSBjYXNlCisgKiB3aGVyZSB0aGUgZGlnaXRhbCBpbnB1dHMgYXJlIHNoYXJlZC4gVGhlIEVuY29kZXIgY2xhc3Mgd2lsbCBub3QgYWxsb2NhdGUgdGhlCisgKiBkaWdpdGFsIGlucHV0cworICogYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbSBhU291cmNlIFRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGEgY2hhbm5lbC4KKyAqIEBwYXJhbSBiU291cmNlIHRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGIgY2hhbm5lbC4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZCBpbnZlcnRzCisgKiB0aGUgb3V0cHV0IHZhbHVlcworICogaWYgbmVjZXNzYXJ5IHNvIGZvcndhcmQgcmVwcmVzZW50cyBwb3NpdGl2ZSB2YWx1ZXMuCisgKiBAcGFyYW0gZW5jb2RpbmdUeXBlIGVpdGhlciBrMVgsIGsyWCwgb3IgazRYIHRvIGluZGljYXRlIDFYLCAyWCBvciA0WAorICogZGVjb2RpbmcuIElmIDRYIGlzCisgKiBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0Egb2JqZWN0IGlzIHVzZWQgYW5kIHRoZSByZXR1cm5lZCBjb3VudHMgd2lsbCBiZQorICogNHggdGhlIGVuY29kZXIKKyAqIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIGFyZSBjb3VudGVkLiBJZiAxWCBvciAyWCBhcmUKKyAqIHNlbGVjdGVkIHRoZW4KKyAqIGEgY291bnRlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBlaXRoZXIgZXhhY3RseQorICogbWF0Y2ggdGhlIHNwZWMnZCBjb3VudAorICogb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KKyAqLworRW5jb2Rlcjo6RW5jb2RlcihEaWdpdGFsU291cmNlICZhU291cmNlLCBEaWdpdGFsU291cmNlICZiU291cmNlLAorICAgICAgICAgICAgICAgICBib29sIHJldmVyc2VEaXJlY3Rpb24sIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUpCisgICAgOiBtX2FTb3VyY2UoJmFTb3VyY2UsIE51bGxEZWxldGVyPERpZ2l0YWxTb3VyY2U+KCkpLAorICAgICAgbV9iU291cmNlKCZiU291cmNlLCBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKQoreworICBJbml0RW5jb2RlcihyZXZlcnNlRGlyZWN0aW9uLCBlbmNvZGluZ1R5cGUpOworfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlcyBmb3IgYW4gRW5jb2Rlci4KKyAqIEZyZWVzIHRoZSBGUEdBIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYW4gRW5jb2Rlci4KKyAqLworRW5jb2Rlcjo6fkVuY29kZXIoKSB7CisgIGlmICghbV9jb3VudGVyKSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIGZyZWVFbmNvZGVyKG1fZW5jb2RlciwgJnN0YXR1cyk7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKworLyoqCisgKiBUaGUgZW5jb2Rpbmcgc2NhbGUgZmFjdG9yIDF4LCAyeCwgb3IgNHgsIHBlciB0aGUgcmVxdWVzdGVkIGVuY29kaW5nVHlwZS4KKyAqIFVzZWQgdG8gZGl2aWRlIHJhdyBlZGdlIGNvdW50cyBkb3duIHRvIHNwZWMnZCBjb3VudHMuCisgKi8KK2ludDMyX3QgRW5jb2Rlcjo6R2V0RW5jb2RpbmdTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZW5jb2RpbmdTY2FsZTsgfQorCisvKioKKyAqIEdldHMgdGhlIHJhdyB2YWx1ZSBmcm9tIHRoZSBlbmNvZGVyLgorICogVGhlIHJhdyB2YWx1ZSBpcyB0aGUgYWN0dWFsIGNvdW50IHVuc2NhbGVkIGJ5IHRoZSAxeCwgMngsIG9yIDR4IHNjYWxlCisgKiBmYWN0b3IuCisgKiBAcmV0dXJuIEN1cnJlbnQgcmF3IGNvdW50IGZyb20gdGhlIGVuY29kZXIKKyAqLworaW50MzJfdCBFbmNvZGVyOjpHZXRSYXcoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworICBpbnQzMl90IHZhbHVlOworICBpZiAobV9jb3VudGVyKQorICAgIHZhbHVlID0gbV9jb3VudGVyLT5HZXQoKTsKKyAgZWxzZSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIHZhbHVlID0gZ2V0RW5jb2RlcihtX2VuY29kZXIsICZzdGF0dXMpOworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IGNvdW50LgorICogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvbiB0aGUgRW5jb2Rlci4KKyAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KKyAqCisgKiBAcmV0dXJuIEN1cnJlbnQgY291bnQgZnJvbSB0aGUgRW5jb2RlciBhZGp1c3RlZCBmb3IgdGhlIDF4LCAyeCwgb3IgNHggc2NhbGUKKyAqIGZhY3Rvci4KKyAqLworaW50MzJfdCBFbmNvZGVyOjpHZXQoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOworICByZXR1cm4gKGludDMyX3QpKEdldFJhdygpICogRGVjb2RpbmdTY2FsZUZhY3RvcigpKTsKK30KKworLyoqCisgKiBSZXNldCB0aGUgRW5jb2RlciBkaXN0YW5jZSB0byB6ZXJvLgorICogUmVzZXRzIHRoZSBjdXJyZW50IGNvdW50IHRvIHplcm8gb24gdGhlIGVuY29kZXIuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6UmVzZXQoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaWYgKG1fY291bnRlcikKKyAgICBtX2NvdW50ZXItPlJlc2V0KCk7CisgIGVsc2UgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICByZXNldEVuY29kZXIobV9lbmNvZGVyLCAmc3RhdHVzKTsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgcHVsc2UuCisgKiBSZXR1cm5zIHRoZSBwZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IEVuY29kZXIgcHVsc2UgaW4gc2Vjb25kcy4KKyAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgR2V0UmF0ZSgpIGluIGZhdm9yIG9mIHRoaXMgbWV0aG9kLiAgVGhpcyByZXR1cm5zIHVuc2NhbGVkCisgKiBwZXJpb2RzIGFuZCBHZXRSYXRlKCkgc2NhbGVzIHVzaW5nIHZhbHVlIGZyb20gU2V0RGlzdGFuY2VQZXJQdWxzZSgpLgorICoKKyAqIEByZXR1cm4gUGVyaW9kIGluIHNlY29uZHMgb2YgdGhlIG1vc3QgcmVjZW50IHB1bHNlLgorICovCitkb3VibGUgRW5jb2Rlcjo6R2V0UGVyaW9kKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworICBpZiAobV9jb3VudGVyKSB7CisgICAgcmV0dXJuIG1fY291bnRlci0+R2V0UGVyaW9kKCkgLyBEZWNvZGluZ1NjYWxlRmFjdG9yKCk7CisgIH0gZWxzZSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIGRvdWJsZSBwZXJpb2QgPSBnZXRFbmNvZGVyUGVyaW9kKG1fZW5jb2RlciwgJnN0YXR1cyk7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgcmV0dXJuIHBlcmlvZDsKKyAgfQorfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gcGVyaW9kIGZvciBzdG9wcGVkIGRldGVjdGlvbi4KKyAqIFNldHMgdGhlIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBwZXJpb2Qgb2YgdGhlIEVuY29kZXIgYmVmb3JlIGl0CisgKiB3aWxsIGFzc3VtZQorICogdGhhdCB0aGUgYXR0YWNoZWQgZGV2aWNlIGlzIHN0b3BwZWQuIFRoaXMgdGltZW91dCBhbGxvd3MgdXNlcnMgdG8gZGV0ZXJtaW5lCisgKiBpZiB0aGUgd2hlZWxzIG9yCisgKiBvdGhlciBzaGFmdCBoYXMgc3RvcHBlZCByb3RhdGluZy4KKyAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgU2V0TWluUmF0ZSgpIGluIGZhdm9yIG9mIHRoaXMgbWV0aG9kLiAgVGhpcyB0YWtlcyB1bnNjYWxlZAorICogcGVyaW9kcyBhbmQgU2V0TWluUmF0ZSgpIHNjYWxlcyB1c2luZyB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqCisgKiBAcGFyYW0gbWF4UGVyaW9kIFRoZSBtYXhpbXVtIHRpbWUgYmV0d2VlbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYmVmb3JlIHRoZQorICogRlBHQSB3aWxsCisgKiByZXBvcnQgdGhlIGRldmljZSBzdG9wcGVkLiBUaGlzIGlzIGV4cHJlc3NlZCBpbiBzZWNvbmRzLgorICovCit2b2lkIEVuY29kZXI6OlNldE1heFBlcmlvZChkb3VibGUgbWF4UGVyaW9kKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaWYgKG1fY291bnRlcikgeworICAgIG1fY291bnRlci0+U2V0TWF4UGVyaW9kKG1heFBlcmlvZCAqIERlY29kaW5nU2NhbGVGYWN0b3IoKSk7CisgIH0gZWxzZSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIHNldEVuY29kZXJNYXhQZXJpb2QobV9lbmNvZGVyLCBtYXhQZXJpb2QsICZzdGF0dXMpOworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBlbmNvZGVyIGlzIHN0b3BwZWQuCisgKiBVc2luZyB0aGUgTWF4UGVyaW9kIHZhbHVlLCBhIGJvb2xlYW4gaXMgcmV0dXJuZWQgdGhhdCBpcyB0cnVlIGlmIHRoZSBlbmNvZGVyCisgKiBpcyBjb25zaWRlcmVkCisgKiBzdG9wcGVkIGFuZCBmYWxzZSBpZiBpdCBpcyBzdGlsbCBtb3ZpbmcuIEEgc3RvcHBlZCBlbmNvZGVyIGlzIG9uZSB3aGVyZSB0aGUKKyAqIG1vc3QgcmVjZW50IHB1bHNlCisgKiB3aWR0aCBleGNlZWRzIHRoZSBNYXhQZXJpb2QuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVuY29kZXIgaXMgY29uc2lkZXJlZCBzdG9wcGVkLgorICovCitib29sIEVuY29kZXI6OkdldFN0b3BwZWQoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiB0cnVlOworICBpZiAobV9jb3VudGVyKSB7CisgICAgcmV0dXJuIG1fY291bnRlci0+R2V0U3RvcHBlZCgpOworICB9IGVsc2UgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBib29sIHZhbHVlID0gZ2V0RW5jb2RlclN0b3BwZWQobV9lbmNvZGVyLCAmc3RhdHVzKTsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KK30KKworLyoqCisgKiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGVuY29kZXIgdmFsdWUgY2hhbmdlZC4KKyAqIEByZXR1cm4gVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBlbmNvZGVyIHZhbHVlIGNoYW5nZWQuCisgKi8KK2Jvb2wgRW5jb2Rlcjo6R2V0RGlyZWN0aW9uKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7CisgIGlmIChtX2NvdW50ZXIpIHsKKyAgICByZXR1cm4gbV9jb3VudGVyLT5HZXREaXJlY3Rpb24oKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgYm9vbCB2YWx1ZSA9IGdldEVuY29kZXJEaXJlY3Rpb24obV9lbmNvZGVyLCAmc3RhdHVzKTsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KK30KKworLyoqCisgKiBUaGUgc2NhbGUgbmVlZGVkIHRvIGNvbnZlcnQgYSByYXcgY291bnRlciB2YWx1ZSBpbnRvIGEgbnVtYmVyIG9mIGVuY29kZXIKKyAqIHB1bHNlcy4KKyAqLworZG91YmxlIEVuY29kZXI6OkRlY29kaW5nU2NhbGVGYWN0b3IoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisgIHN3aXRjaCAobV9lbmNvZGluZ1R5cGUpIHsKKyAgICBjYXNlIGsxWDoKKyAgICAgIHJldHVybiAxLjA7CisgICAgY2FzZSBrMlg6CisgICAgICByZXR1cm4gMC41OworICAgIGNhc2UgazRYOgorICAgICAgcmV0dXJuIDAuMjU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwLjA7CisgIH0KK30KKworLyoqCisgKiBHZXQgdGhlIGRpc3RhbmNlIHRoZSByb2JvdCBoYXMgZHJpdmVuIHNpbmNlIHRoZSBsYXN0IHJlc2V0LgorICoKKyAqIEByZXR1cm4gVGhlIGRpc3RhbmNlIGRyaXZlbiBzaW5jZSB0aGUgbGFzdCByZXNldCBhcyBzY2FsZWQgYnkgdGhlIHZhbHVlIGZyb20KKyAqIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqLworZG91YmxlIEVuY29kZXI6OkdldERpc3RhbmNlKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworICByZXR1cm4gR2V0UmF3KCkgKiBEZWNvZGluZ1NjYWxlRmFjdG9yKCkgKiBtX2Rpc3RhbmNlUGVyUHVsc2U7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGVuY29kZXIuCisgKiBVbml0cyBhcmUgZGlzdGFuY2UgcGVyIHNlY29uZCBhcyBzY2FsZWQgYnkgdGhlIHZhbHVlIGZyb20KKyAqIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGVuY29kZXIuCisgKi8KK2RvdWJsZSBFbmNvZGVyOjpHZXRSYXRlKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworICByZXR1cm4gKG1fZGlzdGFuY2VQZXJQdWxzZSAvIEdldFBlcmlvZCgpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIG1pbmltdW0gcmF0ZSBvZiB0aGUgZGV2aWNlIGJlZm9yZSB0aGUgaGFyZHdhcmUgcmVwb3J0cyBpdCBzdG9wcGVkLgorICoKKyAqIEBwYXJhbSBtaW5SYXRlIFRoZSBtaW5pbXVtIHJhdGUuICBUaGUgdW5pdHMgYXJlIGluIGRpc3RhbmNlIHBlciBzZWNvbmQgYXMKKyAqIHNjYWxlZCBieSB0aGUgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0TWluUmF0ZShkb3VibGUgbWluUmF0ZSkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIFNldE1heFBlcmlvZChtX2Rpc3RhbmNlUGVyUHVsc2UgLyBtaW5SYXRlKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGRpc3RhbmNlIHBlciBwdWxzZSBmb3IgdGhpcyBlbmNvZGVyLgorICogVGhpcyBzZXRzIHRoZSBtdWx0aXBsaWVyIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaXN0YW5jZSBkcml2ZW4gYmFzZWQgb24gdGhlCisgKiBjb3VudCB2YWx1ZQorICogZnJvbSB0aGUgZW5jb2Rlci4KKyAqIERvIG5vdCBpbmNsdWRlIHRoZSBkZWNvZGluZyB0eXBlIGluIHRoaXMgc2NhbGUuICBUaGUgbGlicmFyeSBhbHJlYWR5CisgKiBjb21wZW5zYXRlcyBmb3IgdGhlIGRlY29kaW5nIHR5cGUuCisgKiBTZXQgdGhpcyB2YWx1ZSBiYXNlZCBvbiB0aGUgZW5jb2RlcidzIHJhdGVkIFB1bHNlcyBwZXIgUmV2b2x1dGlvbiBhbmQKKyAqIGZhY3RvciBpbiBnZWFyaW5nIHJlZHVjdGlvbnMgZm9sbG93aW5nIHRoZSBlbmNvZGVyIHNoYWZ0LgorICogVGhpcyBkaXN0YW5jZSBjYW4gYmUgaW4gYW55IHVuaXRzIHlvdSBsaWtlLCBsaW5lYXIgb3IgYW5ndWxhci4KKyAqCisgKiBAcGFyYW0gZGlzdGFuY2VQZXJQdWxzZSBUaGUgc2NhbGUgZmFjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgcHVsc2VzCisgKiB0byB1c2VmdWwgdW5pdHMuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0RGlzdGFuY2VQZXJQdWxzZShkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIG1fZGlzdGFuY2VQZXJQdWxzZSA9IGRpc3RhbmNlUGVyUHVsc2U7Cit9CisKKy8qKgorICogU2V0IHRoZSBkaXJlY3Rpb24gc2Vuc2luZyBmb3IgdGhpcyBlbmNvZGVyLgorICogVGhpcyBzZXRzIHRoZSBkaXJlY3Rpb24gc2Vuc2luZyBvbiB0aGUgZW5jb2RlciBzbyB0aGF0IGl0IGNvdWxkIGNvdW50IGluIHRoZQorICogY29ycmVjdAorICogc29mdHdhcmUgZGlyZWN0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vdW50aW5nLgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gdHJ1ZSBpZiB0aGUgZW5jb2RlciBkaXJlY3Rpb24gc2hvdWxkIGJlIHJldmVyc2VkCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpZiAobV9jb3VudGVyKSB7CisgICAgbV9jb3VudGVyLT5TZXRSZXZlcnNlRGlyZWN0aW9uKHJldmVyc2VEaXJlY3Rpb24pOworICB9IGVsc2UgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBzZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbihtX2VuY29kZXIsIHJldmVyc2VEaXJlY3Rpb24sICZzdGF0dXMpOworICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICB9Cit9CisKKy8qKgorICogU2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIKKyAqIHRvCisgKiBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKKyAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KKyAqIEBwYXJhbSBzYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBhdmVyYWdlIGZyb20gMSB0byAxMjcuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSkgeworICBpZiAoc2FtcGxlc1RvQXZlcmFnZSA8IDEgfHwgc2FtcGxlc1RvQXZlcmFnZSA+IDEyNykgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAorICAgICAgICBQYXJhbWV0ZXJPdXRPZlJhbmdlLAorICAgICAgICAiQXZlcmFnZSBjb3VudGVyIHZhbHVlcyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTI3Iik7CisgIH0KKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzd2l0Y2ggKG1fZW5jb2RpbmdUeXBlKSB7CisgICAgY2FzZSBrNFg6CisgICAgICBzZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShtX2VuY29kZXIsIHNhbXBsZXNUb0F2ZXJhZ2UsICZzdGF0dXMpOworICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGsxWDoKKyAgICBjYXNlIGsyWDoKKyAgICAgIG1fY291bnRlci0+U2V0U2FtcGxlc1RvQXZlcmFnZShzYW1wbGVzVG9BdmVyYWdlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIKKyAqIHRvCisgKiBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKKyAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KKyAqIEByZXR1cm4gU2FtcGxlc1RvQXZlcmFnZSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYmVpbmcgYXZlcmFnZWQgKGZyb20gMSB0byAxMjcpCisgKi8KK2ludCBFbmNvZGVyOjpHZXRTYW1wbGVzVG9BdmVyYWdlKCkgY29uc3QgeworICBpbnQgcmVzdWx0ID0gMTsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzd2l0Y2ggKG1fZW5jb2RpbmdUeXBlKSB7CisgICAgY2FzZSBrNFg6CisgICAgICByZXN1bHQgPSBnZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShtX2VuY29kZXIsICZzdGF0dXMpOworICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGsxWDoKKyAgICBjYXNlIGsyWDoKKyAgICAgIHJlc3VsdCA9IG1fY291bnRlci0+R2V0U2FtcGxlc1RvQXZlcmFnZSgpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBJbXBsZW1lbnQgdGhlIFBJRFNvdXJjZSBpbnRlcmZhY2UuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgc291cmNlIHBhcmFtZXRlci4KKyAqLworZG91YmxlIEVuY29kZXI6OlBJREdldCgpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKyAgc3dpdGNoIChHZXRQSURTb3VyY2VUeXBlKCkpIHsKKyAgICBjYXNlIFBJRFNvdXJjZVR5cGU6OmtEaXNwbGFjZW1lbnQ6CisgICAgICByZXR1cm4gR2V0RGlzdGFuY2UoKTsKKyAgICBjYXNlIFBJRFNvdXJjZVR5cGU6OmtSYXRlOgorICAgICAgcmV0dXJuIEdldFJhdGUoKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDAuMDsKKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgaW5kZXggc291cmNlIGZvciB0aGUgZW5jb2Rlci4gIFdoZW4gdGhpcyBzb3VyY2UgaXMgYWN0aXZhdGVkLCB0aGUKKyAqIGVuY29kZXIgY291bnQgYXV0b21hdGljYWxseSByZXNldHMuCisgKgorICogQHBhcmFtIGNoYW5uZWwgQSBESU8gY2hhbm5lbCB0byBzZXQgYXMgdGhlIGVuY29kZXIgaW5kZXgKKyAqIEBwYXJhbSB0eXBlIFRoZSBzdGF0ZSB0aGF0IHdpbGwgY2F1c2UgdGhlIGVuY29kZXIgdG8gcmVzZXQKKyAqLwordm9pZCBFbmNvZGVyOjpTZXRJbmRleFNvdXJjZSh1aW50MzJfdCBjaGFubmVsLCBFbmNvZGVyOjpJbmRleGluZ1R5cGUgdHlwZSkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGJvb2wgYWN0aXZlSGlnaCA9ICh0eXBlID09IGtSZXNldFdoaWxlSGlnaCkgfHwgKHR5cGUgPT0ga1Jlc2V0T25SaXNpbmdFZGdlKTsKKyAgYm9vbCBlZGdlU2Vuc2l0aXZlID0KKyAgICAgICh0eXBlID09IGtSZXNldE9uRmFsbGluZ0VkZ2UpIHx8ICh0eXBlID09IGtSZXNldE9uUmlzaW5nRWRnZSk7CisKKyAgc2V0RW5jb2RlckluZGV4U291cmNlKG1fZW5jb2RlciwgY2hhbm5lbCwgZmFsc2UsIGFjdGl2ZUhpZ2gsIGVkZ2VTZW5zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBpbmRleCBzb3VyY2UgZm9yIHRoZSBlbmNvZGVyLiAgV2hlbiB0aGlzIHNvdXJjZSBpcyBhY3RpdmF0ZWQsIHRoZQorICogZW5jb2RlciBjb3VudCBhdXRvbWF0aWNhbGx5IHJlc2V0cy4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBBIGRpZ2l0YWwgc291cmNlIHRvIHNldCBhcyB0aGUgZW5jb2RlciBpbmRleAorICogQHBhcmFtIHR5cGUgVGhlIHN0YXRlIHRoYXQgd2lsbCBjYXVzZSB0aGUgZW5jb2RlciB0byByZXNldAorICovCitERVBSRUNBVEVEKCJVc2UgcGFzcy1ieS1yZWZlcmVuY2UgaW5zdGVhZC4iKQordm9pZCBFbmNvZGVyOjpTZXRJbmRleFNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZXI6OkluZGV4aW5nVHlwZSB0eXBlKSB7CisgIFNldEluZGV4U291cmNlKCpzb3VyY2UsIHR5cGUpOworfQorCisvKioKKyAqIFNldCB0aGUgaW5kZXggc291cmNlIGZvciB0aGUgZW5jb2Rlci4gIFdoZW4gdGhpcyBzb3VyY2UgaXMgYWN0aXZhdGVkLCB0aGUKKyAqIGVuY29kZXIgY291bnQgYXV0b21hdGljYWxseSByZXNldHMuCisgKgorICogQHBhcmFtIGNoYW5uZWwgQSBkaWdpdGFsIHNvdXJjZSB0byBzZXQgYXMgdGhlIGVuY29kZXIgaW5kZXgKKyAqIEBwYXJhbSB0eXBlIFRoZSBzdGF0ZSB0aGF0IHdpbGwgY2F1c2UgdGhlIGVuY29kZXIgdG8gcmVzZXQKKyAqLwordm9pZCBFbmNvZGVyOjpTZXRJbmRleFNvdXJjZShjb25zdCBEaWdpdGFsU291cmNlICZzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZXI6OkluZGV4aW5nVHlwZSB0eXBlKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgYm9vbCBhY3RpdmVIaWdoID0gKHR5cGUgPT0ga1Jlc2V0V2hpbGVIaWdoKSB8fCAodHlwZSA9PSBrUmVzZXRPblJpc2luZ0VkZ2UpOworICBib29sIGVkZ2VTZW5zaXRpdmUgPQorICAgICAgKHR5cGUgPT0ga1Jlc2V0T25GYWxsaW5nRWRnZSkgfHwgKHR5cGUgPT0ga1Jlc2V0T25SaXNpbmdFZGdlKTsKKworICBzZXRFbmNvZGVySW5kZXhTb3VyY2UobV9lbmNvZGVyLCBzb3VyY2UuR2V0Q2hhbm5lbEZvclJvdXRpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5HZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpLCBhY3RpdmVIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgZWRnZVNlbnNpdGl2ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCit2b2lkIEVuY29kZXI6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJTcGVlZCIsIEdldFJhdGUoKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJEaXN0YW5jZSIsIEdldERpc3RhbmNlKCkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiRGlzdGFuY2UgcGVyIFRpY2siLCBtX2Rpc3RhbmNlUGVyUHVsc2UpOworICB9Cit9CisKK3ZvaWQgRW5jb2Rlcjo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHt9CisKK3ZvaWQgRW5jb2Rlcjo6U3RvcExpdmVXaW5kb3dNb2RlKCkge30KKworc3RkOjpzdHJpbmcgRW5jb2Rlcjo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworICBpZiAobV9lbmNvZGluZ1R5cGUgPT0gazRYKQorICAgIHJldHVybiAiUXVhZHJhdHVyZSBFbmNvZGVyIjsKKyAgZWxzZQorICAgIHJldHVybiAiRW5jb2RlciI7Cit9CisKK3ZvaWQgRW5jb2Rlcjo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSB7CisgIG1fdGFibGUgPSBzdWJUYWJsZTsKKyAgVXBkYXRlVGFibGUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gRW5jb2Rlcjo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvR2VhclRvb3RoLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9HZWFyVG9vdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTkxMjUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvR2VhclRvb3RoLmNwcApAQCAtMCwwICsxLDY0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJHZWFyVG9vdGguaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworY29uc3RleHByIGRvdWJsZSBHZWFyVG9vdGg6OmtHZWFyVG9vdGhUaHJlc2hvbGQ7CisKKy8qKgorICogQ29tbW9uIGNvZGUgY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3RvcnMuCisgKi8KK3ZvaWQgR2VhclRvb3RoOjpFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlKSB7CisgIGlmIChkaXJlY3Rpb25TZW5zaXRpdmUpIHsKKyAgICBTZXRQdWxzZUxlbmd0aE1vZGUoa0dlYXJUb290aFRocmVzaG9sZCk7CisgIH0KK30KKworLyoqCisgKiBDb25zdHJ1Y3QgYSBHZWFyVG9vdGggc2Vuc29yIGdpdmVuIGEgY2hhbm5lbC4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgRElPIGNoYW5uZWwgdGhhdCB0aGUgc2Vuc29yIGlzIGNvbm5lY3RlZCB0by4gMC05IGFyZQorICogb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUgTVhQLgorICogQHBhcmFtIGRpcmVjdGlvblNlbnNpdGl2ZSBUcnVlIHRvIGVuYWJsZSB0aGUgcHVsc2UgbGVuZ3RoIGRlY29kaW5nIGluCisgKiBoYXJkd2FyZSB0byBzcGVjaWZ5IGNvdW50IGRpcmVjdGlvbi4KKyAqLworR2VhclRvb3RoOjpHZWFyVG9vdGgodWludDMyX3QgY2hhbm5lbCwgYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUpCisgICAgOiBDb3VudGVyKGNoYW5uZWwpIHsKKyAgRW5hYmxlRGlyZWN0aW9uU2Vuc2luZyhkaXJlY3Rpb25TZW5zaXRpdmUpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkdlYXJUb290aCIsIGNoYW5uZWwsIHRoaXMpOworfQorCisvKioKKyAqIENvbnN0cnVjdCBhIEdlYXJUb290aCBzZW5zb3IgZ2l2ZW4gYSBkaWdpdGFsIGlucHV0LgorICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIHNoYXJpbmcgZGlnaXRhbCBpbnB1dHMuCisgKgorICogQHBhcmFtIHNvdXJjZSBBIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nIERpZ2l0YWxTb3VyY2Ugb2JqZWN0IChzdWNoIGFzIGEKKyAqIERpZ2l0YWxJbnB1dCkKKyAqIEBwYXJhbSBkaXJlY3Rpb25TZW5zaXRpdmUgVHJ1ZSB0byBlbmFibGUgdGhlIHB1bHNlIGxlbmd0aCBkZWNvZGluZyBpbgorICogaGFyZHdhcmUgdG8gc3BlY2lmeSBjb3VudCBkaXJlY3Rpb24uCisgKi8KK0dlYXJUb290aDo6R2VhclRvb3RoKERpZ2l0YWxTb3VyY2UgKnNvdXJjZSwgYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUpCisgICAgOiBDb3VudGVyKHNvdXJjZSkgeworICBFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGRpcmVjdGlvblNlbnNpdGl2ZSk7Cit9CisKKy8qKgorICogQ29uc3RydWN0IGEgR2VhclRvb3RoIHNlbnNvciBnaXZlbiBhIGRpZ2l0YWwgaW5wdXQuCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gc2hhcmluZyBkaWdpdGFsIGlucHV0cy4KKyAqCisgKiBAcGFyYW0gc291cmNlIEEgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBEaWdpdGFsU291cmNlIG9iamVjdCAoc3VjaCBhcyBhCisgKiBEaWdpdGFsSW5wdXQpCisgKiBAcGFyYW0gZGlyZWN0aW9uU2Vuc2l0aXZlIFRydWUgdG8gZW5hYmxlIHRoZSBwdWxzZSBsZW5ndGggZGVjb2RpbmcgaW4KKyAqIGhhcmR3YXJlIHRvIHNwZWNpZnkgY291bnQgZGlyZWN0aW9uLgorICovCitHZWFyVG9vdGg6OkdlYXJUb290aChzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gc291cmNlLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSkKKyAgICA6IENvdW50ZXIoc291cmNlKSB7CisgIEVuYWJsZURpcmVjdGlvblNlbnNpbmcoZGlyZWN0aW9uU2Vuc2l0aXZlKTsKK30KKworc3RkOjpzdHJpbmcgR2VhclRvb3RoOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7IHJldHVybiAiR2VhclRvb3RoIjsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0d5cm9CYXNlLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9HeXJvQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjOTA1NgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9HeXJvQmFzZS5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiR3lyb0Jhc2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworLyoqCisgKiBHZXQgdGhlIFBJRE91dHB1dCBmb3IgdGhlIFBJRFNvdXJjZSBiYXNlIG9iamVjdC4gQ2FuIGJlIHNldCB0byByZXR1cm4KKyAqIGFuZ2xlIG9yIHJhdGUgdXNpbmcgU2V0UElEU291cmNlVHlwZSgpLiBEZWZhdWx0cyB0byBhbmdsZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBQSURPdXRwdXQgKGFuZ2xlIG9yIHJhdGUsIGRlZmF1bHRzIHRvIGFuZ2xlKQorICovCitkb3VibGUgR3lyb0Jhc2U6OlBJREdldCgpIHsKKyAgc3dpdGNoIChHZXRQSURTb3VyY2VUeXBlKCkpIHsKKyAgICBjYXNlIFBJRFNvdXJjZVR5cGU6OmtSYXRlOgorICAgICAgcmV0dXJuIEdldFJhdGUoKTsKKyAgICBjYXNlIFBJRFNvdXJjZVR5cGU6OmtEaXNwbGFjZW1lbnQ6CisgICAgICByZXR1cm4gR2V0QW5nbGUoKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKwordm9pZCBHeXJvQmFzZTo6VXBkYXRlVGFibGUoKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIlZhbHVlIiwgR2V0QW5nbGUoKSk7CisgIH0KK30KKwordm9pZCBHeXJvQmFzZTo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHt9CisKK3ZvaWQgR3lyb0Jhc2U6OlN0b3BMaXZlV2luZG93TW9kZSgpIHt9CisKK3N0ZDo6c3RyaW5nIEd5cm9CYXNlOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7IHJldHVybiAiR3lybyI7IH0KKwordm9pZCBHeXJvQmFzZTo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSB7CisgIG1fdGFibGUgPSBzdWJUYWJsZTsKKyAgVXBkYXRlVGFibGUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR3lyb0Jhc2U6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0kyQy5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvSTJDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc2N2IzCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0kyQy5jcHAKQEAgLTAsMCArMSwxOTkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkkyQy5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIkhBTC9EaWdpdGFsLmhwcCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworLyoqCisgKiBDb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgSTJDIHBvcnQgdG8gd2hpY2ggdGhlIGRldmljZSBpcyBjb25uZWN0ZWQuCisgKiBAcGFyYW0gZGV2aWNlQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIG9uIHRoZSBJMkMgYnVzLgorICovCitJMkM6OkkyQyhQb3J0IHBvcnQsIHVpbnQ4X3QgZGV2aWNlQWRkcmVzcykKKyAgICA6IG1fcG9ydChwb3J0KSwgbV9kZXZpY2VBZGRyZXNzKGRldmljZUFkZHJlc3MpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpMkNJbml0aWFsaXplKG1fcG9ydCwgJnN0YXR1cyk7CisgIC8vIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9JMkMsIGRldmljZUFkZHJlc3MpOworfQorCisvKioKKyAqIERlc3RydWN0b3IuCisgKi8KK0kyQzo6fkkyQygpIHsgaTJDQ2xvc2UobV9wb3J0KTsgfQorCisvKioKKyAqIEdlbmVyaWMgdHJhbnNhY3Rpb24uCisgKgorICogVGhpcyBpcyBhIGxvd2VyLWxldmVsIGludGVyZmFjZSB0byB0aGUgSTJDIGhhcmR3YXJlIGdpdmluZyB5b3UgbW9yZSBjb250cm9sCisgKiBvdmVyIGVhY2ggdHJhbnNhY3Rpb24uCisgKgorICogQHBhcmFtIGRhdGFUb1NlbmQgQnVmZmVyIG9mIGRhdGEgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSBzZW5kU2l6ZSBOdW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSBkYXRhUmVjZWl2ZWQgQnVmZmVyIHRvIHJlYWQgZGF0YSBpbnRvLgorICogQHBhcmFtIHJlY2VpdmVTaXplIE51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIGRldmljZS4KKyAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KKyAqLworYm9vbCBJMkM6OlRyYW5zYWN0aW9uKHVpbnQ4X3QgKmRhdGFUb1NlbmQsIHVpbnQ4X3Qgc2VuZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YVJlY2VpdmVkLCB1aW50OF90IHJlY2VpdmVTaXplKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc3RhdHVzID0gaTJDVHJhbnNhY3Rpb24obV9wb3J0LCBtX2RldmljZUFkZHJlc3MsIGRhdGFUb1NlbmQsIHNlbmRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVjZWl2ZWQsIHJlY2VpdmVTaXplKTsKKyAgLy8gd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiBzdGF0dXMgPCAwOworfQorCisvKioKKyAqIEF0dGVtcHQgdG8gYWRkcmVzcyBhIGRldmljZSBvbiB0aGUgSTJDIGJ1cy4KKyAqCisgKiBUaGlzIGFsbG93cyB5b3UgdG8gZmlndXJlIG91dCBpZiB0aGVyZSBpcyBhIGRldmljZSBvbiB0aGUgSTJDIGJ1cyB0aGF0CisgKiByZXNwb25kcyB0byB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICoKKyAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KKyAqLworYm9vbCBJMkM6OkFkZHJlc3NPbmx5KCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHN0YXR1cyA9IFRyYW5zYWN0aW9uKG51bGxwdHIsIDAsIG51bGxwdHIsIDApOworICByZXR1cm4gc3RhdHVzIDwgMDsKK30KKworLyoqCisgKiBFeGVjdXRlIGEgd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFdyaXRlIGEgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlciBvbiBhIGRldmljZSBhbmQgd2FpdCB1bnRpbCB0aGUKKyAqICAgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCisgKgorICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZSB0byBiZQorICogd3JpdHRlbi4KKyAqIEBwYXJhbSBkYXRhIFRoZSBieXRlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlciBvbiB0aGUgZGV2aWNlLgorICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgorICovCitib29sIEkyQzo6V3JpdGUodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgZGF0YSkgeworICB1aW50OF90IGJ1ZmZlclsyXTsKKyAgYnVmZmVyWzBdID0gcmVnaXN0ZXJBZGRyZXNzOworICBidWZmZXJbMV0gPSBkYXRhOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHN0YXR1cyA9IGkyQ1dyaXRlKG1fcG9ydCwgbV9kZXZpY2VBZGRyZXNzLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgcmV0dXJuIHN0YXR1cyA8IDA7Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIGJ1bGsgd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFdyaXRlIG11bHRpcGxlIGJ5dGVzIHRvIGEgZGV2aWNlIGFuZCB3YWl0IHVudGlsIHRoZQorICogICB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KKyAqCisgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2Jvb2wgSTJDOjpXcml0ZUJ1bGsodWludDhfdCAqZGF0YSwgdWludDhfdCBjb3VudCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHN0YXR1cyA9IGkyQ1dyaXRlKG1fcG9ydCwgbV9kZXZpY2VBZGRyZXNzLCBkYXRhLCBjb3VudCk7CisgIHJldHVybiBzdGF0dXMgPCAwOworfQorCisvKioKKyAqIEV4ZWN1dGUgYSByZWFkIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBSZWFkIGJ5dGVzIGZyb20gYSBkZXZpY2UuCisgKiBNb3N0IEkyQyBkZXZpY2VzIHdpbGwgYXV0by1pbmNyZW1lbnQgdGhlIHJlZ2lzdGVyIHBvaW50ZXIgaW50ZXJuYWxseSBhbGxvd2luZworICogICB5b3UgdG8gcmVhZCBjb25zZWN1dGl2ZSByZWdpc3RlcnMgb24gYSBkZXZpY2UgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uCisgKgorICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgcmVnaXN0ZXIgdG8gcmVhZCBmaXJzdCBpbiB0aGUgdHJhbnNhY3Rpb24uCisgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoZSB0cmFuc2FjdGlvbi4KKyAqIEBwYXJhbSBidWZmZXIgQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgZGF0YSByZWFkIGZyb20gdGhlCisgKiBkZXZpY2UuCisgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCisgKi8KK2Jvb2wgSTJDOjpSZWFkKHVpbnQ4X3QgcmVnaXN0ZXJBZGRyZXNzLCB1aW50OF90IGNvdW50LCB1aW50OF90ICpidWZmZXIpIHsKKyAgaWYgKGNvdW50IDwgMSkgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJjb3VudCIpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJidWZmZXIiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHN0YXR1cyA9CisgICAgICBUcmFuc2FjdGlvbigmcmVnaXN0ZXJBZGRyZXNzLCBzaXplb2YocmVnaXN0ZXJBZGRyZXNzKSwgYnVmZmVyLCBjb3VudCk7CisgIHJldHVybiBzdGF0dXMgPCAwOworfQorCisvKioKKyAqIEV4ZWN1dGUgYSByZWFkIG9ubHkgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFJlYWQgYnl0ZXMgZnJvbSBhIGRldmljZS4gVGhpcyBtZXRob2QgZG9lcyBub3Qgd3JpdGUgYW55IGRhdGEgdG8gcHJvbXB0IHRoZQorICogZGV2aWNlLgorICoKKyAqIEBwYXJhbSBidWZmZXIKKyAqICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgZGF0YSByZWFkIGZyb20KKyAqICAgICAgICAgICAgdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjb3VudAorICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhlIHRyYW5zYWN0aW9uLgorICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgorICovCitib29sIEkyQzo6UmVhZE9ubHkodWludDhfdCBjb3VudCwgdWludDhfdCAqYnVmZmVyKSB7CisgIGlmIChjb3VudCA8IDEpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAiY291bnQiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiYnVmZmVyIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzdGF0dXMgPSBpMkNSZWFkKG1fcG9ydCwgbV9kZXZpY2VBZGRyZXNzLCBidWZmZXIsIGNvdW50KTsKKyAgcmV0dXJuIHN0YXR1cyA8IDA7Cit9CisKKy8qKgorICogU2VuZCBhIGJyb2FkY2FzdCB3cml0ZSB0byBhbGwgZGV2aWNlcyBvbiB0aGUgSTJDIGJ1cy4KKyAqCisgKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQhCisgKgorICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgcmVnaXN0ZXIgdG8gd3JpdGUgb24gYWxsIGRldmljZXMgb24gdGhlIGJ1cy4KKyAqIEBwYXJhbSBkYXRhIFRoZSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgZGV2aWNlcy4KKyAqLworW1tnbnU6Ondhcm5pbmcoIkkyQzo6QnJvYWRjYXN0KCkgaXMgbm90IGltcGxlbWVudGVkLiIpXV0KK3ZvaWQgSTJDOjpCcm9hZGNhc3QodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgZGF0YSkge30KKworLyoqCisgKiBWZXJpZnkgdGhhdCBhIGRldmljZSdzIHJlZ2lzdGVycyBjb250YWluIGV4cGVjdGVkIHZhbHVlcy4KKyAqCisgKiBNb3N0IGRldmljZXMgd2lsbCBoYXZlIGEgc2V0IG9mIHJlZ2lzdGVycyB0aGF0IGNvbnRhaW4gYSBrbm93biB2YWx1ZSB0aGF0CisgKiAgIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZW0uICBUaGlzIGFsbG93cyBhbiBJMkMgZGV2aWNlIGRyaXZlciB0byBlYXNpbHkKKyAqICAgdmVyaWZ5IHRoYXQgdGhlIGRldmljZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdmFsdWUuCisgKgorICogQHByZSBUaGUgZGV2aWNlIG11c3Qgc3VwcG9ydCBhbmQgYmUgY29uZmlndXJlZCB0byB1c2UgcmVnaXN0ZXIKKyAqIGF1dG8taW5jcmVtZW50LgorICoKKyAqIEBwYXJhbSByZWdpc3RlckFkZHJlc3MgVGhlIGJhc2UgcmVnaXN0ZXIgdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY291bnQgVGhlIHNpemUgb2YgdGhlIGZpZWxkIHRvIGJlIHZlcmlmaWVkLgorICogQHBhcmFtIGV4cGVjdGVkIEEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBleHBlY3RlZCBmcm9tIHRoZSBkZXZpY2UuCisgKi8KK2Jvb2wgSTJDOjpWZXJpZnlTZW5zb3IodWludDhfdCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmV4cGVjdGVkKSB7CisgIC8vIFRPRE86IE1ha2UgdXNlIG9mIGFsbCA3IHJlYWQgYnl0ZXMKKyAgdWludDhfdCBkZXZpY2VEYXRhWzRdOworICBmb3IgKHVpbnQ4X3QgaSA9IDAsIGN1clJlZ2lzdGVyQWRkcmVzcyA9IHJlZ2lzdGVyQWRkcmVzczsgaSA8IGNvdW50OworICAgICAgIGkgKz0gNCwgY3VyUmVnaXN0ZXJBZGRyZXNzICs9IDQpIHsKKyAgICB1aW50OF90IHRvUmVhZCA9IGNvdW50IC0gaSA8IDQgPyBjb3VudCAtIGkgOiA0OworICAgIC8vIFJlYWQgdGhlIGNodW5rIG9mIGRhdGEuICBSZXR1cm4gZmFsc2UgaWYgdGhlIHNlbnNvciBkb2VzIG5vdCByZXNwb25kLgorICAgIGlmIChSZWFkKGN1clJlZ2lzdGVyQWRkcmVzcywgdG9SZWFkLCBkZXZpY2VEYXRhKSkgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1aW50OF90IGogPSAwOyBqIDwgdG9SZWFkOyBqKyspIHsKKyAgICAgIGlmIChkZXZpY2VEYXRhW2pdICE9IGV4cGVjdGVkW2kgKyBqXSkgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc2YzgwCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0ludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuY3BwCkBAIC0wLDAgKzEsMTIgQEAKKworI2luY2x1ZGUgIkludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKwordm9pZCBIYXJkd2FyZUhMUmVwb3J0aW5nOjpSZXBvcnRTY2hlZHVsZXIoKSB7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Db21tYW5kLAorICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtDb21tYW5kX1NjaGVkdWxlcik7Cit9CisKK3ZvaWQgSGFyZHdhcmVITFJlcG9ydGluZzo6UmVwb3J0U21hcnREYXNoYm9hcmQoKSB7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9TbWFydERhc2hib2FyZCwgMCk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY2YzM0Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmNwcApAQCAtMCwwICsxLDE5OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKK3N0ZDo6dW5pcXVlX3B0cjxSZXNvdXJjZT4gSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6Om1faW50ZXJydXB0cyA9CisgICAgc3RkOjptYWtlX3VuaXF1ZTxSZXNvdXJjZT4oaW50ZXJydXB0X2tOdW1TeXN0ZW1zKTsKKworSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OkludGVycnVwdGFibGVTZW5zb3JCYXNlKCkgeworfQorCisvKioKKyogUmVxdWVzdCBvbmUgb2YgdGhlIDggaW50ZXJydXB0cyBhc3luY2hyb25vdXNseSBvbiB0aGlzIGRpZ2l0YWwgaW5wdXQuCisqIFJlcXVlc3QgaW50ZXJydXB0cyBpbiBhc3luY2hyb25vdXMgbW9kZSB3aGVyZSB0aGUgdXNlcidzIGludGVycnVwdCBoYW5kbGVyCisqIHdpbGwgYmUKKyogY2FsbGVkIHdoZW4gdGhlIGludGVycnVwdCBmaXJlcy4gVXNlcnMgdGhhdCB3YW50IGNvbnRyb2wgb3ZlciB0aGUgdGhyZWFkCisqIHByaW9yaXR5CisqIHNob3VsZCB1c2UgdGhlIHN5bmNocm9ub3VzIG1ldGhvZCB3aXRoIHRoZWlyIG93biBzcGF3bmVkIHRocmVhZC4KKyogVGhlIGRlZmF1bHQgaXMgaW50ZXJydXB0IG9uIHJpc2luZyBlZGdlcyBvbmx5LgorKi8KK3ZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlJlcXVlc3RJbnRlcnJ1cHRzKAorICAgIEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLCB2b2lkICpwYXJhbSkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIHVpbnQzMl90IGluZGV4ID0gbV9pbnRlcnJ1cHRzLT5BbGxvY2F0ZSgiQXN5bmMgSW50ZXJydXB0Iik7CisgIGlmIChpbmRleCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpIHsKKyAgICBDbG9uZUVycm9yKCptX2ludGVycnVwdHMpOworICAgIHJldHVybjsKKyAgfQorICBtX2ludGVycnVwdEluZGV4ID0gaW5kZXg7CisKKyAgLy8gQ3JlYXRlcyBhIG1hbmFnZXIgdG9vCisgIEFsbG9jYXRlSW50ZXJydXB0cyhmYWxzZSk7CisKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICByZXF1ZXN0SW50ZXJydXB0cyhtX2ludGVycnVwdCwgR2V0TW9kdWxlRm9yUm91dGluZygpLCBHZXRDaGFubmVsRm9yUm91dGluZygpLAorICAgICAgICAgICAgICAgICAgICBHZXRBbmFsb2dUcmlnZ2VyRm9yUm91dGluZygpLCAmc3RhdHVzKTsKKyAgU2V0VXBTb3VyY2VFZGdlKHRydWUsIGZhbHNlKTsKKyAgYXR0YWNoSW50ZXJydXB0SGFuZGxlcihtX2ludGVycnVwdCwgaGFuZGxlciwgcGFyYW0sICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisqIFJlcXVlc3Qgb25lIG9mIHRoZSA4IGludGVycnVwdHMgc3luY2hyb25vdXNseSBvbiB0aGlzIGRpZ2l0YWwgaW5wdXQuCisqIFJlcXVlc3QgaW50ZXJydXB0cyBpbiBzeW5jaHJvbm91cyBtb2RlIHdoZXJlIHRoZSB1c2VyIHByb2dyYW0gd2lsbCBoYXZlIHRvCisqIGV4cGxpY2l0bHkKKyogd2FpdCBmb3IgdGhlIGludGVycnVwdCB0byBvY2N1ciB1c2luZyBXYWl0Rm9ySW50ZXJydXB0LgorKiBUaGUgZGVmYXVsdCBpcyBpbnRlcnJ1cHQgb24gcmlzaW5nIGVkZ2VzIG9ubHkuCisqLwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6UmVxdWVzdEludGVycnVwdHMoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgdWludDMyX3QgaW5kZXggPSBtX2ludGVycnVwdHMtPkFsbG9jYXRlKCJTeW5jIEludGVycnVwdCIpOworICBpZiAoaW5kZXggPT0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CisgICAgQ2xvbmVFcnJvcigqbV9pbnRlcnJ1cHRzKTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9pbnRlcnJ1cHRJbmRleCA9IGluZGV4OworCisgIEFsbG9jYXRlSW50ZXJydXB0cyh0cnVlKTsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHJlcXVlc3RJbnRlcnJ1cHRzKG1faW50ZXJydXB0LCBHZXRNb2R1bGVGb3JSb3V0aW5nKCksIEdldENoYW5uZWxGb3JSb3V0aW5nKCksCisgICAgICAgICAgICAgICAgICAgIEdldEFuYWxvZ1RyaWdnZXJGb3JSb3V0aW5nKCksICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgU2V0VXBTb3VyY2VFZGdlKHRydWUsIGZhbHNlKTsKK30KKwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6QWxsb2NhdGVJbnRlcnJ1cHRzKGJvb2wgd2F0Y2hlcikgeworICB3cGlfYXNzZXJ0KG1faW50ZXJydXB0ID09IG51bGxwdHIpOworICAvLyBFeHBlY3RzIHRoZSBjYWxsaW5nIGxlYWYgY2xhc3MgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0IGluZGV4LgorICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIG1faW50ZXJydXB0ID0gaW5pdGlhbGl6ZUludGVycnVwdHMobV9pbnRlcnJ1cHRJbmRleCwgd2F0Y2hlciwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENhbmNlbCBpbnRlcnJ1cHRzIG9uIHRoaXMgZGV2aWNlLgorICogVGhpcyBkZWFsbG9jYXRlcyBhbGwgdGhlIGNoaXBvYmplY3Qgc3RydWN0dXJlcyBhbmQgZGlzYWJsZXMgYW55IGludGVycnVwdHMuCisgKi8KK3ZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OkNhbmNlbEludGVycnVwdHMoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgd3BpX2Fzc2VydChtX2ludGVycnVwdCAhPSBudWxscHRyKTsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBjbGVhbkludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgbV9pbnRlcnJ1cHQgPSBudWxscHRyOworICBtX2ludGVycnVwdHMtPkZyZWUobV9pbnRlcnJ1cHRJbmRleCk7Cit9CisKKy8qKgorICogSW4gc3luY2hyb25vdXMgbW9kZSwgd2FpdCBmb3IgdGhlIGRlZmluZWQgaW50ZXJydXB0IHRvIG9jY3VyLiBZb3Ugc2hvdWxkCisgKiA8Yj5OT1Q8L2I+IGF0dGVtcHQgdG8gcmVhZCB0aGUKKyAqIHNlbnNvciBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIHdhaXRpbmcgZm9yIGFuIGludGVycnVwdC4gVGhpcyBpcyBub3QKKyAqIHRocmVhZHNhZmUsIGFuZCBjYW4gY2F1c2UKKyAqIG1lbW9yeSBjb3JydXB0aW9uCisgKiBAcGFyYW0gdGltZW91dCBUaW1lb3V0IGluIHNlY29uZHMKKyAqIEBwYXJhbSBpZ25vcmVQcmV2aW91cyBJZiB0cnVlLCBpZ25vcmUgaW50ZXJydXB0cyB0aGF0IGhhcHBlbmVkIGJlZm9yZQorICogV2FpdEZvckludGVycnVwdCB3YXMgY2FsbGVkLgorICogQHJldHVybiBXaGF0IGludGVycnVwdHMgZmlyZWQKKyAqLworSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OldhaXRSZXN1bHQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OldhaXRGb3JJbnRlcnJ1cHQoCisgICAgZmxvYXQgdGltZW91dCwgYm9vbCBpZ25vcmVQcmV2aW91cykgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OmtUaW1lb3V0OworICB3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IG51bGxwdHIpOworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHVpbnQzMl90IHJlc3VsdDsKKworICByZXN1bHQgPSB3YWl0Rm9ySW50ZXJydXB0KG1faW50ZXJydXB0LCB0aW1lb3V0LCBpZ25vcmVQcmV2aW91cywgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIHJldHVybiBzdGF0aWNfY2FzdDxXYWl0UmVzdWx0PihyZXN1bHQpOworfQorCisvKioKKyAqIEVuYWJsZSBpbnRlcnJ1cHRzIHRvIG9jY3VyIG9uIHRoaXMgaW5wdXQuCisgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB3aGVuIHRoZSBSZXF1ZXN0SW50ZXJydXB0IGNhbGwgaXMgbWFkZS4gVGhpcyBnaXZlcworICogdGltZSB0byBkbyB0aGUKKyAqIHNldHVwIG9mIHRoZSBvdGhlciBvcHRpb25zIGJlZm9yZSBzdGFydGluZyB0byBmaWVsZCBpbnRlcnJ1cHRzLgorICovCit2b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpFbmFibGVJbnRlcnJ1cHRzKCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gbnVsbHB0cik7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZW5hYmxlSW50ZXJydXB0cyhtX2ludGVycnVwdCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIERpc2FibGUgSW50ZXJydXB0cyB3aXRob3V0IHdpdGhvdXQgZGVhbGxvY2F0aW5nIHN0cnVjdHVyZXMuCisgKi8KK3ZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OkRpc2FibGVJbnRlcnJ1cHRzKCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gbnVsbHB0cik7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZGlzYWJsZUludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBmb3IgdGhlIHJpc2luZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LgorICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgorICogVGhlIHJpc2luZy1lZGdlIGludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCB3aXRoCisgKiB7QGxpbmsgI0RpZ2l0YWxJbnB1dC5TZXRVcFNvdXJjZUVkZ2V9CisgKiBAcmV0dXJuIFRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIGJvb3QuCisgKi8KK2RvdWJsZSBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6UmVhZFJpc2luZ1RpbWVzdGFtcCgpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKyAgd3BpX2Fzc2VydChtX2ludGVycnVwdCAhPSBudWxscHRyKTsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBkb3VibGUgdGltZXN0YW1wID0gcmVhZFJpc2luZ1RpbWVzdGFtcChtX2ludGVycnVwdCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gdGltZXN0YW1wOworfQorCisvKioKKyAqIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgZmFsbGluZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LgorICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgorICogVGhlIGZhbGxpbmctZWRnZSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aAorICoge0BsaW5rICNEaWdpdGFsSW5wdXQuU2V0VXBTb3VyY2VFZGdlfQorICogQHJldHVybiBUaW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSBib290LgorKi8KK2RvdWJsZSBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6UmVhZEZhbGxpbmdUaW1lc3RhbXAoKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7CisgIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gbnVsbHB0cik7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZG91YmxlIHRpbWVzdGFtcCA9IHJlYWRGYWxsaW5nVGltZXN0YW1wKG1faW50ZXJydXB0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiB0aW1lc3RhbXA7Cit9CisKKy8qKgorICogU2V0IHdoaWNoIGVkZ2UgdG8gdHJpZ2dlciBpbnRlcnJ1cHRzIG9uCisgKgorICogQHBhcmFtIHJpc2luZ0VkZ2UKKyAqICAgICAgICAgICAgdHJ1ZSB0byBpbnRlcnJ1cHQgb24gcmlzaW5nIGVkZ2UKKyAqIEBwYXJhbSBmYWxsaW5nRWRnZQorICogICAgICAgICAgICB0cnVlIHRvIGludGVycnVwdCBvbiBmYWxsaW5nIGVkZ2UKKyAqLwordm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6U2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZhbGxpbmdFZGdlKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgaWYgKG1faW50ZXJydXB0ID09IG51bGxwdHIpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKKyAgICAgICAgTnVsbFBhcmFtZXRlciwKKyAgICAgICAgIllvdSBtdXN0IGNhbGwgUmVxdWVzdEludGVycnVwdHMgYmVmb3JlIFNldFVwU291cmNlRWRnZSIpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9pbnRlcnJ1cHQgIT0gbnVsbHB0cikgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBzZXRJbnRlcnJ1cHRVcFNvdXJjZUVkZ2UobV9pbnRlcnJ1cHQsIHJpc2luZ0VkZ2UsIGZhbGxpbmdFZGdlLCAmc3RhdHVzKTsKKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0l0ZXJhdGl2ZVJvYm90LmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9JdGVyYXRpdmVSb2JvdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExZDJiYQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9JdGVyYXRpdmVSb2JvdC5jcHAKQEAgLTAsMCArMSwyMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkl0ZXJhdGl2ZVJvYm90LmgiCisKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKyNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oIgorCitjb25zdGV4cHIgZG91YmxlIEl0ZXJhdGl2ZVJvYm90OjprRGVmYXVsdFBlcmlvZDsKKworLyoqCisgKiBQcm92aWRlIGFuIGFsdGVybmF0ZSAibWFpbiBsb29wIiB2aWEgU3RhcnRDb21wZXRpdGlvbigpLgorICoKKyAqIFRoaXMgc3BlY2lmaWMgU3RhcnRDb21wZXRpdGlvbigpIGltcGxlbWVudHMgIm1haW4gbG9vcCIgYmVoYXZpb3VyIHN5bmNlZCB3aXRoCisgKiB0aGUgRFMgcGFja2V0cworICovCit2b2lkIEl0ZXJhdGl2ZVJvYm90OjpTdGFydENvbXBldGl0aW9uKCkgeworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRnJhbWV3b3JrLAorICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtGcmFtZXdvcmtfSXRlcmF0aXZlKTsKKworICBMaXZlV2luZG93ICpsdyA9IExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCk7CisgIC8vIGZpcnN0IGFuZCBvbmUtdGltZSBpbml0aWFsaXphdGlvbgorICBTbWFydERhc2hib2FyZDo6aW5pdCgpOworICBOZXR3b3JrVGFibGU6OkdldFRhYmxlKCJMaXZlV2luZG93IikKKyAgICAgIC0+R2V0U3ViVGFibGUoIn5TVEFUVVN+IikKKyAgICAgIC0+UHV0Qm9vbGVhbigiTFcgRW5hYmxlZCIsIGZhbHNlKTsKKyAgUm9ib3RJbml0KCk7CisKKyAgLy8gVGVsbCB0aGUgRFMgdGhhdCB0aGUgcm9ib3QgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZAorICBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCk7CisKKyAgLy8gbG9vcCBmb3JldmVyLCBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBtb2RlLWRlcGVuZGVudCBmdW5jdGlvbgorICBsdy0+U2V0RW5hYmxlZChmYWxzZSk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gQ2FsbCB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb24gZGVwZW5kaW5nIHVwb24gdGhlIGN1cnJlbnQgcm9ib3QgbW9kZQorICAgIGlmIChJc0Rpc2FibGVkKCkpIHsKKyAgICAgIC8vIGNhbGwgRGlzYWJsZWRJbml0KCkgaWYgd2UgYXJlIG5vdyBqdXN0IGVudGVyaW5nIGRpc2FibGVkIG1vZGUgZnJvbQorICAgICAgLy8gZWl0aGVyIGEgZGlmZmVyZW50IG1vZGUgb3IgZnJvbSBwb3dlci1vbgorICAgICAgaWYgKCFtX2Rpc2FibGVkSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbHctPlNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBEaXNhYmxlZEluaXQoKTsKKyAgICAgICAgbV9kaXNhYmxlZEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgLy8gcmVzZXQgdGhlIGluaXRpYWxpemF0aW9uIGZsYWdzIGZvciB0aGUgb3RoZXIgbW9kZXMKKyAgICAgICAgbV9hdXRvbm9tb3VzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgbV90ZWxlb3BJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICBtX3Rlc3RJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgfQorICAgICAgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1EaXNhYmxlZCgpOworICAgICAgRGlzYWJsZWRQZXJpb2RpYygpOworICAgIH0gZWxzZSBpZiAoSXNBdXRvbm9tb3VzKCkpIHsKKyAgICAgIC8vIGNhbGwgQXV0b25vbW91c0luaXQoKSBpZiB3ZSBhcmUgbm93IGp1c3QgZW50ZXJpbmcgYXV0b25vbW91cyBtb2RlIGZyb20KKyAgICAgIC8vIGVpdGhlciBhIGRpZmZlcmVudCBtb2RlIG9yIGZyb20gcG93ZXItb24KKyAgICAgIGlmICghbV9hdXRvbm9tb3VzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbHctPlNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBBdXRvbm9tb3VzSW5pdCgpOworICAgICAgICBtX2F1dG9ub21vdXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIC8vIHJlc2V0IHRoZSBpbml0aWFsaXphdGlvbiBmbGFncyBmb3IgdGhlIG90aGVyIG1vZGVzCisgICAgICAgIG1fZGlzYWJsZWRJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICBtX3RlbGVvcEluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIG1fdGVzdEluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICB9CisgICAgICBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMoKTsKKyAgICAgIEF1dG9ub21vdXNQZXJpb2RpYygpOworICAgIH0gZWxzZSBpZiAoSXNUZXN0KCkpIHsKKyAgICAgIC8vIGNhbGwgVGVzdEluaXQoKSBpZiB3ZSBhcmUgbm93IGp1c3QgZW50ZXJpbmcgdGVzdCBtb2RlIGZyb20KKyAgICAgIC8vIGVpdGhlciBhIGRpZmZlcmVudCBtb2RlIG9yIGZyb20gcG93ZXItb24KKyAgICAgIGlmICghbV90ZXN0SW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbHctPlNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIFRlc3RJbml0KCk7CisgICAgICAgIG1fdGVzdEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgLy8gcmVzZXQgdGhlIGluaXRpYWxpemF0aW9uIGZsYWdzIGZvciB0aGUgb3RoZXIgbW9kZXMKKyAgICAgICAgbV9kaXNhYmxlZEluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIG1fYXV0b25vbW91c0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIG1fdGVsZW9wSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCgpOworICAgICAgVGVzdFBlcmlvZGljKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGNhbGwgVGVsZW9wSW5pdCgpIGlmIHdlIGFyZSBub3cganVzdCBlbnRlcmluZyB0ZWxlb3AgbW9kZSBmcm9tCisgICAgICAvLyBlaXRoZXIgYSBkaWZmZXJlbnQgbW9kZSBvciBmcm9tIHBvd2VyLW9uCisgICAgICBpZiAoIW1fdGVsZW9wSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbHctPlNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBUZWxlb3BJbml0KCk7CisgICAgICAgIG1fdGVsZW9wSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAvLyByZXNldCB0aGUgaW5pdGlhbGl6YXRpb24gZmxhZ3MgZm9yIHRoZSBvdGhlciBtb2RlcworICAgICAgICBtX2Rpc2FibGVkSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9hdXRvbm9tb3VzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgbV90ZXN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5TZXRFbmFibGVkKHRydWUpOworICAgICAgfQorICAgICAgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1UZWxlb3AoKTsKKyAgICAgIFRlbGVvcFBlcmlvZGljKCk7CisgICAgfQorICAgIC8vIHdhaXQgZm9yIGRyaXZlciBzdGF0aW9uIGRhdGEgc28gdGhlIGxvb3AgZG9lc24ndCBob2cgdGhlIENQVQorICAgIG1fZHMuV2FpdEZvckRhdGEoKTsKKyAgfQorfQorCisvKioKKyAqIFJvYm90LXdpZGUgaW5pdGlhbGl6YXRpb24gY29kZSBzaG91bGQgZ28gaGVyZS4KKyAqCisgKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGRlZmF1bHQgUm9ib3Qtd2lkZSBpbml0aWFsaXphdGlvbiB3aGljaAorICogd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcm9ib3QgaXMgZmlyc3QgcG93ZXJlZCBvbi4gSXQgd2lsbCBiZSBjYWxsZWQgZXhhY3RseQorICogb25lIHRpbWUuCisgKgorICogV2FybmluZzogdGhlIERyaXZlciBTdGF0aW9uICJSb2JvdCBDb2RlIiBsaWdodCBhbmQgRk1TICJSb2JvdCBSZWFkeSIKKyAqIGluZGljYXRvcnMgd2lsbCBiZSBvZmYgdW50aWwgUm9ib3RJbml0KCkgZXhpdHMuIENvZGUgaW4gUm9ib3RJbml0KCkgdGhhdAorICogd2FpdHMgZm9yIGVuYWJsZSB3aWxsIGNhdXNlIHRoZSByb2JvdCB0byBuZXZlciBpbmRpY2F0ZSB0aGF0IHRoZSBjb2RlIGlzCisgKiByZWFkeSwgY2F1c2luZyB0aGUgcm9ib3QgdG8gYmUgYnlwYXNzZWQgaW4gYSBtYXRjaC4KKyAqLwordm9pZCBJdGVyYXRpdmVSb2JvdDo6Um9ib3RJbml0KCkgeworICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIGRpc2FibGVkIG1vZGUgc2hvdWxkIGdvIGhlcmUuCisgKgorICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBpbml0aWFsaXphdGlvbiBjb2RlIHdoaWNoIHdpbGwgYmUKKyAqIGNhbGxlZCBlYWNoIHRpbWUKKyAqIHRoZSByb2JvdCBlbnRlcnMgZGlzYWJsZWQgbW9kZS4KKyAqLwordm9pZCBJdGVyYXRpdmVSb2JvdDo6RGlzYWJsZWRJbml0KCkgeworICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIGF1dG9ub21vdXMgbW9kZSBzaG91bGQgZ28gaGVyZS4KKyAqCisgKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUgd2hpY2ggd2lsbCBiZQorICogY2FsbGVkIGVhY2ggdGltZQorICogdGhlIHJvYm90IGVudGVycyBhdXRvbm9tb3VzIG1vZGUuCisgKi8KK3ZvaWQgSXRlcmF0aXZlUm9ib3Q6OkF1dG9ub21vdXNJbml0KCkgeworICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHRlbGVvcCBtb2RlIHNob3VsZCBnbyBoZXJlLgorICoKKyAqIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgaW5pdGlhbGl6YXRpb24gY29kZSB3aGljaCB3aWxsIGJlCisgKiBjYWxsZWQgZWFjaCB0aW1lCisgKiB0aGUgcm9ib3QgZW50ZXJzIHRlbGVvcCBtb2RlLgorICovCit2b2lkIEl0ZXJhdGl2ZVJvYm90OjpUZWxlb3BJbml0KCkgeworICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHRlc3QgbW9kZSBzaG91bGQgZ28gaGVyZS4KKyAqCisgKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUgd2hpY2ggd2lsbCBiZQorICogY2FsbGVkIGVhY2ggdGltZQorICogdGhlIHJvYm90IGVudGVycyB0ZXN0IG1vZGUuCisgKi8KK3ZvaWQgSXRlcmF0aXZlUm9ib3Q6OlRlc3RJbml0KCkgeworICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIFBlcmlvZGljIGNvZGUgZm9yIGRpc2FibGVkIG1vZGUgc2hvdWxkIGdvIGhlcmUuCisgKgorICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjb2RlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHBlcmlvZGljYWxseQorICogYXQgYSByZWd1bGFyCisgKiByYXRlIHdoaWxlIHRoZSByb2JvdCBpcyBpbiBkaXNhYmxlZCBtb2RlLgorICovCit2b2lkIEl0ZXJhdGl2ZVJvYm90OjpEaXNhYmxlZFBlcmlvZGljKCkgeworICBzdGF0aWMgYm9vbCBmaXJzdFJ1biA9IHRydWU7CisgIGlmIChmaXJzdFJ1bikgeworICAgIHByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgZmlyc3RSdW4gPSBmYWxzZTsKKyAgfQorICBkZWxheVRpY2tzKDEpOworfQorCisvKioKKyAqIFBlcmlvZGljIGNvZGUgZm9yIGF1dG9ub21vdXMgbW9kZSBzaG91bGQgZ28gaGVyZS4KKyAqCisgKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGNvZGUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5CisgKiBhdCBhIHJlZ3VsYXIKKyAqIHJhdGUgd2hpbGUgdGhlIHJvYm90IGlzIGluIGF1dG9ub21vdXMgbW9kZS4KKyAqLwordm9pZCBJdGVyYXRpdmVSb2JvdDo6QXV0b25vbW91c1BlcmlvZGljKCkgeworICBzdGF0aWMgYm9vbCBmaXJzdFJ1biA9IHRydWU7CisgIGlmIChmaXJzdFJ1bikgeworICAgIHByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgZmlyc3RSdW4gPSBmYWxzZTsKKyAgfQorICBkZWxheVRpY2tzKDEpOworfQorCisvKioKKyAqIFBlcmlvZGljIGNvZGUgZm9yIHRlbGVvcCBtb2RlIHNob3VsZCBnbyBoZXJlLgorICoKKyAqIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgY29kZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkKKyAqIGF0IGEgcmVndWxhcgorICogcmF0ZSB3aGlsZSB0aGUgcm9ib3QgaXMgaW4gdGVsZW9wIG1vZGUuCisgKi8KK3ZvaWQgSXRlcmF0aXZlUm9ib3Q6OlRlbGVvcFBlcmlvZGljKCkgeworICBzdGF0aWMgYm9vbCBmaXJzdFJ1biA9IHRydWU7CisgIGlmIChmaXJzdFJ1bikgeworICAgIHByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgZmlyc3RSdW4gPSBmYWxzZTsKKyAgfQorICBkZWxheVRpY2tzKDEpOworfQorCisvKioKKyAqIFBlcmlvZGljIGNvZGUgZm9yIHRlc3QgbW9kZSBzaG91bGQgZ28gaGVyZS4KKyAqCisgKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGNvZGUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5CisgKiBhdCBhIHJlZ3VsYXIKKyAqIHJhdGUgd2hpbGUgdGhlIHJvYm90IGlzIGluIHRlc3QgbW9kZS4KKyAqLwordm9pZCBJdGVyYXRpdmVSb2JvdDo6VGVzdFBlcmlvZGljKCkgeworICBzdGF0aWMgYm9vbCBmaXJzdFJ1biA9IHRydWU7CisgIGlmIChmaXJzdFJ1bikgeworICAgIHByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgZmlyc3RSdW4gPSBmYWxzZTsKKyAgfQorICBkZWxheVRpY2tzKDEpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL0phZ3Vhci5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvSmFndWFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTYxZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0phZ3Vhci5jcHAKQEAgLTAsMCArMSw3OSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiSmFndWFyLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIGEgSmFndWFyIGNvbm5lY3RlZCB2aWEgUFdNCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgSmFndWFyIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlCisgKiBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitKYWd1YXI6OkphZ3Vhcih1aW50MzJfdCBjaGFubmVsKSA6IFNhZmVQV00oY2hhbm5lbCkgeworICAvKioKKyAgICogSW5wdXQgcHJvZmlsZSBkZWZpbmVkIGJ5IEx1bWluYXJ5IE1pY3JvLgorICAgKgorICAgKiBGdWxsIHJldmVyc2UgcmFuZ2VzIGZyb20gMC42NzEzMjVtcyB0byAwLjY5NzIyMTFtcworICAgKiBQcm9wb3J0aW9uYWwgcmV2ZXJzZSByYW5nZXMgZnJvbSAwLjY5NzIyMTFtcyB0byAxLjQ0ODIwNzhtcworICAgKiBOZXV0cmFsIHJhbmdlcyBmcm9tIDEuNDQ4MjA3OG1zIHRvIDEuNTUxNzkyMm1zCisgICAqIFByb3BvcnRpb25hbCBmb3J3YXJkIHJhbmdlcyBmcm9tIDEuNTUxNzkyMm1zIHRvIDIuMzAyNzc4OW1zCisgICAqIEZ1bGwgZm9yd2FyZCByYW5nZXMgZnJvbSAyLjMwMjc3ODltcyB0byAyLjMyODY3NW1zCisgICAqLworICBTZXRCb3VuZHMoMi4zMSwgMS41NSwgMS41MDcsIDEuNDU0LCAuNjk3KTsKKyAgU2V0UGVyaW9kTXVsdGlwbGllcihrUGVyaW9kTXVsdGlwbGllcl8xWCk7CisgIFNldFJhdyhtX2NlbnRlclB3bSk7CisgIFNldFplcm9MYXRjaCgpOworCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9KYWd1YXIsIEdldENoYW5uZWwoKSk7CisgIExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCktPkFkZEFjdHVhdG9yKCJKYWd1YXIiLCBHZXRDaGFubmVsKCksIHRoaXMpOworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlLgorICoKKyAqIFRoZSBQV00gdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkKKyAqIHNjYWxpbmcgdGhlIHZhbHVlIGZvciB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgMS4wIHRvIHNldC4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVW51c2VkIGludGVyZmFjZS4KKyAqLwordm9pZCBKYWd1YXI6OlNldChmbG9hdCBzcGVlZCwgdWludDhfdCBzeW5jR3JvdXApIHsKKyAgU2V0U3BlZWQobV9pc0ludmVydGVkID8gLXNwZWVkIDogc3BlZWQpOworfQorCisvKioKKyAqIEdldCB0aGUgcmVjZW50bHkgc2V0IHZhbHVlIG9mIHRoZSBQV00uCisgKgorICogQHJldHVybiBUaGUgbW9zdCByZWNlbnRseSBzZXQgdmFsdWUgZm9yIHRoZSBQV00gYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisgKi8KK2Zsb2F0IEphZ3Vhcjo6R2V0KCkgY29uc3QgeyByZXR1cm4gR2V0U3BlZWQoKTsgfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorICovCit2b2lkIEphZ3Vhcjo6RGlzYWJsZSgpIHsgU2V0UmF3KGtQd21EaXNhYmxlZCk7IH0KKworLyoqCisqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGludmVydGluZyBkaXJlY3Rpb24gb2YgYSBzcGVlZCBjb250cm9sbGVyLgorKiBAcGFyYW0gaXNJbnZlcnRlZCBUaGUgc3RhdGUgb2YgaW52ZXJzaW9uLCB0cnVlIGlzIGludmVydGVkLgorKi8KK3ZvaWQgSmFndWFyOjpTZXRJbnZlcnRlZChib29sIGlzSW52ZXJ0ZWQpIHsgbV9pc0ludmVydGVkID0gaXNJbnZlcnRlZDsgfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZSBpbnZlcnRpbmcgZGlyZWN0aW9uIG9mIGEgc3BlZWQgY29udHJvbGxlci4KKyAqCisgKiBAcmV0dXJuIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KKyAqCisgKi8KK2Jvb2wgSmFndWFyOjpHZXRJbnZlcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJbnZlcnRlZDsgfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIEphZ3Vhcjo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KSB7IFNldChvdXRwdXQpOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvSm95c3RpY2suY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL0pveXN0aWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg4MzJjCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL0pveXN0aWNrLmNwcApAQCAtMCwwICsxLDM3NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiSm95c3RpY2suaCIKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitjb25zdCB1aW50MzJfdCBKb3lzdGljazo6a0RlZmF1bHRYQXhpczsKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFlBeGlzOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0WkF4aXM7Citjb25zdCB1aW50MzJfdCBKb3lzdGljazo6a0RlZmF1bHRUd2lzdEF4aXM7Citjb25zdCB1aW50MzJfdCBKb3lzdGljazo6a0RlZmF1bHRUaHJvdHRsZUF4aXM7Citjb25zdCB1aW50MzJfdCBKb3lzdGljazo6a0RlZmF1bHRUcmlnZ2VyQnV0dG9uOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0VG9wQnV0dG9uOworc3RhdGljIEpveXN0aWNrICpqb3lzdGlja3NbRHJpdmVyU3RhdGlvbjo6a0pveXN0aWNrUG9ydHNdOworc3RhdGljIGJvb2wgam95U3RpY2tzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworLyoqCisgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgYSBqb3lzdGljay4KKyAqIFRoZSBqb3lzdGljayBpbmRleCBpcyB0aGUgdXNiIHBvcnQgb24gdGhlIGRyaXZlcnMgc3RhdGlvbi4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBvbiB0aGUgZHJpdmVyIHN0YXRpb24gdGhhdCB0aGUgam95c3RpY2sgaXMgcGx1Z2dlZCBpbnRvCisgKiAoMC01KS4KKyAqLworSm95c3RpY2s6OkpveXN0aWNrKHVpbnQzMl90IHBvcnQpCisgICAgOiBKb3lzdGljayhwb3J0LCBrTnVtQXhpc1R5cGVzLCBrTnVtQnV0dG9uVHlwZXMpIHsKKyAgbV9heGVzW2tYQXhpc10gPSBrRGVmYXVsdFhBeGlzOworICBtX2F4ZXNba1lBeGlzXSA9IGtEZWZhdWx0WUF4aXM7CisgIG1fYXhlc1trWkF4aXNdID0ga0RlZmF1bHRaQXhpczsKKyAgbV9heGVzW2tUd2lzdEF4aXNdID0ga0RlZmF1bHRUd2lzdEF4aXM7CisgIG1fYXhlc1trVGhyb3R0bGVBeGlzXSA9IGtEZWZhdWx0VGhyb3R0bGVBeGlzOworCisgIG1fYnV0dG9uc1trVHJpZ2dlckJ1dHRvbl0gPSBrRGVmYXVsdFRyaWdnZXJCdXR0b247CisgIG1fYnV0dG9uc1trVG9wQnV0dG9uXSA9IGtEZWZhdWx0VG9wQnV0dG9uOworCisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Kb3lzdGljaywgcG9ydCk7Cit9CisKKy8qKgorICogVmVyc2lvbiBvZiB0aGUgY29uc3RydWN0b3IgdG8gYmUgY2FsbGVkIGJ5IHN1Yi1jbGFzc2VzLgorICoKKyAqIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHRoZSBzdWJjbGFzcyB0byBjb25maWd1cmUgdGhlIG51bWJlciBvZiBjb25zdGFudHMKKyAqIGZvciBheGVzIGFuZCBidXR0b25zLgorICoKKyAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IG9uIHRoZSBkcml2ZXIgc3RhdGlvbiB0aGF0IHRoZSBqb3lzdGljayBpcyBwbHVnZ2VkIGludG8uCisgKiBAcGFyYW0gbnVtQXhpc1R5cGVzIFRoZSBudW1iZXIgb2YgYXhpcyB0eXBlcyBpbiB0aGUgZW51bS4KKyAqIEBwYXJhbSBudW1CdXR0b25UeXBlcyBUaGUgbnVtYmVyIG9mIGJ1dHRvbiB0eXBlcyBpbiB0aGUgZW51bS4KKyAqLworSm95c3RpY2s6OkpveXN0aWNrKHVpbnQzMl90IHBvcnQsIHVpbnQzMl90IG51bUF4aXNUeXBlcywKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1CdXR0b25UeXBlcykKKyAgICA6IG1fZHMoRHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKSksCisgICAgICBtX3BvcnQocG9ydCksCisgICAgICBtX2F4ZXMobnVtQXhpc1R5cGVzKSwKKyAgICAgIG1fYnV0dG9ucyhudW1CdXR0b25UeXBlcykgeworICBpZiAoIWpveVN0aWNrc0luaXRpYWxpemVkKSB7CisgICAgZm9yIChhdXRvJiBqb3lzdGljayA6IGpveXN0aWNrcykgam95c3RpY2sgPSBudWxscHRyOworICAgIGpveVN0aWNrc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorICBpZiAobV9wb3J0ID49IERyaXZlclN0YXRpb246OmtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICB9IGVsc2UgeworICAgIGpveXN0aWNrc1ttX3BvcnRdID0gdGhpczsKKyAgfQorfQorCitKb3lzdGljayAqSm95c3RpY2s6OkdldFN0aWNrRm9yUG9ydCh1aW50MzJfdCBwb3J0KSB7CisgIEpveXN0aWNrICpzdGljayA9IGpveXN0aWNrc1twb3J0XTsKKyAgaWYgKHN0aWNrID09IG51bGxwdHIpIHsKKyAgICBzdGljayA9IG5ldyBKb3lzdGljayhwb3J0KTsKKyAgICBqb3lzdGlja3NbcG9ydF0gPSBzdGljazsKKyAgfQorICByZXR1cm4gc3RpY2s7Cit9CisKKy8qKgorICogR2V0IHRoZSBYIHZhbHVlIG9mIHRoZSBqb3lzdGljay4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCisgKiBAcGFyYW0gaGFuZCBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciB0aGUgSm95c3RpY2sgY2xhc3MgYW5kIGlzIG9ubHkgaGVyZQorICogdG8gY29tcGxldGUgdGhlIEdlbmVyaWNISUQgaW50ZXJmYWNlLgorICovCitmbG9hdCBKb3lzdGljazo6R2V0WChKb3lzdGlja0hhbmQgaGFuZCkgY29uc3QgeworICByZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba1hBeGlzXSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBZIHZhbHVlIG9mIHRoZSBqb3lzdGljay4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCisgKiBAcGFyYW0gaGFuZCBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciB0aGUgSm95c3RpY2sgY2xhc3MgYW5kIGlzIG9ubHkgaGVyZQorICogdG8gY29tcGxldGUgdGhlIEdlbmVyaWNISUQgaW50ZXJmYWNlLgorICovCitmbG9hdCBKb3lzdGljazo6R2V0WShKb3lzdGlja0hhbmQgaGFuZCkgY29uc3QgeworICByZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba1lBeGlzXSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBaIHZhbHVlIG9mIHRoZSBjdXJyZW50IGpveXN0aWNrLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnQgcG9ydC4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFooKSBjb25zdCB7IHJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trWkF4aXNdKTsgfQorCisvKioKKyAqIEdldCB0aGUgdHdpc3QgdmFsdWUgb2YgdGhlIGN1cnJlbnQgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgorICovCitmbG9hdCBKb3lzdGljazo6R2V0VHdpc3QoKSBjb25zdCB7IHJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trVHdpc3RBeGlzXSk7IH0KKworLyoqCisgKiBHZXQgdGhlIHRocm90dGxlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGpveXN0aWNrLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnQgcG9ydC4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFRocm90dGxlKCkgY29uc3QgeworICByZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba1Rocm90dGxlQXhpc10pOworfQorCisvKioKKyAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGF4aXMuCisgKgorICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gcmVhZCwgc3RhcnRpbmcgYXQgMC4KKyAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBheGlzLgorICovCitmbG9hdCBKb3lzdGljazo6R2V0UmF3QXhpcyh1aW50MzJfdCBheGlzKSBjb25zdCB7CisgIHJldHVybiBtX2RzLkdldFN0aWNrQXhpcyhtX3BvcnQsIGF4aXMpOworfQorCisvKioKKyAqIEZvciB0aGUgY3VycmVudCBqb3lzdGljaywgcmV0dXJuIHRoZSBheGlzIGRldGVybWluZWQgYnkgdGhlIGFyZ3VtZW50LgorICoKKyAqIFRoaXMgaXMgZm9yIGNhc2VzIHdoZXJlIHRoZSBqb3lzdGljayBheGlzIGlzIHJldHVybmVkIHByb2dyYW1hdGljYWxseSwKKyAqIG90aGVyd2lzZSBvbmUgb2YgdGhlCisgKiBwcmV2aW91cyBmdW5jdGlvbnMgd291bGQgYmUgcHJlZmVyYWJsZSAoZm9yIGV4YW1wbGUgR2V0WCgpKS4KKyAqCisgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byByZWFkLgorICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGF4aXMuCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXRBeGlzKEF4aXNUeXBlIGF4aXMpIGNvbnN0IHsKKyAgc3dpdGNoIChheGlzKSB7CisgICAgY2FzZSBrWEF4aXM6CisgICAgICByZXR1cm4gdGhpcy0+R2V0WCgpOworICAgIGNhc2Uga1lBeGlzOgorICAgICAgcmV0dXJuIHRoaXMtPkdldFkoKTsKKyAgICBjYXNlIGtaQXhpczoKKyAgICAgIHJldHVybiB0aGlzLT5HZXRaKCk7CisgICAgY2FzZSBrVHdpc3RBeGlzOgorICAgICAgcmV0dXJuIHRoaXMtPkdldFR3aXN0KCk7CisgICAgY2FzZSBrVGhyb3R0bGVBeGlzOgorICAgICAgcmV0dXJuIHRoaXMtPkdldFRocm90dGxlKCk7CisgICAgZGVmYXVsdDoKKyAgICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0F4aXMpOworICAgICAgcmV0dXJuIDAuMDsKKyAgfQorfQorCisvKioKKyAqIFJlYWQgdGhlIHN0YXRlIG9mIHRoZSB0cmlnZ2VyIG9uIHRoZSBqb3lzdGljay4KKyAqCisgKiBMb29rIHVwIHdoaWNoIGJ1dHRvbiBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgdHJpZ2dlciBhbmQgcmVhZCBpdHMgc3RhdGUuCisgKgorICogQHBhcmFtIGhhbmQgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlIEpveXN0aWNrIGNsYXNzIGFuZCBpcyBvbmx5IGhlcmUKKyAqIHRvIGNvbXBsZXRlIHRoZSBHZW5lcmljSElEIGludGVyZmFjZS4KKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSB0cmlnZ2VyLgorICovCitib29sIEpveXN0aWNrOjpHZXRUcmlnZ2VyKEpveXN0aWNrSGFuZCBoYW5kKSBjb25zdCB7CisgIHJldHVybiBHZXRSYXdCdXR0b24obV9idXR0b25zW2tUcmlnZ2VyQnV0dG9uXSk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgc3RhdGUgb2YgdGhlIHRvcCBidXR0b24gb24gdGhlIGpveXN0aWNrLgorICoKKyAqIExvb2sgdXAgd2hpY2ggYnV0dG9uIGhhcyBiZWVuIGFzc2lnbmVkIHRvIHRoZSB0b3AgYW5kIHJlYWQgaXRzIHN0YXRlLgorICoKKyAqIEBwYXJhbSBoYW5kIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgZm9yIHRoZSBKb3lzdGljayBjbGFzcyBhbmQgaXMgb25seSBoZXJlCisgKiB0byBjb21wbGV0ZSB0aGUgR2VuZXJpY0hJRCBpbnRlcmZhY2UuCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgdG9wIGJ1dHRvbi4KKyAqLworYm9vbCBKb3lzdGljazo6R2V0VG9wKEpveXN0aWNrSGFuZCBoYW5kKSBjb25zdCB7CisgIHJldHVybiBHZXRSYXdCdXR0b24obV9idXR0b25zW2tUb3BCdXR0b25dKTsKK30KKworLyoqCisgKiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBKb3lzdGljay4KKyAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgaGVyZSB0byBjb21wbGV0ZSB0aGUgR2VuZXJpY0hJRCBpbnRlcmZhY2UuCisgKi8KK2Jvb2wgSm95c3RpY2s6OkdldEJ1bXBlcihKb3lzdGlja0hhbmQgaGFuZCkgY29uc3QgeworICAvLyBKb3lzdGlja3MgZG9uJ3QgaGF2ZSBidW1wZXJzLgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogR2V0IHRoZSBidXR0b24gdmFsdWUgKHN0YXJ0aW5nIGF0IGJ1dHRvbiAxKQorICoKKyAqIFRoZSBidXR0b25zIGFyZSByZXR1cm5lZCBpbiBhIHNpbmdsZSAxNiBiaXQgdmFsdWUgd2l0aCBvbmUgYml0IHJlcHJlc2VudGluZworICogdGhlIHN0YXRlCisgKiBvZiBlYWNoIGJ1dHRvbi4gVGhlIGFwcHJvcHJpYXRlIGJ1dHRvbiBpcyByZXR1cm5lZCBhcyBhIGJvb2xlYW4gdmFsdWUuCisgKgorICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIG51bWJlciB0byBiZSByZWFkIChzdGFydGluZyBhdCAxKQorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KKyAqKi8KK2Jvb2wgSm95c3RpY2s6OkdldFJhd0J1dHRvbih1aW50MzJfdCBidXR0b24pIGNvbnN0IHsKKyAgcmV0dXJuIG1fZHMuR2V0U3RpY2tCdXR0b24obV9wb3J0LCBidXR0b24pOworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdGUgb2YgYSBQT1Ygb24gdGhlIGpveXN0aWNrLgorICoKKyAqIEBwYXJhbSBwb3YgVGhlIGluZGV4IG9mIHRoZSBQT1YgdG8gcmVhZCAoc3RhcnRpbmcgYXQgMCkKKyAqIEByZXR1cm4gdGhlIGFuZ2xlIG9mIHRoZSBQT1YgaW4gZGVncmVlcywgb3IgLTEgaWYgdGhlIFBPViBpcyBub3QgcHJlc3NlZC4KKyAqLworaW50IEpveXN0aWNrOjpHZXRQT1YodWludDMyX3QgcG92KSBjb25zdCB7CisgIHJldHVybiBtX2RzLkdldFN0aWNrUE9WKG1fcG9ydCwgcG92KTsKK30KKworLyoqCisgKiBHZXQgYnV0dG9ucyBiYXNlZCBvbiBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKgorICogVGhlIGJ1dHRvbiB0eXBlIHdpbGwgYmUgbG9va2VkIHVwIGluIHRoZSBsaXN0IG9mIGJ1dHRvbnMgYW5kIHRoZW4gcmVhZC4KKyAqCisgKiBAcGFyYW0gYnV0dG9uIFRoZSB0eXBlIG9mIGJ1dHRvbiB0byByZWFkLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KKyAqLworYm9vbCBKb3lzdGljazo6R2V0QnV0dG9uKEJ1dHRvblR5cGUgYnV0dG9uKSBjb25zdCB7CisgIHN3aXRjaCAoYnV0dG9uKSB7CisgICAgY2FzZSBrVHJpZ2dlckJ1dHRvbjoKKyAgICAgIHJldHVybiBHZXRUcmlnZ2VyKCk7CisgICAgY2FzZSBrVG9wQnV0dG9uOgorICAgICAgcmV0dXJuIEdldFRvcCgpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBheGlzIGZvciBhIGpveXN0aWNrCisgKgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGF4aXMgZm9yIHRoZSBjdXJyZW50IGpveXN0aWNrCisgKi8KK2ludCBKb3lzdGljazo6R2V0QXhpc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbV9kcy5HZXRTdGlja0F4aXNDb3VudChtX3BvcnQpOyB9CisKKy8qKgorICogR2V0IHRoZSB2YWx1ZSBvZiBpc1hib3ggZm9yIHRoZSBqb3lzdGljay4KKyAqCisgKiBAcmV0dXJuIEEgYm9vbGVhbiB0aGF0IGlzIHRydWUgaWYgdGhlIGpveXN0aWNrIGlzIGFuIHhib3ggY29udHJvbGxlci4KKyAqLworYm9vbCBKb3lzdGljazo6R2V0SXNYYm94KCkgY29uc3QgeyByZXR1cm4gbV9kcy5HZXRKb3lzdGlja0lzWGJveChtX3BvcnQpOyB9CisKKy8qKgorICogR2V0IHRoZSBISUQgdHlwZSBvZiB0aGUgY29udHJvbGxlci4KKyAqCisgKiBAcmV0dXJuIHRoZSBISUQgdHlwZSBvZiB0aGUgY29udHJvbGxlci4KKyAqLworSm95c3RpY2s6OkhJRFR5cGUgSm95c3RpY2s6OkdldFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxISURUeXBlPihtX2RzLkdldEpveXN0aWNrVHlwZShtX3BvcnQpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGpveXN0aWNrLgorICoKKyAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsZXIuCisgKi8KK3N0ZDo6c3RyaW5nIEpveXN0aWNrOjpHZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kcy5HZXRKb3lzdGlja05hbWUobV9wb3J0KTsgfQorCisvLyBpbnQgSm95c3RpY2s6OkdldEF4aXNUeXBlKHVpbnQ4X3QgYXhpcykgY29uc3QKKy8veworLy8JcmV0dXJuIG1fZHMuR2V0Sm95c3RpY2tBeGlzVHlwZShtX3BvcnQsIGF4aXMpOworLy99CisKKy8qKgorICAqIEdldCB0aGUgbnVtYmVyIG9mIGF4aXMgZm9yIGEgam95c3RpY2sKKyAgKgorKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnV0dG9ucyBvbiB0aGUgY3VycmVudCBqb3lzdGljaworICovCitpbnQgSm95c3RpY2s6OkdldEJ1dHRvbkNvdW50KCkgY29uc3QgeworICByZXR1cm4gbV9kcy5HZXRTdGlja0J1dHRvbkNvdW50KG1fcG9ydCk7Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgYXhpcyBmb3IgYSBqb3lzdGljaworICoKKyAqIEByZXR1cm4gdGhlbiB1bWJlciBvZiBQT1ZzIGZvciB0aGUgY3VycmVudCBqb3lzdGljaworICovCitpbnQgSm95c3RpY2s6OkdldFBPVkNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9kcy5HZXRTdGlja1BPVkNvdW50KG1fcG9ydCk7IH0KKworLyoqCisgKiBHZXQgdGhlIGNoYW5uZWwgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGF4aXMuCisgKgorICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gbG9vayB1cCB0aGUgY2hhbm5lbCBmb3IuCisgKiBAcmV0dXJuIFRoZSBjaGFubmVsIGZyIHRoZSBheGlzLgorICovCit1aW50MzJfdCBKb3lzdGljazo6R2V0QXhpc0NoYW5uZWwoQXhpc1R5cGUgYXhpcykgY29uc3QgeyByZXR1cm4gbV9heGVzW2F4aXNdOyB9CisKKy8qKgorICogU2V0IHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmllZCBheGlzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHNldCB0aGUgY2hhbm5lbCBmb3IuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byBzZXQgdGhlIGF4aXMgdG8uCisgKi8KK3ZvaWQgSm95c3RpY2s6OlNldEF4aXNDaGFubmVsKEF4aXNUeXBlIGF4aXMsIHVpbnQzMl90IGNoYW5uZWwpIHsKKyAgbV9heGVzW2F4aXNdID0gY2hhbm5lbDsKK30KKworLyoqCisgKiBHZXQgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlyZWN0aW9uIHZlY3RvciBmb3JtZWQgYnkgdGhlIGpveXN0aWNrJ3MKKyAqIGN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gaXRzIG9yaWdpbgorICoKKyAqIEByZXR1cm4gVGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlyZWN0aW9uIHZlY3RvcgorICovCitmbG9hdCBKb3lzdGljazo6R2V0TWFnbml0dWRlKCkgY29uc3QgeworICByZXR1cm4gc3FydChwb3coR2V0WCgpLCAyKSArIHBvdyhHZXRZKCksIDIpKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGZvcm1lZCBieSB0aGUgam95c3RpY2sgYW5kIGl0cyBvcmlnaW4KKyAqIGluIHJhZGlhbnMKKyAqCisgKiBAcmV0dXJuIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHZlY3RvciBpbiByYWRpYW5zCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXREaXJlY3Rpb25SYWRpYW5zKCkgY29uc3QgeyByZXR1cm4gYXRhbjIoR2V0WCgpLCAtR2V0WSgpKTsgfQorCisvKioKKyAqIEdldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSB2ZWN0b3IgZm9ybWVkIGJ5IHRoZSBqb3lzdGljayBhbmQgaXRzIG9yaWdpbgorICogaW4gZGVncmVlcworICoKKyAqIHVzZXMgYWNvcygtMSkgdG8gcmVwcmVzZW50IFBpIGR1ZSB0byBhYnNlbmNlIG9mIHJlYWRpbHkgYWNjZXNzaWJsZSBQaQorICogY29uc3RhbnQgaW4gQysrCisgKgorICogQHJldHVybiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB2ZWN0b3IgaW4gZGVncmVlcworICovCitmbG9hdCBKb3lzdGljazo6R2V0RGlyZWN0aW9uRGVncmVlcygpIGNvbnN0IHsKKyAgcmV0dXJuICgxODAgLyBhY29zKC0xKSkgKiBHZXREaXJlY3Rpb25SYWRpYW5zKCk7Cit9CisKKy8qKgorICogU2V0IHRoZSBydW1ibGUgb3V0cHV0IGZvciB0aGUgam95c3RpY2suIFRoZSBEUyBjdXJyZW50bHkgc3VwcG9ydHMgMiBydW1ibGUKKyAqIHZhbHVlcywKKyAqIGxlZnQgcnVtYmxlIGFuZCByaWdodCBydW1ibGUKKyAqIEBwYXJhbSB0eXBlIFdoaWNoIHJ1bWJsZSB2YWx1ZSB0byBzZXQKKyAqIEBwYXJhbSB2YWx1ZSBUaGUgbm9ybWFsaXplZCB2YWx1ZSAoMCB0byAxKSB0byBzZXQgdGhlIHJ1bWJsZSB0bworICovCit2b2lkIEpveXN0aWNrOjpTZXRSdW1ibGUoUnVtYmxlVHlwZSB0eXBlLCBmbG9hdCB2YWx1ZSkgeworICBpZiAodmFsdWUgPCAwKQorICAgIHZhbHVlID0gMDsKKyAgZWxzZSBpZiAodmFsdWUgPiAxKQorICAgIHZhbHVlID0gMTsKKyAgaWYgKHR5cGUgPT0ga0xlZnRSdW1ibGUpCisgICAgbV9sZWZ0UnVtYmxlID0gdmFsdWUgKiA2NTUzNTsKKyAgZWxzZQorICAgIG1fcmlnaHRSdW1ibGUgPSB2YWx1ZSAqIDY1NTM1OworICBIQUxTZXRKb3lzdGlja091dHB1dHMobV9wb3J0LCBtX291dHB1dHMsIG1fbGVmdFJ1bWJsZSwgbV9yaWdodFJ1bWJsZSk7Cit9CisKKy8qKgorICogU2V0IGEgc2luZ2xlIEhJRCBvdXRwdXQgdmFsdWUgZm9yIHRoZSBqb3lzdGljay4KKyAqIEBwYXJhbSBvdXRwdXROdW1iZXIgVGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgdG8gc2V0ICgxLTMyKQorICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgdGhlIG91dHB1dCB0bworICovCisKK3ZvaWQgSm95c3RpY2s6OlNldE91dHB1dCh1aW50OF90IG91dHB1dE51bWJlciwgYm9vbCB2YWx1ZSkgeworICBtX291dHB1dHMgPQorICAgICAgKG1fb3V0cHV0cyAmIH4oMSA8PCAob3V0cHV0TnVtYmVyIC0gMSkpKSB8ICh2YWx1ZSA8PCAob3V0cHV0TnVtYmVyIC0gMSkpOworCisgIEhBTFNldEpveXN0aWNrT3V0cHV0cyhtX3BvcnQsIG1fb3V0cHV0cywgbV9sZWZ0UnVtYmxlLCBtX3JpZ2h0UnVtYmxlKTsKK30KKworLyoqCisgKiBTZXQgYWxsIEhJRCBvdXRwdXQgdmFsdWVzIGZvciB0aGUgam95c3RpY2suCisgKiBAcGFyYW0gdmFsdWUgVGhlIDMyIGJpdCBvdXRwdXQgdmFsdWUgKDEgYml0IGZvciBlYWNoIG91dHB1dCkKKyAqLwordm9pZCBKb3lzdGljazo6U2V0T3V0cHV0cyh1aW50MzJfdCB2YWx1ZSkgeworICBtX291dHB1dHMgPSB2YWx1ZTsKKyAgSEFMU2V0Sm95c3RpY2tPdXRwdXRzKG1fcG9ydCwgbV9vdXRwdXRzLCBtX2xlZnRSdW1ibGUsIG1fcmlnaHRSdW1ibGUpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL01vdG9yU2FmZXR5SGVscGVyLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9Nb3RvclNhZmV0eUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiYmEzMAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9Nb3RvclNhZmV0eUhlbHBlci5jcHAKQEAgLTAsMCArMSwxMzkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCitzdGQ6OnNldDxNb3RvclNhZmV0eUhlbHBlcio+IE1vdG9yU2FmZXR5SGVscGVyOjptX2hlbHBlckxpc3Q7Citwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggTW90b3JTYWZldHlIZWxwZXI6Om1fbGlzdE11dGV4OworCisvKioKKyAqIFRoZSBjb25zdHJ1Y3RvciBmb3IgYSBNb3RvclNhZmV0eUhlbHBlciBvYmplY3QuCisgKiBUaGUgaGVscGVyIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBmb3IgZXZlcnkgb2JqZWN0IHRoYXQgd2FudHMgdG8gaW1wbGVtZW50IHRoZQorICogTW90b3IKKyAqIFNhZmV0eSBwcm90b2NvbC4gVGhlIGhlbHBlciBvYmplY3QgaGFzIHRoZSBjb2RlIHRvIGFjdHVhbGx5IGRvIHRoZSB0aW1pbmcgYW5kCisgKiBjYWxsIHRoZQorICogbW90b3JzIFN0b3AoKSBtZXRob2Qgd2hlbiB0aGUgdGltZW91dCBleHBpcmVzLiBUaGUgbW90b3Igb2JqZWN0IGlzIGV4cGVjdGVkCisgKiB0byBjYWxsIHRoZQorICogRmVlZCgpIG1ldGhvZCB3aGVuZXZlciB0aGUgbW90b3JzIHZhbHVlIGlzIHVwZGF0ZWQuCisgKiBAcGFyYW0gc2FmZU9iamVjdCBhIHBvaW50ZXIgdG8gdGhlIG1vdG9yIG9iamVjdCBpbXBsZW1lbnRpbmcgTW90b3JTYWZldHkuCisgKiBUaGlzIGlzIHVzZWQKKyAqIHRvIGNhbGwgdGhlIFN0b3AoKSBtZXRob2Qgb24gdGhlIG1vdG9yLgorICovCitNb3RvclNhZmV0eUhlbHBlcjo6TW90b3JTYWZldHlIZWxwZXIoTW90b3JTYWZldHkgKnNhZmVPYmplY3QpCisgICAgOiBtX3NhZmVPYmplY3Qoc2FmZU9iamVjdCkgeworICBtX2VuYWJsZWQgPSBmYWxzZTsKKyAgbV9leHBpcmF0aW9uID0gREVGQVVMVF9TQUZFVFlfRVhQSVJBVElPTjsKKyAgbV9zdG9wVGltZSA9IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7CisKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhtX2xpc3RNdXRleCk7CisgIG1faGVscGVyTGlzdC5pbnNlcnQodGhpcyk7Cit9CisKK01vdG9yU2FmZXR5SGVscGVyOjp+TW90b3JTYWZldHlIZWxwZXIoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9saXN0TXV0ZXgpOworICBtX2hlbHBlckxpc3QuZXJhc2UodGhpcyk7Cit9CisKKy8qKgorICogRmVlZCB0aGUgbW90b3Igc2FmZXR5IG9iamVjdC4KKyAqIFJlc2V0cyB0aGUgdGltZXIgb24gdGhpcyBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGRvIHRoZSB0aW1lb3V0cy4KKyAqLwordm9pZCBNb3RvclNhZmV0eUhlbHBlcjo6RmVlZCgpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisgIG1fc3RvcFRpbWUgPSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpICsgbV9leHBpcmF0aW9uOworfQorCisvKioKKyAqIFNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb3RvciBzYWZldHkgb2JqZWN0LgorICogQHBhcmFtIGV4cGlyYXRpb25UaW1lIFRoZSB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuCisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OlNldEV4cGlyYXRpb24oZmxvYXQgZXhwaXJhdGlvblRpbWUpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisgIG1fZXhwaXJhdGlvbiA9IGV4cGlyYXRpb25UaW1lOworfQorCisvKioKKyAqIFJldHJpZXZlIHRoZSB0aW1lb3V0IHZhbHVlIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb3RvciBzYWZldHkgb2JqZWN0LgorICogQHJldHVybiB0aGUgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgorICovCitmbG9hdCBNb3RvclNhZmV0eUhlbHBlcjo6R2V0RXhwaXJhdGlvbigpIGNvbnN0IHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisgIHJldHVybiBtX2V4cGlyYXRpb247Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBtb3RvciBpcyBzdGlsbCBvcGVyYXRpbmcgb3IgaGFzIHRpbWVkIG91dC4KKyAqIEByZXR1cm4gYSB0cnVlIHZhbHVlIGlmIHRoZSBtb3RvciBpcyBzdGlsbCBvcGVyYXRpbmcgbm9ybWFsbHkgYW5kIGhhc24ndAorICogdGltZWQgb3V0LgorICovCitib29sIE1vdG9yU2FmZXR5SGVscGVyOjpJc0FsaXZlKCkgY29uc3QgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBzeW5jKG1fc3luY011dGV4KTsKKyAgcmV0dXJuICFtX2VuYWJsZWQgfHwgbV9zdG9wVGltZSA+IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhpcyBtb3RvciBoYXMgZXhjZWVkZWQgaXRzIHRpbWVvdXQuCisgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGRldGVybWluZSBpZiB0aGlzIG1vdG9yIGhhcyBleGNlZWRlZAorICogaXRzIHRpbWVvdXQKKyAqIHZhbHVlLiBJZiBpdCBoYXMsIHRoZSBzdG9wIG1ldGhvZCBpcyBjYWxsZWQsIGFuZCB0aGUgbW90b3IgaXMgc2h1dCBkb3duIHVudGlsCisgKiBpdHMgdmFsdWUgaXMKKyAqIHVwZGF0ZWQgYWdhaW4uCisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OkNoZWNrKCkgeworICBEcml2ZXJTdGF0aW9uICZkcyA9IERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCk7CisgIGlmICghbV9lbmFibGVkIHx8IGRzLklzRGlzYWJsZWQoKSB8fCBkcy5Jc1Rlc3QoKSkgcmV0dXJuOworCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICBpZiAobV9zdG9wVGltZSA8IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCkpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gZGVzYzsKKyAgICBtX3NhZmVPYmplY3QtPkdldERlc2NyaXB0aW9uKGRlc2MpOworICAgIGRlc2MgPDwgICIuLi4gT3V0cHV0IG5vdCB1cGRhdGVkIG9mdGVuIGVub3VnaC4iOworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsIGRlc2Muc3RyKCkuY19zdHIoKSk7CisgICAgbV9zYWZlT2JqZWN0LT5TdG9wTW90b3IoKTsKKyAgfQorfQorCisvKioKKyAqIEVuYWJsZS9kaXNhYmxlIG1vdG9yIHNhZmV0eSBmb3IgdGhpcyBkZXZpY2UKKyAqIFR1cm4gb24gYW5kIG9mZiB0aGUgbW90b3Igc2FmZXR5IG9wdGlvbiBmb3IgdGhpcyBQV00gb2JqZWN0LgorICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0CisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICBtX2VuYWJsZWQgPSBlbmFibGVkOworfQorCisvKioKKyAqIFJldHVybiB0aGUgc3RhdGUgb2YgdGhlIG1vdG9yIHNhZmV0eSBlbmFibGVkIGZsYWcKKyAqIFJldHVybiBpZiB0aGUgbW90b3Igc2FmZXR5IGlzIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGlzIGRldmljY2UuCisgKiBAcmV0dXJuIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIGRldmljZQorICovCitib29sIE1vdG9yU2FmZXR5SGVscGVyOjpJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICByZXR1cm4gbV9lbmFibGVkOworfQorCisvKioKKyAqIENoZWNrIHRoZSBtb3RvcnMgdG8gc2VlIGlmIGFueSBoYXZlIHRpbWVkIG91dC4KKyAqIFRoaXMgc3RhdGljICBtZXRob2QgaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBwb2xsIGFsbCB0aGUgbW90b3JzIGFuZCBzdG9wCisgKiBhbnkgdGhhdCBoYXZlCisgKiB0aW1lZCBvdXQuCisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OkNoZWNrTW90b3JzKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBzeW5jKG1fbGlzdE11dGV4KTsKKyAgZm9yIChhdXRvIGVsZW0gOiBtX2hlbHBlckxpc3QpIHsKKyAgICBlbGVtLT5DaGVjaygpOworICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvTm90aWZpZXIuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL05vdGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzMwNTljCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL05vdGlmaWVyLmNwcApAQCAtMCwwICsxLDI2MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiTm90aWZpZXIuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworTm90aWZpZXIgKk5vdGlmaWVyOjp0aW1lclF1ZXVlSGVhZCA9IG51bGxwdHI7Citwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggTm90aWZpZXI6OnF1ZXVlTXV0ZXg7Citwcmlvcml0eV9tdXRleCBOb3RpZmllcjo6aGFsTXV0ZXg7Cit2b2lkICpOb3RpZmllcjo6bV9ub3RpZmllciA9IG51bGxwdHI7CitzdGQ6OmF0b21pYzxpbnQ+IE5vdGlmaWVyOjpyZWZjb3VudHswfTsKKworLyoqCisgKiBDcmVhdGUgYSBOb3RpZmllciBmb3IgdGltZXIgZXZlbnQgbm90aWZpY2F0aW9uLgorICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgaXMgY2FsbGVkIGF0IHRoZSBub3RpZmljYXRpb24gdGltZSB3aGljaCBpcyBzZXQKKyAqIHVzaW5nIFN0YXJ0U2luZ2xlIG9yIFN0YXJ0UGVyaW9kaWMuCisgKi8KK05vdGlmaWVyOjpOb3RpZmllcihUaW1lckV2ZW50SGFuZGxlciBoYW5kbGVyLCB2b2lkICpwYXJhbSkgeworICBpZiAoaGFuZGxlciA9PSBudWxscHRyKQorICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJoYW5kbGVyIG11c3Qgbm90IGJlIG51bGxwdHIiKTsKKyAgbV9oYW5kbGVyID0gaGFuZGxlcjsKKyAgbV9wYXJhbSA9IHBhcmFtOworICAvLyBkbyB0aGUgZmlyc3QgdGltZSBpbnRpYWxpemF0aW9uIG9mIHN0YXRpYyB2YXJpYWJsZXMKKyAgaWYgKHJlZmNvdW50LmZldGNoX2FkZCgxKSA9PSAwKSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIHsKKyAgICAgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhoYWxNdXRleCk7CisgICAgICBpZiAoIW1fbm90aWZpZXIpCisgICAgICAgIG1fbm90aWZpZXIgPSBpbml0aWFsaXplTm90aWZpZXIoUHJvY2Vzc1F1ZXVlLCBudWxscHRyLCAmc3RhdHVzKTsKKyAgICB9CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKworLyoqCisgKiBGcmVlIHRoZSByZXNvdXJjZXMgZm9yIGEgdGltZXIgZXZlbnQuCisgKiBBbGwgcmVzb3VyY2VzIHdpbGwgYmUgZnJlZWQgYW5kIHRoZSB0aW1lciBldmVudCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAqIHF1ZXVlIGlmIG5lY2Vzc2FyeS4KKyAqLworTm90aWZpZXI6On5Ob3RpZmllcigpIHsKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMocXVldWVNdXRleCk7CisgICAgRGVsZXRlRnJvbVF1ZXVlKCk7CisgIH0KKworICAvLyBEZWxldGUgdGhlIHN0YXRpYyB2YXJpYWJsZXMgd2hlbiB0aGUgbGFzdCBvbmUgaXMgZ29pbmcgYXdheQorICBpZiAocmVmY291bnQuZmV0Y2hfc3ViKDEpID09IDEpIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgeworICAgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKGhhbE11dGV4KTsKKyAgICAgIGlmIChtX25vdGlmaWVyKSB7CisgICAgICAgIGNsZWFuTm90aWZpZXIobV9ub3RpZmllciwgJnN0YXR1cyk7CisgICAgICAgIG1fbm90aWZpZXIgPSBudWxscHRyOworICAgICAgfQorICAgIH0KKyAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgfQorCisgIC8vIEFjcXVpcmUgdGhlIG11dGV4OyB0aGlzIG1ha2VzIGNlcnRhaW4gdGhhdCB0aGUgaGFuZGxlciBpcworICAvLyBub3QgYmVpbmcgZXhlY3V0ZWQgYnkgdGhlIGludGVycnVwdCBtYW5hZ2VyLgorICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9oYW5kbGVyTXV0ZXgpOworfQorCisvKioKKyAqIFVwZGF0ZSB0aGUgYWxhcm0gaGFyZHdhcmUgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBmaXJzdCBlbGVtZW50IGluIHRoZSBxdWV1ZS4KKyAqIENvbXB1dGUgdGhlIHRpbWUgdGhlIG5leHQgYWxhcm0gc2hvdWxkIG9jY3VyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUgYW5kCisgKiB0aGUKKyAqIHBlcmlvZCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHRpbWVyIHF1ZXVlLgorICogV0FSTklORzogdGhpcyBtZXRob2QgZG9lcyBub3QgZG8gc3luY2hyb25pemF0aW9uISBJdCBtdXN0IGJlIGNhbGxlZCBmcm9tCisgKiBzb21ld2hlcmUKKyAqIHRoYXQgaXMgdGFraW5nIGNhcmUgb2Ygc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIHF1ZXVlLgorICovCit2b2lkIE5vdGlmaWVyOjpVcGRhdGVBbGFybSgpIHsKKyAgaWYgKHRpbWVyUXVldWVIZWFkICE9IG51bGxwdHIpIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgLy8gVGhpcyBsb2NraW5nIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhdm9pZCB0d28gdGhpbmdzOgorICAgIC8vICAxKSBSYWNlIGNvbmRpdGlvbiBpc3N1ZXMgd2l0aCBjYWxsaW5nIGNsZWFuTm90aWZlcigpIGFuZAorICAgIC8vICAgICB1cGRhdGVOb3RpZmllckFsYXJtKCkgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAvLyAgMikgQXZvaWQgZGVhZGxvY2sgYnkgbWFraW5nIGl0IHNvIHRoYXQgdGhpcyB3b24ndCBibG9jayB3YWl0aW5nCisgICAgLy8gICAgIGZvciB0aGUgbXV0ZXggdG8gdW5sb2NrLgorICAgIC8vIENoZWNraW5nIHJlZmNvdW50IGFzIHdlbGwgaXMgdW5uZWNlc3NhcnksIGJ1dCB3aWxsIG5vdCBodXJ0LgorICAgIGlmIChoYWxNdXRleC50cnlfbG9jaygpICYmIHJlZmNvdW50ICE9IDApIHsKKyAgICAgIGlmIChtX25vdGlmaWVyKQorICAgICAgICB1cGRhdGVOb3RpZmllckFsYXJtKG1fbm90aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSh0aW1lclF1ZXVlSGVhZC0+bV9leHBpcmF0aW9uVGltZSAqIDFlNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICBoYWxNdXRleC51bmxvY2soKTsKKyAgICB9CisgICAgd3BpX3NldFN0YXRpY0Vycm9yV2l0aENvbnRleHQodGltZXJRdWV1ZUhlYWQsIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIH0KK30KKworLyoqCisgKiBQcm9jZXNzUXVldWUgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgdGltZXIgaW50ZXJydXB0LgorICogV2UgbmVlZCB0byB3YWtlIHVwIGFuZCBwcm9jZXNzIHRoZSBjdXJyZW50IHRvcCBpdGVtIGluIHRoZSB0aW1lciBxdWV1ZSBhcworICogbG9uZworICogYXMgaXRzIHNjaGVkdWxlZCB0aW1lIGlzIGFmdGVyIHRoZSBjdXJyZW50IHRpbWUuIFRoZW4gdGhlIGl0ZW0gaXMgcmVtb3ZlZCBvcgorICogcmVzY2hlZHVsZWQgKHJlcGV0aXRpdmUgZXZlbnRzKSBpbiB0aGUgcXVldWUuCisgKi8KK3ZvaWQgTm90aWZpZXI6OlByb2Nlc3NRdWV1ZSh1aW50MzJfdCBjdXJyZW50VGltZUludCwgdm9pZCAqcGFyYW1zKSB7CisgIE5vdGlmaWVyICpjdXJyZW50OworICB3aGlsZSAodHJ1ZSkgIC8vIGtlZXAgcHJvY2Vzc2luZyBwYXN0IGV2ZW50cyB1bnRpbCBubyBtb3JlCisgIHsKKyAgICB7CisgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBzeW5jKHF1ZXVlTXV0ZXgpOworICAgICAgZG91YmxlIGN1cnJlbnRUaW1lID0gY3VycmVudFRpbWVJbnQgKiAxLjBlLTY7CisgICAgICBjdXJyZW50ID0gdGltZXJRdWV1ZUhlYWQ7CisgICAgICBpZiAoY3VycmVudCA9PSBudWxscHRyIHx8IGN1cnJlbnQtPm1fZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSkgeworICAgICAgICBicmVhazsgIC8vIG5vIG1vcmUgdGltZXIgZXZlbnRzIHRvIHByb2Nlc3MKKyAgICAgIH0KKyAgICAgIC8vIG5lZWQgdG8gcHJvY2VzcyB0aGlzIGVudHJ5CisgICAgICB0aW1lclF1ZXVlSGVhZCA9IGN1cnJlbnQtPm1fbmV4dEV2ZW50OworICAgICAgaWYgKGN1cnJlbnQtPm1fcGVyaW9kaWMpIHsKKyAgICAgICAgLy8gaWYgcGVyaW9kaWMsIHJlcXVldWUgdGhlIGV2ZW50CisgICAgICAgIC8vIGNvbXB1dGUgd2hlbiB0byBwdXQgaW50byBxdWV1ZQorICAgICAgICBjdXJyZW50LT5JbnNlcnRJblF1ZXVlKHRydWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbm90IHBlcmlvZGljOyByZW1vdmVkIGZyb20gcXVldWUKKyAgICAgICAgY3VycmVudC0+bV9xdWV1ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIFRha2UgaGFuZGxlciBtdXRleCB3aGlsZSBob2xkaW5nIHF1ZXVlIG11dGV4IHRvIG1ha2Ugc3VyZQorICAgICAgLy8gIHRoZSBoYW5kbGVyIHdpbGwgZXhlY3V0ZSB0byBjb21wbGV0aW9uIGluIGNhc2Ugd2UgYXJlIGJlaW5nIGRlbGV0ZWQuCisgICAgICBjdXJyZW50LT5tX2hhbmRsZXJNdXRleC5sb2NrKCk7CisgICAgfQorCisgICAgY3VycmVudC0+bV9oYW5kbGVyKGN1cnJlbnQtPm1fcGFyYW0pOyAgLy8gY2FsbCB0aGUgZXZlbnQgaGFuZGxlcgorICAgIGN1cnJlbnQtPm1faGFuZGxlck11dGV4LnVubG9jaygpOworICB9CisgIC8vIHJlc2NoZWR1bGUgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHF1ZXVlCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMocXVldWVNdXRleCk7CisgIFVwZGF0ZUFsYXJtKCk7Cit9CisKKy8qKgorICogSW5zZXJ0IHRoaXMgTm90aWZpZXIgaW50byB0aGUgdGltZXIgcXVldWUgaW4gcmlnaHQgcGxhY2UuCisgKiBXQVJOSU5HOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkbyBzeW5jaHJvbml6YXRpb24hIEl0IG11c3QgYmUgY2FsbGVkIGZyb20KKyAqIHNvbWV3aGVyZQorICogdGhhdCBpcyB0YWtpbmcgY2FyZSBvZiBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byB0aGUgcXVldWUuCisgKiBAcGFyYW0gcmVzY2hlZHVsZSBJZiBmYWxzZSwgdGhlIHNjaGVkdWxlZCBhbGFybSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lCisgKiBhbmQgVXBkYXRlQWxhcm0KKyAqIG1ldGhvZCBpcyBjYWxsZWQgd2hpY2ggd2lsbCBlbmFibGUgdGhlIGFsYXJtIGlmIG5lY2Vzc2FyeS4KKyAqIElmIHRydWUsIHVwZGF0ZSB0aGUgdGltZSBieSBhZGRpbmcgdGhlIHBlcmlvZCAobm8gZHJpZnQpIHdoZW4gcmVzY2hlZHVsZWQKKyAqIHBlcmlvZGljIGZyb20gUHJvY2Vzc1F1ZXVlLgorICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHB1YmxpYyBtZXRob2RzIG9ubHkgdXBkYXRlIHRoZSBxdWV1ZSBhZnRlciBmaW5pc2hpbmcKKyAqIGluc2VydGluZy4KKyAqLwordm9pZCBOb3RpZmllcjo6SW5zZXJ0SW5RdWV1ZShib29sIHJlc2NoZWR1bGUpIHsKKyAgaWYgKHJlc2NoZWR1bGUpIHsKKyAgICBtX2V4cGlyYXRpb25UaW1lICs9IG1fcGVyaW9kOworICB9IGVsc2UgeworICAgIG1fZXhwaXJhdGlvblRpbWUgPSBHZXRDbG9jaygpICsgbV9wZXJpb2Q7CisgIH0KKyAgaWYgKG1fZXhwaXJhdGlvblRpbWUgPiBUaW1lcjo6a1JvbGxvdmVyVGltZSkgeworICAgIG1fZXhwaXJhdGlvblRpbWUgLT0gVGltZXI6OmtSb2xsb3ZlclRpbWU7CisgIH0KKyAgaWYgKHRpbWVyUXVldWVIZWFkID09IG51bGxwdHIgfHwKKyAgICAgIHRpbWVyUXVldWVIZWFkLT5tX2V4cGlyYXRpb25UaW1lID49IHRoaXMtPm1fZXhwaXJhdGlvblRpbWUpIHsKKyAgICAvLyB0aGUgcXVldWUgaXMgZW1wdHkgb3IgZ3JlYXRlciB0aGFuIHRoZSBuZXcgZW50cnkKKyAgICAvLyB0aGUgbmV3IGVudHJ5IGJlY29tZXMgdGhlIGZpcnN0IGVsZW1lbnQKKyAgICB0aGlzLT5tX25leHRFdmVudCA9IHRpbWVyUXVldWVIZWFkOworICAgIHRpbWVyUXVldWVIZWFkID0gdGhpczsKKyAgICBpZiAoIXJlc2NoZWR1bGUpIHsKKyAgICAgIC8vIHNpbmNlIHRoZSBmaXJzdCBlbGVtZW50IGNoYW5nZWQsIHVwZGF0ZSBhbGFybSwgdW5sZXNzIHdlIGFscmVhZHkgcGxhbgorICAgICAgLy8gdG8KKyAgICAgIFVwZGF0ZUFsYXJtKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoTm90aWZpZXIgKipucHAgPSAmKHRpbWVyUXVldWVIZWFkLT5tX25leHRFdmVudCk7OworICAgICAgICAgbnBwID0gJigqbnBwKS0+bV9uZXh0RXZlbnQpIHsKKyAgICAgIE5vdGlmaWVyICpuID0gKm5wcDsKKyAgICAgIGlmIChuID09IG51bGxwdHIgfHwgbi0+bV9leHBpcmF0aW9uVGltZSA+IHRoaXMtPm1fZXhwaXJhdGlvblRpbWUpIHsKKyAgICAgICAgKm5wcCA9IHRoaXM7CisgICAgICAgIHRoaXMtPm1fbmV4dEV2ZW50ID0gbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIG1fcXVldWVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBEZWxldGUgdGhpcyBOb3RpZmllciBmcm9tIHRoZSB0aW1lciBxdWV1ZS4KKyAqIFdBUk5JTkc6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIHN5bmNocm9uaXphdGlvbiEgSXQgbXVzdCBiZSBjYWxsZWQgZnJvbQorICogc29tZXdoZXJlCisgKiB0aGF0IGlzIHRha2luZyBjYXJlIG9mIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIHRoZSBxdWV1ZS4KKyAqIFJlbW92ZSB0aGlzIE5vdGlmaWVyIGZyb20gdGhlIHRpbWVyIHF1ZXVlIGFuZCBhZGp1c3QgdGhlIG5leHQgaW50ZXJydXB0IHRpbWUKKyAqIHRvIHJlZmxlY3QKKyAqIHRoZSBjdXJyZW50IHRvcCBvZiB0aGUgcXVldWUuCisgKi8KK3ZvaWQgTm90aWZpZXI6OkRlbGV0ZUZyb21RdWV1ZSgpIHsKKyAgaWYgKG1fcXVldWVkKSB7CisgICAgbV9xdWV1ZWQgPSBmYWxzZTsKKyAgICB3cGlfYXNzZXJ0KHRpbWVyUXVldWVIZWFkICE9IG51bGxwdHIpOworICAgIGlmICh0aW1lclF1ZXVlSGVhZCA9PSB0aGlzKSB7CisgICAgICAvLyByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QgLSB1cGRhdGUgdGhlIGFsYXJtCisgICAgICB0aW1lclF1ZXVlSGVhZCA9IHRoaXMtPm1fbmV4dEV2ZW50OworICAgICAgVXBkYXRlQWxhcm0oKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChOb3RpZmllciAqbiA9IHRpbWVyUXVldWVIZWFkOyBuICE9IG51bGxwdHI7IG4gPSBuLT5tX25leHRFdmVudCkgeworICAgICAgICBpZiAobi0+bV9uZXh0RXZlbnQgPT0gdGhpcykgeworICAgICAgICAgIC8vIHRoaXMgZWxlbWVudCBpcyB0aGUgbmV4dCBlbGVtZW50IGZyb20gKm4gZnJvbSB0aGUgcXVldWUKKyAgICAgICAgICBuLT5tX25leHRFdmVudCA9IHRoaXMtPm1fbmV4dEV2ZW50OyAgLy8gcG9pbnQgYXJvdW5kIHRoaXMgb25lCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZWdpc3RlciBmb3Igc2luZ2xlIGV2ZW50IG5vdGlmaWNhdGlvbi4KKyAqIEEgdGltZXIgZXZlbnQgaXMgcXVldWVkIGZvciBhIHNpbmdsZSBldmVudCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LgorICogQHBhcmFtIGRlbGF5IFNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgorICovCit2b2lkIE5vdGlmaWVyOjpTdGFydFNpbmdsZShkb3VibGUgZGVsYXkpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhxdWV1ZU11dGV4KTsKKyAgbV9wZXJpb2RpYyA9IGZhbHNlOworICBtX3BlcmlvZCA9IGRlbGF5OworICBEZWxldGVGcm9tUXVldWUoKTsKKyAgSW5zZXJ0SW5RdWV1ZShmYWxzZSk7Cit9CisKKy8qKgorICogUmVnaXN0ZXIgZm9yIHBlcmlvZGljIGV2ZW50IG5vdGlmaWNhdGlvbi4KKyAqIEEgdGltZXIgZXZlbnQgaXMgcXVldWVkIGZvciBwZXJpb2RpYyBldmVudCBub3RpZmljYXRpb24uIEVhY2ggdGltZSB0aGUKKyAqIGludGVycnVwdAorICogb2NjdXJzLCB0aGUgZXZlbnQgd2lsbCBiZSBpbW1lZGlhdGVseSByZXF1ZXVlZCBmb3IgdGhlIHNhbWUgdGltZSBpbnRlcnZhbC4KKyAqIEBwYXJhbSBwZXJpb2QgUGVyaW9kIGluIHNlY29uZHMgdG8gY2FsbCB0aGUgaGFuZGxlciBzdGFydGluZyBvbmUgcGVyaW9kIGFmdGVyCisgKiB0aGUgY2FsbCB0byB0aGlzIG1ldGhvZC4KKyAqLwordm9pZCBOb3RpZmllcjo6U3RhcnRQZXJpb2RpYyhkb3VibGUgcGVyaW9kKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMocXVldWVNdXRleCk7CisgIG1fcGVyaW9kaWMgPSB0cnVlOworICBtX3BlcmlvZCA9IHBlcmlvZDsKKyAgRGVsZXRlRnJvbVF1ZXVlKCk7CisgIEluc2VydEluUXVldWUoZmFsc2UpOworfQorCisvKioKKyAqIFN0b3AgdGltZXIgZXZlbnRzIGZyb20gb2NjdXJpbmcuCisgKiBTdG9wIGFueSByZXBlYXRpbmcgdGltZXIgZXZlbnRzIGZyb20gb2NjdXJpbmcuIFRoaXMgd2lsbCBhbHNvIHJlbW92ZSBhbnkKKyAqIHNpbmdsZQorICogbm90aWZpY2F0aW9uIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZS4KKyAqIElmIGEgdGltZXItYmFzZWQgY2FsbCB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVyIGlzIGluIHByb2dyZXNzLCB0aGlzIGZ1bmN0aW9uCisgKiB3aWxsCisgKiBibG9jayB1bnRpbCB0aGUgaGFuZGxlciBjYWxsIGlzIGNvbXBsZXRlLgorICovCit2b2lkIE5vdGlmaWVyOjpTdG9wKCkgeworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhxdWV1ZU11dGV4KTsKKyAgICBEZWxldGVGcm9tUXVldWUoKTsKKyAgfQorICAvLyBXYWl0IGZvciBhIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlciB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIGZyb20KKyAgLy8gU3RvcCgpCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX2hhbmRsZXJNdXRleCk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvUElEQ29udHJvbGxlci5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvUElEQ29udHJvbGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiYmI1YQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9QSURDb250cm9sbGVyLmNwcApAQCAtMCwwICsxLDU4MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiUElEQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIk5vdGlmaWVyLmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQID0gInAiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtJID0gImkiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEID0gImQiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGID0gImYiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtTZXRwb2ludCA9ICJzZXRwb2ludCI7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0VuYWJsZWQgPSAiZW5hYmxlZCI7CisKKy8qKgorICogQWxsb2NhdGUgYSBQSUQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvbnN0YW50cyBmb3IgUCwgSSwgRAorICogQHBhcmFtIEtwIHRoZSBwcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBLaSB0aGUgaW50ZWdyYWwgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBLZCB0aGUgZGVyaXZhdGl2ZSBjb2VmZmljaWVudAorICogQHBhcmFtIHNvdXJjZSBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcworICogQHBhcmFtIG91dHB1dCBUaGUgUElET3V0cHV0IG9iamVjdCB0aGF0IGlzIHNldCB0byB0aGUgb3V0cHV0IHZhbHVlCisgKiBAcGFyYW0gcGVyaW9kIHRoZSBsb29wIHRpbWUgZm9yIGRvaW5nIGNhbGN1bGF0aW9ucy4gVGhpcyBwYXJ0aWN1bGFybHkgZWZmZWN0cworICogY2FsY3VsYXRpb25zIG9mIHRoZQorICogaW50ZWdyYWwgYW5kIGRpZmZlcmVudGFsIHRlcm1zLiBUaGUgZGVmYXVsdCBpcyA1MG1zLgorICovCitQSURDb250cm9sbGVyOjpQSURDb250cm9sbGVyKGZsb2F0IEtwLCBmbG9hdCBLaSwgZmxvYXQgS2QsIFBJRFNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSURPdXRwdXQgKm91dHB1dCwgZmxvYXQgcGVyaW9kKSB7CisgIEluaXRpYWxpemUoS3AsIEtpLCBLZCwgMC4wZiwgc291cmNlLCBvdXRwdXQsIHBlcmlvZCk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBQSUQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvbnN0YW50cyBmb3IgUCwgSSwgRAorICogQHBhcmFtIEtwIHRoZSBwcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBLaSB0aGUgaW50ZWdyYWwgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBLZCB0aGUgZGVyaXZhdGl2ZSBjb2VmZmljaWVudAorICogQHBhcmFtIHNvdXJjZSBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcworICogQHBhcmFtIG91dHB1dCBUaGUgUElET3V0cHV0IG9iamVjdCB0aGF0IGlzIHNldCB0byB0aGUgb3V0cHV0IHZhbHVlCisgKiBAcGFyYW0gcGVyaW9kIHRoZSBsb29wIHRpbWUgZm9yIGRvaW5nIGNhbGN1bGF0aW9ucy4gVGhpcyBwYXJ0aWN1bGFybHkgZWZmZWN0cworICogY2FsY3VsYXRpb25zIG9mIHRoZQorICogaW50ZWdyYWwgYW5kIGRpZmZlcmVudGFsIHRlcm1zLiBUaGUgZGVmYXVsdCBpcyA1MG1zLgorICovCitQSURDb250cm9sbGVyOjpQSURDb250cm9sbGVyKGZsb2F0IEtwLCBmbG9hdCBLaSwgZmxvYXQgS2QsIGZsb2F0IEtmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSURTb3VyY2UgKnNvdXJjZSwgUElET3V0cHV0ICpvdXRwdXQsIGZsb2F0IHBlcmlvZCkgeworICBJbml0aWFsaXplKEtwLCBLaSwgS2QsIEtmLCBzb3VyY2UsIG91dHB1dCwgcGVyaW9kKTsKK30KKwordm9pZCBQSURDb250cm9sbGVyOjpJbml0aWFsaXplKGZsb2F0IEtwLCBmbG9hdCBLaSwgZmxvYXQgS2QsIGZsb2F0IEtmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJRFNvdXJjZSAqc291cmNlLCBQSURPdXRwdXQgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBwZXJpb2QpIHsKKyAgbV9jb250cm9sTG9vcCA9IHN0ZDo6bWFrZV91bmlxdWU8Tm90aWZpZXI+KFBJRENvbnRyb2xsZXI6OkNhbGxDYWxjdWxhdGUsIHRoaXMpOworCisgIG1fUCA9IEtwOworICBtX0kgPSBLaTsKKyAgbV9EID0gS2Q7CisgIG1fRiA9IEtmOworCisgIG1fcGlkSW5wdXQgPSBzb3VyY2U7CisgIG1fcGlkT3V0cHV0ID0gb3V0cHV0OworICBtX3BlcmlvZCA9IHBlcmlvZDsKKworICBtX2NvbnRyb2xMb29wLT5TdGFydFBlcmlvZGljKG1fcGVyaW9kKTsKKworICBzdGF0aWMgaW50MzJfdCBpbnN0YW5jZXMgPSAwOworICBpbnN0YW5jZXMrKzsKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1BJRENvbnRyb2xsZXIsIGluc3RhbmNlcyk7Cit9CisKK1BJRENvbnRyb2xsZXI6On5QSURDb250cm9sbGVyKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSBtX3RhYmxlLT5SZW1vdmVUYWJsZUxpc3RlbmVyKHRoaXMpOworfQorCisvKioKKyAqIENhbGwgdGhlIENhbGN1bGF0ZSBtZXRob2QgYXMgYSBub24tc3RhdGljIG1ldGhvZC4gVGhpcyBhdm9pZHMgaGF2aW5nIHRvCisgKiBwcmVwZW5kCisgKiBhbGwgbG9jYWwgdmFyaWFibGVzIGluIHRoYXQgbWV0aG9kIHdpdGggdGhlIGNsYXNzIHBvaW50ZXIuIFRoaXMgd2F5IHRoZQorICogInRoaXMiCisgKiBwb2ludGVyIHdpbGwgYmUgc2V0IHVwIGFuZCBjbGFzcyB2YXJpYWJsZXMgY2FuIGJlIGNhbGxlZCBtb3JlIGVhc2lseS4KKyAqIFRoaXMgbWV0aG9kIGlzIHN0YXRpYyBhbmQgY2FsbGVkIGJ5IHRoZSBOb3RpZmllciBjbGFzcy4KKyAqIEBwYXJhbSBjb250cm9sbGVyIHRoZSBhZGRyZXNzIG9mIHRoZSBQSUQgY29udHJvbGxlciBvYmplY3QgdG8gdXNlIGluIHRoZQorICogYmFja2dyb3VuZCBsb29wCisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6Q2FsbENhbGN1bGF0ZSh2b2lkICpjb250cm9sbGVyKSB7CisgIFBJRENvbnRyb2xsZXIgKmNvbnRyb2wgPSAoUElEQ29udHJvbGxlciAqKWNvbnRyb2xsZXI7CisgIGNvbnRyb2wtPkNhbGN1bGF0ZSgpOworfQorCisvKioKKyAqIFJlYWQgdGhlIGlucHV0LCBjYWxjdWxhdGUgdGhlIG91dHB1dCBhY2NvcmRpbmdseSwgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQuCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgTm90aWZpZXIgaW5kaXJlY3RseSB0aHJvdWdoIENhbGxDYWxjdWxhdGUKKyAqIGFuZCBpcyBjcmVhdGVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpDYWxjdWxhdGUoKSB7CisgIGJvb2wgZW5hYmxlZDsKKyAgUElEU291cmNlICpwaWRJbnB1dDsKKyAgUElET3V0cHV0ICpwaWRPdXRwdXQ7CisKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX211dGV4KTsKKyAgICBwaWRJbnB1dCA9IG1fcGlkSW5wdXQ7CisgICAgcGlkT3V0cHV0ID0gbV9waWRPdXRwdXQ7CisgICAgZW5hYmxlZCA9IG1fZW5hYmxlZDsKKyAgfQorCisgIGlmIChwaWRJbnB1dCA9PSBudWxscHRyKSByZXR1cm47CisgIGlmIChwaWRPdXRwdXQgPT0gbnVsbHB0cikgcmV0dXJuOworCisgIGlmIChlbmFibGVkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICAgIGZsb2F0IGlucHV0ID0gcGlkSW5wdXQtPlBJREdldCgpOworICAgIGZsb2F0IHJlc3VsdDsKKyAgICBQSURPdXRwdXQgKnBpZE91dHB1dDsKKworICAgIG1fZXJyb3IgPSBtX3NldHBvaW50IC0gaW5wdXQ7CisgICAgaWYgKG1fY29udGludW91cykgeworICAgICAgaWYgKGZhYnMobV9lcnJvcikgPiAobV9tYXhpbXVtSW5wdXQgLSBtX21pbmltdW1JbnB1dCkgLyAyKSB7CisgICAgICAgIGlmIChtX2Vycm9yID4gMCkgeworICAgICAgICAgIG1fZXJyb3IgPSBtX2Vycm9yIC0gbV9tYXhpbXVtSW5wdXQgKyBtX21pbmltdW1JbnB1dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX2Vycm9yID0gbV9lcnJvciArIG1fbWF4aW11bUlucHV0IC0gbV9taW5pbXVtSW5wdXQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9waWRJbnB1dC0+R2V0UElEU291cmNlVHlwZSgpID09IFBJRFNvdXJjZVR5cGU6OmtSYXRlKSB7CisgICAgICBpZiAobV9QICE9IDApIHsKKyAgICAgICAgZG91YmxlIHBvdGVudGlhbFBHYWluID0gKG1fdG90YWxFcnJvciArIG1fZXJyb3IpICogbV9QOworICAgICAgICBpZiAocG90ZW50aWFsUEdhaW4gPCBtX21heGltdW1PdXRwdXQpIHsKKyAgICAgICAgICBpZiAocG90ZW50aWFsUEdhaW4gPiBtX21pbmltdW1PdXRwdXQpCisgICAgICAgICAgICBtX3RvdGFsRXJyb3IgKz0gbV9lcnJvcjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3RvdGFsRXJyb3IgPSBtX21pbmltdW1PdXRwdXQgLyBtX1A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV90b3RhbEVycm9yID0gbV9tYXhpbXVtT3V0cHV0IC8gbV9QOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1fcmVzdWx0ID0gbV9EICogbV9lcnJvciArIG1fUCAqIG1fdG90YWxFcnJvciArIG1fc2V0cG9pbnQgKiBtX0Y7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKG1fSSAhPSAwKSB7CisgICAgICAgIGRvdWJsZSBwb3RlbnRpYWxJR2FpbiA9IChtX3RvdGFsRXJyb3IgKyBtX2Vycm9yKSAqIG1fSTsKKyAgICAgICAgaWYgKHBvdGVudGlhbElHYWluIDwgbV9tYXhpbXVtT3V0cHV0KSB7CisgICAgICAgICAgaWYgKHBvdGVudGlhbElHYWluID4gbV9taW5pbXVtT3V0cHV0KQorICAgICAgICAgICAgbV90b3RhbEVycm9yICs9IG1fZXJyb3I7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbV90b3RhbEVycm9yID0gbV9taW5pbXVtT3V0cHV0IC8gbV9JOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fdG90YWxFcnJvciA9IG1fbWF4aW11bU91dHB1dCAvIG1fSTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBtX3Jlc3VsdCA9IG1fUCAqIG1fZXJyb3IgKyBtX0kgKiBtX3RvdGFsRXJyb3IgKworICAgICAgICAgICAgICAgICBtX0QgKiAobV9wcmV2SW5wdXQgLSBpbnB1dCkgKyBtX3NldHBvaW50ICogbV9GOworICAgIH0KKyAgICBtX3ByZXZJbnB1dCA9IGlucHV0OworCisgICAgaWYgKG1fcmVzdWx0ID4gbV9tYXhpbXVtT3V0cHV0KQorICAgICAgbV9yZXN1bHQgPSBtX21heGltdW1PdXRwdXQ7CisgICAgZWxzZSBpZiAobV9yZXN1bHQgPCBtX21pbmltdW1PdXRwdXQpCisgICAgICBtX3Jlc3VsdCA9IG1fbWluaW11bU91dHB1dDsKKworICAgIHBpZE91dHB1dCA9IG1fcGlkT3V0cHV0OworICAgIHJlc3VsdCA9IG1fcmVzdWx0OworCisgICAgcGlkT3V0cHV0LT5QSURXcml0ZShyZXN1bHQpOworCisgICAgLy8gVXBkYXRlIHRoZSBidWZmZXIuCisgICAgbV9idWYucHVzaChtX2Vycm9yKTsKKyAgICBtX2J1ZlRvdGFsICs9IG1fZXJyb3I7CisgICAgLy8gUmVtb3ZlIG9sZCBlbGVtZW50cyB3aGVuIGJ1ZmZlciBpcyBmdWxsLgorICAgIGlmIChtX2J1Zi5zaXplKCkgPiBtX2J1Zkxlbmd0aCkgeworICAgICAgbV9idWZUb3RhbCAtPSBtX2J1Zi5mcm9udCgpOworICAgICAgbV9idWYucG9wKCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogU2V0IHRoZSBQSUQgQ29udHJvbGxlciBnYWluIHBhcmFtZXRlcnMuCisgKiBTZXQgdGhlIHByb3BvcnRpb25hbCwgaW50ZWdyYWwsIGFuZCBkaWZmZXJlbnRpYWwgY29lZmZpY2llbnRzLgorICogQHBhcmFtIHAgUHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50CisgKiBAcGFyYW0gaSBJbnRlZ3JhbCBjb2VmZmljaWVudAorICogQHBhcmFtIGQgRGlmZmVyZW50aWFsIGNvZWZmaWNpZW50CisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpIHsKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX211dGV4KTsKKyAgICBtX1AgPSBwOworICAgIG1fSSA9IGk7CisgICAgbV9EID0gZDsKKyAgfQorCisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoInAiLCBtX1ApOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiaSIsIG1fSSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJkIiwgbV9EKTsKKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgUElEIENvbnRyb2xsZXIgZ2FpbiBwYXJhbWV0ZXJzLgorICogU2V0IHRoZSBwcm9wb3J0aW9uYWwsIGludGVncmFsLCBhbmQgZGlmZmVyZW50aWFsIGNvZWZmaWNpZW50cy4KKyAqIEBwYXJhbSBwIFByb3BvcnRpb25hbCBjb2VmZmljaWVudAorICogQHBhcmFtIGkgSW50ZWdyYWwgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBkIERpZmZlcmVudGlhbCBjb2VmZmljaWVudAorICogQHBhcmFtIGYgRmVlZCBmb3J3YXJkIGNvZWZmaWNpZW50CisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIGRvdWJsZSBmKSB7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgICAgbV9QID0gcDsKKyAgICBtX0kgPSBpOworICAgIG1fRCA9IGQ7CisgICAgbV9GID0gZjsKKyAgfQorCisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoInAiLCBtX1ApOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiaSIsIG1fSSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJkIiwgbV9EKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoImYiLCBtX0YpOworICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBQcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKKyAqIEByZXR1cm4gcHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50CisgKi8KK2RvdWJsZSBQSURDb250cm9sbGVyOjpHZXRQKCkgY29uc3QgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgIHJldHVybiBtX1A7Cit9CisKKy8qKgorICogR2V0IHRoZSBJbnRlZ3JhbCBjb2VmZmljaWVudAorICogQHJldHVybiBpbnRlZ3JhbCBjb2VmZmljaWVudAorICovCitkb3VibGUgUElEQ29udHJvbGxlcjo6R2V0SSgpIGNvbnN0IHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICByZXR1cm4gbV9JOworfQorCisvKioKKyAqIEdldCB0aGUgRGlmZmVyZW50aWFsIGNvZWZmaWNpZW50CisgKiBAcmV0dXJuIGRpZmZlcmVudGlhbCBjb2VmZmljaWVudAorICovCitkb3VibGUgUElEQ29udHJvbGxlcjo6R2V0RCgpIGNvbnN0IHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICByZXR1cm4gbV9EOworfQorCisvKioKKyAqIEdldCB0aGUgRmVlZCBmb3J3YXJkIGNvZWZmaWNpZW50CisgKiBAcmV0dXJuIEZlZWQgZm9yd2FyZCBjb2VmZmljaWVudAorICovCitkb3VibGUgUElEQ29udHJvbGxlcjo6R2V0RigpIGNvbnN0IHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICByZXR1cm4gbV9GOworfQorCisvKioKKyAqIFJldHVybiB0aGUgY3VycmVudCBQSUQgcmVzdWx0CisgKiBUaGlzIGlzIGFsd2F5cyBjZW50ZXJlZCBvbiB6ZXJvIGFuZCBjb25zdHJhaW5lZCB0aGUgdGhlIG1heCBhbmQgbWluIG91dHMKKyAqIEByZXR1cm4gdGhlIGxhdGVzdCBjYWxjdWxhdGVkIG91dHB1dAorICovCitmbG9hdCBQSURDb250cm9sbGVyOjpHZXQoKSBjb25zdCB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX211dGV4KTsKKyAgcmV0dXJuIG1fcmVzdWx0OworfQorCisvKioKKyAqICBTZXQgdGhlIFBJRCBjb250cm9sbGVyIHRvIGNvbnNpZGVyIHRoZSBpbnB1dCB0byBiZSBjb250aW51b3VzLAorICogIFJhdGhlciB0aGVuIHVzaW5nIHRoZSBtYXggYW5kIG1pbiBpbiBhcyBjb25zdHJhaW50cywgaXQgY29uc2lkZXJzIHRoZW0gdG8KKyAqICBiZSB0aGUgc2FtZSBwb2ludCBhbmQgYXV0b21hdGljYWxseSBjYWxjdWxhdGVzIHRoZSBzaG9ydGVzdCByb3V0ZSB0bworICogIHRoZSBzZXRwb2ludC4KKyAqIEBwYXJhbSBjb250aW51b3VzIFNldCB0byB0cnVlIHR1cm5zIG9uIGNvbnRpbnVvdXMsIGZhbHNlIHR1cm5zIG9mZiBjb250aW51b3VzCisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0Q29udGludW91cyhib29sIGNvbnRpbnVvdXMpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICBtX2NvbnRpbnVvdXMgPSBjb250aW51b3VzOworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gdmFsdWVzIGV4cGVjdGVkIGZyb20gdGhlIGlucHV0LgorICoKKyAqIEBwYXJhbSBtaW5pbXVtSW5wdXQgdGhlIG1pbmltdW0gdmFsdWUgZXhwZWN0ZWQgZnJvbSB0aGUgaW5wdXQKKyAqIEBwYXJhbSBtYXhpbXVtSW5wdXQgdGhlIG1heGltdW0gdmFsdWUgZXhwZWN0ZWQgZnJvbSB0aGUgb3V0cHV0CisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0SW5wdXRSYW5nZShmbG9hdCBtaW5pbXVtSW5wdXQsIGZsb2F0IG1heGltdW1JbnB1dCkgeworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICAgIG1fbWluaW11bUlucHV0ID0gbWluaW11bUlucHV0OworICAgIG1fbWF4aW11bUlucHV0ID0gbWF4aW11bUlucHV0OworICB9CisKKyAgU2V0U2V0cG9pbnQobV9zZXRwb2ludCk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgdG8gd3JpdGUuCisgKgorICogQHBhcmFtIG1pbmltdW1PdXRwdXQgdGhlIG1pbmltdW0gdmFsdWUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dAorICogQHBhcmFtIG1heGltdW1PdXRwdXQgdGhlIG1heGltdW0gdmFsdWUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dAorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OlNldE91dHB1dFJhbmdlKGZsb2F0IG1pbmltdW1PdXRwdXQsIGZsb2F0IG1heGltdW1PdXRwdXQpIHsKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX211dGV4KTsKKyAgICBtX21pbmltdW1PdXRwdXQgPSBtaW5pbXVtT3V0cHV0OworICAgIG1fbWF4aW11bU91dHB1dCA9IG1heGltdW1PdXRwdXQ7CisgIH0KK30KKworLyoqCisgKiBTZXQgdGhlIHNldHBvaW50IGZvciB0aGUgUElEQ29udHJvbGxlcgorICogQ2xlYXJzIHRoZSBxdWV1ZSBmb3IgR2V0QXZnRXJyb3IoKS4KKyAqIEBwYXJhbSBzZXRwb2ludCB0aGUgZGVzaXJlZCBzZXRwb2ludAorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OlNldFNldHBvaW50KGZsb2F0IHNldHBvaW50KSB7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgICAgaWYgKG1fbWF4aW11bUlucHV0ID4gbV9taW5pbXVtSW5wdXQpIHsKKyAgICAgIGlmIChzZXRwb2ludCA+IG1fbWF4aW11bUlucHV0KQorICAgICAgICBtX3NldHBvaW50ID0gbV9tYXhpbXVtSW5wdXQ7CisgICAgICBlbHNlIGlmIChzZXRwb2ludCA8IG1fbWluaW11bUlucHV0KQorICAgICAgICBtX3NldHBvaW50ID0gbV9taW5pbXVtSW5wdXQ7CisgICAgICBlbHNlCisgICAgICAgIG1fc2V0cG9pbnQgPSBzZXRwb2ludDsKKyAgICB9IGVsc2UgeworICAgICAgbV9zZXRwb2ludCA9IHNldHBvaW50OworICAgIH0KKworICAgIC8vIENsZWFyIG1fYnVmLgorICAgIG1fYnVmID0gc3RkOjpxdWV1ZTxkb3VibGU+KCk7CisgIH0KKworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJzZXRwb2ludCIsIG1fc2V0cG9pbnQpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBzZXRwb2ludCBvZiB0aGUgUElEQ29udHJvbGxlcgorICogQHJldHVybiB0aGUgY3VycmVudCBzZXRwb2ludAorICovCitkb3VibGUgUElEQ29udHJvbGxlcjo6R2V0U2V0cG9pbnQoKSBjb25zdCB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX211dGV4KTsKKyAgcmV0dXJuIG1fc2V0cG9pbnQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBkaWZmZXJlbmNlIG9mIHRoZSBpbnB1dCBmcm9tIHRoZSBzZXRwb2ludAorICogQHJldHVybiB0aGUgY3VycmVudCBlcnJvcgorICovCitmbG9hdCBQSURDb250cm9sbGVyOjpHZXRFcnJvcigpIGNvbnN0IHsKKyAgZG91YmxlIHBpZElucHV0OworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICAgIHBpZElucHV0ID0gbV9waWRJbnB1dC0+UElER2V0KCk7CisgIH0KKyAgcmV0dXJuIEdldFNldHBvaW50KCkgLSBwaWRJbnB1dDsKK30KKworLyoqCisgKiBTZXRzIHdoYXQgdHlwZSBvZiBpbnB1dCB0aGUgUElEIGNvbnRyb2xsZXIgd2lsbCB1c2UKKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7CisgIG1fcGlkSW5wdXQtPlNldFBJRFNvdXJjZVR5cGUocGlkU291cmNlKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBvZiBpbnB1dCB0aGUgUElEIGNvbnRyb2xsZXIgaXMgdXNpbmcKKyAqIEByZXR1cm4gdGhlIFBJRCBjb250cm9sbGVyIGlucHV0IHR5cGUKKyAqLworUElEU291cmNlVHlwZSBQSURDb250cm9sbGVyOjpHZXRQSURTb3VyY2VUeXBlKCkgY29uc3QgeworICByZXR1cm4gbV9waWRJbnB1dC0+R2V0UElEU291cmNlVHlwZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgYXZlcmFnZSBvZiB0aGUgZXJyb3Igb3ZlciB0aGUgcGFzdCBmZXcgaXRlcmF0aW9ucy4KKyAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gYXZlcmFnZSB3aXRoIFNldFRvbGVyYW5jZUJ1ZmZlcigpCisgKiAoZGVmYXVsdHMgdG8gMSkuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyB1c2VkIGZvciBPblRhcmdldCgpLgorICogQHJldHVybiB0aGUgYXZlcmFnZSBlcnJvcgorICovCitmbG9hdCBQSURDb250cm9sbGVyOjpHZXRBdmdFcnJvcigpIGNvbnN0IHsKKyAgZmxvYXQgYXZnRXJyb3IgPSAwOworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICAgIC8vIERvbid0IGRpdmlkZSBieSB6ZXJvLgorICAgIGlmIChtX2J1Zi5zaXplKCkpIGF2Z0Vycm9yID0gbV9idWZUb3RhbCAvIG1fYnVmLnNpemUoKTsKKyAgfQorICByZXR1cm4gYXZnRXJyb3I7Cit9CisKKy8qCisgKiBTZXQgdGhlIHBlcmNlbnRhZ2UgZXJyb3Igd2hpY2ggaXMgY29uc2lkZXJlZCB0b2xlcmFibGUgZm9yIHVzZSB3aXRoCisgKiBPblRhcmdldC4KKyAqIEBwYXJhbSBwZXJjZW50YWdlIGVycm9yIHdoaWNoIGlzIHRvbGVyYWJsZQorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OlNldFRvbGVyYW5jZShmbG9hdCBwZXJjZW50KSB7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgICAgbV90b2xlcmFuY2VUeXBlID0ga1BlcmNlbnRUb2xlcmFuY2U7CisgICAgbV90b2xlcmFuY2UgPSBwZXJjZW50OworICB9Cit9CisKKy8qCisgKiBTZXQgdGhlIHBlcmNlbnRhZ2UgZXJyb3Igd2hpY2ggaXMgY29uc2lkZXJlZCB0b2xlcmFibGUgZm9yIHVzZSB3aXRoCisgKiBPblRhcmdldC4KKyAqIEBwYXJhbSBwZXJjZW50YWdlIGVycm9yIHdoaWNoIGlzIHRvbGVyYWJsZQorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OlNldFBlcmNlbnRUb2xlcmFuY2UoZmxvYXQgcGVyY2VudCkgeworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICAgIG1fdG9sZXJhbmNlVHlwZSA9IGtQZXJjZW50VG9sZXJhbmNlOworICAgIG1fdG9sZXJhbmNlID0gcGVyY2VudDsKKyAgfQorfQorCisvKgorICogU2V0IHRoZSBhYnNvbHV0ZSBlcnJvciB3aGljaCBpcyBjb25zaWRlcmVkIHRvbGVyYWJsZSBmb3IgdXNlIHdpdGgKKyAqIE9uVGFyZ2V0LgorICogQHBhcmFtIHBlcmNlbnRhZ2UgZXJyb3Igd2hpY2ggaXMgdG9sZXJhYmxlCisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0QWJzb2x1dGVUb2xlcmFuY2UoZmxvYXQgYWJzVG9sZXJhbmNlKSB7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgICAgbV90b2xlcmFuY2VUeXBlID0ga0Fic29sdXRlVG9sZXJhbmNlOworICAgIG1fdG9sZXJhbmNlID0gYWJzVG9sZXJhbmNlOworICB9Cit9CisKKy8qCisgKiBTZXQgdGhlIG51bWJlciBvZiBwcmV2aW91cyBlcnJvciBzYW1wbGVzIHRvIGF2ZXJhZ2UgZm9yIHRvbGVyYW5jaW5nLiBXaGVuCisgKiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgbWVjaGFuaXNtIGlzIG9uIHRhcmdldCwgdGhlIHVzZXIgbWF5IHdhbnQgdG8gdXNlIGEKKyAqIHJvbGxpbmcgYXZlcmFnZSBvZiBwcmV2aW91cyBtZWFzdXJlbWVudHMgaW5zdGVhZCBvZiBhIHByZWNpc2UgcG9zaXRpb24gb3IKKyAqIHZlbG9jaXR5LiBUaGlzIGlzIHVzZWZ1bCBmb3Igbm9pc3kgc2Vuc29ycyB3aGljaCByZXR1cm4gYSBmZXcgZXJyb25lb3VzCisgKiBtZWFzdXJlbWVudHMgd2hlbiB0aGUgbWVjaGFuaXNtIGlzIG9uIHRhcmdldC4gSG93ZXZlciwgdGhlIG1lY2hhbmlzbSB3aWxsCisgKiBub3QgcmVnaXN0ZXIgYXMgb24gdGFyZ2V0IGZvciBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIGJ1Zkxlbmd0aCBjeWNsZXMuCisgKiBAcGFyYW0gYnVmTGVuZ3RoIE51bWJlciBvZiBwcmV2aW91cyBjeWNsZXMgdG8gYXZlcmFnZS4gRGVmYXVsdHMgdG8gMS4KKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpTZXRUb2xlcmFuY2VCdWZmZXIodW5zaWduZWQgYnVmTGVuZ3RoKSB7CisgIG1fYnVmTGVuZ3RoID0gYnVmTGVuZ3RoOworCisgIC8vIEN1dCB0aGUgYnVmZmVyIGRvd24gdG8gc2l6ZSBpZiBuZWVkZWQuCisgIHdoaWxlIChtX2J1Zi5zaXplKCkgPiBidWZMZW5ndGgpIHsKKyAgICBtX2J1ZlRvdGFsIC09IG1fYnVmLmZyb250KCk7CisgICAgbV9idWYucG9wKCk7CisgIH0KK30KKworLyoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBlcnJvciBpcyB3aXRoaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIGlucHV0IHJhbmdlLAorICogZGV0ZXJtaW5lZCBieSBTZXRUb2xlcmFuY2UuIFRoaXMgYXNzc3VtZXMgdGhhdCB0aGUgbWF4aW11bSBhbmQgbWluaW11bSBpbnB1dAorICogd2VyZSBzZXQgdXNpbmcgU2V0SW5wdXQuCisgKiBDdXJyZW50bHkgdGhpcyBqdXN0IHJlcG9ydHMgb24gdGFyZ2V0IGFzIHRoZSBhY3R1YWwgdmFsdWUgcGFzc2VzIHRocm91Z2ggdGhlCisgKiBzZXRwb2ludC4KKyAqIElkZWFsbHkgaXQgc2hvdWxkIGJlIGJhc2VkIG9uIGJlaW5nIHdpdGhpbiB0aGUgdG9sZXJhbmNlIGZvciBzb21lIHBlcmlvZCBvZgorICogdGltZS4KKyAqLworYm9vbCBQSURDb250cm9sbGVyOjpPblRhcmdldCgpIGNvbnN0IHsKKyAgZG91YmxlIGVycm9yID0gR2V0QXZnRXJyb3IoKTsKKworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgIHN3aXRjaCAobV90b2xlcmFuY2VUeXBlKSB7CisgICAgY2FzZSBrUGVyY2VudFRvbGVyYW5jZToKKyAgICAgIHJldHVybiBmYWJzKGVycm9yKSA8IG1fdG9sZXJhbmNlIC8gMTAwICogKG1fbWF4aW11bUlucHV0IC0gbV9taW5pbXVtSW5wdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrQWJzb2x1dGVUb2xlcmFuY2U6CisgICAgICByZXR1cm4gZmFicyhlcnJvcikgPCBtX3RvbGVyYW5jZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga05vVG9sZXJhbmNlOgorICAgICAgLy8gVE9ETzogdGhpcyBjYXNlIG5lZWRzIGFuIGVycm9yCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIEJlZ2luIHJ1bm5pbmcgdGhlIFBJRENvbnRyb2xsZXIKKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpFbmFibGUoKSB7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgICAgbV9lbmFibGVkID0gdHJ1ZTsKKyAgfQorCisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXRCb29sZWFuKCJlbmFibGVkIiwgdHJ1ZSk7CisgIH0KK30KKworLyoqCisgKiBTdG9wIHJ1bm5pbmcgdGhlIFBJRENvbnRyb2xsZXIsIHRoaXMgc2V0cyB0aGUgb3V0cHV0IHRvIHplcm8gYmVmb3JlIHN0b3BwaW5nLgorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OkRpc2FibGUoKSB7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgICAgbV9waWRPdXRwdXQtPlBJRFdyaXRlKDApOworICAgIG1fZW5hYmxlZCA9IGZhbHNlOworICB9CisKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlB1dEJvb2xlYW4oImVuYWJsZWQiLCBmYWxzZSk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm4gdHJ1ZSBpZiBQSURDb250cm9sbGVyIGlzIGVuYWJsZWQuCisgKi8KK2Jvb2wgUElEQ29udHJvbGxlcjo6SXNFbmFibGVkKCkgY29uc3QgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgIHJldHVybiBtX2VuYWJsZWQ7Cit9CisKKy8qKgorICogUmVzZXQgdGhlIHByZXZpb3VzIGVycm9yLCwgdGhlIGludGVncmFsIHRlcm0sIGFuZCBkaXNhYmxlIHRoZSBjb250cm9sbGVyLgorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OlJlc2V0KCkgeworICBEaXNhYmxlKCk7CisKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICBtX3ByZXZJbnB1dCA9IDA7CisgIG1fdG90YWxFcnJvciA9IDA7CisgIG1fcmVzdWx0ID0gMDsKK30KKworc3RkOjpzdHJpbmcgUElEQ29udHJvbGxlcjo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworICByZXR1cm4gIlBJRENvbnRyb2xsZXIiOworfQorCit2b2lkIFBJRENvbnRyb2xsZXI6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiB0YWJsZSkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSBtX3RhYmxlLT5SZW1vdmVUYWJsZUxpc3RlbmVyKHRoaXMpOworICBtX3RhYmxlID0gdGFibGU7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoa1AsIEdldFAoKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKGtJLCBHZXRJKCkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcihrRCwgR2V0RCgpKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoa0YsIEdldEYoKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKGtTZXRwb2ludCwgR2V0U2V0cG9pbnQoKSk7CisgICAgbV90YWJsZS0+UHV0Qm9vbGVhbihrRW5hYmxlZCwgSXNFbmFibGVkKCkpOworICAgIG1fdGFibGUtPkFkZFRhYmxlTGlzdGVuZXIodGhpcywgZmFsc2UpOworICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IFBJRENvbnRyb2xsZXI6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQorCit2b2lkIFBJRENvbnRyb2xsZXI6OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSB7CisgIGlmIChrZXkgPT0ga1AgfHwga2V5ID09IGtJIHx8IGtleSA9PSBrRCB8fCBrZXkgPT0ga0YpIHsKKyAgICBpZiAobV9QICE9IG1fdGFibGUtPkdldE51bWJlcihrUCwgMC4wKSB8fAorICAgICAgICBtX0kgIT0gbV90YWJsZS0+R2V0TnVtYmVyKGtJLCAwLjApIHx8CisgICAgICAgIG1fRCAhPSBtX3RhYmxlLT5HZXROdW1iZXIoa0QsIDAuMCkgfHwKKyAgICAgICAgbV9GICE9IG1fdGFibGUtPkdldE51bWJlcihrRiwgMC4wKSkgeworICAgICAgU2V0UElEKG1fdGFibGUtPkdldE51bWJlcihrUCwgMC4wKSwgbV90YWJsZS0+R2V0TnVtYmVyKGtJLCAwLjApLAorICAgICAgICAgICAgIG1fdGFibGUtPkdldE51bWJlcihrRCwgMC4wKSwgbV90YWJsZS0+R2V0TnVtYmVyKGtGLCAwLjApKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoa2V5ID09IGtTZXRwb2ludCAmJiB2YWx1ZS0+SXNEb3VibGUoKSAmJgorICAgICAgICAgICAgIG1fc2V0cG9pbnQgIT0gdmFsdWUtPkdldERvdWJsZSgpKSB7CisgICAgU2V0U2V0cG9pbnQodmFsdWUtPkdldERvdWJsZSgpKTsKKyAgfSBlbHNlIGlmIChrZXkgPT0ga0VuYWJsZWQgJiYgdmFsdWUtPklzQm9vbGVhbigpICYmCisgICAgICAgICAgICAgbV9lbmFibGVkICE9IHZhbHVlLT5HZXRCb29sZWFuKCkpIHsKKyAgICBpZiAodmFsdWUtPkdldEJvb2xlYW4oKSkgeworICAgICAgRW5hYmxlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIERpc2FibGUoKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQSURDb250cm9sbGVyOjpVcGRhdGVUYWJsZSgpIHt9CisKK3ZvaWQgUElEQ29udHJvbGxlcjo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsgRGlzYWJsZSgpOyB9CisKK3ZvaWQgUElEQ29udHJvbGxlcjo6U3RvcExpdmVXaW5kb3dNb2RlKCkge30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9QV00uY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1BXTS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzYjRiNwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9QV00uY3BwCkBAIC0wLDAgKzEsMzc0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJQV00uaCIKKworI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworY29uc3RleHByIGZsb2F0IFBXTTo6a0RlZmF1bHRQd21QZXJpb2Q7Citjb25zdGV4cHIgZmxvYXQgUFdNOjprRGVmYXVsdFB3bUNlbnRlcjsKK2NvbnN0IGludDMyX3QgUFdNOjprRGVmYXVsdFB3bVN0ZXBzRG93bjsKK2NvbnN0IGludDMyX3QgUFdNOjprUHdtRGlzYWJsZWQ7CisKKy8qKgorICogQWxsb2NhdGUgYSBQV00gZ2l2ZW4gYSBjaGFubmVsIG51bWJlci4KKyAqCisgKiBDaGVja3MgY2hhbm5lbCB2YWx1ZSByYW5nZSBhbmQgYWxsb2NhdGVzIHRoZSBhcHByb3ByaWF0ZSBjaGFubmVsLgorICogVGhlIGFsbG9jYXRpb24gaXMgb25seSBkb25lIHRvIGhlbHAgdXNlcnMgZW5zdXJlIHRoYXQgdGhleSBkb24ndCBkb3VibGUKKyAqIGFzc2lnbiBjaGFubmVscy4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQCisgKiBwb3J0CisgKi8KK1BXTTo6UFdNKHVpbnQzMl90IGNoYW5uZWwpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOworCisgIGlmICghQ2hlY2tQV01DaGFubmVsKGNoYW5uZWwpKSB7CisgICAgYnVmIDw8ICJQV00gQ2hhbm5lbCAiIDw8IGNoYW5uZWw7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmLnN0cigpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGFsbG9jYXRlUFdNQ2hhbm5lbChtX3B3bV9wb3J0c1tjaGFubmVsXSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIG1fY2hhbm5lbCA9IGNoYW5uZWw7CisKKyAgc2V0UFdNKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sIGtQd21EaXNhYmxlZCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIG1fZWxpbWluYXRlRGVhZGJhbmQgPSBmYWxzZTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUFdNLCBjaGFubmVsKTsKK30KKworLyoqCisgKiBGcmVlIHRoZSBQV00gY2hhbm5lbC4KKyAqCisgKiBGcmVlIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIFBXTSBjaGFubmVsIGFuZCBzZXQgdGhlIHZhbHVlIHRvIDAuCisgKi8KK1BXTTo6flBXTSgpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIHNldFBXTShtX3B3bV9wb3J0c1ttX2NoYW5uZWxdLCBrUHdtRGlzYWJsZWQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICBmcmVlUFdNQ2hhbm5lbChtX3B3bV9wb3J0c1ttX2NoYW5uZWxdLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKK30KKworLyoqCisgKiBPcHRpb25hbGx5IGVsaW1pbmF0ZSB0aGUgZGVhZGJhbmQgZnJvbSBhIHNwZWVkIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZWxpbWluYXRlRGVhZGJhbmQgSWYgdHJ1ZSwgc2V0IHRoZSBtb3RvciBjdXJ2ZSBvbiB0aGUgSmFndWFyIHRvCisgKiBlbGltaW5hdGUKKyAqIHRoZSBkZWFkYmFuZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSByYW5nZS4gT3RoZXJ3aXNlLCBrZWVwIHRoZSBmdWxsIHJhbmdlCisgKiB3aXRob3V0CisgKiBtb2RpZnlpbmcgYW55IHZhbHVlcy4KKyAqLwordm9pZCBQV006OkVuYWJsZURlYWRiYW5kRWxpbWluYXRpb24oYm9vbCBlbGltaW5hdGVEZWFkYmFuZCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIG1fZWxpbWluYXRlRGVhZGJhbmQgPSBlbGltaW5hdGVEZWFkYmFuZDsKK30KKworLyoqCisgKiBTZXQgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHZhbHVlcy4KKyAqIFRoaXMgc2V0cyB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgZWFjaCB0eXBlIG9mCisgKiBjb250cm9sbGVyLiBUaGUgdmFsdWVzCisgKiBkZXRlcm1pbmUgdGhlIHVwcGVyIGFuZCBsb3dlciBzcGVlZHMgYXMgd2VsbCBhcyB0aGUgZGVhZGJhbmQgYnJhY2tldC4KKyAqIEBwYXJhbSBtYXggVGhlIE1pbmltdW0gcHdtIHZhbHVlCisgKiBAcGFyYW0gZGVhZGJhbmRNYXggVGhlIGhpZ2ggZW5kIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogQHBhcmFtIGNlbnRlciBUaGUgY2VudGVyIHNwZWVkIChvZmYpCisgKiBAcGFyYW0gZGVhZGJhbmRNaW4gVGhlIGxvdyBlbmQgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgKiBAcGFyYW0gbWluIFRoZSBtaW5pbXVtIHB3bSB2YWx1ZQorICovCit2b2lkIFBXTTo6U2V0Qm91bmRzKGludDMyX3QgbWF4LCBpbnQzMl90IGRlYWRiYW5kTWF4LCBpbnQzMl90IGNlbnRlciwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWFkYmFuZE1pbiwgaW50MzJfdCBtaW4pIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBtX21heFB3bSA9IG1heDsKKyAgbV9kZWFkYmFuZE1heFB3bSA9IGRlYWRiYW5kTWF4OworICBtX2NlbnRlclB3bSA9IGNlbnRlcjsKKyAgbV9kZWFkYmFuZE1pblB3bSA9IGRlYWRiYW5kTWluOworICBtX21pblB3bSA9IG1pbjsKK30KKworLyoqCisgKiBTZXQgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHB1bHNlIHdpZHRocy4KKyAqIFRoaXMgc2V0cyB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvZiBjb250cm9sbGVyLgorICogVGhlIHZhbHVlcworICogZGV0ZXJtaW5lIHRoZSB1cHBlciBhbmQgbG93ZXIgc3BlZWRzIGFzIHdlbGwgYXMgdGhlIGRlYWRiYW5kIGJyYWNrZXQuCisgKiBAcGFyYW0gbWF4IFRoZSBtYXggUFdNIHB1bHNlIHdpZHRoIGluIG1zCisgKiBAcGFyYW0gZGVhZGJhbmRNYXggVGhlIGhpZ2ggZW5kIG9mIHRoZSBkZWFkYmFuZCByYW5nZSBwdWxzZSB3aWR0aCBpbiBtcworICogQHBhcmFtIGNlbnRlciBUaGUgY2VudGVyIChvZmYpIHB1bHNlIHdpZHRoIGluIG1zCisgKiBAcGFyYW0gZGVhZGJhbmRNaW4gVGhlIGxvdyBlbmQgb2YgdGhlIGRlYWRiYW5kIHB1bHNlIHdpZHRoIGluIG1zCisgKiBAcGFyYW0gbWluIFRoZSBtaW5pbXVtIHB1bHNlIHdpZHRoIGluIG1zCisgKi8KK3ZvaWQgUFdNOjpTZXRCb3VuZHMoZG91YmxlIG1heCwgZG91YmxlIGRlYWRiYW5kTWF4LCBkb3VibGUgY2VudGVyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVhZGJhbmRNaW4sIGRvdWJsZSBtaW4pIHsKKyAgLy8gY2FsY3VsYXRlIHRoZSBsb29wIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgZG91YmxlIGxvb3BUaW1lID0KKyAgICAgIGdldExvb3BUaW1pbmcoJnN0YXR1cykgLyAoa1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCAqIDFlMyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworICBtX21heFB3bSA9IChpbnQzMl90KSgobWF4IC0ga0RlZmF1bHRQd21DZW50ZXIpIC8gbG9vcFRpbWUgKworICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOworICBtX2RlYWRiYW5kTWF4UHdtID0gKGludDMyX3QpKChkZWFkYmFuZE1heCAtIGtEZWZhdWx0UHdtQ2VudGVyKSAvIGxvb3BUaW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOworICBtX2NlbnRlclB3bSA9IChpbnQzMl90KSgoY2VudGVyIC0ga0RlZmF1bHRQd21DZW50ZXIpIC8gbG9vcFRpbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOworICBtX2RlYWRiYW5kTWluUHdtID0gKGludDMyX3QpKChkZWFkYmFuZE1pbiAtIGtEZWZhdWx0UHdtQ2VudGVyKSAvIGxvb3BUaW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOworICBtX21pblB3bSA9IChpbnQzMl90KSgobWluIC0ga0RlZmF1bHRQd21DZW50ZXIpIC8gbG9vcFRpbWUgKworICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlIGJhc2VkIG9uIGEgcG9zaXRpb24uCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlcnZvcy4KKyAqCisgKiBAcHJlIFNldE1heFBvc2l0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNaW5OZWdhdGl2ZVB3bSgpIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gcG9zIFRoZSBwb3NpdGlvbiB0byBzZXQgdGhlIHNlcnZvIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgKi8KK3ZvaWQgUFdNOjpTZXRQb3NpdGlvbihmbG9hdCBwb3MpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworICBpZiAocG9zIDwgMC4wKSB7CisgICAgcG9zID0gMC4wOworICB9IGVsc2UgaWYgKHBvcyA+IDEuMCkgeworICAgIHBvcyA9IDEuMDsKKyAgfQorCisgIC8vIG5vdGUsIG5lZWQgdG8gcGVyZm9ybSB0aGUgbXVsdGlwbGljYXRpb24gYmVsb3cgYXMgZmxvYXRpbmcgcG9pbnQgYmVmb3JlCisgIC8vIGNvbnZlcnRpbmcgdG8gaW50CisgIHVuc2lnbmVkIHNob3J0IHJhd1ZhbHVlID0KKyAgICAgIChpbnQzMl90KSgocG9zICogKGZsb2F0KUdldEZ1bGxSYW5nZVNjYWxlRmFjdG9yKCkpICsgR2V0TWluTmVnYXRpdmVQd20oKSk7CisgIC8vCXByaW50ZigiTWluTmVnUFdNOiAlZCBGdWxsUmFuZ2VTY2FsZUZhY3RvcjogJWQgUmF3IHZhbHVlOiAlNWQgICBJbnB1dAorICAvL3ZhbHVlOiAlNC40ZlxuIiwgR2V0TWluTmVnYXRpdmVQd20oKSwgR2V0RnVsbFJhbmdlU2NhbGVGYWN0b3IoKSwgcmF3VmFsdWUsCisgIC8vcG9zKTsKKworICAvLwl3cGlfYXNzZXJ0KChyYXdWYWx1ZSA+PSBHZXRNaW5OZWdhdGl2ZVB3bSgpKSAmJiAocmF3VmFsdWUgPD0KKyAgLy9HZXRNYXhQb3NpdGl2ZVB3bSgpKSk7CisgIHdwaV9hc3NlcnQocmF3VmFsdWUgIT0ga1B3bURpc2FibGVkKTsKKworICAvLyBzZW5kIHRoZSBjb21wdXRlZCBwd20gdmFsdWUgdG8gdGhlIEZQR0EKKyAgU2V0UmF3KCh1bnNpZ25lZCBzaG9ydClyYXdWYWx1ZSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBQV00gdmFsdWUgaW4gdGVybXMgb2YgYSBwb3NpdGlvbi4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vydm9zLgorICoKKyAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIHRoZSBzZXJ2byBpcyBzZXQgdG8gYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgUFdNOjpHZXRQb3NpdGlvbigpIGNvbnN0IHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKKyAgaW50MzJfdCB2YWx1ZSA9IEdldFJhdygpOworICBpZiAodmFsdWUgPCBHZXRNaW5OZWdhdGl2ZVB3bSgpKSB7CisgICAgcmV0dXJuIDAuMDsKKyAgfSBlbHNlIGlmICh2YWx1ZSA+IEdldE1heFBvc2l0aXZlUHdtKCkpIHsKKyAgICByZXR1cm4gMS4wOworICB9IGVsc2UgeworICAgIHJldHVybiAoZmxvYXQpKHZhbHVlIC0gR2V0TWluTmVnYXRpdmVQd20oKSkgLworICAgICAgICAgICAoZmxvYXQpR2V0RnVsbFJhbmdlU2NhbGVGYWN0b3IoKTsKKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlIGJhc2VkIG9uIGEgc3BlZWQuCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNwZWVkIGNvbnRyb2xsZXJzLgorICoKKyAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pblBvc2l0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRDZW50ZXJQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1heE5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNaW5OZWdhdGl2ZVB3bSgpIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHRvIHNldCB0aGUgc3BlZWQgY29udHJvbGxlciBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKyAqLwordm9pZCBQV006OlNldFNwZWVkKGZsb2F0IHNwZWVkKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKyAgLy8gY2xhbXAgc3BlZWQgdG8gYmUgaW4gdGhlIHJhbmdlIDEuMCA+PSBzcGVlZCA+PSAtMS4wCisgIGlmIChzcGVlZCA8IC0xLjApIHsKKyAgICBzcGVlZCA9IC0xLjA7CisgIH0gZWxzZSBpZiAoc3BlZWQgPiAxLjApIHsKKyAgICBzcGVlZCA9IDEuMDsKKyAgfQorCisgIC8vIGNhbGN1bGF0ZSB0aGUgZGVzaXJlZCBvdXRwdXQgcHdtIHZhbHVlIGJ5IHNjYWxpbmcgdGhlIHNwZWVkIGFwcHJvcHJpYXRlbHkKKyAgaW50MzJfdCByYXdWYWx1ZTsKKyAgaWYgKHNwZWVkID09IDAuMCkgeworICAgIHJhd1ZhbHVlID0gR2V0Q2VudGVyUHdtKCk7CisgIH0gZWxzZSBpZiAoc3BlZWQgPiAwLjApIHsKKyAgICByYXdWYWx1ZSA9IChpbnQzMl90KShzcGVlZCAqICgoZmxvYXQpR2V0UG9zaXRpdmVTY2FsZUZhY3RvcigpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKChmbG9hdClHZXRNaW5Qb3NpdGl2ZVB3bSgpKSArIDAuNSk7CisgIH0gZWxzZSB7CisgICAgcmF3VmFsdWUgPSAoaW50MzJfdCkoc3BlZWQgKiAoKGZsb2F0KUdldE5lZ2F0aXZlU2NhbGVGYWN0b3IoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpR2V0TWF4TmVnYXRpdmVQd20oKSkgKyAwLjUpOworICB9CisKKyAgLy8gdGhlIGFib3ZlIHNob3VsZCByZXN1bHQgaW4gYSBwd21fdmFsdWUgaW4gdGhlIHZhbGlkIHJhbmdlCisgIHdwaV9hc3NlcnQoKHJhd1ZhbHVlID49IEdldE1pbk5lZ2F0aXZlUHdtKCkpICYmCisgICAgICAgICAgICAgKHJhd1ZhbHVlIDw9IEdldE1heFBvc2l0aXZlUHdtKCkpKTsKKyAgd3BpX2Fzc2VydChyYXdWYWx1ZSAhPSBrUHdtRGlzYWJsZWQpOworCisgIC8vIHNlbmQgdGhlIGNvbXB1dGVkIHB3bSB2YWx1ZSB0byB0aGUgRlBHQQorICBTZXRSYXcocmF3VmFsdWUpOworfQorCisvKioKKyAqIEdldCB0aGUgUFdNIHZhbHVlIGluIHRlcm1zIG9mIHNwZWVkLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBzcGVlZCBjb250cm9sbGVycy4KKyAqCisgKiBAcHJlIFNldE1heFBvc2l0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNaW5Qb3NpdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWF4TmVnYXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHNwZWVkIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBQV006OkdldFNwZWVkKCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworICBpbnQzMl90IHZhbHVlID0gR2V0UmF3KCk7CisgIGlmICh2YWx1ZSA9PSBQV006OmtQd21EaXNhYmxlZCkgeworICAgIHJldHVybiAwLjA7CisgIH0gZWxzZSBpZiAodmFsdWUgPiBHZXRNYXhQb3NpdGl2ZVB3bSgpKSB7CisgICAgcmV0dXJuIDEuMDsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8IEdldE1pbk5lZ2F0aXZlUHdtKCkpIHsKKyAgICByZXR1cm4gLTEuMDsKKyAgfSBlbHNlIGlmICh2YWx1ZSA+IEdldE1pblBvc2l0aXZlUHdtKCkpIHsKKyAgICByZXR1cm4gKGZsb2F0KSh2YWx1ZSAtIEdldE1pblBvc2l0aXZlUHdtKCkpIC8KKyAgICAgICAgICAgKGZsb2F0KUdldFBvc2l0aXZlU2NhbGVGYWN0b3IoKTsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8IEdldE1heE5lZ2F0aXZlUHdtKCkpIHsKKyAgICByZXR1cm4gKGZsb2F0KSh2YWx1ZSAtIEdldE1heE5lZ2F0aXZlUHdtKCkpIC8KKyAgICAgICAgICAgKGZsb2F0KUdldE5lZ2F0aXZlU2NhbGVGYWN0b3IoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMC4wOworICB9Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUgZGlyZWN0bHkgdG8gdGhlIGhhcmR3YXJlLgorICoKKyAqIFdyaXRlIGEgcmF3IHZhbHVlIHRvIGEgUFdNIGNoYW5uZWwuCisgKgorICogQHBhcmFtIHZhbHVlIFJhdyBQV00gdmFsdWUuCisgKi8KK3ZvaWQgUFdNOjpTZXRSYXcodW5zaWduZWQgc2hvcnQgdmFsdWUpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOworCisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0UFdNKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sIHZhbHVlLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBQV00gdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUgaGFyZHdhcmUuCisgKgorICogUmVhZCBhIHJhdyB2YWx1ZSBmcm9tIGEgUFdNIGNoYW5uZWwuCisgKgorICogQHJldHVybiBSYXcgUFdNIGNvbnRyb2wgdmFsdWUuCisgKi8KK3Vuc2lnbmVkIHNob3J0IFBXTTo6R2V0UmF3KCkgY29uc3QgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHVuc2lnbmVkIHNob3J0IHZhbHVlID0gZ2V0UFdNKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogU2xvdyBkb3duIHRoZSBQV00gc2lnbmFsIGZvciBvbGQgZGV2aWNlcy4KKyAqCisgKiBAcGFyYW0gbXVsdCBUaGUgcGVyaW9kIG11bHRpcGxpZXIgdG8gYXBwbHkgdG8gdGhpcyBjaGFubmVsCisgKi8KK3ZvaWQgUFdNOjpTZXRQZXJpb2RNdWx0aXBsaWVyKFBlcmlvZE11bHRpcGxpZXIgbXVsdCkgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIHN3aXRjaCAobXVsdCkgeworICAgIGNhc2Uga1BlcmlvZE11bHRpcGxpZXJfNFg6CisgICAgICBzZXRQV01QZXJpb2RTY2FsZShtX3B3bV9wb3J0c1ttX2NoYW5uZWxdLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7ICAvLyBTcXVlbGNoIDMgb3V0IG9mIDQgb3V0cHV0cworICAgICAgYnJlYWs7CisgICAgY2FzZSBrUGVyaW9kTXVsdGlwbGllcl8yWDoKKyAgICAgIHNldFBXTVBlcmlvZFNjYWxlKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsgIC8vIFNxdWVsY2ggMSBvdXQgb2YgMiBvdXRwdXRzCisgICAgICBicmVhazsKKyAgICBjYXNlIGtQZXJpb2RNdWx0aXBsaWVyXzFYOgorICAgICAgc2V0UFdNUGVyaW9kU2NhbGUobV9wd21fcG9ydHNbbV9jaGFubmVsXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOyAgLy8gRG9uJ3Qgc3F1ZWxjaCBhbnkgb3V0cHV0cworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHdwaV9hc3NlcnQoZmFsc2UpOworICB9CisKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKK3ZvaWQgUFdNOjpTZXRaZXJvTGF0Y2goKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisKKyAgbGF0Y2hQV01aZXJvKG1fcHdtX3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKwordm9pZCBQV006OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIHsKKyAgaWYgKCF2YWx1ZS0+SXNEb3VibGUoKSkgcmV0dXJuOworICBTZXRTcGVlZCh2YWx1ZS0+R2V0RG91YmxlKCkpOworfQorCit2b2lkIFBXTTo6VXBkYXRlVGFibGUoKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIlZhbHVlIiwgR2V0U3BlZWQoKSk7CisgIH0KK30KKwordm9pZCBQV006OlN0YXJ0TGl2ZVdpbmRvd01vZGUoKSB7CisgIFNldFNwZWVkKDApOworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+QWRkVGFibGVMaXN0ZW5lcigiVmFsdWUiLCB0aGlzLCB0cnVlKTsKKyAgfQorfQorCit2b2lkIFBXTTo6U3RvcExpdmVXaW5kb3dNb2RlKCkgeworICBTZXRTcGVlZCgwKTsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgUFdNOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7IHJldHVybiAiU3BlZWQgQ29udHJvbGxlciI7IH0KKwordm9pZCBQV006OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworICBtX3RhYmxlID0gc3ViVGFibGU7CisgIFVwZGF0ZVRhYmxlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IFBXTTo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvUG93ZXJEaXN0cmlidXRpb25QYW5lbC5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvUG93ZXJEaXN0cmlidXRpb25QYW5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0MjhjZgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiUG93ZXJEaXN0cmlidXRpb25QYW5lbC5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkhBTC9QRFAuaHBwIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6UG93ZXJEaXN0cmlidXRpb25QYW5lbCgpIDogUG93ZXJEaXN0cmlidXRpb25QYW5lbCgwKSB7fQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIFBEUC4KKyAqLworUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6UG93ZXJEaXN0cmlidXRpb25QYW5lbCh1aW50OF90IG1vZHVsZSkKKyAgICA6IG1fbW9kdWxlKG1vZHVsZSkgeworICBpbml0aWFsaXplUERQKG1fbW9kdWxlKTsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgaW5wdXQgdm9sdGFnZSBvZiB0aGUgUERQCisgKiBAcmV0dXJuIFRoZSB2b2x0YWdlIG9mIHRoZSBQRFAgaW4gdm9sdHMKKyAqLworZG91YmxlIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFZvbHRhZ2UoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKworICBkb3VibGUgdm9sdGFnZSA9IGdldFBEUFZvbHRhZ2UobV9tb2R1bGUsICZzdGF0dXMpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisgIH0KKworICByZXR1cm4gdm9sdGFnZTsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgdGVtcGVyYXR1cmUgb2YgdGhlIFBEUAorICogQHJldHVybiBUaGUgdGVtcGVyYXR1cmUgb2YgdGhlIFBEUCBpbiBkZWdyZWVzIENlbHNpdXMKKyAqLworZG91YmxlIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFRlbXBlcmF0dXJlKCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisKKyAgZG91YmxlIHRlbXBlcmF0dXJlID0gZ2V0UERQVGVtcGVyYXR1cmUobV9tb2R1bGUsICZzdGF0dXMpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisgIH0KKworICByZXR1cm4gdGVtcGVyYXR1cmU7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIGN1cnJlbnQgb2YgYSBzaW5nbGUgY2hhbm5lbCBvZiB0aGUgUERQCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IG9mIG9uZSBvZiB0aGUgUERQIGNoYW5uZWxzIChjaGFubmVscyAwLTE1KSBpbiBBbXBlcmVzCisgKi8KK2RvdWJsZSBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRDdXJyZW50KHVpbnQ4X3QgY2hhbm5lbCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisKKyAgaWYgKCFDaGVja1BEUENoYW5uZWwoY2hhbm5lbCkpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CisgICAgYnVmIDw8ICJQRFAgQ2hhbm5lbCAiIDw8IGNoYW5uZWw7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgYnVmLnN0cigpKTsKKyAgfQorCisgIGRvdWJsZSBjdXJyZW50ID0gZ2V0UERQQ2hhbm5lbEN1cnJlbnQobV9tb2R1bGUsIGNoYW5uZWwsICZzdGF0dXMpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisgIH0KKworICByZXR1cm4gY3VycmVudDsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgdG90YWwgY3VycmVudCBvZiBhbGwgbW9uaXRvcmVkIFBEUCBjaGFubmVscyAoMC0xNSkKKyAqIEByZXR1cm4gVGhlIHRoZSB0b3RhbCBjdXJyZW50IGRyYXduIGZyb20gdGhlIFBEUCBjaGFubmVscyBpbiBBbXBlcmVzCisgKi8KK2RvdWJsZSBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRUb3RhbEN1cnJlbnQoKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKworICBkb3VibGUgY3VycmVudCA9IGdldFBEUFRvdGFsQ3VycmVudChtX21vZHVsZSwgJnN0YXR1cyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKyAgfQorCisgIHJldHVybiBjdXJyZW50OworfQorCisvKioKKyAqIFF1ZXJ5IHRoZSB0b3RhbCBwb3dlciBkcmF3biBmcm9tIHRoZSBtb25pdG9yZWQgUERQIGNoYW5uZWxzCisgKiBAcmV0dXJuIFRoZSB0aGUgdG90YWwgcG93ZXIgZHJhd24gZnJvbSB0aGUgUERQIGNoYW5uZWxzIGluIFdhdHRzCisgKi8KK2RvdWJsZSBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRUb3RhbFBvd2VyKCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisKKyAgZG91YmxlIHBvd2VyID0gZ2V0UERQVG90YWxQb3dlcihtX21vZHVsZSwgJnN0YXR1cyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKyAgfQorCisgIHJldHVybiBwb3dlcjsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgdG90YWwgZW5lcmd5IGRyYXduIGZyb20gdGhlIG1vbml0b3JlZCBQRFAgY2hhbm5lbHMKKyAqIEByZXR1cm4gVGhlIHRoZSB0b3RhbCBlbmVyZ3kgZHJhd24gZnJvbSB0aGUgUERQIGNoYW5uZWxzIGluIEpvdWxlcworICovCitkb3VibGUgUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6R2V0VG90YWxFbmVyZ3koKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKworICBkb3VibGUgZW5lcmd5ID0gZ2V0UERQVG90YWxFbmVyZ3kobV9tb2R1bGUsICZzdGF0dXMpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7CisgIH0KKworICByZXR1cm4gZW5lcmd5OworfQorCisvKioKKyAqIFJlc2V0IHRoZSB0b3RhbCBlbmVyZ3kgZHJhd24gZnJvbSB0aGUgUERQCisgKiBAc2VlIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwjR2V0VG90YWxFbmVyZ3kKKyAqLwordm9pZCBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpSZXNldFRvdGFsRW5lcmd5KCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisKKyAgcmVzZXRQRFBUb3RhbEVuZXJneShtX21vZHVsZSwgJnN0YXR1cyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKKyAgfQorfQorCisvKioKKyAqIFJlbW92ZSBhbGwgb2YgdGhlIGZhdWx0IGZsYWdzIG9uIHRoZSBQRFAKKyAqLwordm9pZCBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpDbGVhclN0aWNreUZhdWx0cygpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIGNsZWFyUERQU3RpY2t5RmF1bHRzKG1fbW9kdWxlLCAmc3RhdHVzKTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgIiIpOworICB9Cit9CisKK3ZvaWQgUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6VXBkYXRlVGFibGUoKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIkNoYW4wIiwgR2V0Q3VycmVudCgwKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuMSIsIEdldEN1cnJlbnQoMSkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiQ2hhbjIiLCBHZXRDdXJyZW50KDIpKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIkNoYW4zIiwgR2V0Q3VycmVudCgzKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuNCIsIEdldEN1cnJlbnQoNCkpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiQ2hhbjUiLCBHZXRDdXJyZW50KDUpKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIkNoYW42IiwgR2V0Q3VycmVudCg2KSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuNyIsIEdldEN1cnJlbnQoNykpOworICAgIG1fdGFibGUtPlB1dE51bWJlcigiQ2hhbjgiLCBHZXRDdXJyZW50KDgpKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIkNoYW45IiwgR2V0Q3VycmVudCg5KSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuMTAiLCBHZXRDdXJyZW50KDEwKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuMTEiLCBHZXRDdXJyZW50KDExKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuMTIiLCBHZXRDdXJyZW50KDEyKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuMTMiLCBHZXRDdXJyZW50KDEzKSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuMTQiLCBHZXRDdXJyZW50KDE0KSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJDaGFuMTUiLCBHZXRDdXJyZW50KDE1KSk7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWb2x0YWdlIiwgR2V0Vm9sdGFnZSgpKTsKKyAgICBtX3RhYmxlLT5QdXROdW1iZXIoIlRvdGFsQ3VycmVudCIsIEdldFRvdGFsQ3VycmVudCgpKTsKKyAgfQorfQorCit2b2lkIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OlN0YXJ0TGl2ZVdpbmRvd01vZGUoKSB7fQorCit2b2lkIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OlN0b3BMaXZlV2luZG93TW9kZSgpIHt9CisKK3N0ZDo6c3RyaW5nIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJQb3dlckRpc3RyaWJ1dGlvblBhbmVsIjsKK30KKwordm9pZCBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YlRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGU7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9QcmVmZXJlbmNlcy5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvUHJlZmVyZW5jZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjZhNGEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvUHJlZmVyZW5jZXMuY3BwCkBAIC0wLDAgKzEsMjE3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlByZWZlcmVuY2VzLmgiCisKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisvKiogVGhlIFByZWZlcmVuY2VzIHRhYmxlIG5hbWUgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprVGFibGVOYW1lID0gIlByZWZlcmVuY2VzIjsKKwordm9pZCBQcmVmZXJlbmNlczo6TGlzdGVuZXI6OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOZXcpIHt9Cit2b2lkIFByZWZlcmVuY2VzOjpMaXN0ZW5lcjo6VmFsdWVDaGFuZ2VkRXgoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSB7CisgIHNvdXJjZS0+U2V0UGVyc2lzdGVudChrZXkpOworfQorCitQcmVmZXJlbmNlczo6UHJlZmVyZW5jZXMoKSA6IG1fdGFibGUoTmV0d29ya1RhYmxlOjpHZXRUYWJsZShrVGFibGVOYW1lKSkgeworICBtX3RhYmxlLT5BZGRUYWJsZUxpc3RlbmVyRXgoJm1fbGlzdGVuZXIsIE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfSU1NRURJQVRFKTsKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1ByZWZlcmVuY2VzLCAwKTsKK30KKworLyoqCisgKiBHZXQgdGhlIG9uZSBhbmQgb25seSB7QGxpbmsgUHJlZmVyZW5jZXN9IG9iamVjdAorICogQHJldHVybiBwb2ludGVyIHRvIHRoZSB7QGxpbmsgUHJlZmVyZW5jZXN9CisgKi8KK1ByZWZlcmVuY2VzICpQcmVmZXJlbmNlczo6R2V0SW5zdGFuY2UoKSB7CisgIHN0YXRpYyBQcmVmZXJlbmNlcyBpbnN0YW5jZTsKKyAgcmV0dXJuICZpbnN0YW5jZTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgdmVjdG9yIG9mIGFsbCB0aGUga2V5cworICogQHJldHVybiBhIHZlY3RvciBvZiB0aGUga2V5cworICovCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gUHJlZmVyZW5jZXM6OkdldEtleXMoKSB7IHJldHVybiBtX3RhYmxlLT5HZXRLZXlzKCk7IH0KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdHJpbmcgYXQgdGhlIGdpdmVuIGtleS4gIElmIHRoaXMgdGFibGUgZG9lcyBub3QgaGF2ZSBhIHZhbHVlCisgKiBmb3IgdGhhdCBwb3NpdGlvbiwgdGhlbiB0aGUgZ2l2ZW4gZGVmYXVsdFZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuCisgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKyAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHJldHVybiBpZiBub25lIGV4aXN0cyBpbiB0aGUgdGFibGUKKyAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgdGFibGUsIG9yIHRoZSBkZWZhdWx0VmFsdWUKKyAqLworc3RkOjpzdHJpbmcgUHJlZmVyZW5jZXM6OkdldFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSB7CisgIHJldHVybiBtX3RhYmxlLT5HZXRTdHJpbmcoa2V5LCBkZWZhdWx0VmFsdWUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgZ2l2ZW4ga2V5LiAgSWYgdGhpcyB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUKKyAqIGZvciB0aGF0IHBvc2l0aW9uLCB0aGVuIHRoZSBnaXZlbiBkZWZhdWx0VmFsdWUgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KKyAqIEBwYXJhbSBrZXkgdGhlIGtleQorICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQorICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlIGluIHRoZSB0YWJsZSwgb3IgdGhlIGRlZmF1bHRWYWx1ZQorICovCitpbnQgUHJlZmVyZW5jZXM6OkdldEludChsbHZtOjpTdHJpbmdSZWYga2V5LCBpbnQgZGVmYXVsdFZhbHVlKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1fdGFibGUtPkdldE51bWJlcihrZXksIGRlZmF1bHRWYWx1ZSkpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGRvdWJsZSBhdCB0aGUgZ2l2ZW4ga2V5LiAgSWYgdGhpcyB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUKKyAqIGZvciB0aGF0IHBvc2l0aW9uLCB0aGVuIHRoZSBnaXZlbiBkZWZhdWx0VmFsdWUgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KKyAqIEBwYXJhbSBrZXkgdGhlIGtleQorICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQorICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlIGluIHRoZSB0YWJsZSwgb3IgdGhlIGRlZmF1bHRWYWx1ZQorICovCitkb3VibGUgUHJlZmVyZW5jZXM6OkdldERvdWJsZShsbHZtOjpTdHJpbmdSZWYga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7CisgIHJldHVybiBtX3RhYmxlLT5HZXROdW1iZXIoa2V5LCBkZWZhdWx0VmFsdWUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGZsb2F0IGF0IHRoZSBnaXZlbiBrZXkuICBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYSB2YWx1ZQorICogZm9yIHRoYXQgcG9zaXRpb24sIHRoZW4gdGhlIGdpdmVuIGRlZmF1bHRWYWx1ZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgorICogQHBhcmFtIGtleSB0aGUga2V5CisgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgbm9uZSBleGlzdHMgaW4gdGhlIHRhYmxlCisgKiBAcmV0dXJuIGVpdGhlciB0aGUgdmFsdWUgaW4gdGhlIHRhYmxlLCBvciB0aGUgZGVmYXVsdFZhbHVlCisgKi8KK2Zsb2F0IFByZWZlcmVuY2VzOjpHZXRGbG9hdChsbHZtOjpTdHJpbmdSZWYga2V5LCBmbG9hdCBkZWZhdWx0VmFsdWUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihtX3RhYmxlLT5HZXROdW1iZXIoa2V5LCBkZWZhdWx0VmFsdWUpKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBib29sZWFuIGF0IHRoZSBnaXZlbiBrZXkuICBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYSB2YWx1ZQorICogZm9yIHRoYXQgcG9zaXRpb24sIHRoZW4gdGhlIGdpdmVuIGRlZmF1bHRWYWx1ZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgorICogQHBhcmFtIGtleSB0aGUga2V5CisgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgbm9uZSBleGlzdHMgaW4gdGhlIHRhYmxlCisgKiBAcmV0dXJuIGVpdGhlciB0aGUgdmFsdWUgaW4gdGhlIHRhYmxlLCBvciB0aGUgZGVmYXVsdFZhbHVlCisgKi8KK2Jvb2wgUHJlZmVyZW5jZXM6OkdldEJvb2xlYW4obGx2bTo6U3RyaW5nUmVmIGtleSwgYm9vbCBkZWZhdWx0VmFsdWUpIHsKKyAgcmV0dXJuIG1fdGFibGUtPkdldEJvb2xlYW4oa2V5LCBkZWZhdWx0VmFsdWUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGxvbmcgKGludDY0X3QpIGF0IHRoZSBnaXZlbiBrZXkuICBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYQorICogdmFsdWUKKyAqIGZvciB0aGF0IHBvc2l0aW9uLCB0aGVuIHRoZSBnaXZlbiBkZWZhdWx0VmFsdWUgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KKyAqIEBwYXJhbSBrZXkgdGhlIGtleQorICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQorICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlIGluIHRoZSB0YWJsZSwgb3IgdGhlIGRlZmF1bHRWYWx1ZQorICovCitpbnQ2NF90IFByZWZlcmVuY2VzOjpHZXRMb25nKGxsdm06OlN0cmluZ1JlZiBrZXksIGludDY0X3QgZGVmYXVsdFZhbHVlKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90PihtX3RhYmxlLT5HZXROdW1iZXIoa2V5LCBkZWZhdWx0VmFsdWUpKTsKK30KKworLyoqCisgKiBQdXRzIHRoZSBnaXZlbiBzdHJpbmcgaW50byB0aGUgcHJlZmVyZW5jZXMgdGFibGUuCisgKgorICogPHA+VGhlIHZhbHVlIG1heSBub3QgaGF2ZSBxdW90YXRpb24gbWFya3MsIG5vciBtYXkgdGhlIGtleQorICogaGF2ZSBhbnkgd2hpdGVzcGFjZSBub3IgYW4gZXF1YWxzIHNpZ248L3A+CisgKgorICogQHBhcmFtIGtleSB0aGUga2V5CisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKi8KK3ZvaWQgUHJlZmVyZW5jZXM6OlB1dFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpTdHJpbmdSZWYgdmFsdWUpIHsKKyAgbV90YWJsZS0+UHV0U3RyaW5nKGtleSwgdmFsdWUpOworICBtX3RhYmxlLT5TZXRQZXJzaXN0ZW50KGtleSk7Cit9CisKKy8qKgorICogUHV0cyB0aGUgZ2l2ZW4gaW50IGludG8gdGhlIHByZWZlcmVuY2VzIHRhYmxlLgorICoKKyAqIDxwPlRoZSBrZXkgbWF5IG5vdCBoYXZlIGFueSB3aGl0ZXNwYWNlIG5vciBhbiBlcXVhbHMgc2lnbjwvcD4KKyAqCisgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqLwordm9pZCBQcmVmZXJlbmNlczo6UHV0SW50KGxsdm06OlN0cmluZ1JlZiBrZXksIGludCB2YWx1ZSkgeworICBtX3RhYmxlLT5QdXROdW1iZXIoa2V5LCB2YWx1ZSk7CisgIG1fdGFibGUtPlNldFBlcnNpc3RlbnQoa2V5KTsKK30KKworLyoqCisgKiBQdXRzIHRoZSBnaXZlbiBkb3VibGUgaW50byB0aGUgcHJlZmVyZW5jZXMgdGFibGUuCisgKgorICogPHA+VGhlIGtleSBtYXkgbm90IGhhdmUgYW55IHdoaXRlc3BhY2Ugbm9yIGFuIGVxdWFscyBzaWduPC9wPgorICoKKyAqIEBwYXJhbSBrZXkgdGhlIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICovCit2b2lkIFByZWZlcmVuY2VzOjpQdXREb3VibGUobGx2bTo6U3RyaW5nUmVmIGtleSwgZG91YmxlIHZhbHVlKSB7CisgIG1fdGFibGUtPlB1dE51bWJlcihrZXksIHZhbHVlKTsKKyAgbV90YWJsZS0+U2V0UGVyc2lzdGVudChrZXkpOworfQorCisvKioKKyAqIFB1dHMgdGhlIGdpdmVuIGZsb2F0IGludG8gdGhlIHByZWZlcmVuY2VzIHRhYmxlLgorICoKKyAqIDxwPlRoZSBrZXkgbWF5IG5vdCBoYXZlIGFueSB3aGl0ZXNwYWNlIG5vciBhbiBlcXVhbHMgc2lnbjwvcD4KKyAqCisgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqLwordm9pZCBQcmVmZXJlbmNlczo6UHV0RmxvYXQobGx2bTo6U3RyaW5nUmVmIGtleSwgZmxvYXQgdmFsdWUpIHsKKyAgbV90YWJsZS0+UHV0TnVtYmVyKGtleSwgdmFsdWUpOworICBtX3RhYmxlLT5TZXRQZXJzaXN0ZW50KGtleSk7Cit9CisKKy8qKgorICogUHV0cyB0aGUgZ2l2ZW4gYm9vbGVhbiBpbnRvIHRoZSBwcmVmZXJlbmNlcyB0YWJsZS4KKyAqCisgKiA8cD5UaGUga2V5IG1heSBub3QgaGF2ZSBhbnkgd2hpdGVzcGFjZSBub3IgYW4gZXF1YWxzIHNpZ248L3A+CisgKgorICogQHBhcmFtIGtleSB0aGUga2V5CisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKi8KK3ZvaWQgUHJlZmVyZW5jZXM6OlB1dEJvb2xlYW4obGx2bTo6U3RyaW5nUmVmIGtleSwgYm9vbCB2YWx1ZSkgeworICBtX3RhYmxlLT5QdXRCb29sZWFuKGtleSwgdmFsdWUpOworICBtX3RhYmxlLT5TZXRQZXJzaXN0ZW50KGtleSk7Cit9CisKKy8qKgorICogUHV0cyB0aGUgZ2l2ZW4gbG9uZyAoaW50NjRfdCkgaW50byB0aGUgcHJlZmVyZW5jZXMgdGFibGUuCisgKgorICogPHA+VGhlIGtleSBtYXkgbm90IGhhdmUgYW55IHdoaXRlc3BhY2Ugbm9yIGFuIGVxdWFscyBzaWduPC9wPgorICoKKyAqIEBwYXJhbSBrZXkgdGhlIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICovCit2b2lkIFByZWZlcmVuY2VzOjpQdXRMb25nKGxsdm06OlN0cmluZ1JlZiBrZXksIGludDY0X3QgdmFsdWUpIHsKKyAgbV90YWJsZS0+UHV0TnVtYmVyKGtleSwgdmFsdWUpOworICBtX3RhYmxlLT5TZXRQZXJzaXN0ZW50KGtleSk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBubyBsb25nZXIgcmVxdWlyZWQsIGFzIE5ldHdvcmtUYWJsZXMgYXV0b21hdGljYWxseQorICogc2F2ZXMgcGVyc2lzdGVudCB2YWx1ZXMgKHdoaWNoIGFsbCBQcmVmZXJlbmNlcyB2YWx1ZXMgYXJlKSBwZXJpb2RpY2FsbHkKKyAqIHdoZW4gcnVubmluZyBhcyBhIHNlcnZlci4KKyAqIEBkZXByZWNhdGVkIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHNoaW0KKyAqLwordm9pZCBQcmVmZXJlbmNlczo6U2F2ZSgpIHt9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIGtleSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICogQHBhcmFtIGtleSB0aGUga2V5CisgKiBAcmV0dXJuIGlmIHRoZXJlIGlzIGEgdmFsdWUgYXQgdGhlIGdpdmVuIGtleQorICovCitib29sIFByZWZlcmVuY2VzOjpDb250YWluc0tleShsbHZtOjpTdHJpbmdSZWYga2V5KSB7CisgIHJldHVybiBtX3RhYmxlLT5Db250YWluc0tleShrZXkpOworfQorCisvKioKKyAqIFJlbW92ZSBhIHByZWZlcmVuY2UKKyAqIEBwYXJhbSBrZXkgdGhlIGtleQorICovCit2b2lkIFByZWZlcmVuY2VzOjpSZW1vdmUobGx2bTo6U3RyaW5nUmVmIGtleSkgeworICBtX3RhYmxlLT5EZWxldGUoa2V5KTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9SZWxheS5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvUmVsYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZjBlZjgKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvUmVsYXkuY3BwCkBAIC0wLDAgKzEsMjkzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUKKyAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSZWxheS5oIgorCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworLy8gQWxsb2NhdGUgZWFjaCBkaXJlY3Rpb24gc2VwYXJhdGVseS4KK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UmVzb3VyY2U+IHJlbGF5Q2hhbm5lbHM7CisKKy8qKgorICogUmVsYXkgY29uc3RydWN0b3IgZ2l2ZW4gYSBjaGFubmVsLgorICoKKyAqIFRoaXMgY29kZSBpbml0aWFsaXplcyB0aGUgcmVsYXkgYW5kIHJlc2VydmVzIGFsbCByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlCisgKiBsb2NrZWQuIEluaXRpYWxseSB0aGUgcmVsYXkgaXMgc2V0IHRvIGJvdGggbGluZXMgYXQgMHYuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBudW1iZXIgKDAtMykuCisgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhhdCB0aGUgUmVsYXkgb2JqZWN0IHdpbGwgY29udHJvbC4KKyAqLworUmVsYXk6OlJlbGF5KHVpbnQzMl90IGNoYW5uZWwsIFJlbGF5OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQorICAgIDogbV9jaGFubmVsKGNoYW5uZWwpLCBtX2RpcmVjdGlvbihkaXJlY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOworICBSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QocmVsYXlDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpb19rTnVtU3lzdGVtcyAqIGtSZWxheUNoYW5uZWxzICogMik7CisgIGlmICghU2Vuc29yQmFzZTo6Q2hlY2tSZWxheUNoYW5uZWwobV9jaGFubmVsKSkgeworICAgIGJ1ZiA8PCAiUmVsYXkgQ2hhbm5lbCAiIDw8IG1fY2hhbm5lbDsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYuc3RyKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KSB7CisgICAgYnVmIDw8ICJGb3J3YXJkIFJlbGF5ICIgPDwgbV9jaGFubmVsOworICAgIGlmIChyZWxheUNoYW5uZWxzLT5BbGxvY2F0ZShtX2NoYW5uZWwgKiAyLCBidWYuc3RyKCkpID09CisgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkgeworICAgICAgQ2xvbmVFcnJvcigqcmVsYXlDaGFubmVscyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JlbGF5LCBtX2NoYW5uZWwpOworICB9CisgIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KSB7CisgICAgYnVmIDw8ICJSZXZlcnNlIFJlbGF5ICIgPDwgbV9jaGFubmVsOworICAgIGlmIChyZWxheUNoYW5uZWxzLT5BbGxvY2F0ZShtX2NoYW5uZWwgKiAyICsgMSwgYnVmLnN0cigpKSA9PQorICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpIHsKKyAgICAgIENsb25lRXJyb3IoKnJlbGF5Q2hhbm5lbHMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9SZWxheSwgbV9jaGFubmVsICsgMTI4KTsKKyAgfQorCisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2V0UmVsYXlGb3J3YXJkKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworICBzZXRSZWxheVJldmVyc2UobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCBmYWxzZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIG1fc2FmZXR5SGVscGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb3RvclNhZmV0eUhlbHBlcj4odGhpcyk7CisgIG1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKKworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRBY3R1YXRvcigiUmVsYXkiLCAxLCBtX2NoYW5uZWwsIHRoaXMpOworfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5LgorICogVGhlIHJlbGF5IGNoYW5uZWxzIGFyZSBzZXQgdG8gZnJlZSBhbmQgdGhlIHJlbGF5IG91dHB1dCBpcyB0dXJuZWQgb2ZmLgorICovCitSZWxheTo6flJlbGF5KCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNldFJlbGF5Rm9yd2FyZChtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKyAgc2V0UmVsYXlSZXZlcnNlKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKworICBpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkgeworICAgIHJlbGF5Q2hhbm5lbHMtPkZyZWUobV9jaGFubmVsICogMik7CisgIH0KKyAgaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpIHsKKyAgICByZWxheUNoYW5uZWxzLT5GcmVlKG1fY2hhbm5lbCAqIDIgKyAxKTsKKyAgfQorICBpZiAobV90YWJsZSAhPSBudWxscHRyKSBtX3RhYmxlLT5SZW1vdmVUYWJsZUxpc3RlbmVyKHRoaXMpOworfQorCisvKioKKyAqIFNldCB0aGUgcmVsYXkgc3RhdGUuCisgKgorICogVmFsaWQgdmFsdWVzIGRlcGVuZCBvbiB3aGljaCBkaXJlY3Rpb25zIG9mIHRoZSByZWxheSBhcmUgY29udHJvbGxlZCBieSB0aGUKKyAqIG9iamVjdC4KKyAqCisgKiBXaGVuIHNldCB0byBrQm90aERpcmVjdGlvbnMsIHRoZSByZWxheSBjYW4gYmUgYW55IG9mIHRoZSBmb3VyIHN0YXRlczoKKyAqIAkgMHYtMHYsIDB2LTEydiwgMTJ2LTB2LCAxMnYtMTJ2CisgKgorICogV2hlbiBzZXQgdG8ga0ZvcndhcmRPbmx5IG9yIGtSZXZlcnNlT25seSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBjb25zdGFudCBmb3IKKyAqIHRoZQorICogCSBkaXJlY3Rpb24gb3IgeW91IGNhbiBzaW1wbHkgc3BlY2lmeSBrT2ZmIGFuZCBrT24uICBVc2luZyBvbmx5IGtPZmYgYW5kCisgKiBrT24gaXMKKyAqIAkgcmVjb21tZW5kZWQuCisgKgorICogQHBhcmFtIHZhbHVlIFRoZSBzdGF0ZSB0byBzZXQgdGhlIHJlbGF5LgorICovCit2b2lkIFJlbGF5OjpTZXQoUmVsYXk6OlZhbHVlIHZhbHVlKSB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworICBpbnQzMl90IHN0YXR1cyA9IDA7CisKKyAgc3dpdGNoICh2YWx1ZSkgeworICAgIGNhc2Uga09mZjoKKyAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KSB7CisgICAgICAgIHNldFJlbGF5Rm9yd2FyZChtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KSB7CisgICAgICAgIHNldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sIGZhbHNlLCAmc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2Uga09uOgorICAgICAgaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpIHsKKyAgICAgICAgc2V0UmVsYXlGb3J3YXJkKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgdHJ1ZSwgJnN0YXR1cyk7CisgICAgICB9CisgICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkgeworICAgICAgICBzZXRSZWxheVJldmVyc2UobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCB0cnVlLCAmc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2Uga0ZvcndhcmQ6CisgICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KSB7CisgICAgICAgIHdwaV9zZXRXUElFcnJvcihJbmNvbXBhdGlibGVNb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkgeworICAgICAgICBzZXRSZWxheUZvcndhcmQobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCB0cnVlLCAmc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMpIHsKKyAgICAgICAgc2V0UmVsYXlSZXZlcnNlKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBrUmV2ZXJzZToKKyAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpIHsKKyAgICAgICAgd3BpX3NldFdQSUVycm9yKEluY29tcGF0aWJsZU1vZGUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMpIHsKKyAgICAgICAgc2V0UmVsYXlGb3J3YXJkKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgZmFsc2UsICZzdGF0dXMpOworICAgICAgfQorICAgICAgaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpIHsKKyAgICAgICAgc2V0UmVsYXlSZXZlcnNlKG1fcmVsYXlfcG9ydHNbbV9jaGFubmVsXSwgdHJ1ZSwgJnN0YXR1cyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIEdldCB0aGUgUmVsYXkgU3RhdGUKKyAqCisgKiBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZWxheS4KKyAqCisgKiBXaGVuIHNldCB0byBrRm9yd2FyZE9ubHkgb3Iga1JldmVyc2VPbmx5LCB2YWx1ZSBpcyByZXR1cm5lZCBhcyBrT24va09mZiBub3QKKyAqIGtGb3J3YXJkL2tSZXZlcnNlIChwZXIgdGhlIHJlY29tbWVuZGF0aW9uIGluIFNldCkKKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZWxheSBhcyBhIFJlbGF5OjpWYWx1ZQorICovCitSZWxheTo6VmFsdWUgUmVsYXk6OkdldCgpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXM7CisKKyAgaWYgKGdldFJlbGF5Rm9yd2FyZChtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpKSB7CisgICAgaWYgKGdldFJlbGF5UmV2ZXJzZShtX3JlbGF5X3BvcnRzW21fY2hhbm5lbF0sICZzdGF0dXMpKSB7CisgICAgICByZXR1cm4ga09uOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KSB7CisgICAgICAgIHJldHVybiBrT247CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4ga0ZvcndhcmQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZXRSZWxheVJldmVyc2UobV9yZWxheV9wb3J0c1ttX2NoYW5uZWxdLCAmc3RhdHVzKSkgeworICAgICAgaWYgKG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkgeworICAgICAgICByZXR1cm4ga09uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGtSZXZlcnNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4ga09mZjsKKyAgICB9CisgIH0KKworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKwordWludDMyX3QgUmVsYXk6OkdldENoYW5uZWwoKSBjb25zdCB7CisgIHJldHVybiBtX2NoYW5uZWw7Cit9CisKKy8qKgorICogU2V0IHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBSZWxheSBvYmplY3QKKyAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyByZWxheSBvYmplY3QKKyAqLwordm9pZCBSZWxheTo6U2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSB7CisgIG1fc2FmZXR5SGVscGVyLT5TZXRFeHBpcmF0aW9uKHRpbWVvdXQpOworfQorCisvKioKKyAqIFJldHVybiB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgcmVsYXkgb2JqZWN0LgorICogQHJldHVybiBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgorICovCitmbG9hdCBSZWxheTo6R2V0RXhwaXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7IH0KKworLyoqCisgKiBDaGVjayBpZiB0aGUgcmVsYXkgb2JqZWN0IGlzIGN1cnJlbnRseSBhbGl2ZSBvciBzdG9wcGVkIGR1ZSB0byBhIHRpbWVvdXQuCisgKiBAcmV0dXJucyBhIGJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHRoZSBtb3RvciBoYXMgTk9UIHRpbWVkIG91dCBhbmQgc2hvdWxkCisgKiBzdGlsbCBiZSBydW5uaW5nLgorICovCitib29sIFJlbGF5OjpJc0FsaXZlKCkgY29uc3QgeyByZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsgfQorCisvKioKKyAqIFN0b3AgdGhlIG1vdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFBXTSBvYmplY3QuCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0IHdoZW4gaXQgaGFzIGEgdGltZW91dCBmb3IgdGhpcworICogcmVsYXkgYW5kIG5lZWRzIHRvIHN0b3AgaXQgZnJvbSBydW5uaW5nLgorICovCit2b2lkIFJlbGF5OjpTdG9wTW90b3IoKSB7IFNldChrT2ZmKTsgfQorCisvKioKKyAqIEVuYWJsZS9kaXNhYmxlIG1vdG9yIHNhZmV0eSBmb3IgdGhpcyBkZXZpY2UKKyAqIFR1cm4gb24gYW5kIG9mZiB0aGUgbW90b3Igc2FmZXR5IG9wdGlvbiBmb3IgdGhpcyByZWxheSBvYmplY3QuCisgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKKyAqLwordm9pZCBSZWxheTo6U2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpIHsKKyAgbV9zYWZldHlIZWxwZXItPlNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgbW90b3Igc2FmZXR5IGlzIGVuYWJsZWQgZm9yIHRoaXMgb2JqZWN0CisgKiBAcmV0dXJucyBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKKyAqLworYm9vbCBSZWxheTo6SXNTYWZldHlFbmFibGVkKCkgY29uc3QgeworICByZXR1cm4gbV9zYWZldHlIZWxwZXItPklzU2FmZXR5RW5hYmxlZCgpOworfQorCit2b2lkIFJlbGF5OjpHZXREZXNjcmlwdGlvbihzdGQ6Om9zdHJpbmdzdHJlYW0mIGRlc2MpIGNvbnN0IHsKKyAgZGVzYyA8PCAiUmVsYXkgIiA8PCBHZXRDaGFubmVsKCk7Cit9CisKK3ZvaWQgUmVsYXk6OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwgYm9vbCBpc05ldykgeworICBpZiAoIXZhbHVlLT5Jc1N0cmluZygpKSByZXR1cm47CisgIGlmICh2YWx1ZS0+R2V0U3RyaW5nKCkgPT0gIk9mZiIpIFNldChrT2ZmKTsKKyAgZWxzZSBpZiAodmFsdWUtPkdldFN0cmluZygpID09ICJGb3J3YXJkIikgU2V0KGtGb3J3YXJkKTsKKyAgZWxzZSBpZiAodmFsdWUtPkdldFN0cmluZygpID09ICJSZXZlcnNlIikgU2V0KGtSZXZlcnNlKTsKKyAgZWxzZSBpZiAodmFsdWUtPkdldFN0cmluZygpID09ICJPbiIpIFNldChrT24pOworfQorCit2b2lkIFJlbGF5OjpVcGRhdGVUYWJsZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIGlmIChHZXQoKSA9PSBrT24pIHsKKyAgICAgIG1fdGFibGUtPlB1dFN0cmluZygiVmFsdWUiLCAiT24iKTsKKyAgICB9IGVsc2UgaWYgKEdldCgpID09IGtGb3J3YXJkKSB7CisgICAgICBtX3RhYmxlLT5QdXRTdHJpbmcoIlZhbHVlIiwgIkZvcndhcmQiKTsKKyAgICB9IGVsc2UgaWYgKEdldCgpID09IGtSZXZlcnNlKSB7CisgICAgICBtX3RhYmxlLT5QdXRTdHJpbmcoIlZhbHVlIiwgIlJldmVyc2UiKTsKKyAgICB9IGVsc2UgeworICAgICAgbV90YWJsZS0+UHV0U3RyaW5nKCJWYWx1ZSIsICJPZmYiKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBSZWxheTo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPkFkZFRhYmxlTGlzdGVuZXIoIlZhbHVlIiwgdGhpcywgdHJ1ZSk7CisgIH0KK30KKwordm9pZCBSZWxheTo6U3RvcExpdmVXaW5kb3dNb2RlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBSZWxheTo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeyByZXR1cm4gIlJlbGF5IjsgfQorCit2b2lkIFJlbGF5OjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YlRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBSZWxheTo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvUm9ib3RCYXNlLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9Sb2JvdEJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDFkMTMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvUm9ib3RCYXNlLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiUm9ib3RCYXNlLmgiCisKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiUm9ib3RTdGF0ZS5oIgorI2luY2x1ZGUgIkhMVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJJbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlIDxjc3RkaW8+CisKK1JvYm90QmFzZSAqUm9ib3RCYXNlOjptX2luc3RhbmNlID0gbnVsbHB0cjsKKwordm9pZCBSb2JvdEJhc2U6OnNldEluc3RhbmNlKFJvYm90QmFzZSAqcm9ib3QpIHsKKyAgd3BpX2Fzc2VydChtX2luc3RhbmNlID09IG51bGxwdHIpOworICBtX2luc3RhbmNlID0gcm9ib3Q7Cit9CisKK1JvYm90QmFzZSAmUm9ib3RCYXNlOjpnZXRJbnN0YW5jZSgpIHsgcmV0dXJuICptX2luc3RhbmNlOyB9CisKK3ZvaWQgUm9ib3RCYXNlOjpyb2JvdFNldHVwKFJvYm90QmFzZSAqcm9ib3QpIHsKKyAgcm9ib3QtPlN0YXJ0Q29tcGV0aXRpb24oKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBnZW5lcmljIHJvYm90IHByb2dyYW0uCisgKiBVc2VyIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgY29uc3RydWN0b3IgdGhhdCBydW5zIGJlZm9yZSB0aGUgQXV0b25vbW91cworICogb3IgT3BlcmF0b3IKKyAqIENvbnRyb2wgcGVyaW9kIHN0YXJ0cy4gVGhlIGNvbnN0cnVjdG9yIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gYmVmb3JlCisgKiBBdXRvbm9tb3VzIGlzIGVudGVyZWQuCisgKgorICogVGhpcyBtdXN0IGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbW11bmljYXRpb25zIGNvZGUgc3RhcnRzLiBJbiB0aGUKKyAqIGZ1dHVyZSBpdCB3b3VsZCBiZQorICogbmljZSB0byBwdXQgdGhpcyBjb2RlIGludG8gaXQncyBvd24gdGFzayB0aGF0IGxvYWRzIG9uIGJvb3Qgc28gZW5zdXJlIHRoYXQgaXQKKyAqIHJ1bnMuCisgKi8KK1JvYm90QmFzZTo6Um9ib3RCYXNlKCkgOiBtX2RzKERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCkpIHsKKyAgUm9ib3RTdGF0ZTo6U2V0SW1wbGVtZW50YXRpb24oRHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKSk7CisgIEhMVXNhZ2VSZXBvcnRpbmc6OlNldEltcGxlbWVudGF0aW9uKG5ldyBIYXJkd2FyZUhMUmVwb3J0aW5nKCkpOworCisgIFJvYm90QmFzZTo6c2V0SW5zdGFuY2UodGhpcyk7CisKKyAgTmV0d29ya1RhYmxlOjpTZXROZXR3b3JrSWRlbnRpdHkoIlJvYm90Iik7CisKKyAgRklMRSAqZmlsZSA9IG51bGxwdHI7CisgIGZpbGUgPSBmb3BlbigiL3RtcC9mcmNfdmVyc2lvbnMvRlJDX0xpYl9WZXJzaW9uLmluaSIsICJ3Iik7CisKKyAgaWYgKGZpbGUgIT0gbnVsbHB0cikgeworICAgIGZwdXRzKCIyMDE2IEMrKyBCZXRhNS4wIiwgZmlsZSk7CisgICAgZmNsb3NlKGZpbGUpOworICB9Cit9CisKKy8qKgorICogRnJlZSB0aGUgcmVzb3VyY2VzIGZvciBhIFJvYm90QmFzZSBjbGFzcy4KKyAqIFRoaXMgaW5jbHVkZXMgZGVsZXRpbmcgYWxsIGNsYXNzZXMgdGhhdCBtaWdodCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFzCisgKiBTaW5nbGV0b25zIHRvIHRoZXkKKyAqIHdvdWxkIG5ldmVyIGJlIGRlbGV0ZWQgZXhjZXB0IGhlcmUuCisgKi8KK1JvYm90QmFzZTo6flJvYm90QmFzZSgpIHsKKyAgU2Vuc29yQmFzZTo6RGVsZXRlU2luZ2xldG9ucygpOworICBkZWxldGUgbV90YXNrOworICBtX3Rhc2sgPSBudWxscHRyOworICBtX2luc3RhbmNlID0gbnVsbHB0cjsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBlbmFibGVkLgorICogQHJldHVybiBUcnVlIGlmIHRoZSBSb2JvdCBpcyBjdXJyZW50bHkgZW5hYmxlZCBieSB0aGUgZmllbGQgY29udHJvbHMuCisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtX2RzLklzRW5hYmxlZCgpOyB9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBSb2JvdCBpcyBjdXJyZW50bHkgZGlzYWJsZWQuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBkaXNhYmxlZCBieSB0aGUgZmllbGQgY29udHJvbHMuCisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc0Rpc2FibGVkKCkgY29uc3QgeyByZXR1cm4gbV9kcy5Jc0Rpc2FibGVkKCk7IH0KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBpbiBBdXRvbm9tb3VzIG1vZGUuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBvcGVyYXRpbmcgQXV0b25vbW91c2x5IGFzIGRldGVybWluZWQKKyAqIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzQXV0b25vbW91cygpIGNvbnN0IHsgcmV0dXJuIG1fZHMuSXNBdXRvbm9tb3VzKCk7IH0KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBpbiBPcGVyYXRvciBDb250cm9sIG1vZGUuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBvcGVyYXRpbmcgaW4gVGVsZS1PcCBtb2RlIGFzCisgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzT3BlcmF0b3JDb250cm9sKCkgY29uc3QgeyByZXR1cm4gbV9kcy5Jc09wZXJhdG9yQ29udHJvbCgpOyB9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgaW4gVGVzdCBtb2RlLgorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgcnVubmluZyB0ZXN0cyBhcyBkZXRlcm1pbmVkIGJ5IHRoZQorICogZmllbGQgY29udHJvbHMuCisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc1Rlc3QoKSBjb25zdCB7IHJldHVybiBtX2RzLklzVGVzdCgpOyB9CisKKy8qKgorICogSW5kaWNhdGVzIGlmIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbi4KKyAqIEByZXR1cm4gSGFzIG5ldyBkYXRhIGFycml2ZWQgb3ZlciB0aGUgbmV0d29yayBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMKKyAqIGZ1bmN0aW9uIHdhcyBjYWxsZWQ/CisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc05ld0RhdGFBdmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBtX2RzLklzTmV3Q29udHJvbERhdGEoKTsgfQorCisvKioKKyAqIFRoaXMgY2xhc3MgZXhpc3RzIGZvciB0aGUgc29sZSBwdXJwb3NlIG9mIGdldHRpbmcgaXRzIGRlc3RydWN0b3IgY2FsbGVkIHdoZW4KKyAqIHRoZSBtb2R1bGUgdW5sb2Fkcy4KKyAqIEJlZm9yZSB0aGUgbW9kdWxlIGlzIGRvbmUgdW5sb2FkaW5nLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgUm9ib3RCYXNlIGRlcml2ZWQKKyAqIHNpbmdsZXRvbi4gIFRoaXMgc2hvdWxkIGRlbGV0ZQorICogdGhlIG90aGVyIHJlbWFpbmluZyBzaW5nbGV0b25zIHRoYXQgd2VyZSByZWdpc3RlcmVkLiAgVGhpcyBzaG91bGQgYWxzbyBzdG9wCisgKiBhbGwgdGFza3MgdGhhdCBhcmUgdXNpbmcKKyAqIHRoZSBUYXNrIGNsYXNzLgorICovCitjbGFzcyBSb2JvdERlbGV0ZXIgeworIHB1YmxpYzoKKyAgUm9ib3REZWxldGVyKCkge30KKyAgflJvYm90RGVsZXRlcigpIHsgZGVsZXRlICZSb2JvdEJhc2U6OmdldEluc3RhbmNlKCk7IH0KK307CitzdGF0aWMgUm9ib3REZWxldGVyIGdfcm9ib3REZWxldGVyOwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL1JvYm90RHJpdmUuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1JvYm90RHJpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzUzZTkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvUm9ib3REcml2ZS5jcHAKQEAgLTAsMCArMSw3NTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlJvYm90RHJpdmUuaCIKKworI2luY2x1ZGUgIkNBTkphZ3Vhci5oIgorI2luY2x1ZGUgIkdlbmVyaWNISUQuaCIKKyNpbmNsdWRlICJKb3lzdGljay5oIgorI2luY2x1ZGUgIlRhbG9uLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworI3VuZGVmIG1heAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworY29uc3QgaW50MzJfdCBSb2JvdERyaXZlOjprTWF4TnVtYmVyT2ZNb3RvcnM7CisKK3N0YXRpYyBhdXRvIG1ha2Vfc2hhcmVkX25vZGVsZXRlKFNwZWVkQ29udHJvbGxlciAqcHRyKSB7CisgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPihwdHIsIE51bGxEZWxldGVyPFNwZWVkQ29udHJvbGxlcj4oKSk7Cit9CisKKy8qCisgKiBEcml2aW5nIGZ1bmN0aW9ucworICogVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIG11bHRpcGxlIG1vdG9ycyB0aGF0IGlzIHVzZWQgZm9yIEMKKyAqIHByb2dyYW1taW5nCisgKiBUaGUgRHJpdmUoc3BlZWQsIGRpcmVjdGlvbikgZnVuY3Rpb24gaXMgdGhlIG1haW4gcGFydCBvZiB0aGUgc2V0IHRoYXQgbWFrZXMKKyAqIGl0IGVhc3kKKyAqIHRvIHNldCBzcGVlZHMgYW5kIGRpcmVjdGlvbiBpbmRlcGVuZGVudGx5IGluIG9uZSBjYWxsLgorICovCisKKy8qKgorICogQ29tbW9uIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYWxsIHRoZSByb2JvdCBkcml2ZSBjb25zdHJ1Y3RvcnMuCisgKiBDcmVhdGUgYSBtb3RvciBzYWZldHkgb2JqZWN0ICh0aGUgcmVhbCByZWFzb24gZm9yIHRoZSBjb21tb24gY29kZSkgYW5kCisgKiBpbml0aWFsaXplIGFsbCB0aGUgbW90b3IgYXNzaWdubWVudHMuIFRoZSBkZWZhdWx0IHRpbWVvdXQgaXMgc2V0IGZvciB0aGUKKyAqIHJvYm90IGRyaXZlLgorICovCit2b2lkIFJvYm90RHJpdmU6OkluaXRSb2JvdERyaXZlKCkgeworICBtX3NhZmV0eUhlbHBlciA9IHN0ZDo6bWFrZV91bmlxdWU8TW90b3JTYWZldHlIZWxwZXI+KHRoaXMpOworICBtX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZCh0cnVlKTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgUm9ib3REcml2ZSB3aXRoIDIgbW90b3JzIHNwZWNpZmllZCB3aXRoIGNoYW5uZWwgbnVtYmVycy4KKyAqIFNldCB1cCBwYXJhbWV0ZXJzIGZvciBhIHR3byB3aGVlbCBkcml2ZSBzeXN0ZW0gd2hlcmUgdGhlCisgKiBsZWZ0IGFuZCByaWdodCBtb3RvciBwd20gY2hhbm5lbHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2FsbC4KKyAqIFRoaXMgY2FsbCBhc3N1bWVzIFRhbG9ucyBmb3IgY29udHJvbGxpbmcgdGhlIG1vdG9ycy4KKyAqIEBwYXJhbSBsZWZ0TW90b3JDaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIgdGhhdCBkcml2ZXMgdGhlIGxlZnQgbW90b3IuCisgKiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKiBAcGFyYW0gcmlnaHRNb3RvckNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlciB0aGF0IGRyaXZlcyB0aGUgcmlnaHQgbW90b3IuCisgKiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK1JvYm90RHJpdmU6OlJvYm90RHJpdmUodWludDMyX3QgbGVmdE1vdG9yQ2hhbm5lbCwgdWludDMyX3QgcmlnaHRNb3RvckNoYW5uZWwpIHsKKyAgSW5pdFJvYm90RHJpdmUoKTsKKyAgbV9yZWFyTGVmdE1vdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUYWxvbj4obGVmdE1vdG9yQ2hhbm5lbCk7CisgIG1fcmVhclJpZ2h0TW90b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRhbG9uPihyaWdodE1vdG9yQ2hhbm5lbCk7CisgIFNldExlZnRSaWdodE1vdG9yT3V0cHV0cygwLjAsIDAuMCk7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCA0IG1vdG9ycyBzcGVjaWZpZWQgd2l0aCBjaGFubmVsIG51bWJlcnMuCisgKiBTZXQgdXAgcGFyYW1ldGVycyBmb3IgYSBmb3VyIHdoZWVsIGRyaXZlIHN5c3RlbSB3aGVyZSBhbGwgZm91ciBtb3RvcgorICogcHdtIGNoYW5uZWxzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuCisgKiBUaGlzIGNhbGwgYXNzdW1lcyBUYWxvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBtb3RvcnMuCisgKiBAcGFyYW0gZnJvbnRMZWZ0TW90b3IgRnJvbnQgbGVmdCBtb3RvciBjaGFubmVsIG51bWJlci4gMC05IGFyZSBvbi1ib2FyZCwKKyAqIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqIEBwYXJhbSByZWFyTGVmdE1vdG9yIFJlYXIgTGVmdCBtb3RvciBjaGFubmVsIG51bWJlci4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkKKyAqIGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqIEBwYXJhbSBmcm9udFJpZ2h0TW90b3IgRnJvbnQgcmlnaHQgbW90b3IgY2hhbm5lbCBudW1iZXIuIDAtOSBhcmUgb24tYm9hcmQsCisgKiAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKiBAcGFyYW0gcmVhclJpZ2h0TW90b3IgUmVhciBSaWdodCBtb3RvciBjaGFubmVsIG51bWJlci4gMC05IGFyZSBvbi1ib2FyZCwKKyAqIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworUm9ib3REcml2ZTo6Um9ib3REcml2ZSh1aW50MzJfdCBmcm9udExlZnRNb3RvciwgdWludDMyX3QgcmVhckxlZnRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJvbnRSaWdodE1vdG9yLCB1aW50MzJfdCByZWFyUmlnaHRNb3RvcikgeworICBJbml0Um9ib3REcml2ZSgpOworICBtX3JlYXJMZWZ0TW90b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRhbG9uPihyZWFyTGVmdE1vdG9yKTsKKyAgbV9yZWFyUmlnaHRNb3RvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGFsb24+KHJlYXJSaWdodE1vdG9yKTsKKyAgbV9mcm9udExlZnRNb3RvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGFsb24+KGZyb250TGVmdE1vdG9yKTsKKyAgbV9mcm9udFJpZ2h0TW90b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRhbG9uPihmcm9udFJpZ2h0TW90b3IpOworICBTZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMoMC4wLCAwLjApOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBSb2JvdERyaXZlIHdpdGggMiBtb3RvcnMgc3BlY2lmaWVkIGFzIFNwZWVkQ29udHJvbGxlcgorICogb2JqZWN0cy4KKyAqIFRoZSBTcGVlZENvbnRyb2xsZXIgdmVyc2lvbiBvZiB0aGUgY29uc3RydWN0b3IgZW5hYmxlcyBwcm9ncmFtcyB0byB1c2UgdGhlCisgKiBSb2JvdERyaXZlIGNsYXNzZXMgd2l0aAorICogc3ViY2xhc3NlcyBvZiB0aGUgU3BlZWRDb250cm9sbGVyIG9iamVjdHMsIGZvciBleGFtcGxlLCB2ZXJzaW9ucyB3aXRoIHJhbXBpbmcKKyAqIG9yIHJlc2hhcGluZyBvZgorICogdGhlIGN1cnZlIHRvIHN1aXQgbW90b3IgYmlhcyBvciBkZWFkYmFuZCBlbGltaW5hdGlvbi4KKyAqIEBwYXJhbSBsZWZ0TW90b3IgVGhlIGxlZnQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KKyAqIEBwYXJhbSByaWdodE1vdG9yIHRoZSByaWdodCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUgdGhlIHJvYm90LgorICovCitSb2JvdERyaXZlOjpSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAqbGVmdE1vdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXIgKnJpZ2h0TW90b3IpIHsKKyAgSW5pdFJvYm90RHJpdmUoKTsKKyAgaWYgKGxlZnRNb3RvciA9PSBudWxscHRyIHx8IHJpZ2h0TW90b3IgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKyAgICBtX3JlYXJMZWZ0TW90b3IgPSBtX3JlYXJSaWdodE1vdG9yID0gbnVsbHB0cjsKKyAgICByZXR1cm47CisgIH0KKyAgbV9yZWFyTGVmdE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUobGVmdE1vdG9yKTsKKyAgbV9yZWFyUmlnaHRNb3RvciA9IG1ha2Vfc2hhcmVkX25vZGVsZXRlKHJpZ2h0TW90b3IpOworfQorCisvL1RPRE86IENoYW5nZSB0byBydmFsdWUgcmVmZXJlbmNlcyAmIG1vdmUgc3ludGF4LgorUm9ib3REcml2ZTo6Um9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgJmxlZnRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyICZyaWdodE1vdG9yKSB7CisgIEluaXRSb2JvdERyaXZlKCk7CisgIG1fcmVhckxlZnRNb3RvciA9IG1ha2Vfc2hhcmVkX25vZGVsZXRlKCZsZWZ0TW90b3IpOworICBtX3JlYXJSaWdodE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUoJnJpZ2h0TW90b3IpOworfQorCitSb2JvdERyaXZlOjpSb2JvdERyaXZlKHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IGxlZnRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gcmlnaHRNb3RvcikgeworICBJbml0Um9ib3REcml2ZSgpOworICBpZiAobGVmdE1vdG9yID09IG51bGxwdHIgfHwgcmlnaHRNb3RvciA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworICAgIG1fcmVhckxlZnRNb3RvciA9IG1fcmVhclJpZ2h0TW90b3IgPSBudWxscHRyOworICAgIHJldHVybjsKKyAgfQorICBtX3JlYXJMZWZ0TW90b3IgPSBsZWZ0TW90b3I7CisgIG1fcmVhclJpZ2h0TW90b3IgPSByaWdodE1vdG9yOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBSb2JvdERyaXZlIHdpdGggNCBtb3RvcnMgc3BlY2lmaWVkIGFzIFNwZWVkQ29udHJvbGxlcgorICogb2JqZWN0cy4KKyAqIFNwZWVkIGNvbnRyb2xsZXIgaW5wdXQgdmVyc2lvbiBvZiBSb2JvdERyaXZlIChzZWUgcHJldmlvdXMgY29tbWVudHMpLgorICogQHBhcmFtIHJlYXJMZWZ0TW90b3IgVGhlIGJhY2sgbGVmdCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUgdGhlCisgKiByb2JvdC4KKyAqIEBwYXJhbSBmcm9udExlZnRNb3RvciBUaGUgZnJvbnQgbGVmdCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUgdGhlCisgKiByb2JvdAorICogQHBhcmFtIHJlYXJSaWdodE1vdG9yIFRoZSBiYWNrIHJpZ2h0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUKKyAqIHJvYm90LgorICogQHBhcmFtIGZyb250UmlnaHRNb3RvciBUaGUgZnJvbnQgcmlnaHQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlCisgKiB0aGUgcm9ib3QuCisgKi8KK1JvYm90RHJpdmU6OlJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICpmcm9udExlZnRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyICpyZWFyTGVmdE1vdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXIgKmZyb250UmlnaHRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyICpyZWFyUmlnaHRNb3RvcikgeworICBJbml0Um9ib3REcml2ZSgpOworICBpZiAoZnJvbnRMZWZ0TW90b3IgPT0gbnVsbHB0ciB8fCByZWFyTGVmdE1vdG9yID09IG51bGxwdHIgfHwKKyAgICAgIGZyb250UmlnaHRNb3RvciA9PSBudWxscHRyIHx8IHJlYXJSaWdodE1vdG9yID09IG51bGxwdHIpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisgICAgcmV0dXJuOworICB9CisgIG1fZnJvbnRMZWZ0TW90b3IgPSBtYWtlX3NoYXJlZF9ub2RlbGV0ZShmcm9udExlZnRNb3Rvcik7CisgIG1fcmVhckxlZnRNb3RvciA9IG1ha2Vfc2hhcmVkX25vZGVsZXRlKHJlYXJMZWZ0TW90b3IpOworICBtX2Zyb250UmlnaHRNb3RvciA9IG1ha2Vfc2hhcmVkX25vZGVsZXRlKGZyb250UmlnaHRNb3Rvcik7CisgIG1fcmVhclJpZ2h0TW90b3IgPSBtYWtlX3NoYXJlZF9ub2RlbGV0ZShyZWFyUmlnaHRNb3Rvcik7Cit9CisKK1JvYm90RHJpdmU6OlJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICZmcm9udExlZnRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyICZyZWFyTGVmdE1vdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXIgJmZyb250UmlnaHRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyICZyZWFyUmlnaHRNb3RvcikgeworICBJbml0Um9ib3REcml2ZSgpOworICBtX2Zyb250TGVmdE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUoJmZyb250TGVmdE1vdG9yKTsKKyAgbV9yZWFyTGVmdE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUoJnJlYXJMZWZ0TW90b3IpOworICBtX2Zyb250UmlnaHRNb3RvciA9IG1ha2Vfc2hhcmVkX25vZGVsZXRlKCZmcm9udFJpZ2h0TW90b3IpOworICBtX3JlYXJSaWdodE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUoJnJlYXJSaWdodE1vdG9yKTsKK30KKworUm9ib3REcml2ZTo6Um9ib3REcml2ZShzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBmcm9udExlZnRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gcmVhckxlZnRNb3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gZnJvbnRSaWdodE1vdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiByZWFyUmlnaHRNb3RvcikgeworICBJbml0Um9ib3REcml2ZSgpOworICBpZiAoZnJvbnRMZWZ0TW90b3IgPT0gbnVsbHB0ciB8fCByZWFyTGVmdE1vdG9yID09IG51bGxwdHIgfHwKKyAgICAgIGZyb250UmlnaHRNb3RvciA9PSBudWxscHRyIHx8IHJlYXJSaWdodE1vdG9yID09IG51bGxwdHIpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisgICAgcmV0dXJuOworICB9CisgIG1fZnJvbnRMZWZ0TW90b3IgPSBmcm9udExlZnRNb3RvcjsKKyAgbV9yZWFyTGVmdE1vdG9yID0gcmVhckxlZnRNb3RvcjsKKyAgbV9mcm9udFJpZ2h0TW90b3IgPSBmcm9udFJpZ2h0TW90b3I7CisgIG1fcmVhclJpZ2h0TW90b3IgPSByZWFyUmlnaHRNb3RvcjsKK30KKworLyoqCisgKiBEcml2ZSB0aGUgbW90b3JzIGF0ICJvdXRwdXRNYWduaXR1ZGUiIGFuZCAiY3VydmUiLgorICogQm90aCBvdXRwdXRNYWduaXR1ZGUgYW5kIGN1cnZlIGFyZSAtMS4wIHRvICsxLjAgdmFsdWVzLCB3aGVyZSAwLjAgcmVwcmVzZW50cworICogc3RvcHBlZCBhbmQgbm90IHR1cm5pbmcuIGN1cnZlIDwgMCB3aWxsIHR1cm4gbGVmdCBhbmQgY3VydmUgPiAwIHdpbGwgdHVybgorICogcmlnaHQuCisgKgorICogVGhlIGFsZ29yaXRobSBmb3Igc3RlZXJpbmcgcHJvdmlkZXMgYSBjb25zdGFudCB0dXJuIHJhZGl1cyBmb3IgYW55IG5vcm1hbAorICogc3BlZWQgcmFuZ2UsIGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmQuIEluY3JlYXNpbmcgbV9zZW5zaXRpdml0eSBjYXVzZXMKKyAqIHNoYXJwZXIgdHVybnMgZm9yIGZpeGVkIHZhbHVlcyBvZiBjdXJ2ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbW9zdCBsaWtlbHkgYmUgdXNlZCBpbiBhbiBhdXRvbm9tb3VzIHJvdXRpbmUuCisgKgorICogQHBhcmFtIG91dHB1dE1hZ25pdHVkZSBUaGUgc3BlZWQgc2V0dGluZyBmb3IgdGhlIG91dHNpZGUgd2hlZWwgaW4gYSB0dXJuLAorICogICAgICAgIGZvcndhcmQgb3IgYmFja3dhcmRzLCArMSB0byAtMS4KKyAqIEBwYXJhbSBjdXJ2ZSBUaGUgcmF0ZSBvZiB0dXJuLCBjb25zdGFudCBmb3IgZGlmZmVyZW50IGZvcndhcmQgc3BlZWRzLiBTZXQKKyAqICAgICAgICBjdXJ2ZSA8IDAgZm9yIGxlZnQgdHVybiBvciBjdXJ2ZSA+IDAgZm9yIHJpZ2h0IHR1cm4uCisgKiBTZXQgY3VydmUgPSBlXigtci93KSB0byBnZXQgYSB0dXJuIHJhZGl1cyByIGZvciB3aGVlbGJhc2UgdyBvZiB5b3VyIHJvYm90LgorICogQ29udmVyc2VseSwgdHVybiByYWRpdXMgciA9IC1sbihjdXJ2ZSkqdyBmb3IgYSBnaXZlbiB2YWx1ZSBvZiBjdXJ2ZSBhbmQKKyAqIHdoZWVsYmFzZSB3LgorICovCit2b2lkIFJvYm90RHJpdmU6OkRyaXZlKGZsb2F0IG91dHB1dE1hZ25pdHVkZSwgZmxvYXQgY3VydmUpIHsKKyAgZmxvYXQgbGVmdE91dHB1dCwgcmlnaHRPdXRwdXQ7CisgIHN0YXRpYyBib29sIHJlcG9ydGVkID0gZmFsc2U7CisgIGlmICghcmVwb3J0ZWQpIHsKKyAgICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksCisgICAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9BcmNhZGVSYXRpb0N1cnZlKTsKKyAgICByZXBvcnRlZCA9IHRydWU7CisgIH0KKworICBpZiAoY3VydmUgPCAwKSB7CisgICAgZmxvYXQgdmFsdWUgPSBsb2coLWN1cnZlKTsKKyAgICBmbG9hdCByYXRpbyA9ICh2YWx1ZSAtIG1fc2Vuc2l0aXZpdHkpIC8gKHZhbHVlICsgbV9zZW5zaXRpdml0eSk7CisgICAgaWYgKHJhdGlvID09IDApIHJhdGlvID0gLjAwMDAwMDAwMDE7CisgICAgbGVmdE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZSAvIHJhdGlvOworICAgIHJpZ2h0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOworICB9IGVsc2UgaWYgKGN1cnZlID4gMCkgeworICAgIGZsb2F0IHZhbHVlID0gbG9nKGN1cnZlKTsKKyAgICBmbG9hdCByYXRpbyA9ICh2YWx1ZSAtIG1fc2Vuc2l0aXZpdHkpIC8gKHZhbHVlICsgbV9zZW5zaXRpdml0eSk7CisgICAgaWYgKHJhdGlvID09IDApIHJhdGlvID0gLjAwMDAwMDAwMDE7CisgICAgbGVmdE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZTsKKyAgICByaWdodE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZSAvIHJhdGlvOworICB9IGVsc2UgeworICAgIGxlZnRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7CisgICAgcmlnaHRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7CisgIH0KKyAgU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGxlZnRPdXRwdXQsIHJpZ2h0T3V0cHV0KTsKK30KKworLyoqCisgKiBQcm92aWRlIHRhbmsgc3RlZXJpbmcgdXNpbmcgdGhlIHN0b3JlZCByb2JvdCBjb25maWd1cmF0aW9uLgorICogRHJpdmUgdGhlIHJvYm90IHVzaW5nIHR3byBqb3lzdGljayBpbnB1dHMuIFRoZSBZLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmcm9tCisgKiBlYWNoIEpveXN0aWNrIG9iamVjdC4KKyAqIEBwYXJhbSBsZWZ0U3RpY2sgVGhlIGpveXN0aWNrIHRvIGNvbnRyb2wgdGhlIGxlZnQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKiBAcGFyYW0gcmlnaHRTdGljayBUaGUgam95c3RpY2sgdG8gY29udHJvbCB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQgKmxlZnRTdGljaywgR2VuZXJpY0hJRCAqcmlnaHRTdGljaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgeworICBpZiAobGVmdFN0aWNrID09IG51bGxwdHIgfHwgcmlnaHRTdGljayA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworICAgIHJldHVybjsKKyAgfQorICBUYW5rRHJpdmUobGVmdFN0aWNrLT5HZXRZKCksIHJpZ2h0U3RpY2stPkdldFkoKSwgc3F1YXJlZElucHV0cyk7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQgJmxlZnRTdGljaywgR2VuZXJpY0hJRCAmcmlnaHRTdGljaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgeworICBUYW5rRHJpdmUobGVmdFN0aWNrLkdldFkoKSwgcmlnaHRTdGljay5HZXRZKCksIHNxdWFyZWRJbnB1dHMpOworfQorCisvKioKKyAqIFByb3ZpZGUgdGFuayBzdGVlcmluZyB1c2luZyB0aGUgc3RvcmVkIHJvYm90IGNvbmZpZ3VyYXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGxldHMgeW91IHBpY2sgdGhlIGF4aXMgdG8gYmUgdXNlZCBvbiBlYWNoIEpveXN0aWNrIG9iamVjdCBmb3IKKyAqIHRoZSBsZWZ0CisgKiBhbmQgcmlnaHQgc2lkZXMgb2YgdGhlIHJvYm90LgorICogQHBhcmFtIGxlZnRTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIGxlZnQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKiBAcGFyYW0gbGVmdEF4aXMgVGhlIGF4aXMgdG8gc2VsZWN0IG9uIHRoZSBsZWZ0IHNpZGUgSm95c3RpY2sgb2JqZWN0LgorICogQHBhcmFtIHJpZ2h0U3RpY2sgVGhlIEpveXN0aWNrIG9iamVjdCB0byB1c2UgZm9yIHRoZSByaWdodCBzaWRlIG9mIHRoZSByb2JvdC4KKyAqIEBwYXJhbSByaWdodEF4aXMgVGhlIGF4aXMgdG8gc2VsZWN0IG9uIHRoZSByaWdodCBzaWRlIEpveXN0aWNrIG9iamVjdC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpUYW5rRHJpdmUoR2VuZXJpY0hJRCAqbGVmdFN0aWNrLCB1aW50MzJfdCBsZWZ0QXhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNISUQgKnJpZ2h0U3RpY2ssIHVpbnQzMl90IHJpZ2h0QXhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgeworICBpZiAobGVmdFN0aWNrID09IG51bGxwdHIgfHwgcmlnaHRTdGljayA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworICAgIHJldHVybjsKKyAgfQorICBUYW5rRHJpdmUobGVmdFN0aWNrLT5HZXRSYXdBeGlzKGxlZnRBeGlzKSwgcmlnaHRTdGljay0+R2V0UmF3QXhpcyhyaWdodEF4aXMpLAorICAgICAgICAgICAgc3F1YXJlZElucHV0cyk7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQgJmxlZnRTdGljaywgdWludDMyX3QgbGVmdEF4aXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljSElEICZyaWdodFN0aWNrLCB1aW50MzJfdCByaWdodEF4aXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKKyAgVGFua0RyaXZlKGxlZnRTdGljay5HZXRSYXdBeGlzKGxlZnRBeGlzKSwgcmlnaHRTdGljay5HZXRSYXdBeGlzKHJpZ2h0QXhpcyksCisgICAgICAgICAgICBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBQcm92aWRlIHRhbmsgc3RlZXJpbmcgdXNpbmcgdGhlIHN0b3JlZCByb2JvdCBjb25maWd1cmF0aW9uLgorICogVGhpcyBmdW5jdGlvbiBsZXRzIHlvdSBkaXJlY3RseSBwcm92aWRlIGpveXN0aWNrIHZhbHVlcyBmcm9tIGFueSBzb3VyY2UuCisgKiBAcGFyYW0gbGVmdFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbGVmdCBzdGljay4KKyAqIEBwYXJhbSByaWdodFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcmlnaHQgc3RpY2suCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKGZsb2F0IGxlZnRWYWx1ZSwgZmxvYXQgcmlnaHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgeworICBzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOworICBpZiAoIXJlcG9ydGVkKSB7CisgICAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIEdldE51bU1vdG9ycygpLAorICAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfVGFuayk7CisgICAgcmVwb3J0ZWQgPSB0cnVlOworICB9CisKKyAgLy8gc3F1YXJlIHRoZSBpbnB1dHMgKHdoaWxlIHByZXNlcnZpbmcgdGhlIHNpZ24pIHRvIGluY3JlYXNlIGZpbmUgY29udHJvbAorICAvLyB3aGlsZSBwZXJtaXR0aW5nIGZ1bGwgcG93ZXIKKyAgbGVmdFZhbHVlID0gTGltaXQobGVmdFZhbHVlKTsKKyAgcmlnaHRWYWx1ZSA9IExpbWl0KHJpZ2h0VmFsdWUpOworICBpZiAoc3F1YXJlZElucHV0cykgeworICAgIGlmIChsZWZ0VmFsdWUgPj0gMC4wKSB7CisgICAgICBsZWZ0VmFsdWUgPSAobGVmdFZhbHVlICogbGVmdFZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgbGVmdFZhbHVlID0gLShsZWZ0VmFsdWUgKiBsZWZ0VmFsdWUpOworICAgIH0KKyAgICBpZiAocmlnaHRWYWx1ZSA+PSAwLjApIHsKKyAgICAgIHJpZ2h0VmFsdWUgPSAocmlnaHRWYWx1ZSAqIHJpZ2h0VmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICByaWdodFZhbHVlID0gLShyaWdodFZhbHVlICogcmlnaHRWYWx1ZSk7CisgICAgfQorICB9CisKKyAgU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7Cit9CisKKy8qKgorICogQXJjYWRlIGRyaXZlIGltcGxlbWVudHMgc2luZ2xlIHN0aWNrIGRyaXZpbmcuCisgKiBHaXZlbiBhIHNpbmdsZSBKb3lzdGljaywgdGhlIGNsYXNzIGFzc3VtZXMgdGhlIFkgYXhpcyBmb3IgdGhlIG1vdmUgdmFsdWUgYW5kCisgKiB0aGUgWCBheGlzCisgKiBmb3IgdGhlIHJvdGF0ZSB2YWx1ZS4KKyAqIChTaG91bGQgYWRkIG1vcmUgaW5mb3JtYXRpb24gaGVyZSByZWdhcmRpbmcgdGhlIHdheSB0aGF0IGFyY2FkZSBkcml2ZSB3b3Jrcy4pCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHRvIHVzZSBmb3IgQXJjYWRlIHNpbmdsZS1zdGljayBkcml2aW5nLiBUaGUgWS1heGlzCisgKiB3aWxsIGJlIHNlbGVjdGVkCisgKiBmb3IgZm9yd2FyZHMvYmFja3dhcmRzIGFuZCB0aGUgWC1heGlzIHdpbGwgYmUgc2VsZWN0ZWQgZm9yIHJvdGF0aW9uIHJhdGUuCisgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiB0cnVlLCB0aGUgc2Vuc2l0aXZpdHkgd2lsbCBiZSBpbmNyZWFzZWQgZm9yIHNtYWxsCisgKiB2YWx1ZXMKKyAqLwordm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShHZW5lcmljSElEICpzdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzKSB7CisgIC8vIHNpbXBseSBjYWxsIHRoZSBmdWxsLWZlYXR1cmVkIEFyY2FkZURyaXZlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcworICBBcmNhZGVEcml2ZShzdGljay0+R2V0WSgpLCBzdGljay0+R2V0WCgpLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIEdpdmVuIGEgc2luZ2xlIEpveXN0aWNrLCB0aGUgY2xhc3MgYXNzdW1lcyB0aGUgWSBheGlzIGZvciB0aGUgbW92ZSB2YWx1ZSBhbmQKKyAqIHRoZSBYIGF4aXMKKyAqIGZvciB0aGUgcm90YXRlIHZhbHVlLgorICogKFNob3VsZCBhZGQgbW9yZSBpbmZvcm1hdGlvbiBoZXJlIHJlZ2FyZGluZyB0aGUgd2F5IHRoYXQgYXJjYWRlIGRyaXZlIHdvcmtzLikKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgdG8gdXNlIGZvciBBcmNhZGUgc2luZ2xlLXN0aWNrIGRyaXZpbmcuIFRoZSBZLWF4aXMKKyAqIHdpbGwgYmUgc2VsZWN0ZWQKKyAqIGZvciBmb3J3YXJkcy9iYWNrd2FyZHMgYW5kIHRoZSBYLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmb3Igcm90YXRpb24gcmF0ZS4KKyAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIElmIHRydWUsIHRoZSBzZW5zaXRpdml0eSB3aWxsIGJlIGluY3JlYXNlZCBmb3Igc21hbGwKKyAqIHZhbHVlcworICovCit2b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQgJnN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMpIHsKKyAgLy8gc2ltcGx5IGNhbGwgdGhlIGZ1bGwtZmVhdHVyZWQgQXJjYWRlRHJpdmUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzCisgIEFyY2FkZURyaXZlKHN0aWNrLkdldFkoKSwgc3RpY2suR2V0WCgpLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIEdpdmVuIHR3byBqb3lzdGljayBpbnN0YW5jZXMgYW5kIHR3byBheGlzLCBjb21wdXRlIHRoZSB2YWx1ZXMgdG8gc2VuZCB0bworICogZWl0aGVyIHR3bworICogb3IgZm91ciBtb3RvcnMuCisgKiBAcGFyYW0gbW92ZVN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBmb3J3YXJkL2JhY2t3YXJkCisgKiBkaXJlY3Rpb24KKyAqIEBwYXJhbSBtb3ZlQXhpcyBUaGUgYXhpcyBvbiB0aGUgbW92ZVN0aWNrIG9iamVjdCB0byB1c2UgZm9yIGZvd2FyZHMvYmFja3dhcmRzCisgKiAodHlwaWNhbGx5IFlfQVhJUykKKyAqIEBwYXJhbSByb3RhdGVTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcm90YXRpb24gdmFsdWUKKyAqIEBwYXJhbSByb3RhdGVBeGlzIFRoZSBheGlzIG9uIHRoZSByb3RhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgcm90YXRlCisgKiByaWdodC9sZWZ0ICh0eXBpY2FsbHkgWF9BWElTKQorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGluY3JlYXNlcyB0aGUgc2Vuc2l0aXZpdHkKKyAqIGF0IGxvd2VyIHNwZWVkcworICovCit2b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQgKm1vdmVTdGljaywgdWludDMyX3QgbW92ZUF4aXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNISUQgKnJvdGF0ZVN0aWNrLCB1aW50MzJfdCByb3RhdGVBeGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKKyAgZmxvYXQgbW92ZVZhbHVlID0gbW92ZVN0aWNrLT5HZXRSYXdBeGlzKG1vdmVBeGlzKTsKKyAgZmxvYXQgcm90YXRlVmFsdWUgPSByb3RhdGVTdGljay0+R2V0UmF3QXhpcyhyb3RhdGVBeGlzKTsKKworICBBcmNhZGVEcml2ZShtb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIEdpdmVuIHR3byBqb3lzdGljayBpbnN0YW5jZXMgYW5kIHR3byBheGlzLCBjb21wdXRlIHRoZSB2YWx1ZXMgdG8gc2VuZCB0bworICogZWl0aGVyIHR3bworICogb3IgZm91ciBtb3RvcnMuCisgKiBAcGFyYW0gbW92ZVN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBmb3J3YXJkL2JhY2t3YXJkCisgKiBkaXJlY3Rpb24KKyAqIEBwYXJhbSBtb3ZlQXhpcyBUaGUgYXhpcyBvbiB0aGUgbW92ZVN0aWNrIG9iamVjdCB0byB1c2UgZm9yIGZvd2FyZHMvYmFja3dhcmRzCisgKiAodHlwaWNhbGx5IFlfQVhJUykKKyAqIEBwYXJhbSByb3RhdGVTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcm90YXRpb24gdmFsdWUKKyAqIEBwYXJhbSByb3RhdGVBeGlzIFRoZSBheGlzIG9uIHRoZSByb3RhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgcm90YXRlCisgKiByaWdodC9sZWZ0ICh0eXBpY2FsbHkgWF9BWElTKQorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGluY3JlYXNlcyB0aGUgc2Vuc2l0aXZpdHkKKyAqIGF0IGxvd2VyIHNwZWVkcworICovCisKK3ZvaWQgUm9ib3REcml2ZTo6QXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAmbW92ZVN0aWNrLCB1aW50MzJfdCBtb3ZlQXhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpY0hJRCAmcm90YXRlU3RpY2ssIHVpbnQzMl90IHJvdGF0ZUF4aXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgeworICBmbG9hdCBtb3ZlVmFsdWUgPSBtb3ZlU3RpY2suR2V0UmF3QXhpcyhtb3ZlQXhpcyk7CisgIGZsb2F0IHJvdGF0ZVZhbHVlID0gcm90YXRlU3RpY2suR2V0UmF3QXhpcyhyb3RhdGVBeGlzKTsKKworICBBcmNhZGVEcml2ZShtb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkgcHJvdmlkZSBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLgorICogQHBhcmFtIG1vdmVWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIGZvciBmb3dhcmRzL2JhY2t3YXJkcworICogQHBhcmFtIHJvdGF0ZVZhbHVlIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByb3RhdGUgcmlnaHQvbGVmdAorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgSWYgc2V0LCBpbmNyZWFzZXMgdGhlIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMKKyAqLwordm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShmbG9hdCBtb3ZlVmFsdWUsIGZsb2F0IHJvdGF0ZVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKKyAgc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKKyAgaWYgKCFyZXBvcnRlZCkgeworICAgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCBHZXROdW1Nb3RvcnMoKSwKKyAgICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtSb2JvdERyaXZlX0FyY2FkZVN0YW5kYXJkKTsKKyAgICByZXBvcnRlZCA9IHRydWU7CisgIH0KKworICAvLyBsb2NhbCB2YXJpYWJsZXMgdG8gaG9sZCB0aGUgY29tcHV0ZWQgUFdNIHZhbHVlcyBmb3IgdGhlIG1vdG9ycworICBmbG9hdCBsZWZ0TW90b3JPdXRwdXQ7CisgIGZsb2F0IHJpZ2h0TW90b3JPdXRwdXQ7CisKKyAgbW92ZVZhbHVlID0gTGltaXQobW92ZVZhbHVlKTsKKyAgcm90YXRlVmFsdWUgPSBMaW1pdChyb3RhdGVWYWx1ZSk7CisKKyAgaWYgKHNxdWFyZWRJbnB1dHMpIHsKKyAgICAvLyBzcXVhcmUgdGhlIGlucHV0cyAod2hpbGUgcHJlc2VydmluZyB0aGUgc2lnbikgdG8gaW5jcmVhc2UgZmluZSBjb250cm9sCisgICAgLy8gd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyCisgICAgaWYgKG1vdmVWYWx1ZSA+PSAwLjApIHsKKyAgICAgIG1vdmVWYWx1ZSA9IChtb3ZlVmFsdWUgKiBtb3ZlVmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICBtb3ZlVmFsdWUgPSAtKG1vdmVWYWx1ZSAqIG1vdmVWYWx1ZSk7CisgICAgfQorICAgIGlmIChyb3RhdGVWYWx1ZSA+PSAwLjApIHsKKyAgICAgIHJvdGF0ZVZhbHVlID0gKHJvdGF0ZVZhbHVlICogcm90YXRlVmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICByb3RhdGVWYWx1ZSA9IC0ocm90YXRlVmFsdWUgKiByb3RhdGVWYWx1ZSk7CisgICAgfQorICB9CisKKyAgaWYgKG1vdmVWYWx1ZSA+IDAuMCkgeworICAgIGlmIChyb3RhdGVWYWx1ZSA+IDAuMCkgeworICAgICAgbGVmdE1vdG9yT3V0cHV0ID0gbW92ZVZhbHVlIC0gcm90YXRlVmFsdWU7CisgICAgICByaWdodE1vdG9yT3V0cHV0ID0gc3RkOjptYXgobW92ZVZhbHVlLCByb3RhdGVWYWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxlZnRNb3Rvck91dHB1dCA9IHN0ZDo6bWF4KG1vdmVWYWx1ZSwgLXJvdGF0ZVZhbHVlKTsKKyAgICAgIHJpZ2h0TW90b3JPdXRwdXQgPSBtb3ZlVmFsdWUgKyByb3RhdGVWYWx1ZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHJvdGF0ZVZhbHVlID4gMC4wKSB7CisgICAgICBsZWZ0TW90b3JPdXRwdXQgPSAtc3RkOjptYXgoLW1vdmVWYWx1ZSwgcm90YXRlVmFsdWUpOworICAgICAgcmlnaHRNb3Rvck91dHB1dCA9IG1vdmVWYWx1ZSArIHJvdGF0ZVZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICBsZWZ0TW90b3JPdXRwdXQgPSBtb3ZlVmFsdWUgLSByb3RhdGVWYWx1ZTsKKyAgICAgIHJpZ2h0TW90b3JPdXRwdXQgPSAtc3RkOjptYXgoLW1vdmVWYWx1ZSwgLXJvdGF0ZVZhbHVlKTsKKyAgICB9CisgIH0KKyAgU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGxlZnRNb3Rvck91dHB1dCwgcmlnaHRNb3Rvck91dHB1dCk7Cit9CisKKy8qKgorICogRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLgorICoKKyAqIEEgbWV0aG9kIGZvciBkcml2aW5nIHdpdGggTWVjYW51bSB3aGVlbGVkIHJvYm90cy4gVGhlcmUgYXJlIDQgd2hlZWxzCisgKiBvbiB0aGUgcm9ib3QsIGFycmFuZ2VkIHNvIHRoYXQgdGhlIGZyb250IGFuZCBiYWNrIHdoZWVscyBhcmUgdG9lZCBpbiA0NQorICogZGVncmVlcy4KKyAqIFdoZW4gbG9va2luZyBhdCB0aGUgd2hlZWxzIGZyb20gdGhlIHRvcCwgdGhlIHJvbGxlciBheGxlcyBzaG91bGQgZm9ybSBhbiBYCisgKiBhY3Jvc3MgdGhlIHJvYm90LgorICoKKyAqIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgZGlyZWN0bHkgZHJpdmVuIGJ5IGpveXN0aWNrIGF4ZXMuCisgKgorICogQHBhcmFtIHggVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiB0aGUgWCBkaXJlY3Rpb24uCisgKiBbLTEuMC4uMS4wXQorICogQHBhcmFtIHkgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiB0aGUgWSBkaXJlY3Rpb24uCisgKiBUaGlzIGlucHV0IGlzIGludmVydGVkIHRvIG1hdGNoIHRoZSBmb3J3YXJkID09IC0xLjAgdGhhdCBqb3lzdGlja3MgcHJvZHVjZS4KKyAqIFstMS4wLi4xLjBdCisgKiBAcGFyYW0gcm90YXRpb24gVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkKKyAqIGluZGVwZW5kZW50IG9mCisgKiB0aGUgdHJhbnNsYXRpb24uIFstMS4wLi4xLjBdCisgKiBAcGFyYW0gZ3lyb0FuZ2xlIFRoZSBjdXJyZW50IGFuZ2xlIHJlYWRpbmcgZnJvbSB0aGUgZ3lyby4gIFVzZSB0aGlzIHRvCisgKiBpbXBsZW1lbnQgZmllbGQtb3JpZW50ZWQgY29udHJvbHMuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6TWVjYW51bURyaXZlX0NhcnRlc2lhbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBneXJvQW5nbGUpIHsKKyAgc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKKyAgaWYgKCFyZXBvcnRlZCkgeworICAgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCBHZXROdW1Nb3RvcnMoKSwKKyAgICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4pOworICAgIHJlcG9ydGVkID0gdHJ1ZTsKKyAgfQorCisgIGRvdWJsZSB4SW4gPSB4OworICBkb3VibGUgeUluID0geTsKKyAgLy8gTmVnYXRlIHkgZm9yIHRoZSBqb3lzdGljay4KKyAgeUluID0gLXlJbjsKKyAgLy8gQ29tcGVuc3RhdGUgZm9yIGd5cm8gYW5nbGUuCisgIFJvdGF0ZVZlY3Rvcih4SW4sIHlJbiwgZ3lyb0FuZ2xlKTsKKworICBkb3VibGUgd2hlZWxTcGVlZHNba01heE51bWJlck9mTW90b3JzXTsKKyAgd2hlZWxTcGVlZHNba0Zyb250TGVmdE1vdG9yXSA9IHhJbiArIHlJbiArIHJvdGF0aW9uOworICB3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSA9IC14SW4gKyB5SW4gLSByb3RhdGlvbjsKKyAgd2hlZWxTcGVlZHNba1JlYXJMZWZ0TW90b3JdID0gLXhJbiArIHlJbiArIHJvdGF0aW9uOworICB3aGVlbFNwZWVkc1trUmVhclJpZ2h0TW90b3JdID0geEluICsgeUluIC0gcm90YXRpb247CisKKyAgTm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKKworICBtX2Zyb250TGVmdE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba0Zyb250TGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW5jR3JvdXApOworICBtX2Zyb250UmlnaHRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tGcm9udFJpZ2h0TW90b3JdICogbV9tYXhPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW5jR3JvdXApOworICBtX3JlYXJMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gKiBtX21heE91dHB1dCwgbV9zeW5jR3JvdXApOworICBtX3JlYXJSaWdodE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba1JlYXJSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW5jR3JvdXApOworCisgIGlmIChtX3N5bmNHcm91cCAhPSAwKSB7CisgICAgQ0FOSmFndWFyOjpVcGRhdGVTeW5jR3JvdXAobV9zeW5jR3JvdXApOworICB9CisKKyAgbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KKworLyoqCisgKiBEcml2ZSBtZXRob2QgZm9yIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuCisgKgorICogQSBtZXRob2QgZm9yIGRyaXZpbmcgd2l0aCBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLiBUaGVyZSBhcmUgNCB3aGVlbHMKKyAqIG9uIHRoZSByb2JvdCwgYXJyYW5nZWQgc28gdGhhdCB0aGUgZnJvbnQgYW5kIGJhY2sgd2hlZWxzIGFyZSB0b2VkIGluIDQ1CisgKiBkZWdyZWVzLgorICogV2hlbiBsb29raW5nIGF0IHRoZSB3aGVlbHMgZnJvbSB0aGUgdG9wLCB0aGUgcm9sbGVyIGF4bGVzIHNob3VsZCBmb3JtIGFuIFgKKyAqIGFjcm9zcyB0aGUgcm9ib3QuCisgKgorICogQHBhcmFtIG1hZ25pdHVkZSBUaGUgc3BlZWQgdGhhdCB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlIGluIGEgZ2l2ZW4gZGlyZWN0aW9uLgorICogWy0xLjAuLjEuMF0KKyAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlIGluIGRlZ3JlZXMuIFRoZQorICogZGlyZWN0aW9uIGFuZCBtYWdpbml0dXRlIGFyZQorICogaW5kZXBlbmRlbnQgb2YgdGhlIHJvdGF0aW9uIHJhdGUuCisgKiBAcGFyYW0gcm90YXRpb24gVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkKKyAqIGluZGVwZW5kZW50IG9mCisgKiB0aGUgbWFnbml0dXRlIG9yIGRpcmVjdGlvbi4gWy0xLjAuLjEuMF0KKyAqLwordm9pZCBSb2JvdERyaXZlOjpNZWNhbnVtRHJpdmVfUG9sYXIoZmxvYXQgbWFnbml0dWRlLCBmbG9hdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByb3RhdGlvbikgeworICBzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOworICBpZiAoIXJlcG9ydGVkKSB7CisgICAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIEdldE51bU1vdG9ycygpLAorICAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfTWVjYW51bVBvbGFyKTsKKyAgICByZXBvcnRlZCA9IHRydWU7CisgIH0KKworICAvLyBOb3JtYWxpemVkIGZvciBmdWxsIHBvd2VyIGFsb25nIHRoZSBDYXJ0ZXNpYW4gYXhlcy4KKyAgbWFnbml0dWRlID0gTGltaXQobWFnbml0dWRlKSAqIHNxcnQoMi4wKTsKKyAgLy8gVGhlIHJvbGxlcnMgYXJlIGF0IDQ1IGRlZ3JlZSBhbmdsZXMuCisgIGRvdWJsZSBkaXJJblJhZCA9IChkaXJlY3Rpb24gKyA0NS4wKSAqIDMuMTQxNTkgLyAxODAuMDsKKyAgZG91YmxlIGNvc0QgPSBjb3MoZGlySW5SYWQpOworICBkb3VibGUgc2luRCA9IHNpbihkaXJJblJhZCk7CisKKyAgZG91YmxlIHdoZWVsU3BlZWRzW2tNYXhOdW1iZXJPZk1vdG9yc107CisgIHdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gPSBzaW5EICogbWFnbml0dWRlICsgcm90YXRpb247CisgIHdoZWVsU3BlZWRzW2tGcm9udFJpZ2h0TW90b3JdID0gY29zRCAqIG1hZ25pdHVkZSAtIHJvdGF0aW9uOworICB3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gPSBjb3NEICogbWFnbml0dWRlICsgcm90YXRpb247CisgIHdoZWVsU3BlZWRzW2tSZWFyUmlnaHRNb3Rvcl0gPSBzaW5EICogbWFnbml0dWRlIC0gcm90YXRpb247CisKKyAgTm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKKworICBtX2Zyb250TGVmdE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba0Zyb250TGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW5jR3JvdXApOworICBtX2Zyb250UmlnaHRNb3Rvci0+U2V0KHdoZWVsU3BlZWRzW2tGcm9udFJpZ2h0TW90b3JdICogbV9tYXhPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW5jR3JvdXApOworICBtX3JlYXJMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gKiBtX21heE91dHB1dCwgbV9zeW5jR3JvdXApOworICBtX3JlYXJSaWdodE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba1JlYXJSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW5jR3JvdXApOworCisgIGlmIChtX3N5bmNHcm91cCAhPSAwKSB7CisgICAgQ0FOSmFndWFyOjpVcGRhdGVTeW5jR3JvdXAobV9zeW5jR3JvdXApOworICB9CisKKyAgbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KKworLyoqCisgKiBIb2xvbm9taWMgRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLgorICoKKyAqIFRoaXMgaXMgYW4gYWxpYXMgdG8gTWVjYW51bURyaXZlX1BvbGFyKCkgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkKKyAqCisgKiBAcGFyYW0gbWFnbml0dWRlIFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gYSBnaXZlbiBkaXJlY3Rpb24uCisgKiBbLTEuMC4uMS4wXQorICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRoZSByb2JvdCBzaG91bGQgZHJpdmUuIFRoZSBkaXJlY3Rpb24gYW5kCisgKiBtYWdpbml0dXRlIGFyZQorICogaW5kZXBlbmRlbnQgb2YgdGhlIHJvdGF0aW9uIHJhdGUuCisgKiBAcGFyYW0gcm90YXRpb24gVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkKKyAqIGluZGVwZW5kZW50IG9mCisgKiB0aGUgbWFnbml0dXRlIG9yIGRpcmVjdGlvbi4gIFstMS4wLi4xLjBdCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6SG9sb25vbWljRHJpdmUoZmxvYXQgbWFnbml0dWRlLCBmbG9hdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJvdGF0aW9uKSB7CisgIE1lY2FudW1Ecml2ZV9Qb2xhcihtYWduaXR1ZGUsIGRpcmVjdGlvbiwgcm90YXRpb24pOworfQorCisvKiogU2V0IHRoZSBzcGVlZCBvZiB0aGUgcmlnaHQgYW5kIGxlZnQgbW90b3JzLgorICogVGhpcyBpcyB1c2VkIG9uY2UgYW4gYXBwcm9wcmlhdGUgZHJpdmUgc2V0dXAgZnVuY3Rpb24gaXMgY2FsbGVkIHN1Y2ggYXMKKyAqIFR3b1doZWVsRHJpdmUoKS4gVGhlIG1vdG9ycyBhcmUgc2V0IHRvICJsZWZ0T3V0cHV0IiBhbmQgInJpZ2h0T3V0cHV0IgorICogYW5kIGluY2x1ZGVzIGZsaXBwaW5nIHRoZSBkaXJlY3Rpb24gb2Ygb25lIHNpZGUgZm9yIG9wcG9zaW5nIG1vdG9ycy4KKyAqIEBwYXJhbSBsZWZ0T3V0cHV0IFRoZSBzcGVlZCB0byBzZW5kIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJvYm90LgorICogQHBhcmFtIHJpZ2h0T3V0cHV0IFRoZSBzcGVlZCB0byBzZW5kIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSByb2JvdC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMoZmxvYXQgbGVmdE91dHB1dCwgZmxvYXQgcmlnaHRPdXRwdXQpIHsKKyAgd3BpX2Fzc2VydChtX3JlYXJMZWZ0TW90b3IgIT0gbnVsbHB0ciAmJiBtX3JlYXJSaWdodE1vdG9yICE9IG51bGxwdHIpOworCisgIGlmIChtX2Zyb250TGVmdE1vdG9yICE9IG51bGxwdHIpCisgICAgbV9mcm9udExlZnRNb3Rvci0+U2V0KExpbWl0KGxlZnRPdXRwdXQpICogbV9tYXhPdXRwdXQsIG1fc3luY0dyb3VwKTsKKyAgbV9yZWFyTGVmdE1vdG9yLT5TZXQoTGltaXQobGVmdE91dHB1dCkgKiBtX21heE91dHB1dCwgbV9zeW5jR3JvdXApOworCisgIGlmIChtX2Zyb250UmlnaHRNb3RvciAhPSBudWxscHRyKQorICAgIG1fZnJvbnRSaWdodE1vdG9yLT5TZXQoLUxpbWl0KHJpZ2h0T3V0cHV0KSAqIG1fbWF4T3V0cHV0LCBtX3N5bmNHcm91cCk7CisgIG1fcmVhclJpZ2h0TW90b3ItPlNldCgtTGltaXQocmlnaHRPdXRwdXQpICogbV9tYXhPdXRwdXQsIG1fc3luY0dyb3VwKTsKKworICBpZiAobV9zeW5jR3JvdXAgIT0gMCkgeworICAgIENBTkphZ3Vhcjo6VXBkYXRlU3luY0dyb3VwKG1fc3luY0dyb3VwKTsKKyAgfQorCisgIG1fc2FmZXR5SGVscGVyLT5GZWVkKCk7Cit9CisKKy8qKgorICogTGltaXQgbW90b3IgdmFsdWVzIHRvIHRoZSAtMS4wIHRvICsxLjAgcmFuZ2UuCisgKi8KK2Zsb2F0IFJvYm90RHJpdmU6OkxpbWl0KGZsb2F0IG51bSkgeworICBpZiAobnVtID4gMS4wKSB7CisgICAgcmV0dXJuIDEuMDsKKyAgfQorICBpZiAobnVtIDwgLTEuMCkgeworICAgIHJldHVybiAtMS4wOworICB9CisgIHJldHVybiBudW07Cit9CisKKy8qKgorICogTm9ybWFsaXplIGFsbCB3aGVlbCBzcGVlZHMgaWYgdGhlIG1hZ25pdHVkZSBvZiBhbnkgd2hlZWwgaXMgZ3JlYXRlciB0aGFuIDEuMC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpOb3JtYWxpemUoZG91YmxlICp3aGVlbFNwZWVkcykgeworICBkb3VibGUgbWF4TWFnbml0dWRlID0gZmFicyh3aGVlbFNwZWVkc1swXSk7CisgIGludDMyX3QgaTsKKyAgZm9yIChpID0gMTsgaSA8IGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKSB7CisgICAgZG91YmxlIHRlbXAgPSBmYWJzKHdoZWVsU3BlZWRzW2ldKTsKKyAgICBpZiAobWF4TWFnbml0dWRlIDwgdGVtcCkgbWF4TWFnbml0dWRlID0gdGVtcDsKKyAgfQorICBpZiAobWF4TWFnbml0dWRlID4gMS4wKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKSB7CisgICAgICB3aGVlbFNwZWVkc1tpXSA9IHdoZWVsU3BlZWRzW2ldIC8gbWF4TWFnbml0dWRlOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJvdGF0ZSBhIHZlY3RvciBpbiBDYXJ0ZXNpYW4gc3BhY2UuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6Um90YXRlVmVjdG9yKGRvdWJsZSAmeCwgZG91YmxlICZ5LCBkb3VibGUgYW5nbGUpIHsKKyAgZG91YmxlIGNvc0EgPSBjb3MoYW5nbGUgKiAoMy4xNDE1OSAvIDE4MC4wKSk7CisgIGRvdWJsZSBzaW5BID0gc2luKGFuZ2xlICogKDMuMTQxNTkgLyAxODAuMCkpOworICBkb3VibGUgeE91dCA9IHggKiBjb3NBIC0geSAqIHNpbkE7CisgIGRvdWJsZSB5T3V0ID0geCAqIHNpbkEgKyB5ICogY29zQTsKKyAgeCA9IHhPdXQ7CisgIHkgPSB5T3V0OworfQorCisvKgorICogSW52ZXJ0IGEgbW90b3IgZGlyZWN0aW9uLgorICogVGhpcyBpcyB1c2VkIHdoZW4gYSBtb3RvciBzaG91bGQgcnVuIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gYXMgdGhlIGRyaXZlCisgKiBjb2RlIHdvdWxkIG5vcm1hbGx5IHJ1biBpdC4gTW90b3JzIHRoYXQgYXJlIGRpcmVjdCBkcml2ZSB3b3VsZCBiZSBpbnZlcnRlZCwKKyAqIHRoZQorICogRHJpdmUgY29kZSBhc3N1bWVzIHRoYXQgdGhlIG1vdG9ycyBhcmUgZ2VhcmVkIHdpdGggb25lIHJldmVyc2FsLgorICogQHBhcmFtIG1vdG9yIFRoZSBtb3RvciBpbmRleCB0byBpbnZlcnQuCisgKiBAcGFyYW0gaXNJbnZlcnRlZCBUcnVlIGlmIHRoZSBtb3RvciBzaG91bGQgYmUgaW52ZXJ0ZWQgd2hlbiBvcGVyYXRlZC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRJbnZlcnRlZE1vdG9yKE1vdG9yVHlwZSBtb3RvciwgYm9vbCBpc0ludmVydGVkKSB7CisgIGlmIChtb3RvciA8IDAgfHwgbW90b3IgPiAzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEludmFsaWRNb3RvckluZGV4KTsKKyAgICByZXR1cm47CisgIH0KKyAgc3dpdGNoIChtb3RvcikgeworICAgIGNhc2Uga0Zyb250TGVmdE1vdG9yOgorICAgICAgbV9mcm9udExlZnRNb3Rvci0+U2V0SW52ZXJ0ZWQoaXNJbnZlcnRlZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtGcm9udFJpZ2h0TW90b3I6CisgICAgICBtX2Zyb250UmlnaHRNb3Rvci0+U2V0SW52ZXJ0ZWQoaXNJbnZlcnRlZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtSZWFyTGVmdE1vdG9yOgorICAgICAgbV9yZWFyTGVmdE1vdG9yLT5TZXRJbnZlcnRlZChpc0ludmVydGVkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1JlYXJSaWdodE1vdG9yOgorICAgICAgbV9yZWFyUmlnaHRNb3Rvci0+U2V0SW52ZXJ0ZWQoaXNJbnZlcnRlZCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgdHVybmluZyBzZW5zaXRpdml0eS4KKyAqCisgKiBUaGlzIG9ubHkgaW1wYWN0cyB0aGUgRHJpdmUoKSBlbnRyeS1wb2ludC4KKyAqIEBwYXJhbSBzZW5zaXRpdml0eSBFZmZlY3RpdmVseSBzZXRzIHRoZSB0dXJuaW5nIHNlbnNpdGl2aXR5IChvciB0dXJuIHJhZGl1cworICogZm9yIGEgZ2l2ZW4gdmFsdWUpCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6U2V0U2Vuc2l0aXZpdHkoZmxvYXQgc2Vuc2l0aXZpdHkpIHsKKyAgbV9zZW5zaXRpdml0eSA9IHNlbnNpdGl2aXR5OworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIHVzaW5nIFJvYm90RHJpdmUgd2l0aCBtb3RvciBjb250cm9sbGVycyBpbiBhCisgKiBtb2RlIG90aGVyIHRoYW4gUGVyY2VudFZidXMuCisgKiBAcGFyYW0gbWF4T3V0cHV0IE11bHRpcGxpZWQgd2l0aCB0aGUgb3V0cHV0IHBlcmNlbnRhZ2UgY29tcHV0ZWQgYnkgdGhlIGRyaXZlCisgKiBmdW5jdGlvbnMuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6U2V0TWF4T3V0cHV0KGRvdWJsZSBtYXhPdXRwdXQpIHsgbV9tYXhPdXRwdXQgPSBtYXhPdXRwdXQ7IH0KKworLyoqCisgKiBTZXQgdGhlIG51bWJlciBvZiB0aGUgc3luYyBncm91cCBmb3IgdGhlIG1vdG9yIGNvbnRyb2xsZXJzLiAgSWYgdGhlIG1vdG9yCisgKiBjb250cm9sbGVycyBhcmUge0BsaW5rIENBTkphZ3Vhcn1zLAorICogdGhlbiB0aGV5IHdpbGwgYWxsIGJlIGFkZGVkIHRvIHRoaXMgc3luYyBncm91cCwgY2F1c2luZyB0aGVtIHRvIHVwZGF0ZSB0aGVpcgorICogdmFsdWVzIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogQHBhcmFtIHN5bmNHcm91cCB0aGUgdXBkYXRlIGdyb3VwIHRvIGFkZCB0aGUgbW90b3IgY29udHJvbGxlcnMgdG8KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRDQU5KYWd1YXJTeW5jR3JvdXAodWludDhfdCBzeW5jR3JvdXApIHsKKyAgbV9zeW5jR3JvdXAgPSBzeW5jR3JvdXA7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6U2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSB7CisgIG1fc2FmZXR5SGVscGVyLT5TZXRFeHBpcmF0aW9uKHRpbWVvdXQpOworfQorCitmbG9hdCBSb2JvdERyaXZlOjpHZXRFeHBpcmF0aW9uKCkgY29uc3QgeworICByZXR1cm4gbV9zYWZldHlIZWxwZXItPkdldEV4cGlyYXRpb24oKTsKK30KKworYm9vbCBSb2JvdERyaXZlOjpJc0FsaXZlKCkgY29uc3QgeyByZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsgfQorCitib29sIFJvYm90RHJpdmU6OklzU2FmZXR5RW5hYmxlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc1NhZmV0eUVuYWJsZWQoKTsKK30KKwordm9pZCBSb2JvdERyaXZlOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgeworICBtX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBSb2JvdERyaXZlOjpHZXREZXNjcmlwdGlvbihzdGQ6Om9zdHJpbmdzdHJlYW0mIGRlc2MpIGNvbnN0IHsKKyAgZGVzYyA8PCAiUm9ib3REcml2ZSI7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6U3RvcE1vdG9yKCkgeworICBpZiAobV9mcm9udExlZnRNb3RvciAhPSBudWxscHRyKSBtX2Zyb250TGVmdE1vdG9yLT5EaXNhYmxlKCk7CisgIGlmIChtX2Zyb250UmlnaHRNb3RvciAhPSBudWxscHRyKSBtX2Zyb250UmlnaHRNb3Rvci0+RGlzYWJsZSgpOworICBpZiAobV9yZWFyTGVmdE1vdG9yICE9IG51bGxwdHIpIG1fcmVhckxlZnRNb3Rvci0+RGlzYWJsZSgpOworICBpZiAobV9yZWFyUmlnaHRNb3RvciAhPSBudWxscHRyKSBtX3JlYXJSaWdodE1vdG9yLT5EaXNhYmxlKCk7CisgIG1fc2FmZXR5SGVscGVyLT5GZWVkKCk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvU1BJLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9TUEkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NzA1OTcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvU1BJLmNwcApAQCAtMCwwICsxLDMwMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU1BJLmgiCisKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJIQUwvRGlnaXRhbC5ocHAiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqCisgKiBDb25zdHJ1Y3RvcgorICoKKyAqIEBwYXJhbSBTUElwb3J0IHRoZSBwaHlzaWNhbCBTUEkgcG9ydAorICovCitTUEk6OlNQSShQb3J0IFNQSXBvcnQpIHsKKyAgbV9wb3J0ID0gU1BJcG9ydDsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzcGlJbml0aWFsaXplKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworCisgIHN0YXRpYyBpbnQzMl90IGluc3RhbmNlcyA9IDA7CisgIGluc3RhbmNlcysrOworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU1BJLCBpbnN0YW5jZXMpOworfQorCisvKioKKyAqIERlc3RydWN0b3IuCisgKi8KK1NQSTo6flNQSSgpIHsgc3BpQ2xvc2UobV9wb3J0KTsgfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgcmF0ZSBvZiB0aGUgZ2VuZXJhdGVkIGNsb2NrIHNpZ25hbC4KKyAqCisgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1MDAsMDAwSHouCisgKiBUaGUgbWF4aW11bSB2YWx1ZSBpcyA0LDAwMCwwMDBIei4KKyAqCisgKiBAcGFyYW0gaHoJVGhlIGNsb2NrIHJhdGUgaW4gSGVydHouCisgKi8KK3ZvaWQgU1BJOjpTZXRDbG9ja1JhdGUoZG91YmxlIGh6KSB7IHNwaVNldFNwZWVkKG1fcG9ydCwgaHopOyB9CisKKy8qKgorICogQ29uZmlndXJlIHRoZSBvcmRlciB0aGF0IGJpdHMgYXJlIHNlbnQgYW5kIHJlY2VpdmVkIG9uIHRoZSB3aXJlCisgKiB0byBiZSBtb3N0IHNpZ25pZmljYW50IGJpdCBmaXJzdC4KKyAqLwordm9pZCBTUEk6OlNldE1TQkZpcnN0KCkgeworICBtX21zYkZpcnN0ID0gdHJ1ZTsKKyAgc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpbV9tc2JGaXJzdCwgKGludCltX3NhbXBsZU9uVHJhaWxpbmcsCisgICAgICAgICAgICAgKGludCltX2Nsa19pZGxlX2hpZ2gpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgb3JkZXIgdGhhdCBiaXRzIGFyZSBzZW50IGFuZCByZWNlaXZlZCBvbiB0aGUgd2lyZQorICogdG8gYmUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0LgorICovCit2b2lkIFNQSTo6U2V0TFNCRmlyc3QoKSB7CisgIG1fbXNiRmlyc3QgPSBmYWxzZTsKKyAgc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpbV9tc2JGaXJzdCwgKGludCltX3NhbXBsZU9uVHJhaWxpbmcsCisgICAgICAgICAgICAgKGludCltX2Nsa19pZGxlX2hpZ2gpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGF0IHRoZSBkYXRhIGlzIHN0YWJsZSBvbiB0aGUgZmFsbGluZyBlZGdlIGFuZCB0aGUgZGF0YQorICogY2hhbmdlcyBvbiB0aGUgcmlzaW5nIGVkZ2UuCisgKi8KK3ZvaWQgU1BJOjpTZXRTYW1wbGVEYXRhT25GYWxsaW5nKCkgeworICBtX3NhbXBsZU9uVHJhaWxpbmcgPSB0cnVlOworICBzcGlTZXRPcHRzKG1fcG9ydCwgKGludCltX21zYkZpcnN0LCAoaW50KW1fc2FtcGxlT25UcmFpbGluZywKKyAgICAgICAgICAgICAoaW50KW1fY2xrX2lkbGVfaGlnaCk7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHRoYXQgdGhlIGRhdGEgaXMgc3RhYmxlIG9uIHRoZSByaXNpbmcgZWRnZSBhbmQgdGhlIGRhdGEKKyAqIGNoYW5nZXMgb24gdGhlIGZhbGxpbmcgZWRnZS4KKyAqLwordm9pZCBTUEk6OlNldFNhbXBsZURhdGFPblJpc2luZygpIHsKKyAgbV9zYW1wbGVPblRyYWlsaW5nID0gZmFsc2U7CisgIHNwaVNldE9wdHMobV9wb3J0LCAoaW50KW1fbXNiRmlyc3QsIChpbnQpbV9zYW1wbGVPblRyYWlsaW5nLAorICAgICAgICAgICAgIChpbnQpbV9jbGtfaWRsZV9oaWdoKTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNsb2NrIG91dHB1dCBsaW5lIHRvIGJlIGFjdGl2ZSBsb3cuCisgKiBUaGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgY2xvY2sgcG9sYXJpdHkgaGlnaCBvciBjbG9jayBpZGxlIGhpZ2guCisgKi8KK3ZvaWQgU1BJOjpTZXRDbG9ja0FjdGl2ZUxvdygpIHsKKyAgbV9jbGtfaWRsZV9oaWdoID0gdHJ1ZTsKKyAgc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpbV9tc2JGaXJzdCwgKGludCltX3NhbXBsZU9uVHJhaWxpbmcsCisgICAgICAgICAgICAgKGludCltX2Nsa19pZGxlX2hpZ2gpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgY2xvY2sgb3V0cHV0IGxpbmUgdG8gYmUgYWN0aXZlIGhpZ2guCisgKiBUaGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgY2xvY2sgcG9sYXJpdHkgbG93IG9yIGNsb2NrIGlkbGUgbG93LgorICovCit2b2lkIFNQSTo6U2V0Q2xvY2tBY3RpdmVIaWdoKCkgeworICBtX2Nsa19pZGxlX2hpZ2ggPSBmYWxzZTsKKyAgc3BpU2V0T3B0cyhtX3BvcnQsIChpbnQpbV9tc2JGaXJzdCwgKGludCltX3NhbXBsZU9uVHJhaWxpbmcsCisgICAgICAgICAgICAgKGludCltX2Nsa19pZGxlX2hpZ2gpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgY2hpcCBzZWxlY3QgbGluZSB0byBiZSBhY3RpdmUgaGlnaC4KKyAqLwordm9pZCBTUEk6OlNldENoaXBTZWxlY3RBY3RpdmVIaWdoKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNwaVNldENoaXBTZWxlY3RBY3RpdmVIaWdoKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgY2hpcCBzZWxlY3QgbGluZSB0byBiZSBhY3RpdmUgbG93LgorICovCit2b2lkIFNQSTo6U2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzcGlTZXRDaGlwU2VsZWN0QWN0aXZlTG93KG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFdyaXRlIGRhdGEgdG8gdGhlIHNsYXZlIGRldmljZS4gIEJsb2NrcyB1bnRpbCB0aGVyZSBpcyBzcGFjZSBpbiB0aGUKKyAqIG91dHB1dCBGSUZPLgorICoKKyAqIElmIG5vdCBydW5uaW5nIGluIG91dHB1dCBvbmx5IG1vZGUsIGFsc28gc2F2ZXMgdGhlIGRhdGEgcmVjZWl2ZWQKKyAqIG9uIHRoZSBNSVNPIGlucHV0IGR1cmluZyB0aGUgdHJhbnNmZXIgaW50byB0aGUgcmVjZWl2ZSBGSUZPLgorICovCitpbnQzMl90IFNQSTo6V3JpdGUodWludDhfdCogZGF0YSwgdWludDhfdCBzaXplKSB7CisgIGludDMyX3QgcmV0VmFsID0gMDsKKyAgcmV0VmFsID0gc3BpV3JpdGUobV9wb3J0LCBkYXRhLCBzaXplKTsKKyAgcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBSZWFkIGEgd29yZCBmcm9tIHRoZSByZWNlaXZlIEZJRk8uCisgKgorICogV2FpdHMgZm9yIHRoZSBjdXJyZW50IHRyYW5zZmVyIHRvIGNvbXBsZXRlIGlmIHRoZSByZWNlaXZlIEZJRk8gaXMgZW1wdHkuCisgKgorICogSWYgdGhlIHJlY2VpdmUgRklGTyBpcyBlbXB0eSwgdGhlcmUgaXMgbm8gYWN0aXZlIHRyYW5zZmVyLCBhbmQgaW5pdGlhdGUKKyAqIGlzIGZhbHNlLCBlcnJvcnMuCisgKgorICogQHBhcmFtIGluaXRpYXRlCUlmIHRydWUsIHRoaXMgZnVuY3Rpb24gcHVzaGVzICIwIiBpbnRvIHRoZQorICogCQkJCSAgICB0cmFuc21pdCBidWZmZXIgYW5kIGluaXRpYXRlcyBhIHRyYW5zZmVyLgorICogCQkJCSAgICBJZiBmYWxzZSwgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZGF0YSBpcworICogCQkJCSAgICBhbHJlYWR5IGluIHRoZSByZWNlaXZlIEZJRk8gZnJvbSBhIHByZXZpb3VzCisgKiB3cml0ZS4KKyAqLworaW50MzJfdCBTUEk6OlJlYWQoYm9vbCBpbml0aWF0ZSwgdWludDhfdCogZGF0YVJlY2VpdmVkLCB1aW50OF90IHNpemUpIHsKKyAgaW50MzJfdCByZXRWYWwgPSAwOworICBpZiAoaW5pdGlhdGUpIHsKKyAgICBhdXRvIGRhdGFUb1NlbmQgPSBuZXcgdWludDhfdFtzaXplXTsKKyAgICBtZW1zZXQoZGF0YVRvU2VuZCwgMCwgc2l6ZSk7CisgICAgcmV0VmFsID0gc3BpVHJhbnNhY3Rpb24obV9wb3J0LCBkYXRhVG9TZW5kLCBkYXRhUmVjZWl2ZWQsIHNpemUpOworICB9IGVsc2UKKyAgICByZXRWYWwgPSBzcGlSZWFkKG1fcG9ydCwgZGF0YVJlY2VpdmVkLCBzaXplKTsKKyAgcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgKiBQZXJmb3JtIGEgc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlCisgKgorICogQHBhcmFtIGRhdGFUb1NlbmQgVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBvdXQgdG8gdGhlIGRldmljZQorICogQHBhcmFtIGRhdGFSZWNlaXZlZCBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gdGhlIGRldmljZQorICogQHBhcmFtIHNpemUgVGhlIGxlbmd0aCBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIGJ5dGVzCisgKi8KK2ludDMyX3QgU1BJOjpUcmFuc2FjdGlvbih1aW50OF90KiBkYXRhVG9TZW5kLCB1aW50OF90KiBkYXRhUmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzaXplKSB7CisgIGludDMyX3QgcmV0VmFsID0gMDsKKyAgcmV0VmFsID0gc3BpVHJhbnNhY3Rpb24obV9wb3J0LCBkYXRhVG9TZW5kLCBkYXRhUmVjZWl2ZWQsIHNpemUpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yLgorICoKKyAqIEBwYXJhbSBwZXJpb2QgVGltZSBiZXR3ZWVuIHJlYWRzCisgKiBAcGFyYW0gY21kIFNQSSBjb21tYW5kIHRvIHNlbmQgdG8gcmVxdWVzdCBkYXRhCisgKiBAcGFyYW0geGZlcl9zaXplIFNQSSB0cmFuc2ZlciBzaXplLCBpbiBieXRlcworICogQHBhcmFtIHZhbGlkX21hc2sgTWFzayB0byBhcHBseSB0byByZWNlaXZlZCBkYXRhIGZvciB2YWxpZGl0eSBjaGVja2luZworICogQHBhcmFtIHZhbGlkX2RhdGEgQWZ0ZXIgdmFsaWRfbWFzayBpcyBhcHBsaWVkLCByZXF1aXJlZCBtYXRjaGluZyB2YWx1ZSBmb3IKKyAqICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5IGNoZWNraW5nCisgKiBAcGFyYW0gZGF0YV9zaGlmdCBCaXQgc2hpZnQgdG8gYXBwbHkgdG8gcmVjZWl2ZWQgZGF0YSB0byBnZXQgYWN0dWFsIGRhdGEKKyAqICAgICAgICAgICAgICAgICAgIHZhbHVlCisgKiBAcGFyYW0gZGF0YV9zaXplIFNpemUgKGluIGJpdHMpIG9mIGRhdGEgZmllbGQKKyAqIEBwYXJhbSBpc19zaWduZWQgSXMgZGF0YSBmaWVsZCBzaWduZWQ/CisgKiBAcGFyYW0gYmlnX2VuZGlhbiBJcyBkZXZpY2UgYmlnIGVuZGlhbj8KKyAqLwordm9pZCBTUEk6OkluaXRBY2N1bXVsYXRvcihkb3VibGUgcGVyaW9kLCB1aW50MzJfdCBjbWQsIHVpbnQ4X3QgeGZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWxpZF9tYXNrLCB1aW50MzJfdCB2YWxpZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhX3NoaWZ0LCB1aW50OF90IGRhdGFfc2l6ZSwgYm9vbCBpc19zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmlnX2VuZGlhbikgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNwaUluaXRBY2N1bXVsYXRvcihtX3BvcnQsICh1aW50MzJfdCkocGVyaW9kICogMWU2KSwgY21kLCB4ZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB2YWxpZF9tYXNrLCB2YWxpZF92YWx1ZSwgZGF0YV9zaGlmdCwgZGF0YV9zaXplLCBpc19zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICBiaWdfZW5kaWFuLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogRnJlZXMgdGhlIGFjY3VtdWxhdG9yLgorICovCit2b2lkIFNQSTo6RnJlZUFjY3VtdWxhdG9yKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNwaUZyZWVBY2N1bXVsYXRvcihtX3BvcnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBSZXNldHMgdGhlIGFjY3VtdWxhdG9yIHRvIHplcm8uCisgKi8KK3ZvaWQgU1BJOjpSZXNldEFjY3VtdWxhdG9yKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNwaVJlc2V0QWNjdW11bGF0b3IobV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBjZW50ZXIgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgorICoKKyAqIFRoZSBjZW50ZXIgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIGVhY2ggdmFsdWUgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIHRoZSBhY2N1bXVsYXRvci4gVGhpcworICogaXMgdXNlZCBmb3IgdGhlIGNlbnRlciB2YWx1ZSBvZiBkZXZpY2VzIGxpa2UgZ3lyb3MgYW5kIGFjY2VsZXJvbWV0ZXJzIHRvIG1ha2UgaW50ZWdyYXRpb24gd29yaworICogYW5kIHRvIHRha2UgdGhlIGRldmljZSBvZmZzZXQgaW50byBhY2NvdW50IHdoZW4gaW50ZWdyYXRpbmcuCisgKi8KK3ZvaWQgU1BJOjpTZXRBY2N1bXVsYXRvckNlbnRlcihpbnQzMl90IGNlbnRlcikgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNwaVNldEFjY3VtdWxhdG9yQ2VudGVyKG1fcG9ydCwgY2VudGVyLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBhY2N1bXVsYXRvcidzIGRlYWRiYW5kLgorICovCit2b2lkIFNQSTo6U2V0QWNjdW11bGF0b3JEZWFkYmFuZChpbnQzMl90IGRlYWRiYW5kKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc3BpU2V0QWNjdW11bGF0b3JEZWFkYmFuZChtX3BvcnQsIGRlYWRiYW5kLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgbGFzdCB2YWx1ZSByZWFkIGJ5IHRoZSBhY2N1bXVsYXRvciBlbmdpbmUuCisgKi8KK2ludDMyX3QgU1BJOjpHZXRBY2N1bXVsYXRvckxhc3RWYWx1ZSgpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQzMl90IHJldFZhbCA9IHNwaUdldEFjY3VtdWxhdG9yTGFzdFZhbHVlKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgorICoKKyAqIEByZXR1cm4gVGhlIDY0LWJpdCB2YWx1ZSBhY2N1bXVsYXRlZCBzaW5jZSB0aGUgbGFzdCBSZXNldCgpLgorICovCitpbnQ2NF90IFNQSTo6R2V0QWNjdW11bGF0b3JWYWx1ZSgpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQ2NF90IHJldFZhbCA9IHNwaUdldEFjY3VtdWxhdG9yVmFsdWUobV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogUmVhZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcy4KKyAqCisgKiBSZWFkIHRoZSBjb3VudCBvZiB0aGUgYWNjdW11bGF0ZWQgdmFsdWVzIHNpbmNlIHRoZSBhY2N1bXVsYXRvciB3YXMgbGFzdCBSZXNldCgpLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBzYW1wbGVzIGZyb20gdGhlIGNoYW5uZWwgd2VyZSBhY2N1bXVsYXRlZC4KKyAqLwordWludDMyX3QgU1BJOjpHZXRBY2N1bXVsYXRvckNvdW50KCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHVpbnQzMl90IHJldFZhbCA9IHNwaUdldEFjY3VtdWxhdG9yQ291bnQobV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogUmVhZCB0aGUgYXZlcmFnZSBvZiB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCisgKgorICogQHJldHVybiBUaGUgYWNjdW11bGF0ZWQgYXZlcmFnZSB2YWx1ZSAodmFsdWUgLyBjb3VudCkuCisgKi8KK2RvdWJsZSBTUEk6OkdldEFjY3VtdWxhdG9yQXZlcmFnZSgpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBkb3VibGUgcmV0VmFsID0gc3BpR2V0QWNjdW11bGF0b3JBdmVyYWdlKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcyBhdG9taWNhbGx5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHZhbHVlIGFuZCBjb3VudCBhdG9taWNhbGx5LgorICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYXZlcmFnaW5nLgorICoKKyAqIEBwYXJhbSB2YWx1ZSBQb2ludGVyIHRvIHRoZSA2NC1iaXQgYWNjdW11bGF0ZWQgb3V0cHV0LgorICogQHBhcmFtIGNvdW50IFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBhY2N1bXVsYXRpb24gY3ljbGVzLgorICovCit2b2lkIFNQSTo6R2V0QWNjdW11bGF0b3JPdXRwdXQoaW50NjRfdCAmdmFsdWUsIHVpbnQzMl90ICZjb3VudCkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNwaUdldEFjY3VtdWxhdG9yT3V0cHV0KG1fcG9ydCwgJnZhbHVlLCAmY291bnQsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9TYWZlUFdNLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9TYWZlUFdNLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFlM2VlCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1NhZmVQV00uY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBTYWZlUFdNIG9iamVjdCB0YWtpbmcgYSBjaGFubmVsIG51bWJlci4KKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIgMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAKKyAqIHBvcnQKKyAqLworU2FmZVBXTTo6U2FmZVBXTSh1aW50MzJfdCBjaGFubmVsKSA6IFBXTShjaGFubmVsKSB7CisgIG1fc2FmZXR5SGVscGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb3RvclNhZmV0eUhlbHBlcj4odGhpcyk7CisgIG1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIFBXTSBvYmplY3QKKyAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyBtb3RvciBvYmplY3QKKyAqLwordm9pZCBTYWZlUFdNOjpTZXRFeHBpcmF0aW9uKGZsb2F0IHRpbWVvdXQpIHsKKyAgbV9zYWZldHlIZWxwZXItPlNldEV4cGlyYXRpb24odGltZW91dCk7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBQV00gb2JqZWN0LgorICogQHJldHVybnMgVGhlIGV4cGlyYXRpb24gdGltZSB2YWx1ZS4KKyAqLworZmxvYXQgU2FmZVBXTTo6R2V0RXhwaXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7IH0KKworLyoqCisgKiBDaGVjayBpZiB0aGUgUFdNIG9iamVjdCBpcyBjdXJyZW50bHkgYWxpdmUgb3Igc3RvcHBlZCBkdWUgdG8gYSB0aW1lb3V0LgorICogQHJldHVybnMgYSBib29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbW90b3IgaGFzIE5PVCB0aW1lZCBvdXQgYW5kIHNob3VsZAorICogc3RpbGwKKyAqIGJlIHJ1bm5pbmcuCisgKi8KK2Jvb2wgU2FmZVBXTTo6SXNBbGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc0FsaXZlKCk7IH0KKworLyoqCisgKiBTdG9wIHRoZSBtb3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBQV00gb2JqZWN0LgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIE1vdG9yU2FmZXR5SGVscGVyIG9iamVjdCB3aGVuIGl0IGhhcyBhIHRpbWVvdXQgZm9yIHRoaXMKKyAqIFBXTSBhbmQgbmVlZHMgdG8KKyAqIHN0b3AgaXQgZnJvbSBydW5uaW5nLgorICovCit2b2lkIFNhZmVQV006OlN0b3BNb3RvcigpIHsgU2V0UmF3KGtQd21EaXNhYmxlZCk7IH0KKworLyoqCisgKiBFbmFibGUvZGlzYWJsZSBtb3RvciBzYWZldHkgZm9yIHRoaXMgZGV2aWNlCisgKiBUdXJuIG9uIGFuZCBvZmYgdGhlIG1vdG9yIHNhZmV0eSBvcHRpb24gZm9yIHRoaXMgUFdNIG9iamVjdC4KKyAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIG9iamVjdAorICovCit2b2lkIFNhZmVQV006OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSB7CisgIG1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOworfQorCisvKioKKyAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkIGZvciB0aGlzIG9iamVjdAorICogQHJldHVybnMgVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0CisgKi8KK2Jvb2wgU2FmZVBXTTo6SXNTYWZldHlFbmFibGVkKCkgY29uc3QgeworICByZXR1cm4gbV9zYWZldHlIZWxwZXItPklzU2FmZXR5RW5hYmxlZCgpOworfQorCit2b2lkIFNhZmVQV006OkdldERlc2NyaXB0aW9uKHN0ZDo6b3N0cmluZ3N0cmVhbSYgZGVzYykgY29uc3QgeworICBkZXNjIDw8ICJQV00gIiA8PCBHZXRDaGFubmVsKCk7Cit9CisKKy8qKgorICogRmVlZCB0aGUgTW90b3JTYWZldHkgdGltZXIgd2hlbiBzZXR0aW5nIHRoZSBzcGVlZC4KKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc3ViY2xhc3MgbW90b3Igd2hlbmV2ZXIgaXQgdXBkYXRlcyBpdHMgc3BlZWQsCisgKiB0aGVyZWJ5IHJlc2V0aW5nCisgKiB0aGUgdGltZW91dCB2YWx1ZS4KKyAqIEBwYXJhbSBzcGVlZCBWYWx1ZSB0byBwYXNzIHRvIHRoZSBQV00gY2xhc3MKKyAqLwordm9pZCBTYWZlUFdNOjpTZXRTcGVlZChmbG9hdCBzcGVlZCkgeworICBQV006OlNldFNwZWVkKHNwZWVkKTsKKyAgbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9TYW1wbGVSb2JvdC5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvU2FtcGxlUm9ib3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YjEzNGYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvU2FtcGxlUm9ib3QuY3BwCkBAIC0wLDAgKzEsMTU1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJTYW1wbGVSb2JvdC5oIgorCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKyNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oIgorCitTYW1wbGVSb2JvdDo6U2FtcGxlUm9ib3QoKSA6IG1fcm9ib3RNYWluT3ZlcnJpZGRlbih0cnVlKSB7fQorCisvKioKKyAqIFJvYm90LXdpZGUgaW5pdGlhbGl6YXRpb24gY29kZSBzaG91bGQgZ28gaGVyZS4KKyAqCisgKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGRlZmF1bHQgUm9ib3Qtd2lkZSBpbml0aWFsaXphdGlvbiB3aGljaAorICogd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcm9ib3QgaXMgZmlyc3QgcG93ZXJlZCBvbi4gSXQgd2lsbCBiZSBjYWxsZWQgZXhhY3RseQorICogb25lIHRpbWUuCisgKgorICogV2FybmluZzogdGhlIERyaXZlciBTdGF0aW9uICJSb2JvdCBDb2RlIiBsaWdodCBhbmQgRk1TICJSb2JvdCBSZWFkeSIKKyAqIGluZGljYXRvcnMgd2lsbCBiZSBvZmYgdW50aWwgUm9ib3RJbml0KCkgZXhpdHMuIENvZGUgaW4gUm9ib3RJbml0KCkgdGhhdAorICogd2FpdHMgZm9yIGVuYWJsZSB3aWxsIGNhdXNlIHRoZSByb2JvdCB0byBuZXZlciBpbmRpY2F0ZSB0aGF0IHRoZSBjb2RlIGlzCisgKiByZWFkeSwgY2F1c2luZyB0aGUgcm9ib3QgdG8gYmUgYnlwYXNzZWQgaW4gYSBtYXRjaC4KKyAqLwordm9pZCBTYW1wbGVSb2JvdDo6Um9ib3RJbml0KCkgeworICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIERpc2FibGVkIHNob3VsZCBnbyBoZXJlLgorICogUHJvZ3JhbW1lcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJ1biBjb2RlIHRoYXQgc2hvdWxkIHJ1biB3aGlsZSB0aGUKKyAqIGZpZWxkIGlzCisgKiBkaXNhYmxlZC4KKyAqLwordm9pZCBTYW1wbGVSb2JvdDo6RGlzYWJsZWQoKSB7CisgIHByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qKgorICogQXV0b25vbW91cyBzaG91bGQgZ28gaGVyZS4KKyAqIFByb2dyYW1tZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBydW4gY29kZSB0aGF0IHNob3VsZCBydW4gd2hpbGUgdGhlCisgKiBmaWVsZCBpcworICogaW4gdGhlIGF1dG9ub21vdXMgcGVyaW9kLiBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMKKyAqIHRoZQorICogYXV0b25vbW91cyBzdGF0ZS4KKyAqLwordm9pZCBTYW1wbGVSb2JvdDo6QXV0b25vbW91cygpIHsKKyAgcHJpbnRmKCJEZWZhdWx0ICVzKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoqCisgKiBPcGVyYXRvciBjb250cm9sICh0ZWxlLW9wZXJhdGVkKSBjb2RlIHNob3VsZCBnbyBoZXJlLgorICogUHJvZ3JhbW1lcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJ1biBjb2RlIHRoYXQgc2hvdWxkIHJ1biB3aGlsZSB0aGUKKyAqIGZpZWxkIGlzCisgKiBpbiB0aGUgT3BlcmF0b3IgQ29udHJvbCAodGVsZS1vcGVyYXRlZCkgcGVyaW9kLiBUaGlzIGlzIGNhbGxlZCBvbmNlIGVhY2ggdGltZQorICogdGhlIHJvYm90CisgKiBlbnRlcnMgdGhlIHRlbGVvcCBzdGF0ZS4KKyAqLwordm9pZCBTYW1wbGVSb2JvdDo6T3BlcmF0b3JDb250cm9sKCkgeworICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIFRlc3QgcHJvZ3JhbSBzaG91bGQgZ28gaGVyZS4KKyAqIFByb2dyYW1tZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBydW4gY29kZSB0aGF0IGV4ZWN1dGVzIHdoaWxlIHRoZQorICogcm9ib3QgaXMKKyAqIGluIHRlc3QgbW9kZS4gVGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIHdoZW5ldmVyIHRoZSByb2JvdCBlbnRlcnMgdGVzdCBtb2RlCisgKi8KK3ZvaWQgU2FtcGxlUm9ib3Q6OlRlc3QoKSB7CisgIHByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qKgorICogUm9ib3QgbWFpbiBwcm9ncmFtIGZvciBmcmVlLWZvcm0gcHJvZ3JhbXMuCisgKgorICogVGhpcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIHN1YmNsYXNzZXMgaWYgdGhlIGludGVudCBpcyB0byBub3QgdXNlIHRoZQorICogQXV0b25vbW91cygpIGFuZAorICogT3BlcmF0b3JDb250cm9sKCkgbWV0aG9kcy4gSW4gdGhhdCBjYXNlLCB0aGUgcHJvZ3JhbSBpcyByZXNwb25zaWJsZSBmb3IKKyAqIHNlbnNpbmcgd2hlbiB0byBydW4KKyAqIHRoZSBhdXRvbm9tb3VzIGFuZCBvcGVyYXRvciBjb250cm9sIGZ1bmN0aW9ucyBpbiB0aGVpciBwcm9ncmFtLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIElmIGl0CisgKiBoYXMgbm90IGJlZW4KKyAqIG92ZXJyaWRkZW4gYnkgYSB1c2VyIHN1YmNsYXNzIChpLmUuIHRoZSBkZWZhdWx0IHZlcnNpb24gcnVucyksIHRoZW4gdGhlCisgKiBBdXRvbm9tb3VzKCkgYW5kCisgKiBPcGVyYXRvckNvbnRyb2woKSBtZXRob2RzIHdpbGwgYmUgY2FsbGVkLgorICovCit2b2lkIFNhbXBsZVJvYm90OjpSb2JvdE1haW4oKSB7IG1fcm9ib3RNYWluT3ZlcnJpZGRlbiA9IGZhbHNlOyB9CisKKy8qKgorICogU3RhcnQgYSBjb21wZXRpdGlvbi4KKyAqIFRoaXMgY29kZSBuZWVkcyB0byB0cmFjayB0aGUgb3JkZXIgb2YgdGhlIGZpZWxkIHN0YXJ0aW5nIHRvIGVuc3VyZSB0aGF0CisgKiBldmVyeXRoaW5nIGhhcHBlbnMKKyAqIGluIHRoZSByaWdodCBvcmRlci4gUmVwZWF0ZWRseSBydW4gdGhlIGNvcnJlY3QgbWV0aG9kLCBlaXRoZXIgQXV0b25vbW91cyBvcgorICogT3BlcmF0b3JDb250cm9sCisgKiBvciBUZXN0IHdoZW4gdGhlIHJvYm90IGlzIGVuYWJsZWQuIEFmdGVyIHJ1bm5pbmcgdGhlIGNvcnJlY3QgbWV0aG9kLCB3YWl0IGZvcgorICogc29tZSBzdGF0ZSB0bworICogY2hhbmdlLCBlaXRoZXIgdGhlIG90aGVyIG1vZGUgc3RhcnRzIG9yIHRoZSByb2JvdCBpcyBkaXNhYmxlZC4gVGhlbiBnbyBiYWNrCisgKiBhbmQgd2FpdCBmb3IgdGhlCisgKiByb2JvdCB0byBiZSBlbmFibGVkIGFnYWluLgorICovCit2b2lkIFNhbXBsZVJvYm90OjpTdGFydENvbXBldGl0aW9uKCkgeworICBMaXZlV2luZG93ICpsdyA9IExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0ZyYW1ld29yaywKKyAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprRnJhbWV3b3JrX1NhbXBsZSk7CisKKyAgU21hcnREYXNoYm9hcmQ6OmluaXQoKTsKKyAgTmV0d29ya1RhYmxlOjpHZXRUYWJsZSgiTGl2ZVdpbmRvdyIpCisgICAgICAtPkdldFN1YlRhYmxlKCJ+U1RBVFVTfiIpCisgICAgICAtPlB1dEJvb2xlYW4oIkxXIEVuYWJsZWQiLCBmYWxzZSk7CisKKyAgUm9ib3RJbml0KCk7CisKKyAgLy8gVGVsbCB0aGUgRFMgdGhhdCB0aGUgcm9ib3QgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZAorICBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCk7CisKKyAgUm9ib3RNYWluKCk7CisKKyAgaWYgKCFtX3JvYm90TWFpbk92ZXJyaWRkZW4pIHsKKyAgICAvLyBmaXJzdCBhbmQgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24KKyAgICBsdy0+U2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKElzRGlzYWJsZWQoKSkgeworICAgICAgICBtX2RzLkluRGlzYWJsZWQodHJ1ZSk7CisgICAgICAgIERpc2FibGVkKCk7CisgICAgICAgIG1fZHMuSW5EaXNhYmxlZChmYWxzZSk7CisgICAgICAgIHdoaWxlIChJc0Rpc2FibGVkKCkpIG1fZHMuV2FpdEZvckRhdGEoKTsKKyAgICAgIH0gZWxzZSBpZiAoSXNBdXRvbm9tb3VzKCkpIHsKKyAgICAgICAgbV9kcy5JbkF1dG9ub21vdXModHJ1ZSk7CisgICAgICAgIEF1dG9ub21vdXMoKTsKKyAgICAgICAgbV9kcy5JbkF1dG9ub21vdXMoZmFsc2UpOworICAgICAgICB3aGlsZSAoSXNBdXRvbm9tb3VzKCkgJiYgSXNFbmFibGVkKCkpIG1fZHMuV2FpdEZvckRhdGEoKTsKKyAgICAgIH0gZWxzZSBpZiAoSXNUZXN0KCkpIHsKKyAgICAgICAgbHctPlNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIG1fZHMuSW5UZXN0KHRydWUpOworICAgICAgICBUZXN0KCk7CisgICAgICAgIG1fZHMuSW5UZXN0KGZhbHNlKTsKKyAgICAgICAgd2hpbGUgKElzVGVzdCgpICYmIElzRW5hYmxlZCgpKSBtX2RzLldhaXRGb3JEYXRhKCk7CisgICAgICAgIGx3LT5TZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fZHMuSW5PcGVyYXRvckNvbnRyb2wodHJ1ZSk7CisgICAgICAgIE9wZXJhdG9yQ29udHJvbCgpOworICAgICAgICBtX2RzLkluT3BlcmF0b3JDb250cm9sKGZhbHNlKTsKKyAgICAgICAgd2hpbGUgKElzT3BlcmF0b3JDb250cm9sKCkgJiYgSXNFbmFibGVkKCkpIG1fZHMuV2FpdEZvckRhdGEoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9TZW5zb3JCYXNlLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9TZW5zb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWY5ZjRmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1NlbnNvckJhc2UuY3BwCkBAIC0wLDAgKzEsMTgzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisKKyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiSEFML1BvcnQuaCIKKworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a0RpZ2l0YWxDaGFubmVsczsKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtBbmFsb2dJbnB1dHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprU29sZW5vaWRDaGFubmVsczsKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtTb2xlbm9pZE1vZHVsZXM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprUHdtQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprUmVsYXlDaGFubmVsczsKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtQRFBDaGFubmVsczsKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtDaGFzc2lzU2xvdHM7CitTZW5zb3JCYXNlKiBTZW5zb3JCYXNlOjptX3NpbmdsZXRvbkxpc3QgPSBudWxscHRyOworCitzdGF0aWMgYm9vbCBwb3J0c0luaXRpYWxpemVkID0gZmFsc2U7Cit2b2lkKiBTZW5zb3JCYXNlOjptX2RpZ2l0YWxfcG9ydHNba0RpZ2l0YWxDaGFubmVsc107Cit2b2lkKiBTZW5zb3JCYXNlOjptX3JlbGF5X3BvcnRzW2tSZWxheUNoYW5uZWxzXTsKK3ZvaWQqIFNlbnNvckJhc2U6Om1fcHdtX3BvcnRzW2tQd21DaGFubmVsc107CisKKy8qKgorICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2Vuc29yIGJhc2UgYW5kIGdldHMgYW4gRlBHQSBoYW5kbGUKKyAqLworU2Vuc29yQmFzZTo6U2Vuc29yQmFzZSgpIHsKKyAgaWYgKCFwb3J0c0luaXRpYWxpemVkKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtEaWdpdGFsQ2hhbm5lbHM7IGkrKykgeworICAgICAgdm9pZCogcG9ydCA9IGdldFBvcnQoaSk7CisgICAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgICBtX2RpZ2l0YWxfcG9ydHNbaV0gPSBpbml0aWFsaXplRGlnaXRhbFBvcnQocG9ydCwgJnN0YXR1cyk7CisgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIGZyZWVQb3J0KHBvcnQpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrUmVsYXlDaGFubmVsczsgaSsrKSB7CisgICAgICB2b2lkKiBwb3J0ID0gZ2V0UG9ydChpKTsKKyAgICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICAgIG1fcmVsYXlfcG9ydHNbaV0gPSBpbml0aWFsaXplRGlnaXRhbFBvcnQocG9ydCwgJnN0YXR1cyk7CisgICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgICAgIGZyZWVQb3J0KHBvcnQpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrUHdtQ2hhbm5lbHM7IGkrKykgeworICAgICAgdm9pZCogcG9ydCA9IGdldFBvcnQoaSk7CisgICAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgICBtX3B3bV9wb3J0c1tpXSA9IGluaXRpYWxpemVEaWdpdGFsUG9ydChwb3J0LCAmc3RhdHVzKTsKKyAgICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAgICAgZnJlZVBvcnQocG9ydCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogQWRkIHNlbnNvciB0byB0aGUgc2luZ2xldG9uIGxpc3QuCisgKiBBZGQgdGhpcyBzZW5zb3IgdG8gdGhlIGxpc3Qgb2Ygc2luZ2xldG9ucyB0aGF0IG5lZWQgdG8gYmUgZGVsZXRlZCB3aGVuCisgKiB0aGUgcm9ib3QgcHJvZ3JhbSBleGl0cy4gRWFjaCBvZiB0aGUgc2Vuc29ycyBvbiB0aGlzIGxpc3QgYXJlIHNpbmdsZXRvbnMsCisgKiB0aGF0IGlzIHRoZXkgYXJlbid0IGFsbG9jYXRlZCBkaXJlY3RseSB3aXRoIG5ldywgYnV0IGluc3RlYWQgYXJlIGFsbG9jYXRlZAorICogYnkgdGhlIHN0YXRpYyBHZXRJbnN0YW5jZSBtZXRob2QuIEFzIGEgcmVzdWx0LCB0aGV5IGFyZSBuZXZlciBkZWxldGVkIHdoZW4KKyAqIHRoZSBwcm9ncmFtIGV4aXRzLiBDb25zZXF1ZW50bHkgdGhlc2Ugc2Vuc29ycyBtYXkgc3RpbGwgYmUgaG9sZGluZyBvbnRvCisgKiByZXNvdXJjZXMgYW5kIG5lZWQgdG8gaGF2ZSB0aGVpciBkZXN0cnVjdG9ycyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIHByb2dyYW0uCisgKi8KK3ZvaWQgU2Vuc29yQmFzZTo6QWRkVG9TaW5nbGV0b25MaXN0KCkgeworICBtX25leHRTaW5nbGV0b24gPSBtX3NpbmdsZXRvbkxpc3Q7CisgIG1fc2luZ2xldG9uTGlzdCA9IHRoaXM7Cit9CisKKy8qKgorICogRGVsZXRlIGFsbCB0aGUgc2luZ2xldG9uIGNsYXNzZXMgb24gdGhlIGxpc3QuCisgKiBBbGwgdGhlIGNsYXNzZXMgdGhhdCB3ZXJlIGFsbG9jYXRlZCBhcyBzaW5nbGV0b25zIG5lZWQgdG8gYmUgZGVsZXRlZCBzbworICogdGhlaXIgcmVzb3VyY2VzIGNhbiBiZSBmcmVlZC4KKyAqLwordm9pZCBTZW5zb3JCYXNlOjpEZWxldGVTaW5nbGV0b25zKCkgeworICBmb3IgKFNlbnNvckJhc2UqIG5leHQgPSBtX3NpbmdsZXRvbkxpc3Q7IG5leHQgIT0gbnVsbHB0cjspIHsKKyAgICBTZW5zb3JCYXNlKiB0bXAgPSBuZXh0OworICAgIG5leHQgPSBuZXh0LT5tX25leHRTaW5nbGV0b247CisgICAgZGVsZXRlIHRtcDsKKyAgfQorICBtX3NpbmdsZXRvbkxpc3QgPSBudWxscHRyOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIHNvbGVub2lkIG1vZHVsZSBudW1iZXIgaXMgdmFsaWQuCisgKgorICogQHJldHVybiBTb2xlbm9pZCBtb2R1bGUgaXMgdmFsaWQgYW5kIHByZXNlbnQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1NvbGVub2lkTW9kdWxlKHVpbnQ4X3QgbW9kdWxlTnVtYmVyKSB7CisgIGlmIChtb2R1bGVOdW1iZXIgPCA2NCkgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBkaWdpdGFsIGNoYW5uZWwgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsCisgKiBudW1iZXJzIGFyZQorICogMS1iYXNlZC4KKyAqCisgKiBAcmV0dXJuIERpZ2l0YWwgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIFNlbnNvckJhc2U6OkNoZWNrRGlnaXRhbENoYW5uZWwodWludDMyX3QgY2hhbm5lbCkgeworICBpZiAoY2hhbm5lbCA8IGtEaWdpdGFsQ2hhbm5lbHMpIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGUgZGlnaXRhbCBjaGFubmVsIG51bWJlciBpcyB2YWxpZC4KKyAqIFZlcmlmeSB0aGF0IHRoZSBjaGFubmVsIG51bWJlciBpcyBvbmUgb2YgdGhlIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4gQ2hhbm5lbAorICogbnVtYmVycyBhcmUKKyAqIDEtYmFzZWQuCisgKgorICogQHJldHVybiBSZWxheSBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tSZWxheUNoYW5uZWwodWludDMyX3QgY2hhbm5lbCkgeworICBpZiAoY2hhbm5lbCA8IGtSZWxheUNoYW5uZWxzKSByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGRpZ2l0YWwgY2hhbm5lbCBudW1iZXIgaXMgdmFsaWQuCisgKiBWZXJpZnkgdGhhdCB0aGUgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwKKyAqIG51bWJlcnMgYXJlCisgKiAxLWJhc2VkLgorICoKKyAqIEByZXR1cm4gUFdNIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1BXTUNoYW5uZWwodWludDMyX3QgY2hhbm5lbCkgeworICBpZiAoY2hhbm5lbCA8IGtQd21DaGFubmVscykgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgaW5wdXQgbnVtYmVyIGlzIHZhbHVlLgorICogVmVyaWZ5IHRoYXQgdGhlIGFuYWxvZyBpbnB1dCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuCisgKiBDaGFubmVsIG51bWJlcnMKKyAqIGFyZSAwLWJhc2VkLgorICoKKyAqIEByZXR1cm4gQW5hbG9nIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja0FuYWxvZ0lucHV0KHVpbnQzMl90IGNoYW5uZWwpIHsKKyAgaWYgKGNoYW5uZWwgPCBrQW5hbG9nSW5wdXRzKSByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGFuYWxvZyBvdXRwdXQgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGFuYWxvZyBvdXRwdXQgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLgorICogQ2hhbm5lbCBudW1iZXJzCisgKiBhcmUgMC1iYXNlZC4KKyAqCisgKiBAcmV0dXJuIEFuYWxvZyBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tBbmFsb2dPdXRwdXQodWludDMyX3QgY2hhbm5lbCkgeworICBpZiAoY2hhbm5lbCA8IGtBbmFsb2dPdXRwdXRzKSByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IHRoZSBzb2xlbm9pZCBjaGFubmVsIG51bWJlciBpcyB3aXRoaW4gbGltaXRzLgorICoKKyAqIEByZXR1cm4gU29sZW5vaWQgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIFNlbnNvckJhc2U6OkNoZWNrU29sZW5vaWRDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpIHsKKyAgaWYgKGNoYW5uZWwgPCBrU29sZW5vaWRDaGFubmVscykgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBWZXJpZnkgdGhhdCB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGNoYW5uZWwgbnVtYmVyIGlzIHdpdGhpbiBsaW1pdHMuCisgKgorICogQHJldHVybiBQRFAgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIFNlbnNvckJhc2U6OkNoZWNrUERQQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKSB7CisgIGlmIChjaGFubmVsIDwga1BEUENoYW5uZWxzKSByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL1NlcmlhbFBvcnQuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1NlcmlhbFBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTI1OWEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvU2VyaWFsUG9ydC5jcHAKQEAgLTAsMCArMSwyMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlNlcmlhbFBvcnQuaCIKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvLyBzdGF0aWMgVmlTdGF0dXMgX1ZJX0ZVTkNIIGlvQ29tcGxldGVIYW5kbGVyIChWaVNlc3Npb24gdmksIFZpRXZlbnRUeXBlCisvLyBldmVudFR5cGUsIFZpRXZlbnQgZXZlbnQsIFZpQWRkciB1c2VySGFuZGxlKTsKKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBTZXJpYWwgUG9ydCBjbGFzcy4KKyAqCisgKiBAcGFyYW0gYmF1ZFJhdGUgVGhlIGJhdWQgcmF0ZSB0byBjb25maWd1cmUgdGhlIHNlcmlhbCBwb3J0LgorICogQHBhcmFtIHBvcnQgVGhlIHBoeXNpY2FsIHBvcnQgdG8gdXNlCisgKiBAcGFyYW0gZGF0YUJpdHMgVGhlIG51bWJlciBvZiBkYXRhIGJpdHMgcGVyIHRyYW5zZmVyLiAgVmFsaWQgdmFsdWVzIGFyZQorICogYmV0d2VlbiA1IGFuZCA4IGJpdHMuCisgKiBAcGFyYW0gcGFyaXR5IFNlbGVjdCB0aGUgdHlwZSBvZiBwYXJpdHkgY2hlY2tpbmcgdG8gdXNlLgorICogQHBhcmFtIHN0b3BCaXRzIFRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRvIHVzZSBhcyBkZWZpbmVkIGJ5IHRoZSBlbnVtCisgKiBTdG9wQml0cy4KKyAqLworU2VyaWFsUG9ydDo6U2VyaWFsUG9ydCh1aW50MzJfdCBiYXVkUmF0ZSwgUG9ydCBwb3J0LCB1aW50OF90IGRhdGFCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxQb3J0OjpQYXJpdHkgcGFyaXR5LCBTZXJpYWxQb3J0OjpTdG9wQml0cyBzdG9wQml0cykKK3sKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIG1fcG9ydCA9IHBvcnQ7CisKKyAgc2VyaWFsSW5pdGlhbGl6ZVBvcnQocG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICBzZXJpYWxTZXRCYXVkUmF0ZShwb3J0LCBiYXVkUmF0ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICBzZXJpYWxTZXREYXRhQml0cyhwb3J0LCBkYXRhQml0cywgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICBzZXJpYWxTZXRQYXJpdHkocG9ydCwgcGFyaXR5LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHNlcmlhbFNldFN0b3BCaXRzKHBvcnQsIHN0b3BCaXRzLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisKKyAgLy8gU2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQgdG8gNSBzZWNvbmRzLgorICBTZXRUaW1lb3V0KDUuMGYpOworCisgIC8vIERvbid0IHdhaXQgdW50aWwgdGhlIGJ1ZmZlciBpcyBmdWxsIHRvIHRyYW5zbWl0LgorICBTZXRXcml0ZUJ1ZmZlck1vZGUoa0ZsdXNoT25BY2Nlc3MpOworCisgIEVuYWJsZVRlcm1pbmF0aW9uKCk7CisKKyAgLy8gdmlJbnN0YWxsSGFuZGxlcihtX3BvcnRIYW5kbGUsIFZJX0VWRU5UX0lPX0NPTVBMRVRJT04sIGlvQ29tcGxldGVIYW5kbGVyLAorICAvLyB0aGlzKTsKKyAgLy8gdmlFbmFibGVFdmVudChtX3BvcnRIYW5kbGUsIFZJX0VWRU5UX0lPX0NPTVBMRVRJT04sIFZJX0hORExSLCBWSV9udWxscHRyKTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU2VyaWFsUG9ydCwgMCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3Rvci4KKyAqLworU2VyaWFsUG9ydDo6flNlcmlhbFBvcnQoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgc2VyaWFsQ2xvc2UobV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSB0eXBlIG9mIGZsb3cgY29udHJvbCB0byBlbmFibGUgb24gdGhpcyBwb3J0LgorICoKKyAqIEJ5IGRlZmF1bHQsIGZsb3cgY29udHJvbCBpcyBkaXNhYmxlZC4KKyAqLwordm9pZCBTZXJpYWxQb3J0OjpTZXRGbG93Q29udHJvbChTZXJpYWxQb3J0OjpGbG93Q29udHJvbCBmbG93Q29udHJvbCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNlcmlhbFNldEZsb3dDb250cm9sKG1fcG9ydCwgZmxvd0NvbnRyb2wsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBFbmFibGUgdGVybWluYXRpb24gYW5kIHNwZWNpZnkgdGhlIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4KKyAqCisgKiBUZXJtaW5hdGlvbiBpcyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBmb3IgcmVjZWl2ZS4KKyAqIFdoZW4gdGhlIHRoZSB0ZXJtaW5hdG9yIGlzIHJlY2lldmVkLCB0aGUgUmVhZCgpIG9yIFNjYW5mKCkgd2lsbCByZXR1cm4KKyAqICAgZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQsIHN0b3BwaW5nIGFmdGVyIHRoZSB0ZXJtaW5hdG9yLgorICoKKyAqIEBwYXJhbSB0ZXJtaW5hdG9yIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGZvciB0ZXJtaW5hdGlvbi4KKyAqLwordm9pZCBTZXJpYWxQb3J0OjpFbmFibGVUZXJtaW5hdGlvbihjaGFyIHRlcm1pbmF0b3IpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXJpYWxFbmFibGVUZXJtaW5hdGlvbihtX3BvcnQsIHRlcm1pbmF0b3IsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBEaXNhYmxlIHRlcm1pbmF0aW9uIGJlaGF2aW9yLgorICovCit2b2lkIFNlcmlhbFBvcnQ6OkRpc2FibGVUZXJtaW5hdGlvbigpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXJpYWxEaXNhYmxlVGVybWluYXRpb24obV9wb3J0LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGF2YWlsYWJsZSB0byByZWFkIGZyb20gdGhlIHNlcmlhbCBwb3J0LgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgdG8gcmVhZAorICovCitpbnQzMl90IFNlcmlhbFBvcnQ6OkdldEJ5dGVzUmVjZWl2ZWQoKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgaW50MzJfdCByZXRWYWwgPSBzZXJpYWxHZXRCeXRlc1JlY2VpdmVkKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIFJlYWQgcmF3IGJ5dGVzIG91dCBvZiB0aGUgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBidWZmZXIgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0b3JlIHRoZSBieXRlcyBpbi4KKyAqIEBwYXJhbSBjb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIGludG8gdGhlIGJ1ZmZlci4KKyAqLwordWludDMyX3QgU2VyaWFsUG9ydDo6UmVhZChjaGFyICpidWZmZXIsIGludDMyX3QgY291bnQpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQzMl90IHJldFZhbCA9IHNlcmlhbFJlYWQobV9wb3J0LCBidWZmZXIsIGNvdW50LCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogV3JpdGUgcmF3IGJ5dGVzIHRvIHRoZSBidWZmZXIuCisgKgorICogQHBhcmFtIGJ1ZmZlciBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCB0aGUgYnl0ZXMgZnJvbS4KKyAqIEBwYXJhbSBjb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiBpbnRvIHRoZSBwb3J0LgorICovCit1aW50MzJfdCBTZXJpYWxQb3J0OjpXcml0ZShjb25zdCBzdGQ6OnN0cmluZyAmYnVmZmVyLCBpbnQzMl90IGNvdW50KSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgaW50MzJfdCByZXRWYWwgPSBzZXJpYWxXcml0ZShtX3BvcnQsIGJ1ZmZlci5jX3N0cigpLCBjb3VudCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgdGltZW91dCBvZiB0aGUgc2VyaWFsIHBvcnQuCisgKgorICogVGhpcyBkZWZpbmVzIHRoZSB0aW1lb3V0IGZvciB0cmFuc2FjdGlvbnMgd2l0aCB0aGUgaGFyZHdhcmUuCisgKiBJdCB3aWxsIGFmZmVjdCByZWFkcyBhbmQgdmVyeSBsYXJnZSB3cml0ZXMuCisgKgorICogQHBhcmFtIHRpbWVvdXQgVGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHRvIHdhaXQgZm9yIEkvTy4KKyAqLwordm9pZCBTZXJpYWxQb3J0OjpTZXRUaW1lb3V0KGZsb2F0IHRpbWVvdXQpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXJpYWxTZXRUaW1lb3V0KG1fcG9ydCwgdGltZW91dCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlci4KKyAqCisgKiBTcGVjaWZ5IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSBzdG9yZWQgYmVmb3JlIGRhdGEKKyAqIGZyb20gdGhlIGRldmljZSBpcyByZXR1cm5lZCB0byBSZWFkIG9yIFNjYW5mLiAgSWYgeW91IHdhbnQKKyAqIGRhdGEgdGhhdCBpcyByZWNpZXZlZCB0byBiZSByZXR1cm5lZCBpbW1lZGlhdGVseSwgc2V0IHRoaXMgdG8gMS4KKyAqCisgKiBJdCB0aGUgYnVmZmVyIGlzIG5vdCBmaWxsZWQgYmVmb3JlIHRoZSByZWFkIHRpbWVvdXQgZXhwaXJlcywgYWxsCisgKiBkYXRhIHRoYXQgaGFzIGJlZW4gcmVjZWl2ZWQgc28gZmFyIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIHNpemUgVGhlIHJlYWQgYnVmZmVyIHNpemUuCisgKi8KK3ZvaWQgU2VyaWFsUG9ydDo6U2V0UmVhZEJ1ZmZlclNpemUodWludDMyX3Qgc2l6ZSkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNlcmlhbFNldFJlYWRCdWZmZXJTaXplKG1fcG9ydCwgc2l6ZSwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgKgorICogU3BlY2lmeSB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBjYW4gYmUgc3RvcmVkIGJlZm9yZSBiZWluZworICogdHJhbnNtaXR0ZWQgdG8gdGhlIGRldmljZS4KKyAqCisgKiBAcGFyYW0gc2l6ZSBUaGUgd3JpdGUgYnVmZmVyIHNpemUuCisgKi8KK3ZvaWQgU2VyaWFsUG9ydDo6U2V0V3JpdGVCdWZmZXJTaXplKHVpbnQzMl90IHNpemUpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBzZXJpYWxTZXRXcml0ZUJ1ZmZlclNpemUobV9wb3J0LCBzaXplLCAmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogU3BlY2lmeSB0aGUgZmx1c2hpbmcgYmVoYXZpb3Igb2YgdGhlIG91dHB1dCBidWZmZXIuCisgKgorICogV2hlbiBzZXQgdG8ga0ZsdXNoT25BY2Nlc3MsIGRhdGEgaXMgc3luY2hyb25vdXNseSB3cml0dGVuIHRvIHRoZSBzZXJpYWwgcG9ydAorICogICBhZnRlciBlYWNoIGNhbGwgdG8gZWl0aGVyIFByaW50ZigpIG9yIFdyaXRlKCkuCisgKgorICogV2hlbiBzZXQgdG8ga0ZsdXNoV2hlbkZ1bGwsIGRhdGEgd2lsbCBvbmx5IGJlIHdyaXR0ZW4gdG8gdGhlIHNlcmlhbCBwb3J0IHdoZW4KKyAqICAgdGhlIGJ1ZmZlciBpcyBmdWxsIG9yIHdoZW4gRmx1c2goKSBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtIG1vZGUgVGhlIHdyaXRlIGJ1ZmZlciBtb2RlLgorICovCit2b2lkIFNlcmlhbFBvcnQ6OlNldFdyaXRlQnVmZmVyTW9kZShTZXJpYWxQb3J0OjpXcml0ZUJ1ZmZlck1vZGUgbW9kZSkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNlcmlhbFNldFdyaXRlTW9kZShtX3BvcnQsIG1vZGUsICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKK30KKworLyoqCisgKiBGb3JjZSB0aGUgb3V0cHV0IGJ1ZmZlciB0byBiZSB3cml0dGVuIHRvIHRoZSBwb3J0LgorICoKKyAqIFRoaXMgaXMgdXNlZCB3aGVuIFNldFdyaXRlQnVmZmVyTW9kZSgpIGlzIHNldCB0byBrRmx1c2hXaGVuRnVsbCB0byBmb3JjZSBhCisgKiBmbHVzaCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBmdWxsLgorICovCit2b2lkIFNlcmlhbFBvcnQ6OkZsdXNoKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNlcmlhbEZsdXNoKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQorCisvKioKKyAqIFJlc2V0IHRoZSBzZXJpYWwgcG9ydCBkcml2ZXIgdG8gYSBrbm93biBzdGF0ZS4KKyAqCisgKiBFbXB0eSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyBpbiB0aGUgZGV2aWNlIGFuZCBmb3JtYXR0ZWQgSS9PLgorICovCit2b2lkIFNlcmlhbFBvcnQ6OlJlc2V0KCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHNlcmlhbENsZWFyKG1fcG9ydCwgJnN0YXR1cyk7CisgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL1NlcnZvLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9TZXJ2by5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMGNjNAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9TZXJ2by5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlNlcnZvLmgiCisKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworY29uc3RleHByIGZsb2F0IFNlcnZvOjprTWF4U2Vydm9BbmdsZTsKK2NvbnN0ZXhwciBmbG9hdCBTZXJ2bzo6a01pblNlcnZvQW5nbGU7CisKK2NvbnN0ZXhwciBmbG9hdCBTZXJ2bzo6a0RlZmF1bHRNYXhTZXJ2b1BXTTsKK2NvbnN0ZXhwciBmbG9hdCBTZXJ2bzo6a0RlZmF1bHRNaW5TZXJ2b1BXTTsKKworLyoqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gd2hpY2ggdGhlIHNlcnZvIGlzIGF0dGFjaGVkLiAwLTkgYXJlCisgKiBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitTZXJ2bzo6U2Vydm8odWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpIHsKKyAgLy8gU2V0IG1pbmltdW0gYW5kIG1heGltdW0gUFdNIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZvCisgIFNldEJvdW5kcyhrRGVmYXVsdE1heFNlcnZvUFdNLCAwLjAsIDAuMCwgMC4wLCBrRGVmYXVsdE1pblNlcnZvUFdNKTsKKworICAvLyBBc3NpZ24gZGVmYXVsdHMgZm9yIHBlcmlvZCBtdWx0aXBsaWVyIGZvciB0aGUgc2Vydm8gUFdNIGNvbnRyb2wgc2lnbmFsCisgIFNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfNFgpOworCisgIC8vCXByaW50ZigiRG9uZSBpbml0aWFsaXppbmcgc2Vydm8gJWRcbiIsIGNoYW5uZWwpOworfQorCitTZXJ2bzo6flNlcnZvKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgfQorfQorCisvKioKKyAqIFNldCB0aGUgc2Vydm8gcG9zaXRpb24uCisgKgorICogU2Vydm8gdmFsdWVzIHJhbmdlIGZyb20gMC4wIHRvIDEuMCBjb3JyZXNwb25kaW5nIHRvIHRoZSByYW5nZSBvZiBmdWxsIGxlZnQgdG8KKyAqIGZ1bGwgcmlnaHQuCisgKgorICogQHBhcmFtIHZhbHVlIFBvc2l0aW9uIGZyb20gMC4wIHRvIDEuMC4KKyAqLwordm9pZCBTZXJ2bzo6U2V0KGZsb2F0IHZhbHVlKSB7IFNldFBvc2l0aW9uKHZhbHVlKTsgfQorCisvKioKKyAqIFNldCB0aGUgc2Vydm8gdG8gb2ZmbGluZS4KKyAqCisgKiBTZXQgdGhlIHNlcnZvIHJhdyB2YWx1ZSB0byAwICh1bmRyaXZlbikKKyAqLwordm9pZCBTZXJ2bzo6U2V0T2ZmbGluZSgpIHsgU2V0UmF3KDApOyB9CisKKy8qKgorICogR2V0IHRoZSBzZXJ2byBwb3NpdGlvbi4KKyAqCisgKiBTZXJ2byB2YWx1ZXMgcmFuZ2UgZnJvbSAwLjAgdG8gMS4wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJhbmdlIG9mIGZ1bGwgbGVmdCB0bworICogZnVsbCByaWdodC4KKyAqCisgKiBAcmV0dXJuIFBvc2l0aW9uIGZyb20gMC4wIHRvIDEuMC4KKyAqLworZmxvYXQgU2Vydm86OkdldCgpIGNvbnN0IHsgcmV0dXJuIEdldFBvc2l0aW9uKCk7IH0KKworLyoqCisgKiBTZXQgdGhlIHNlcnZvIGFuZ2xlLgorICoKKyAqIEFzc3VtZSB0aGF0IHRoZSBzZXJ2byBhbmdsZSBpcyBsaW5lYXIgd2l0aCByZXNwZWN0IHRvIHRoZSBQV00gdmFsdWUgKGJpZworICogYXNzdW1wdGlvbiwgbmVlZCB0byB0ZXN0KS4KKyAqCisgKiBTZXJ2byBhbmdsZXMgdGhhdCBhcmUgb3V0IG9mIHRoZSBzdXBwb3J0ZWQgcmFuZ2Ugb2YgdGhlIHNlcnZvIHNpbXBseQorICogInNhdHVyYXRlIiBpbiB0aGF0IGRpcmVjdGlvbgorICogSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBzZXJ2byBoYXMgYSByYW5nZSBvZiAoWCBkZWdyZWVzIHRvIFkgZGVncmVlcykgdGhhbgorICogYW5nbGVzIG9mIGxlc3MgdGhhbiBYCisgKiByZXN1bHQgaW4gYW4gYW5nbGUgb2YgWCBiZWluZyBzZXQgYW5kIGFuZ2xlcyBvZiBtb3JlIHRoYW4gWSBkZWdyZWVzIHJlc3VsdCBpbgorICogYW4gYW5nbGUgb2YgWSBiZWluZyBzZXQuCisgKgorICogQHBhcmFtIGRlZ3JlZXMgVGhlIGFuZ2xlIGluIGRlZ3JlZXMgdG8gc2V0IHRoZSBzZXJ2by4KKyAqLwordm9pZCBTZXJ2bzo6U2V0QW5nbGUoZmxvYXQgZGVncmVlcykgeworICBpZiAoZGVncmVlcyA8IGtNaW5TZXJ2b0FuZ2xlKSB7CisgICAgZGVncmVlcyA9IGtNaW5TZXJ2b0FuZ2xlOworICB9IGVsc2UgaWYgKGRlZ3JlZXMgPiBrTWF4U2Vydm9BbmdsZSkgeworICAgIGRlZ3JlZXMgPSBrTWF4U2Vydm9BbmdsZTsKKyAgfQorCisgIFNldFBvc2l0aW9uKCgoZmxvYXQpKGRlZ3JlZXMgLSBrTWluU2Vydm9BbmdsZSkpIC8gR2V0U2Vydm9BbmdsZVJhbmdlKCkpOworfQorCisvKioKKyAqIEdldCB0aGUgc2Vydm8gYW5nbGUuCisgKgorICogQXNzdW1lIHRoYXQgdGhlIHNlcnZvIGFuZ2xlIGlzIGxpbmVhciB3aXRoIHJlc3BlY3QgdG8gdGhlIFBXTSB2YWx1ZSAoYmlnCisgKiBhc3N1bXB0aW9uLCBuZWVkIHRvIHRlc3QpLgorICogQHJldHVybiBUaGUgYW5nbGUgaW4gZGVncmVlcyB0byB3aGljaCB0aGUgc2Vydm8gaXMgc2V0LgorICovCitmbG9hdCBTZXJ2bzo6R2V0QW5nbGUoKSBjb25zdCB7CisgIHJldHVybiAoZmxvYXQpR2V0UG9zaXRpb24oKSAqIEdldFNlcnZvQW5nbGVSYW5nZSgpICsga01pblNlcnZvQW5nbGU7Cit9CisKK3ZvaWQgU2Vydm86OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwgYm9vbCBpc05ldykgeworICBpZiAoIXZhbHVlLT5Jc0RvdWJsZSgpKSByZXR1cm47CisgIFNldCh2YWx1ZS0+R2V0RG91YmxlKCkpOworfQorCit2b2lkIFNlcnZvOjpVcGRhdGVUYWJsZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlB1dE51bWJlcigiVmFsdWUiLCBHZXQoKSk7CisgIH0KK30KKwordm9pZCBTZXJ2bzo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPkFkZFRhYmxlTGlzdGVuZXIoIlZhbHVlIiwgdGhpcywgdHJ1ZSk7CisgIH0KK30KKwordm9pZCBTZXJ2bzo6U3RvcExpdmVXaW5kb3dNb2RlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyBTZXJ2bzo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeyByZXR1cm4gIlNlcnZvIjsgfQorCit2b2lkIFNlcnZvOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKyAgbV90YWJsZSA9IHN1YlRhYmxlOworICBVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBTZXJ2bzo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvU29sZW5vaWQuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1NvbGVub2lkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTc0Zjk4Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1NvbGVub2lkLmNwcApAQCAtMCwwICsxLDEzNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU29sZW5vaWQuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8qKgorICogQ29uc3RydWN0b3IgdXNpbmcgdGhlIGRlZmF1bHQgUENNIElEICgwKS4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBvbiB0aGUgUENNIHRvIGNvbnRyb2wgKDAuLjcpLgorICovCitTb2xlbm9pZDo6U29sZW5vaWQodWludDMyX3QgY2hhbm5lbCkKKyAgICA6IFNvbGVub2lkKEdldERlZmF1bHRTb2xlbm9pZE1vZHVsZSgpLCBjaGFubmVsKSB7fQorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgVGhlIENBTiBJRCBvZiB0aGUgUENNIHRoZSBzb2xlbm9pZCBpcyBhdHRhY2hlZCB0bworICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgb24gdGhlIFBDTSB0byBjb250cm9sICgwLi43KS4KKyAqLworU29sZW5vaWQ6OlNvbGVub2lkKHVpbnQ4X3QgbW9kdWxlTnVtYmVyLCB1aW50MzJfdCBjaGFubmVsKQorICAgIDogU29sZW5vaWRCYXNlKG1vZHVsZU51bWJlciksIG1fY2hhbm5lbChjaGFubmVsKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKKyAgaWYgKCFDaGVja1NvbGVub2lkTW9kdWxlKG1fbW9kdWxlTnVtYmVyKSkgeworICAgIGJ1ZiA8PCAiU29sZW5vaWQgTW9kdWxlICIgPDwgbV9tb2R1bGVOdW1iZXI7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTW9kdWxlSW5kZXhPdXRPZlJhbmdlLCBidWYuc3RyKCkpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIUNoZWNrU29sZW5vaWRDaGFubmVsKG1fY2hhbm5lbCkpIHsKKyAgICBidWYgPDwgIlNvbGVub2lkIE1vZHVsZSAiIDw8IG1fY2hhbm5lbDsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYuc3RyKCkpOworICAgIHJldHVybjsKKyAgfQorICBSZXNvdXJjZTo6Q3JlYXRlUmVzb3VyY2VPYmplY3QobV9hbGxvY2F0ZWQsIG1fbWF4TW9kdWxlcyAqIG1fbWF4UG9ydHMpOworICBidWYgPDwgIlNvbGVub2lkICIgPDwgbV9jaGFubmVsIDw8ICIgKE1vZHVsZTogIiA8PCBtX21vZHVsZU51bWJlciA8PCAiKSI7CisgIGlmIChtX2FsbG9jYXRlZC0+QWxsb2NhdGUobV9tb2R1bGVOdW1iZXIgKiBrU29sZW5vaWRDaGFubmVscyArIG1fY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuc3RyKCkpID09CisgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpIHsKKyAgICBDbG9uZUVycm9yKCptX2FsbG9jYXRlZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkQWN0dWF0b3IoIlNvbGVub2lkIiwgbV9tb2R1bGVOdW1iZXIsIG1fY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgbV9jaGFubmVsLAorICAgICAgICAgICAgbV9tb2R1bGVOdW1iZXIpOworfQorCisvKioKKyAqIERlc3RydWN0b3IuCisgKi8KK1NvbGVub2lkOjp+U29sZW5vaWQoKSB7CisgIGlmIChDaGVja1NvbGVub2lkTW9kdWxlKG1fbW9kdWxlTnVtYmVyKSkgeworICAgIG1fYWxsb2NhdGVkLT5GcmVlKG1fbW9kdWxlTnVtYmVyICoga1NvbGVub2lkQ2hhbm5lbHMgKyBtX2NoYW5uZWwpOworICB9CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7Cit9CisKKy8qKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNvbGVub2lkLgorICoKKyAqIEBwYXJhbSBvbiBUdXJuIHRoZSBzb2xlbm9pZCBvdXRwdXQgb2ZmIG9yIG9uLgorICovCit2b2lkIFNvbGVub2lkOjpTZXQoYm9vbCBvbikgeworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisgIHVpbnQ4X3QgdmFsdWUgPSBvbiA/IDB4RkYgOiAweDAwOworICB1aW50OF90IG1hc2sgPSAxIDw8IG1fY2hhbm5lbDsKKworICBTb2xlbm9pZEJhc2U6OlNldCh2YWx1ZSwgbWFzaywgbV9tb2R1bGVOdW1iZXIpOworfQorCisvKioKKyAqIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvbGVub2lkLgorICoKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvbGVub2lkLgorICovCitib29sIFNvbGVub2lkOjpHZXQoKSBjb25zdCB7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKKyAgdWludDhfdCB2YWx1ZSA9IEdldEFsbChtX21vZHVsZU51bWJlcikgJiAoMSA8PCBtX2NoYW5uZWwpOworICByZXR1cm4gKHZhbHVlICE9IDApOworfQorLyoqCisgKiBDaGVjayBpZiBzb2xlbm9pZCBpcyBibGFja2xpc3RlZC4KKyAqIAkJSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAorICogCQlkaXNhYmxlZCB1bnRpbCBwb3dlciBjeWNsZSwgb3IgdW50aWwgZmF1bHRzIGFyZSBjbGVhcmVkLgorICogCQlAc2VlIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKKyAqCisgKiBAcmV0dXJuIElmIHNvbGVub2lkIGlzIGRpc2FibGVkIGR1ZSB0byBzaG9ydC4KKyAqLworYm9vbCBTb2xlbm9pZDo6SXNCbGFja0xpc3RlZCgpIGNvbnN0IHsKKyAgaW50IHZhbHVlID0gR2V0UENNU29sZW5vaWRCbGFja0xpc3QobV9tb2R1bGVOdW1iZXIpICYgKDEgPDwgbV9jaGFubmVsKTsKKyAgcmV0dXJuICh2YWx1ZSAhPSAwKTsKK30KKwordm9pZCBTb2xlbm9pZDo6VmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSB7CisgIGlmICghdmFsdWUtPklzQm9vbGVhbigpKSByZXR1cm47CisgIFNldCh2YWx1ZS0+R2V0Qm9vbGVhbigpKTsKK30KKwordm9pZCBTb2xlbm9pZDo6VXBkYXRlVGFibGUoKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5QdXRCb29sZWFuKCJWYWx1ZSIsIEdldCgpKTsKKyAgfQorfQorCit2b2lkIFNvbGVub2lkOjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworICBTZXQoZmFsc2UpOworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+QWRkVGFibGVMaXN0ZW5lcigiVmFsdWUiLCB0aGlzLCB0cnVlKTsKKyAgfQorfQorCit2b2lkIFNvbGVub2lkOjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7CisgIFNldChmYWxzZSk7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICBtX3RhYmxlLT5SZW1vdmVUYWJsZUxpc3RlbmVyKHRoaXMpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFNvbGVub2lkOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7IHJldHVybiAiU29sZW5vaWQiOyB9CisKK3ZvaWQgU29sZW5vaWQ6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworICBtX3RhYmxlID0gc3ViVGFibGU7CisgIFVwZGF0ZVRhYmxlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IFNvbGVub2lkOjpHZXRUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGU7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9Tb2xlbm9pZEJhc2UuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1NvbGVub2lkQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkZjFlYgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9Tb2xlbm9pZEJhc2UuY3BwCkBAIC0wLDAgKzEsMTA1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJTb2xlbm9pZEJhc2UuaCIKKwordm9pZCogU29sZW5vaWRCYXNlOjptX3BvcnRzW21fbWF4TW9kdWxlc11bbV9tYXhQb3J0c107CitzdGQ6OnVuaXF1ZV9wdHI8UmVzb3VyY2U+IFNvbGVub2lkQmFzZTo6bV9hbGxvY2F0ZWQ7CisKKy8qKgorICogQ29uc3RydWN0b3IKKyAqCisgKiBAcGFyYW0gbW9kdWxlTnVtYmVyIFRoZSBDQU4gUENNIElELgorICovCitTb2xlbm9pZEJhc2U6OlNvbGVub2lkQmFzZSh1aW50OF90IG1vZHVsZU51bWJlcikKKyAgICA6IG1fbW9kdWxlTnVtYmVyKG1vZHVsZU51bWJlcikgeworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga1NvbGVub2lkQ2hhbm5lbHM7IGkrKykgeworICAgIHZvaWQqIHBvcnQgPSBnZXRQb3J0V2l0aE1vZHVsZShtb2R1bGVOdW1iZXIsIGkpOworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBTb2xlbm9pZEJhc2U6Om1fcG9ydHNbbW9kdWxlTnVtYmVyXVtpXSA9CisgICAgICAgIGluaXRpYWxpemVTb2xlbm9pZFBvcnQocG9ydCwgJnN0YXR1cyk7CisgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgICAgZnJlZVBvcnQocG9ydCk7CisgIH0KK30KKworLyoqCisgKiBTZXQgdGhlIHZhbHVlIG9mIGEgc29sZW5vaWQuCisgKgorICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB5b3Ugd2FudCB0byBzZXQgb24gdGhlIG1vZHVsZS4KKyAqIEBwYXJhbSBtYXNrIFRoZSBjaGFubmVscyB5b3Ugd2FudCB0byBiZSBhZmZlY3RlZC4KKyAqLwordm9pZCBTb2xlbm9pZEJhc2U6OlNldCh1aW50OF90IHZhbHVlLCB1aW50OF90IG1hc2ssIGludCBtb2R1bGUpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbWF4UG9ydHM7IGkrKykgeworICAgIHVpbnQ4X3QgbG9jYWxfbWFzayA9IDEgPDwgaTsKKyAgICBpZiAobWFzayAmIGxvY2FsX21hc2spCisgICAgICBzZXRTb2xlbm9pZChtX3BvcnRzW21vZHVsZV1baV0sIHZhbHVlICYgbG9jYWxfbWFzaywgJnN0YXR1cyk7CisgIH0KKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBnZXRIQUxFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Cit9CisKKy8qKgorICogUmVhZCBhbGwgOCBzb2xlbm9pZHMgYXMgYSBzaW5nbGUgYnl0ZQorICoKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgYWxsIDggc29sZW5vaWRzIG9uIHRoZSBtb2R1bGUuCisgKi8KK3VpbnQ4X3QgU29sZW5vaWRCYXNlOjpHZXRBbGwoaW50IG1vZHVsZSkgY29uc3QgeworICB1aW50OF90IHZhbHVlID0gMDsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICB2YWx1ZSA9IGdldEFsbFNvbGVub2lkcyhtX3BvcnRzW21vZHVsZV1bMF0sICZzdGF0dXMpOworICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBSZWFkcyBjb21wbGV0ZSBzb2xlbm9pZCBibGFja2xpc3QgZm9yIGFsbCA4IHNvbGVub2lkcyBhcyBhIHNpbmdsZSBieXRlLgorICoKKyAqIAkJSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAorICogCQlkaXNhYmxlZCB1bnRpbCBwb3dlciBjeWNsZSwgb3IgdW50aWwgZmF1bHRzIGFyZSBjbGVhcmVkLgorICogCQlAc2VlIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKKyAqCisgKiBAcmV0dXJuIFRoZSBzb2xlbm9pZCBibGFja2xpc3Qgb2YgYWxsIDggc29sZW5vaWRzIG9uIHRoZSBtb2R1bGUuCisgKi8KK3VpbnQ4X3QgU29sZW5vaWRCYXNlOjpHZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdChpbnQgbW9kdWxlKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgcmV0dXJuIGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KG1fcG9ydHNbbW9kdWxlXVswXSwgJnN0YXR1cyk7Cit9CisvKioKKyAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldCA6IFRoZSBjb21tb24KKyAqIAkJCWhpZ2hzaWRlIHNvbGVub2lkIHZvbHRhZ2UgcmFpbCBpcyB0b28gbG93LAorICogCSAJCW1vc3QgbGlrZWx5IGEgc29sZW5vaWQgY2hhbm5lbCBpcyBzaG9ydGVkLgorICovCitib29sIFNvbGVub2lkQmFzZTo6R2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQoaW50IG1vZHVsZSkgY29uc3QgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHJldHVybiBnZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdChtX3BvcnRzW21vZHVsZV1bMF0sICZzdGF0dXMpOworfQorLyoqCisgKiBAcmV0dXJuIHRydWUgaWYgUENNIGlzIGluIGZhdWx0IHN0YXRlIDogVGhlIGNvbW1vbgorICogCQkJaGlnaHNpZGUgc29sZW5vaWQgdm9sdGFnZSByYWlsIGlzIHRvbyBsb3csCisgKiAJIAkJbW9zdCBsaWtlbHkgYSBzb2xlbm9pZCBjaGFubmVsIGlzIHNob3J0ZWQuCisgKi8KK2Jvb2wgU29sZW5vaWRCYXNlOjpHZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdChpbnQgbW9kdWxlKSBjb25zdCB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgcmV0dXJuIGdldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KG1fcG9ydHNbbW9kdWxlXVswXSwgJnN0YXR1cyk7Cit9CisvKioKKyAqIENsZWFyIEFMTCBzdGlja3kgZmF1bHRzIGluc2lkZSBQQ00gdGhhdCBDb21wcmVzc29yIGlzIHdpcmVkIHRvLgorICoKKyAqIElmIGEgc3RpY2t5IGZhdWx0IGlzIHNldCwgdGhlbiBpdCB3aWxsIGJlIHBlcnNpc3RlbnRseSBjbGVhcmVkLiAgQ29tcHJlc3NvcgorICogZHJpdmUKKyAqIAkJbWF5YmUgbW9tZW50YXJpbHkgZGlzYWJsZSB3aGlsZSBmbGFncyBhcmUgYmVpbmcgY2xlYXJlZC4gQ2FyZQorICogc2hvdWxkIGJlCisgKiAJCXRha2VuIHRvIG5vdCBjYWxsIHRoaXMgdG9vIGZyZXF1ZW50bHksIG90aGVyd2lzZSBub3JtYWwKKyAqIGNvbXByZXNzb3IKKyAqIAkJZnVuY3Rpb25hbGl0eSBtYXkgYmUgcHJldmVudGVkLgorICoKKyAqIElmIG5vIHN0aWNreSBmYXVsdHMgYXJlIHNldCB0aGVuIHRoaXMgY2FsbCB3aWxsIGhhdmUgbm8gZWZmZWN0LgorICovCit2b2lkIFNvbGVub2lkQmFzZTo6Q2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoaW50IG1vZHVsZSkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIHJldHVybiBjbGVhckFsbFBDTVN0aWNreUZhdWx0c19zb2wobV9wb3J0c1ttb2R1bGVdWzBdLCAmc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9UYWxvbi5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvVGFsb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMWNmM2IKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvVGFsb24uY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlRhbG9uLmgiCisKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBUYWxvbiAob3JpZ2luYWwgb3IgVGFsb24gU1IpCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhlIFRhbG9uIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlCisgKiBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitUYWxvbjo6VGFsb24odWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpIHsKKyAgLyogTm90ZSB0aGF0IHRoZSBUYWxvbiB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMKKyAgICogc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMgZXhwZXJpZW5jZQorICAgKiBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvCisgICAqIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLgorICAgKiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVGFsb24gVXNlciBNYW51YWwgYXZhaWxhYmxlCisgICAqIGZyb20gQ1RSRS4KKyAgICoKKyAgICogICAyLjAzN21zID0gZnVsbCAiZm9yd2FyZCIKKyAgICogICAxLjUzOW1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgICAqICAgMS41MTNtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKKyAgICogICAxLjQ4N21zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAgICogICAwLjk4OW1zID0gZnVsbCAicmV2ZXJzZSIKKyAgICovCisgIFNldEJvdW5kcygyLjAzNywgMS41MzksIDEuNTEzLCAxLjQ4NywgLjk4OSk7CisgIFNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMVgpOworICBTZXRSYXcobV9jZW50ZXJQd20pOworICBTZXRaZXJvTGF0Y2goKTsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfVGFsb24sIEdldENoYW5uZWwoKSk7CisgIExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCktPkFkZEFjdHVhdG9yKCJUYWxvbiIsIEdldENoYW5uZWwoKSwgdGhpcyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUuCisgKgorICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQorICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorICogQHBhcmFtIHN5bmNHcm91cCBVbnVzZWQgaW50ZXJmYWNlLgorICovCit2b2lkIFRhbG9uOjpTZXQoZmxvYXQgc3BlZWQsIHVpbnQ4X3Qgc3luY0dyb3VwKSB7CisgIFNldFNwZWVkKG1faXNJbnZlcnRlZCA/IC1zcGVlZCA6IHNwZWVkKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlY2VudGx5IHNldCB2YWx1ZSBvZiB0aGUgUFdNLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlIGZvciB0aGUgUFdNIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBUYWxvbjo6R2V0KCkgY29uc3QgeyByZXR1cm4gR2V0U3BlZWQoKTsgfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorICovCit2b2lkIFRhbG9uOjpEaXNhYmxlKCkgeyBTZXRSYXcoa1B3bURpc2FibGVkKTsgfQorCisvKioKKyogY29tbW9uIGludGVyZmFjZSBmb3IgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIKKyogQHBhcmFtIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiB0cnVlIGlzIGludmVydGVkCisqLwordm9pZCBUYWxvbjo6U2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSB7IG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7IH0KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciB0aGUgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCisgKgorICovCitib29sIFRhbG9uOjpHZXRJbnZlcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJbnZlcnRlZDsgfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIFRhbG9uOjpQSURXcml0ZShmbG9hdCBvdXRwdXQpIHsgU2V0KG91dHB1dCk7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9UYWxvblNSWC5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvVGFsb25TUlguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDM4YzQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvVGFsb25TUlguY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlRhbG9uU1JYLmgiCisKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworLyoqCisgKiBDb25zdHJ1Y3QgYSBUYWxvblNSWCBjb25uZWN0ZWQgdmlhIFBXTQorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIFRhbG9uU1JYIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlCisgKiBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAorICovCitUYWxvblNSWDo6VGFsb25TUlgodWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpIHsKKyAgLyogTm90ZSB0aGF0IHRoZSBUYWxvblNSWCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZQorICAgKiB2YWx1ZXMgc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMKKyAgICogZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IKKyAgICogaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzCisgICAqIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVGFsb25TUlggVXNlcgorICAgKiBNYW51YWwgYXZhaWxhYmxlIGZyb20gQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuCisgICAqICAgMi4wMDRtcyA9IGZ1bGwgImZvcndhcmQiCisgICAqICAgMS41Mm1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgICAqICAgMS41MG1zID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQorICAgKiAgIDEuNDhtcyA9IHRoZSAibG93IGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgICAqICAgMC45OTdtcyA9IGZ1bGwgInJldmVyc2UiCisgICAqLworICBTZXRCb3VuZHMoMi4wMDQsIDEuNTIsIDEuNTAsIDEuNDgsIC45OTcpOworICBTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKKyAgU2V0UmF3KG1fY2VudGVyUHdtKTsKKyAgU2V0WmVyb0xhdGNoKCk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1RhbG9uU1JYLCBHZXRDaGFubmVsKCkpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRBY3R1YXRvcigiVGFsb25TUlgiLCBHZXRDaGFubmVsKCksIHRoaXMpOworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlLgorICoKKyAqIFRoZSBQV00gdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkKKyAqIHNjYWxpbmcgdGhlIHZhbHVlIGZvciB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgMS4wIHRvIHNldC4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVW51c2VkIGludGVyZmFjZS4KKyAqLwordm9pZCBUYWxvblNSWDo6U2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCkgeyBTZXRTcGVlZChzcGVlZCk7IH0KKworLyoqCisgKiBHZXQgdGhlIHJlY2VudGx5IHNldCB2YWx1ZSBvZiB0aGUgUFdNLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlIGZvciB0aGUgUFdNIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBUYWxvblNSWDo6R2V0KCkgY29uc3QgeyByZXR1cm4gR2V0U3BlZWQoKTsgfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorICovCit2b2lkIFRhbG9uU1JYOjpEaXNhYmxlKCkgeyBTZXRSYXcoa1B3bURpc2FibGVkKTsgfQorCisvKioKKyogQ29tbW9uIGludGVyZmFjZSBmb3IgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisqIEBwYXJhbSBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCisqLwordm9pZCBUYWxvblNSWDo6U2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSB7IG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7IH0KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciB0aGUgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCisgKgorICovCitib29sIFRhbG9uU1JYOjpHZXRJbnZlcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJbnZlcnRlZDsgfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIFRhbG9uU1JYOjpQSURXcml0ZShmbG9hdCBvdXRwdXQpIHsgU2V0KG91dHB1dCk7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9UYXNrLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9UYXNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU3ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Rhc2suY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJUYXNrLmgiCisKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZm5kZWYgT0sKKyNkZWZpbmUgT0sgMAorI2VuZGlmIC8qIE9LICovCisjaWZuZGVmIEVSUk9SCisjZGVmaW5lIEVSUk9SICgtMSkKKyNlbmRpZiAvKiBFUlJPUiAqLworCitjb25zdCB1aW50MzJfdCBUYXNrOjprRGVmYXVsdFByaW9yaXR5OworCitUYXNrJiBUYXNrOjpvcGVyYXRvcj0oVGFzayYmIHRhc2spIHsKKyAgbV90aHJlYWQuc3dhcCh0YXNrLm1fdGhyZWFkKTsKKyAgbV90YXNrTmFtZSA9IHN0ZDo6bW92ZSh0YXNrLm1fdGFza05hbWUpOworCisgIHJldHVybiAqdGhpczsKK30KKworVGFzazo6flRhc2soKSB7CisgIGlmIChtX3RocmVhZC5qb2luYWJsZSgpKSB7CisgICAgc3RkOjpjb3V0IDw8ICJbSEFMXSBFeGl0ZWQgdGFzayAiIDw8IG1fdGFza05hbWUgPDwgc3RkOjplbmRsOworICB9Cit9CisKK2Jvb2wgVGFzazo6am9pbmFibGUoKSBjb25zdCBub2V4Y2VwdCB7CisgIHJldHVybiBtX3RocmVhZC5qb2luYWJsZSgpOworfQorCit2b2lkIFRhc2s6OmpvaW4oKSB7CisgIG1fdGhyZWFkLmpvaW4oKTsKK30KKwordm9pZCBUYXNrOjpkZXRhY2goKSB7CisgIG1fdGhyZWFkLmRldGFjaCgpOworfQorCitzdGQ6OnRocmVhZDo6aWQgVGFzazo6Z2V0X2lkKCkgY29uc3Qgbm9leGNlcHQgeworICByZXR1cm4gbV90aHJlYWQuZ2V0X2lkKCk7Cit9CisKK3N0ZDo6dGhyZWFkOjpuYXRpdmVfaGFuZGxlX3R5cGUgVGFzazo6bmF0aXZlX2hhbmRsZSgpIHsKKyAgcmV0dXJuIG1fdGhyZWFkLm5hdGl2ZV9oYW5kbGUoKTsKK30KKworLyoqCisgKiBWZXJpZmllcyBhIHRhc2sgc3RpbGwgZXhpc3RzLgorICoKKyAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLgorICovCitib29sIFRhc2s6OlZlcmlmeSgpIHsKKyAgVEFTSyBpZCA9IChUQVNLKW1fdGhyZWFkLm5hdGl2ZV9oYW5kbGUoKTsKKyAgcmV0dXJuIHZlcmlmeVRhc2tJRChpZCkgPT0gT0s7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcHJpb3JpdHkgb2YgYSB0YXNrLgorICoKKyAqIEByZXR1cm4gdGFzayBwcmlvcml0eSBvciAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50MzJfdCBUYXNrOjpHZXRQcmlvcml0eSgpIHsKKyAgaW50IHByaW9yaXR5OworICBhdXRvIGlkID0gbV90aHJlYWQubmF0aXZlX2hhbmRsZSgpOworICBpZiAoSGFuZGxlRXJyb3IoZ2V0VGFza1ByaW9yaXR5KCZpZCwgJnByaW9yaXR5KSkpCisgICAgcmV0dXJuIHByaW9yaXR5OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhpcyByb3V0aW5lIGNoYW5nZXMgYSB0YXNrJ3MgcHJpb3JpdHkgdG8gYSBzcGVjaWZpZWQgcHJpb3JpdHkuCisgKiBQcmlvcml0aWVzIHJhbmdlIGZyb20gMSwgdGhlIGxvd2VzdCBwcmlvcml0eSwgdG8gOTksIHRoZSBoaWdoZXN0IHByaW9yaXR5LgorICogRGVmYXVsdCB0YXNrIHByaW9yaXR5IGlzIDYwLgorICoKKyAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgYXQgd2hpY2ggdGhlIGludGVybmFsIHRocmVhZCBzaG91bGQgcnVuLgorICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgVGFzazo6U2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSkgeworICBhdXRvIGlkID0gbV90aHJlYWQubmF0aXZlX2hhbmRsZSgpOworICByZXR1cm4gSGFuZGxlRXJyb3Ioc2V0VGFza1ByaW9yaXR5KCZpZCwgcHJpb3JpdHkpKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0YXNrLgorICoKKyAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHRhc2suCisgKi8KK3N0ZDo6c3RyaW5nIFRhc2s6OkdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtX3Rhc2tOYW1lOyB9CisKKy8qKgorICogSGFuZGxlcyBlcnJvcnMgZ2VuZXJhdGVkIGJ5IHRhc2sgcmVsYXRlZCBjb2RlLgorICovCitib29sIFRhc2s6OkhhbmRsZUVycm9yKFNUQVRVUyByZXN1bHRzKSB7CisgIGlmIChyZXN1bHRzICE9IEVSUk9SKSByZXR1cm4gdHJ1ZTsKKyAgaW50IGVycnN2ID0gZXJybm87CisgIGlmIChlcnJzdiA9PSBIQUxfdGFza0xpYl9JTExFR0FMX1BSSU9SSVRZKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGFza1ByaW9yaXR5RXJyb3IsIG1fdGFza05hbWUuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJFUlJPUjogZXJybm89JWkiLCBlcnJzdik7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGFza0Vycm9yLCBtX3Rhc2tOYW1lLmNfc3RyKCkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9UaW1lci5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvVGltZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjMxZTcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvVGltZXIuY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJUaW1lci5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIFBhdXNlIHRoZSB0YXNrIGZvciBhIHNwZWNpZmllZCB0aW1lLgorICoKKyAqIFBhdXNlIHRoZSBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0gZm9yIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lIGdpdmVuIGluCisgKiBzZWNvbmRzLgorICogTW90b3JzIHdpbGwgY29udGludWUgdG8gcnVuIGF0IHRoZWlyIGxhc3QgYXNzaWduZWQgdmFsdWVzLCBhbmQgc2Vuc29ycyB3aWxsCisgKiBjb250aW51ZSB0bworICogdXBkYXRlLiBPbmx5IHRoZSB0YXNrIGNvbnRhaW5pbmcgdGhlIHdhaXQgd2lsbCBwYXVzZSB1bnRpbCB0aGUgd2FpdCB0aW1lIGlzCisgKiBleHBpcmVkLgorICoKKyAqIEBwYXJhbSBzZWNvbmRzIExlbmd0aCBvZiB0aW1lIHRvIHBhdXNlLCBpbiBzZWNvbmRzLgorICovCit2b2lkIFdhaXQoZG91YmxlIHNlY29uZHMpIHsKKyAgaWYgKHNlY29uZHMgPCAwLjApIHJldHVybjsKKyAgZGVsYXlTZWNvbmRzKHNlY29uZHMpOworfQorCisvKioKKyAqIFJldHVybiB0aGUgRlBHQSBzeXN0ZW0gY2xvY2sgdGltZSBpbiBzZWNvbmRzLgorICogVGhpcyBpcyBkZXByZWNhdGVkIGFuZCBqdXN0IGZvcndhcmRzIHRvIFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCkuCisgKiBAcmV0dXJuIFJvYm90IHJ1bm5pbmcgdGltZSBpbiBzZWNvbmRzLgorICovCitkb3VibGUgR2V0Q2xvY2soKSB7IHJldHVybiBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpOyB9CisKKy8qKgorICogQGJyaWVmIEdpdmVzIHJlYWwtdGltZSBjbG9jayBzeXN0ZW0gdGltZSB3aXRoIG5hbm9zZWNvbmQgcmVzb2x1dGlvbgorICogQHJldHVybiBUaGUgdGltZSwganVzdCBpbiBjYXNlIHlvdSB3YW50IHRoZSByb2JvdCB0byBzdGFydCBhdXRvbm9tb3VzIGF0IDhwbQorICogb24gU2F0dXJkYXkuCisqLworZG91YmxlIEdldFRpbWUoKSB7CisgIHN0cnVjdCB0aW1lc3BlYyB0cDsKKworICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHApOworICBkb3VibGUgcmVhbFRpbWUgPSAoZG91YmxlKXRwLnR2X3NlYyArIChkb3VibGUpKChkb3VibGUpdHAudHZfbnNlYyAqIDFlLTkpOworCisgIHJldHVybiAocmVhbFRpbWUpOworfQorCisvL2ZvciBjb21wYXRpYmlsaXR5IHdpdGggbXN2YzEyLS1zZWUgQzI4NjQKK2NvbnN0IGRvdWJsZSBUaW1lcjo6a1JvbGxvdmVyVGltZSA9ICgxbGwgPDwgMzIpIC8gMWU2OworLyoqCisgKiBDcmVhdGUgYSBuZXcgdGltZXIgb2JqZWN0LgorICoKKyAqIENyZWF0ZSBhIG5ldyB0aW1lciBvYmplY3QgYW5kIHJlc2V0IHRoZSB0aW1lIHRvIHplcm8uIFRoZSB0aW1lciBpcyBpbml0aWFsbHkKKyAqIG5vdCBydW5uaW5nIGFuZAorICogbXVzdCBiZSBzdGFydGVkLgorICovCitUaW1lcjo6VGltZXIoKSB7CisgIC8vIENyZWF0ZXMgYSBzZW1hcGhvcmUgdG8gY29udHJvbCBhY2Nlc3MgdG8gY3JpdGljYWwgcmVnaW9ucy4KKyAgLy8gSW5pdGlhbGx5ICdvcGVuJworICBSZXNldCgpOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHRpbWVyLiBJZiB0aGUgY2xvY2sgaXMgcnVubmluZyBpdCBpcyBkZXJpdmVkCisgKiBmcm9tCisgKiB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgdGhlIHN0YXJ0IHRpbWUgc3RvcmVkIGluIHRoZSB0aW1lciBjbGFzcy4gSWYgdGhlCisgKiBjbG9jaworICogaXMgbm90IHJ1bm5pbmcsIHRoZW4gcmV0dXJuIHRoZSB0aW1lIHdoZW4gaXQgd2FzIGxhc3Qgc3RvcHBlZC4KKyAqCisgKiBAcmV0dXJuIEN1cnJlbnQgdGltZSB2YWx1ZSBmb3IgdGhpcyB0aW1lciBpbiBzZWNvbmRzCisgKi8KK2RvdWJsZSBUaW1lcjo6R2V0KCkgY29uc3QgeworICBkb3VibGUgcmVzdWx0OworICBkb3VibGUgY3VycmVudFRpbWUgPSBHZXRGUEdBVGltZXN0YW1wKCk7CisKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICBpZiAobV9ydW5uaW5nKSB7CisgICAgLy8gSWYgdGhlIGN1cnJlbnQgdGltZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IHRpbWUsIHRoZW4gdGhlIEZQR0EgY2xvY2sKKyAgICAvLyByb2xsZWQgb3Zlci4gIENvbXBlbnNhdGUgYnkgYWRkaW5nIHRoZSB+NzEgbWludXRlcyB0aGF0IGl0IHRha2VzCisgICAgLy8gdG8gcm9sbCBvdmVyIHRvIHRoZSBjdXJyZW50IHRpbWUuCisgICAgaWYgKGN1cnJlbnRUaW1lIDwgbV9zdGFydFRpbWUpIHsKKyAgICAgIGN1cnJlbnRUaW1lICs9IGtSb2xsb3ZlclRpbWU7CisgICAgfQorCisgICAgcmVzdWx0ID0gKGN1cnJlbnRUaW1lIC0gbV9zdGFydFRpbWUpICsgbV9hY2N1bXVsYXRlZFRpbWU7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gbV9hY2N1bXVsYXRlZFRpbWU7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlc2V0IHRoZSB0aW1lciBieSBzZXR0aW5nIHRoZSB0aW1lIHRvIDAuCisgKgorICogTWFrZSB0aGUgdGltZXIgc3RhcnRUaW1lIHRoZSBjdXJyZW50IHRpbWUgc28gbmV3IHJlcXVlc3RzIHdpbGwgYmUgcmVsYXRpdmUgdG8KKyAqIG5vdworICovCit2b2lkIFRpbWVyOjpSZXNldCgpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworICBtX2FjY3VtdWxhdGVkVGltZSA9IDA7CisgIG1fc3RhcnRUaW1lID0gR2V0RlBHQVRpbWVzdGFtcCgpOworfQorCisvKioKKyAqIFN0YXJ0IHRoZSB0aW1lciBydW5uaW5nLgorICogSnVzdCBzZXQgdGhlIHJ1bm5pbmcgZmxhZyB0byB0cnVlIGluZGljYXRpbmcgdGhhdCBhbGwgdGltZSByZXF1ZXN0cyBzaG91bGQgYmUKKyAqIHJlbGF0aXZlIHRvIHRoZSBzeXN0ZW0gY2xvY2suCisgKi8KK3ZvaWQgVGltZXI6OlN0YXJ0KCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgIGlmICghbV9ydW5uaW5nKSB7CisgICAgbV9zdGFydFRpbWUgPSBHZXRGUEdBVGltZXN0YW1wKCk7CisgICAgbV9ydW5uaW5nID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIFN0b3AgdGhlIHRpbWVyLgorICogVGhpcyBjb21wdXRlcyB0aGUgdGltZSBhcyBvZiBub3cgYW5kIGNsZWFycyB0aGUgcnVubmluZyBmbGFnLCBjYXVzaW5nIGFsbAorICogc3Vic2VxdWVudCB0aW1lIHJlcXVlc3RzIHRvIGJlIHJlYWQgZnJvbSB0aGUgYWNjdW11bGF0ZWQgdGltZSByYXRoZXIgdGhhbgorICogbG9va2luZyBhdCB0aGUgc3lzdGVtIGNsb2NrLgorICovCit2b2lkIFRpbWVyOjpTdG9wKCkgeworICBkb3VibGUgdGVtcCA9IEdldCgpOworCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX211dGV4KTsKKyAgaWYgKG1fcnVubmluZykgeworICAgIG1fYWNjdW11bGF0ZWRUaW1lID0gdGVtcDsKKyAgICBtX3J1bm5pbmcgPSBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBwZXJpb2Qgc3BlY2lmaWVkIGhhcyBwYXNzZWQgYW5kIGlmIGl0IGhhcywgYWR2YW5jZSB0aGUgc3RhcnQKKyAqIHRpbWUgYnkgdGhhdCBwZXJpb2QuIFRoaXMgaXMgdXNlZnVsIHRvIGRlY2lkZSBpZiBpdCdzIHRpbWUgdG8gZG8gcGVyaW9kaWMKKyAqIHdvcmsgd2l0aG91dCBkcmlmdGluZyBsYXRlciBieSB0aGUgdGltZSBpdCB0b29rIHRvIGdldCBhcm91bmQgdG8gY2hlY2tpbmcuCisgKgorICogQHBhcmFtIHBlcmlvZCBUaGUgcGVyaW9kIHRvIGNoZWNrIGZvciAoaW4gc2Vjb25kcykuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBlcmlvZCBoYXMgcGFzc2VkLgorICovCitib29sIFRpbWVyOjpIYXNQZXJpb2RQYXNzZWQoZG91YmxlIHBlcmlvZCkgeworICBpZiAoR2V0KCkgPiBwZXJpb2QpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgICAgLy8gQWR2YW5jZSB0aGUgc3RhcnQgdGltZSBieSB0aGUgcGVyaW9kLgorICAgIG1fc3RhcnRUaW1lICs9IHBlcmlvZDsKKyAgICAvLyBEb24ndCBzZXQgaXQgdG8gdGhlIGN1cnJlbnQgdGltZS4uLiB3ZSB3YW50IHRvIGF2b2lkIGRyaWZ0LgorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIEZQR0Egc3lzdGVtIGNsb2NrIHRpbWUgaW4gc2Vjb25kcy4KKyAqCisgKiBSZXR1cm4gdGhlIHRpbWUgZnJvbSB0aGUgRlBHQSBoYXJkd2FyZSBjbG9jayBpbiBzZWNvbmRzIHNpbmNlIHRoZSBGUEdBCisgKiBzdGFydGVkLgorICogUm9sbHMgb3ZlciBhZnRlciA3MSBtaW51dGVzLgorICogQHJldHVybnMgUm9ib3QgcnVubmluZyB0aW1lIGluIHNlY29uZHMuCisgKi8KK2RvdWJsZSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpIHsKKyAgLy8gRlBHQSByZXR1cm5zIHRoZSB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzCisgIC8vIENhbGwgdGhlIGhlbHBlciBHZXRGUEdBVGltZSgpIGluIFV0aWxpdHkuY3BwCisgIHJldHVybiBHZXRGUEdBVGltZSgpICogMS4wZS02OworfQorCisvLyBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IHJlYWRzIHRoZSBQUEMgdGltZXN0YW1wIGNvdW50ZXIuCitleHRlcm4gIkMiIHsKK3VpbnQzMl90IG5pVGltZXN0YW1wMzIodm9pZCk7Cit1aW50NjRfdCBuaVRpbWVzdGFtcDY0KHZvaWQpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL1VTQkNhbWVyYS5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvVVNCQ2FtZXJhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU3ZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1VTQkNhbWVyYS5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKyNpbmNsdWRlICJVU0JDYW1lcmEuaCIKKworI2luY2x1ZGUgIlV0aWxpdHkuaCIKKworI2luY2x1ZGUgPHJlZ2V4PgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKKy8vIFRoaXMgbWFjcm8gZXhwYW5kcyB0aGUgZ2l2ZW4gaW1hcSBmdW5jdGlvbiB0byBlbnN1cmUgdGhhdCBpdCBpcyBjYWxsZWQgYW5kCisvLyBwcm9wZXJseSBjaGVja2VkIGZvciBhbiBlcnJvciwgY2FsbGluZyB0aGUgd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0CisvLyBtYWNybworLy8gVG8gY2FsbCBpdCwganVzdCBnaXZlIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBhbmQgdGhlIGFyZ3VtZW50cworI2RlZmluZSBTQUZFX0lNQVFfQ0FMTChmdW5OYW1lLCAuLi4pICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgaW50IGVycm9yID0gZnVuTmFtZShfX1ZBX0FSR1NfXyk7ICAgICAgXAorICAgIGlmIChlcnJvciAhPSBJTUFRZHhFcnJvclN1Y2Nlc3MpICAgICAgICAgICAgICAgIFwKKyAgICAgIHdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChlcnJvciwgI2Z1bk5hbWUpOyBcCisgIH0KKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEganBlZy4gVGhlIGdlbmVyYWwgc3RydWN0dXJlIG9mCisgKiBob3cgdG8gcGFyc2UgYSBqcGVnIGZvciBsZW5ndGggY2FuIGJlIGZvdW5kIGluIHRoaXMgc3RhY2tvdmVyZmxvdyBhcnRpY2xlOgorICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTYwMjQyOC4gQmUgc3VyZSB0byBhbHNvIHJlYWQgdGhlIGNvbW1lbnRzIGZvcgorICogdGhlIFNPUyBmbGFnIGV4cGxhbmF0aW9uLgorICovCit1bnNpZ25lZCBpbnQgVVNCQ2FtZXJhOjpHZXRKcGVnU2l6ZSh2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGludCBidWZmU2l6ZSkgeworICB1aW50OF90KiBkYXRhID0gKHVpbnQ4X3QqKWJ1ZmZlcjsKKyAgaWYgKCF3cGlfYXNzZXJ0KGRhdGFbMF0gPT0gMHhmZiAmJiBkYXRhWzFdID09IDB4ZDgpKSByZXR1cm4gMDsKKyAgdW5zaWduZWQgaW50IHBvcyA9IDI7CisgIHdoaWxlIChwb3MgPCBidWZmU2l6ZSkgeworICAgIC8vIEFsbCBjb250cm9sIG1hcmtlcnMgc3RhcnQgd2l0aCAweGZmLCBzbyBpZiB0aGlzIGlzbid0IHByZXNlbnQsCisgICAgLy8gdGhlIEpQRUcgaXMgbm90IHZhbGlkCisgICAgaWYgKCF3cGlfYXNzZXJ0KGRhdGFbcG9zXSA9PSAweGZmKSkgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgY2hhciB0ID0gZGF0YVtwb3MgKyAxXTsKKyAgICAvLyBUaGVzZSBhcmUgUlNUIG1hcmtlcnMuIFdlIGp1c3Qgc2tpcCB0aGVtIGFuZCBtb3ZlIG9udG8gdGhlIG5leHQgbWFya2VyCisgICAgaWYgKHQgPT0gMHgwMSB8fCAodCA+PSAweGQwICYmIHQgPD0gMHhkNykpIHsKKyAgICAgIHBvcyArPSAyOworICAgIH0gZWxzZSBpZiAodCA9PSAweGQ5KSB7CisgICAgICAvLyBFbmQgb2YgSW1hZ2UsIGFkZCAyIGZvciB0aGlzIGFuZCAwLWluZGV4ZWQKKyAgICAgIHJldHVybiBwb3MgKyAyOworICAgIH0gZWxzZSBpZiAoIXdwaV9hc3NlcnQodCAhPSAweGQ4KSkgeworICAgICAgLy8gQW5vdGhlciBzdGFydCBvZiBpbWFnZSwgaW52YWxpZCBpbWFnZQorICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICh0ID09IDB4ZGEpIHsKKyAgICAgIC8vIFNPUyBtYXJrZXIuIFRoZSBuZXh0IHR3byBieXRlcyBhcmUgYSAxNi1iaXQgYmlnLWVuZGlhbiBpbnQgdGhhdCBpcworICAgICAgLy8gdGhlIGxlbmd0aCBvZiB0aGUgU09TIGhlYWRlciwgc2tpcCB0aGF0CisgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gKCgodW5zaWduZWQgaW50KShkYXRhW3BvcyArIDJdICYgMHhmZikpIDw8IDggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGludClkYXRhW3BvcyArIDNdICYgMHhmZikpOworICAgICAgcG9zICs9IGxlbiArIDI7CisgICAgICAvLyBUaGUgbmV4dCBtYXJrZXIgaXMgdGhlIGZpcnN0IG1hcmtlciB0aGF0IGlzIDB4ZmYgZm9sbG93ZWQgYnkgYSBub24tUlNUCisgICAgICAvLyBlbGVtZW50LiAweGZmIGZvbGxvd2VkIGJ5IDB4MDAgaXMgYW4gZXNjYXBlZCAweGZmLiAweGQwLTB4ZDcgYXJlIFJTVAorICAgICAgLy8gbWFya2VycworICAgICAgd2hpbGUgKGRhdGFbcG9zXSAhPSAweGZmIHx8IGRhdGFbcG9zICsgMV0gPT0gMHgwMCB8fAorICAgICAgICAgICAgIChkYXRhW3BvcyArIDFdID49IDB4ZDAgJiYgZGF0YVtwb3MgKyAxXSA8PSAweGQ3KSkgeworICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgaWYgKHBvcyA+PSBidWZmU2l6ZSkgcmV0dXJuIDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoaXMgaXMgb25lIG9mIHNldmVyYWwgcG9zc2libGUgbWFya2Vycy4gVGhlIG5leHQgdHdvIGJ5dGVzIGFyZSBhCisgICAgICAvLyAxNi1iaXQKKyAgICAgIC8vIGJpZy1lbmRpYW4gaW50IHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgbWFya2VyIGhlYWRlciwgc2tpcCB0aGF0IHRoZW4KKyAgICAgIC8vIGNvbnRpbnVlIHNlYXJjaGluZworICAgICAgdW5zaWduZWQgaW50IGxlbiA9ICgoKHVuc2lnbmVkIGludCkoZGF0YVtwb3MgKyAyXSAmIDB4ZmYpKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBpbnQpZGF0YVtwb3MgKyAzXSAmIDB4ZmYpKTsKKyAgICAgIHBvcyArPSBsZW4gKyAyOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitVU0JDYW1lcmE6OlVTQkNhbWVyYShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVzZUpwZWcpCisgICAgOiBtX25hbWUobmFtZSksCisgICAgICBtX3VzZUpwZWcodXNlSnBlZykge30KKwordm9pZCBVU0JDYW1lcmE6Ok9wZW5DYW1lcmEoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgdUludDMyIGlkID0gMDsKKyAgICAvLyBDYW4ndCB1c2UgU0FGRV9JTUFRX0NBTEwgaGVyZSBiZWNhdXNlIHdlIG9ubHkgZXJyb3Igb24gdGhlIHRoaXJkIHRpbWUKKyAgICBJTUFRZHhFcnJvciBlcnJvciA9IElNQVFkeE9wZW5DYW1lcmEoCisgICAgICAgIG1fbmFtZS5jX3N0cigpLCBJTUFRZHhDYW1lcmFDb250cm9sTW9kZUNvbnRyb2xsZXIsICZpZCk7CisgICAgaWYgKGVycm9yICE9IElNQVFkeEVycm9yU3VjY2VzcykgeworICAgICAgLy8gT25seSBlcnJvciBvbiB0aGUgM3JkIHRyeQorICAgICAgaWYgKGkgPj0gMikgd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KGVycm9yLCAiSU1BUWR4T3BlbkNhbWVyYSIpOworICAgICAgLy8gU2xlZXAgZm9yIGEgZmV3IHNlY29uZHMgdG8gZW5zdXJlIHRoZSBlcnJvciBoYXMgYmVlbiBkZWFsdCB3aXRoCisgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDAwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1faWQgPSBpZDsKKyAgICAgIG1fb3BlbiA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3ZvaWQgVVNCQ2FtZXJhOjpDbG9zZUNhbWVyYSgpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgaWYgKCFtX29wZW4pIHJldHVybjsKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4Q2xvc2VDYW1lcmEsIG1faWQpOworICBtX2lkID0gMDsKKyAgbV9vcGVuID0gZmFsc2U7Cit9CisKK3ZvaWQgVVNCQ2FtZXJhOjpTdGFydENhcHR1cmUoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIGlmICghbV9vcGVuIHx8IG1fYWN0aXZlKSByZXR1cm47CisgIFNBRkVfSU1BUV9DQUxMKElNQVFkeENvbmZpZ3VyZUdyYWIsIG1faWQpOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhTdGFydEFjcXVpc2l0aW9uLCBtX2lkKTsKKyAgbV9hY3RpdmUgPSB0cnVlOworfQorCit2b2lkIFVTQkNhbWVyYTo6U3RvcENhcHR1cmUoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIGlmICghbV9vcGVuIHx8ICFtX2FjdGl2ZSkgcmV0dXJuOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhTdG9wQWNxdWlzaXRpb24sIG1faWQpOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhVbmNvbmZpZ3VyZUFjcXVpc2l0aW9uLCBtX2lkKTsKKyAgbV9hY3RpdmUgPSBmYWxzZTsKK30KKwordm9pZCBVU0JDYW1lcmE6OlVwZGF0ZVNldHRpbmdzKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBib29sIHdhc0FjdGl2ZSA9IG1fYWN0aXZlOworCisgIGlmICh3YXNBY3RpdmUpIFN0b3BDYXB0dXJlKCk7CisgIGlmIChtX29wZW4pIENsb3NlQ2FtZXJhKCk7CisgIE9wZW5DYW1lcmEoKTsKKworICB1SW50MzIgY291bnQgPSAwOworICB1SW50MzIgY3VycmVudE1vZGUgPSAwOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhFbnVtZXJhdGVWaWRlb01vZGVzLCBtX2lkLCBudWxscHRyLCAmY291bnQsICZjdXJyZW50TW9kZSk7CisgIGF1dG8gbW9kZXMgPSBzdGQ6Om1ha2VfdW5pcXVlPElNQVFkeFZpZGVvTW9kZVtdPihjb3VudCk7CisgIFNBRkVfSU1BUV9DQUxMKElNQVFkeEVudW1lcmF0ZVZpZGVvTW9kZXMsIG1faWQsIG1vZGVzLmdldCgpLCAmY291bnQsICZjdXJyZW50TW9kZSk7CisKKyAgLy8gR3JvdXBzIGFyZToKKyAgLy8gICAwIC0gd2lkdGgKKyAgLy8gICAxIC0gaGVpZ2h0CisgIC8vICAgMiAtIGZvcm1hdAorICAvLyAgIDMgLSBmcHMKKyAgc3RkOjpyZWdleCByZU1vZGUoIihbMC05XSspXFxzKnhcXHMqKFswLTldKylcXHMrKC4qPylcXHMrKFswLTkuXSspXFxzKmZwcyIpOworICBJTUFRZHhWaWRlb01vZGUqIGZvdW5kTW9kZSA9IG51bGxwdHI7CisgIElNQVFkeFZpZGVvTW9kZSogY3VycmVudE1vZGVQdHIgPSAmbW9kZXNbY3VycmVudE1vZGVdOworICBkb3VibGUgZm91bmRGcHMgPSAxMDAwLjA7CisKKyAgLy8gTG9vcCB0aHJvdWdoIHRoZSBtb2RlcywgYW5kIGZpbmQgdGhlIG1hdGNoIHdpdGggdGhlIGxvd2VzdCBmcHMKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgc3RkOjpjbWF0Y2ggbTsKKyAgICBpZiAoIXN0ZDo6cmVnZXhfbWF0Y2gobW9kZXNbaV0uTmFtZSwgbSwgcmVNb2RlKSkgY29udGludWU7CisgICAgdW5zaWduZWQgaW50IHdpZHRoID0gKHVuc2lnbmVkIGludClzdGQ6OnN0b3VsKG1bMV0uc3RyKCkpOworICAgIHVuc2lnbmVkIGludCBoZWlnaHQgPSAodW5zaWduZWQgaW50KXN0ZDo6c3RvdWwobVsyXS5zdHIoKSk7CisgICAgaWYgKHdpZHRoICE9IG1fd2lkdGgpIGNvbnRpbnVlOworICAgIGlmIChoZWlnaHQgIT0gbV9oZWlnaHQpIGNvbnRpbnVlOworICAgIGRvdWJsZSBmcHMgPSBhdG9mKG1bNF0uc3RyKCkuY19zdHIoKSk7CisgICAgaWYgKGZwcyA8IG1fZnBzKSBjb250aW51ZTsKKyAgICBpZiAoZnBzID4gZm91bmRGcHMpIGNvbnRpbnVlOworICAgIGJvb2wgaXNKcGVnID0KKyAgICAgICAgbVszXS5zdHIoKS5jb21wYXJlKCJqcGVnIikgPT0gMCB8fCBtWzNdLnN0cigpLmNvbXBhcmUoIkpQRUciKSA9PSAwOworICAgIGlmICgobV91c2VKcGVnICYmICFpc0pwZWcpIHx8ICghbV91c2VKcGVnICYmIGlzSnBlZykpIGNvbnRpbnVlOworICAgIGZvdW5kTW9kZSA9ICZtb2Rlc1tpXTsKKyAgICBmb3VuZEZwcyA9IGZwczsKKyAgfQorICBpZiAoZm91bmRNb2RlICE9IG51bGxwdHIpIHsKKyAgICBpZiAoZm91bmRNb2RlLT5WYWx1ZSAhPSBjdXJyZW50TW9kZVB0ci0+VmFsdWUpIHsKKyAgICAgIFNBRkVfSU1BUV9DQUxMKElNQVFkeFNldEF0dHJpYnV0ZSwgbV9pZCwgSU1BUWR4QXR0cmlidXRlVmlkZW9Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgSU1BUWR4VmFsdWVUeXBlVTMyLCBmb3VuZE1vZGUtPlZhbHVlKTsKKyAgICB9CisgIH0KKworICBpZiAobV93aGl0ZUJhbGFuY2UuY29tcGFyZShBVVRPKSA9PSAwKSB7CisgICAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U2V0QXR0cmlidXRlLCBtX2lkLCBBVFRSX1dCX01PREUsCisgICAgICAgICAgICAgICAgICAgSU1BUWR4VmFsdWVUeXBlU3RyaW5nLCBBVVRPKTsKKyAgfSBlbHNlIHsKKyAgICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhTZXRBdHRyaWJ1dGUsIG1faWQsIEFUVFJfV0JfTU9ERSwKKyAgICAgICAgICAgICAgICAgICBJTUFRZHhWYWx1ZVR5cGVTdHJpbmcsIE1BTlVBTCk7CisgICAgaWYgKG1fd2hpdGVCYWxhbmNlVmFsdWVQcmVzZW50KQorICAgICAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U2V0QXR0cmlidXRlLCBtX2lkLCBBVFRSX1dCX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgSU1BUWR4VmFsdWVUeXBlVTMyLCBtX3doaXRlQmFsYW5jZVZhbHVlKTsKKyAgfQorCisgIGlmIChtX2V4cG9zdXJlLmNvbXBhcmUoQVVUTykgPT0gMCkgeworICAgIFNBRkVfSU1BUV9DQUxMKElNQVFkeFNldEF0dHJpYnV0ZSwgbV9pZCwgQVRUUl9FWF9NT0RFLAorICAgICAgICAgICAgICAgICAgIElNQVFkeFZhbHVlVHlwZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiQXV0b0FwZXJhdHVyZVByaW9yaXR5IikuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U2V0QXR0cmlidXRlLCBtX2lkLCBBVFRSX0VYX01PREUsCisgICAgICAgICAgICAgICAgICAgSU1BUWR4VmFsdWVUeXBlU3RyaW5nLCBNQU5VQUwpOworICAgIGlmIChtX2V4cG9zdXJlVmFsdWVQcmVzZW50KSB7CisgICAgICBkb3VibGUgbWludiA9IDAuMDsKKyAgICAgIGRvdWJsZSBtYXh2ID0gMC4wOworICAgICAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4R2V0QXR0cmlidXRlTWluaW11bSwgbV9pZCwgQVRUUl9FWF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgIElNQVFkeFZhbHVlVHlwZUY2NCwgJm1pbnYpOworICAgICAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4R2V0QXR0cmlidXRlTWF4aW11bSwgbV9pZCwgQVRUUl9FWF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgIElNQVFkeFZhbHVlVHlwZUY2NCwgJm1heHYpOworICAgICAgZG91YmxlIHZhbCA9IG1pbnYgKyAoKG1heHYgLSBtaW52KSAqICgoZG91YmxlKW1fZXhwb3N1cmVWYWx1ZSAvIDEwMC4wKSk7CisgICAgICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhTZXRBdHRyaWJ1dGUsIG1faWQsIEFUVFJfRVhfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICBJTUFRZHhWYWx1ZVR5cGVGNjQsIHZhbCk7CisgICAgfQorICB9CisKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4U2V0QXR0cmlidXRlLCBtX2lkLCBBVFRSX0JSX01PREUsIElNQVFkeFZhbHVlVHlwZVN0cmluZywKKyAgICAgICAgICAgICAgICAgTUFOVUFMKTsKKyAgZG91YmxlIG1pbnYgPSAwLjA7CisgIGRvdWJsZSBtYXh2ID0gMC4wOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhHZXRBdHRyaWJ1dGVNaW5pbXVtLCBtX2lkLCBBVFRSX0JSX1ZBTFVFLAorICAgICAgICAgICAgICAgICBJTUFRZHhWYWx1ZVR5cGVGNjQsICZtaW52KTsKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4R2V0QXR0cmlidXRlTWF4aW11bSwgbV9pZCwgQVRUUl9CUl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgSU1BUWR4VmFsdWVUeXBlRjY0LCAmbWF4dik7CisgIGRvdWJsZSB2YWwgPSBtaW52ICsgKChtYXh2IC0gbWludikgKiAoKGRvdWJsZSltX2JyaWdodG5lc3MgLyAxMDAuMCkpOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhTZXRBdHRyaWJ1dGUsIG1faWQsIEFUVFJfQlJfVkFMVUUsIElNQVFkeFZhbHVlVHlwZUY2NCwKKyAgICAgICAgICAgICAgICAgdmFsKTsKKworICBpZiAod2FzQWN0aXZlKSBTdGFydENhcHR1cmUoKTsKK30KKwordm9pZCBVU0JDYW1lcmE6OlNldEZQUyhkb3VibGUgZnBzKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIGlmIChtX2ZwcyAhPSBmcHMpIHsKKyAgICBtX25lZWRTZXR0aW5nc1VwZGF0ZSA9IHRydWU7CisgICAgbV9mcHMgPSBmcHM7CisgIH0KK30KKwordm9pZCBVU0JDYW1lcmE6OlNldFNpemUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIGlmIChtX3dpZHRoICE9IHdpZHRoIHx8IG1faGVpZ2h0ICE9IGhlaWdodCkgeworICAgIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gdHJ1ZTsKKyAgICBtX3dpZHRoID0gd2lkdGg7CisgICAgbV9oZWlnaHQgPSBoZWlnaHQ7CisgIH0KK30KKwordm9pZCBVU0JDYW1lcmE6OlNldEJyaWdodG5lc3ModW5zaWduZWQgaW50IGJyaWdodG5lc3MpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgaWYgKG1fYnJpZ2h0bmVzcyAhPSBicmlnaHRuZXNzKSB7CisgICAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSB0cnVlOworICAgIG1fYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisgIH0KK30KKwordW5zaWduZWQgaW50IFVTQkNhbWVyYTo6R2V0QnJpZ2h0bmVzcygpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgcmV0dXJuIG1fYnJpZ2h0bmVzczsKK30KKwordm9pZCBVU0JDYW1lcmE6OlNldFdoaXRlQmFsYW5jZUF1dG8oKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIG1fd2hpdGVCYWxhbmNlID0gQVVUTzsKKyAgbV93aGl0ZUJhbGFuY2VWYWx1ZSA9IDA7CisgIG1fd2hpdGVCYWxhbmNlVmFsdWVQcmVzZW50ID0gZmFsc2U7CisgIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZCBVU0JDYW1lcmE6OlNldFdoaXRlQmFsYW5jZUhvbGRDdXJyZW50KCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBsb2NrKG1fbXV0ZXgpOworICBtX3doaXRlQmFsYW5jZSA9IE1BTlVBTDsKKyAgbV93aGl0ZUJhbGFuY2VWYWx1ZSA9IDA7CisgIG1fd2hpdGVCYWxhbmNlVmFsdWVQcmVzZW50ID0gZmFsc2U7CisgIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZCBVU0JDYW1lcmE6OlNldFdoaXRlQmFsYW5jZU1hbnVhbCh1bnNpZ25lZCBpbnQgd2hpdGVCYWxhbmNlKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIG1fd2hpdGVCYWxhbmNlID0gTUFOVUFMOworICBtX3doaXRlQmFsYW5jZVZhbHVlID0gd2hpdGVCYWxhbmNlOworICBtX3doaXRlQmFsYW5jZVZhbHVlUHJlc2VudCA9IHRydWU7CisgIG1fbmVlZFNldHRpbmdzVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZCBVU0JDYW1lcmE6OlNldEV4cG9zdXJlQXV0bygpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgbV9leHBvc3VyZSA9IEFVVE87CisgIG1fZXhwb3N1cmVWYWx1ZSA9IDA7CisgIG1fZXhwb3N1cmVWYWx1ZVByZXNlbnQgPSBmYWxzZTsKKyAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSB0cnVlOworfQorCit2b2lkIFVTQkNhbWVyYTo6U2V0RXhwb3N1cmVIb2xkQ3VycmVudCgpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgbV9leHBvc3VyZSA9IE1BTlVBTDsKKyAgbV9leHBvc3VyZVZhbHVlID0gMDsKKyAgbV9leHBvc3VyZVZhbHVlUHJlc2VudCA9IGZhbHNlOworICBtX25lZWRTZXR0aW5nc1VwZGF0ZSA9IHRydWU7Cit9CisKK3ZvaWQgVVNCQ2FtZXJhOjpTZXRFeHBvc3VyZU1hbnVhbCh1bnNpZ25lZCBpbnQgbGV2ZWwpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgbV9leHBvc3VyZSA9IE1BTlVBTDsKKyAgaWYgKGxldmVsID4gMTAwKQorICAgIG1fZXhwb3N1cmVWYWx1ZSA9IDEwMDsKKyAgZWxzZQorICAgIG1fZXhwb3N1cmVWYWx1ZSA9IGxldmVsOworICBtX2V4cG9zdXJlVmFsdWVQcmVzZW50ID0gdHJ1ZTsKKyAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSB0cnVlOworfQorCit2b2lkIFVTQkNhbWVyYTo6R2V0SW1hZ2UoSW1hZ2UqIGltYWdlKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIGlmIChtX25lZWRTZXR0aW5nc1VwZGF0ZSB8fCBtX3VzZUpwZWcpIHsKKyAgICBtX25lZWRTZXR0aW5nc1VwZGF0ZSA9IGZhbHNlOworICAgIG1fdXNlSnBlZyA9IGZhbHNlOworICAgIFVwZGF0ZVNldHRpbmdzKCk7CisgIH0KKyAgLy8gQnVmTnVtIGlzIG5vdCBhY3R1YWxseSB1c2VkIGZvciBhbnl0aGluZyBhdCBvdXIgbGV2ZWwsIHNpbmNlIHdlIGFyZQorICAvLyB3YWl0aW5nIHVudGlsIHRoZSBuZXh0IGltYWdlIGlzIHJlYWR5IGFueXdheQorICB1SW50MzIgYnVmTnVtOworICBTQUZFX0lNQVFfQ0FMTChJTUFRZHhHcmFiLCBtX2lkLCBpbWFnZSwgMSwgJmJ1Zk51bSk7Cit9CisKK3Vuc2lnbmVkIGludCBVU0JDYW1lcmE6OkdldEltYWdlRGF0YSh2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGludCBidWZmZXJTaXplKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgIGlmIChtX25lZWRTZXR0aW5nc1VwZGF0ZSB8fCAhbV91c2VKcGVnKSB7CisgICAgbV9uZWVkU2V0dGluZ3NVcGRhdGUgPSBmYWxzZTsKKyAgICBtX3VzZUpwZWcgPSB0cnVlOworICAgIFVwZGF0ZVNldHRpbmdzKCk7CisgIH0KKyAgLy8gQnVmTnVtIGlzIG5vdCBhY3R1YWxseSB1c2VkIGZvciBhbnl0aGluZyBhdCBvdXIgbGV2ZWwKKyAgdUludDMyIGJ1Zk51bTsKKyAgU0FGRV9JTUFRX0NBTEwoSU1BUWR4R2V0SW1hZ2VEYXRhLCBtX2lkLCBidWZmZXIsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgIElNQVFkeEJ1ZmZlck51bWJlck1vZGVMYXN0LCAwLCAmYnVmTnVtKTsKKyAgcmV0dXJuIEdldEpwZWdTaXplKGJ1ZmZlciwgYnVmZmVyU2l6ZSk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvVWx0cmFzb25pYy5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvVWx0cmFzb25pYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyNWEwNAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9VbHRyYXNvbmljLmNwcApAQCAtMCwwICsxLDM1NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVWx0cmFzb25pYy5oIgorCisjaW5jbHVkZSAiQ291bnRlci5oIgorI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgorI2luY2x1ZGUgIkRpZ2l0YWxPdXRwdXQuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworY29uc3RleHByIGRvdWJsZQorICAgIFVsdHJhc29uaWM6OmtQaW5nVGltZTsgIC8vLzwgVGltZSAoc2VjKSBmb3IgdGhlIHBpbmcgdHJpZ2dlciBwdWxzZS4KK2NvbnN0IHVpbnQzMl90IFVsdHJhc29uaWM6OmtQcmlvcml0eTsgIC8vLzwgUHJpb3JpdHkgdGhhdCB0aGUgdWx0cmFzb25pYyByb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vcm9iaW4gdGFzayBydW5zLgorY29uc3RleHByIGRvdWJsZQorICAgIFVsdHJhc29uaWM6OmtNYXhVbHRyYXNvbmljVGltZTsgIC8vLzwgTWF4IHRpbWUgKG1zKSBiZXR3ZWVuIHJlYWRpbmdzLgorY29uc3RleHByIGRvdWJsZSBVbHRyYXNvbmljOjprU3BlZWRPZlNvdW5kSW5jaGVzUGVyU2VjOworVWx0cmFzb25pYyAqVWx0cmFzb25pYzo6bV9maXJzdFNlbnNvciA9CisgICAgbnVsbHB0cjsgIC8vIGhlYWQgb2YgdGhlIHVsdHJhc29uaWMgc2Vuc29yIGxpc3QKK1Rhc2sgVWx0cmFzb25pYzo6bV90YXNrOworc3RkOjphdG9taWM8Ym9vbD4gVWx0cmFzb25pYzo6bV9hdXRvbWF0aWNFbmFibGVke2ZhbHNlfTsgLy8gYXV0b21hdGljIHJvdW5kIHJvYmluIG1vZGUKK3ByaW9yaXR5X211dGV4IFVsdHJhc29uaWM6Om1fbXV0ZXg7CisKKy8qKgorICogQmFja2dyb3VuZCB0YXNrIHRoYXQgZ29lcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVsdHJhc29uaWMgc2Vuc29ycyBhbmQgcGluZ3MKKyAqIGVhY2ggb25lIGluIHR1cm4uIFRoZSBjb3VudGVyCisgKiBpcyBjb25maWd1cmVkIHRvIHJlYWQgdGhlIHRpbWluZyBvZiB0aGUgcmV0dXJuZWQgZWNobyBwdWxzZS4KKyAqCisgKiBEQU5HRVIgV0lMTCBST0JJTlNPTiwgREFOR0VSIFdJTEwgUk9CSU5TT046CisgKiBUaGlzIGNvZGUgcnVucyBhcyBhIHRhc2sgYW5kIGFzc3VtZXMgdGhhdCBub25lIG9mIHRoZSB1bHRyYXNvbmljIHNlbnNvcnMgd2lsbAorICogY2hhbmdlIHdoaWxlIGl0J3MKKyAqIHJ1bm5pbmcuIElmIG9uZSBkb2VzLCB0aGVuIHRoaXMgd2lsbCBjZXJ0YWlubHkgYnJlYWsuIE1ha2Ugc3VyZSB0byBkaXNhYmxlCisgKiBhdXRvbWF0aWMgbW9kZSBiZWZvcmUgY2hhbmdpbmcKKyAqIGFueXRoaW5nIHdpdGggdGhlIHNlbnNvcnMhIQorICovCit2b2lkIFVsdHJhc29uaWM6OlVsdHJhc29uaWNDaGVja2VyKCkgeworICBVbHRyYXNvbmljICp1ID0gbnVsbHB0cjsKKyAgd2hpbGUgKG1fYXV0b21hdGljRW5hYmxlZCkgeworICAgIGlmICh1ID09IG51bGxwdHIpIHUgPSBtX2ZpcnN0U2Vuc29yOworICAgIGlmICh1ID09IG51bGxwdHIpIHJldHVybjsKKyAgICBpZiAodS0+SXNFbmFibGVkKCkpIHUtPm1fcGluZ0NoYW5uZWwtPlB1bHNlKGtQaW5nVGltZSk7ICAvLyBkbyB0aGUgcGluZworICAgIHUgPSB1LT5tX25leHRTZW5zb3I7CisgICAgV2FpdCgwLjEpOyAgLy8gd2FpdCBmb3IgcGluZyB0byByZXR1cm4KKyAgfQorfQorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIFVsdHJhc29uaWMgU2Vuc29yLgorICogVGhpcyBpcyB0aGUgY29tbW9uIGNvZGUgdGhhdCBpbml0aWFsaXplcyB0aGUgdWx0cmFzb25pYyBzZW5zb3IgZ2l2ZW4gdGhhdAorICogdGhlcmUKKyAqIGFyZSB0d28gZGlnaXRhbCBJL08gY2hhbm5lbHMgYWxsb2NhdGVkLiBJZiB0aGUgc3lzdGVtIHdhcyBydW5uaW5nIGluCisgKiBhdXRvbWF0aWMgbW9kZSAocm91bmQgcm9iaW4pCisgKiB3aGVuIHRoZSBuZXcgc2Vuc29yIGlzIGFkZGVkLCBpdCBpcyBzdG9wcGVkLCB0aGUgc2Vuc29yIGlzIGFkZGVkLCB0aGVuCisgKiBhdXRvbWF0aWMgbW9kZSBpcworICogcmVzdG9yZWQuCisgKi8KK3ZvaWQgVWx0cmFzb25pYzo6SW5pdGlhbGl6ZSgpIHsKKyAgYm9vbCBvcmlnaW5hbE1vZGUgPSBtX2F1dG9tYXRpY0VuYWJsZWQ7CisgIFNldEF1dG9tYXRpY01vZGUoZmFsc2UpOyAgICAgLy8ga2lsbCB0YXNrIHdoZW4gYWRkaW5nIGEgbmV3IHNlbnNvcgorICAvLyBsaW5rIHRoaXMgaW5zdGFuY2Ugb24gdGhlIGxpc3QKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX211dGV4KTsKKyAgICBtX25leHRTZW5zb3IgPSBtX2ZpcnN0U2Vuc29yOworICAgIG1fZmlyc3RTZW5zb3IgPSB0aGlzOworICB9CisKKyAgbV9jb3VudGVyLlNldE1heFBlcmlvZCgxLjApOworICBtX2NvdW50ZXIuU2V0U2VtaVBlcmlvZE1vZGUodHJ1ZSk7CisgIG1fY291bnRlci5SZXNldCgpOworICBtX2VuYWJsZWQgPSB0cnVlOyAgLy8gbWFrZSBpdCBhdmFpbGFibGUgZm9yIHJvdW5kIHJvYmluIHNjaGVkdWxpbmcKKyAgU2V0QXV0b21hdGljTW9kZShvcmlnaW5hbE1vZGUpOworCisgIHN0YXRpYyBpbnQgaW5zdGFuY2VzID0gMDsKKyAgaW5zdGFuY2VzKys7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9VbHRyYXNvbmljLCBpbnN0YW5jZXMpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIlVsdHJhc29uaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lY2hvQ2hhbm5lbC0+R2V0Q2hhbm5lbCgpLCB0aGlzKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFVsdHJhc29uaWMgU2Vuc29yCisgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIHN1cGNoYW5uZWwgdGhlIERhdmVudGVjaCBTUkYwNCBhbmQgVmV4IHVsdHJhc29uaWMKKyAqIHNlbnNvcnMuCisgKiBAcGFyYW0gcGluZ0NoYW5uZWwgVGhlIGRpZ2l0YWwgb3V0cHV0IGNoYW5uZWwgdGhhdCBzZW5kcyB0aGUgcHVsc2UgdG8KKyAqIGluaXRpYXRlIHRoZSBzZW5zb3Igc2VuZGluZworICogdGhlIHBpbmcuCisgKiBAcGFyYW0gZWNob0NoYW5uZWwgVGhlIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbCB0aGF0IHJlY2VpdmVzIHRoZSBlY2hvLiBUaGUKKyAqIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlCisgKiBlY2hvIGlzIGhpZ2ggcmVwcmVzZW50cyB0aGUgcm91bmQgdHJpcCB0aW1lIG9mIHRoZSBwaW5nLCBhbmQgdGhlIGRpc3RhbmNlLgorICogQHBhcmFtIHVuaXRzIFRoZSB1bml0cyByZXR1cm5lZCBpbiBlaXRoZXIga0luY2hlcyBvciBrTWlsbGlNZXRlcnMKKyAqLworVWx0cmFzb25pYzo6VWx0cmFzb25pYyh1aW50MzJfdCBwaW5nQ2hhbm5lbCwgdWludDMyX3QgZWNob0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgIERpc3RhbmNlVW5pdCB1bml0cykKKyAgICA6IG1fcGluZ0NoYW5uZWwoc3RkOjptYWtlX3NoYXJlZDxEaWdpdGFsT3V0cHV0PihwaW5nQ2hhbm5lbCkpLAorICAgICAgbV9lY2hvQ2hhbm5lbChzdGQ6Om1ha2Vfc2hhcmVkPERpZ2l0YWxJbnB1dD4oZWNob0NoYW5uZWwpKSwKKyAgICAgIG1fY291bnRlcihtX2VjaG9DaGFubmVsKSB7CisgIG1fdW5pdHMgPSB1bml0czsKKyAgSW5pdGlhbGl6ZSgpOworfQorCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBVbHRyYXNvbmljIFNlbnNvciBmcm9tIGEgRGlnaXRhbElucHV0IGZvciB0aGUgZWNobworICogY2hhbm5lbCBhbmQgYSBEaWdpdGFsT3V0cHV0CisgKiBmb3IgdGhlIHBpbmcgY2hhbm5lbC4KKyAqIEBwYXJhbSBwaW5nQ2hhbm5lbCBUaGUgZGlnaXRhbCBvdXRwdXQgb2JqZWN0IHRoYXQgc3RhcnRzIHRoZSBzZW5zb3IgZG9pbmcgYQorICogcGluZy4gUmVxdWlyZXMgYSAxMHVTIHB1bHNlIHRvIHN0YXJ0LgorICogQHBhcmFtIGVjaG9DaGFubmVsIFRoZSBkaWdpdGFsIGlucHV0IG9iamVjdCB0aGF0IHRpbWVzIHRoZSByZXR1cm4gcHVsc2UgdG8KKyAqIGRldGVybWluZSB0aGUgcmFuZ2UuCisgKiBAcGFyYW0gdW5pdHMgVGhlIHVuaXRzIHJldHVybmVkIGluIGVpdGhlciBrSW5jaGVzIG9yIGtNaWxsaU1ldGVycworICovCitVbHRyYXNvbmljOjpVbHRyYXNvbmljKERpZ2l0YWxPdXRwdXQgKnBpbmdDaGFubmVsLCBEaWdpdGFsSW5wdXQgKmVjaG9DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICBEaXN0YW5jZVVuaXQgdW5pdHMpCisgICAgOiBtX3BpbmdDaGFubmVsKHBpbmdDaGFubmVsLCBOdWxsRGVsZXRlcjxEaWdpdGFsT3V0cHV0PigpKSwKKyAgICAgIG1fZWNob0NoYW5uZWwoZWNob0NoYW5uZWwsIE51bGxEZWxldGVyPERpZ2l0YWxJbnB1dD4oKSksCisgICAgICBtX2NvdW50ZXIobV9lY2hvQ2hhbm5lbCkgeworICBpZiAocGluZ0NoYW5uZWwgPT0gbnVsbHB0ciB8fCBlY2hvQ2hhbm5lbCA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworICAgIG1fbmV4dFNlbnNvciA9IG51bGxwdHI7CisgICAgbV91bml0cyA9IHVuaXRzOworICAgIHJldHVybjsKKyAgfQorICBtX3VuaXRzID0gdW5pdHM7CisgIEluaXRpYWxpemUoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gVWx0cmFzb25pYyBTZW5zb3IgZnJvbSBhIERpZ2l0YWxJbnB1dCBmb3IgdGhlIGVjaG8KKyAqIGNoYW5uZWwgYW5kIGEgRGlnaXRhbE91dHB1dAorICogZm9yIHRoZSBwaW5nIGNoYW5uZWwuCisgKiBAcGFyYW0gcGluZ0NoYW5uZWwgVGhlIGRpZ2l0YWwgb3V0cHV0IG9iamVjdCB0aGF0IHN0YXJ0cyB0aGUgc2Vuc29yIGRvaW5nIGEKKyAqIHBpbmcuIFJlcXVpcmVzIGEgMTB1UyBwdWxzZSB0byBzdGFydC4KKyAqIEBwYXJhbSBlY2hvQ2hhbm5lbCBUaGUgZGlnaXRhbCBpbnB1dCBvYmplY3QgdGhhdCB0aW1lcyB0aGUgcmV0dXJuIHB1bHNlIHRvCisgKiBkZXRlcm1pbmUgdGhlIHJhbmdlLgorICogQHBhcmFtIHVuaXRzIFRoZSB1bml0cyByZXR1cm5lZCBpbiBlaXRoZXIga0luY2hlcyBvciBrTWlsbGlNZXRlcnMKKyAqLworVWx0cmFzb25pYzo6VWx0cmFzb25pYyhEaWdpdGFsT3V0cHV0ICZwaW5nQ2hhbm5lbCwgRGlnaXRhbElucHV0ICZlY2hvQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgRGlzdGFuY2VVbml0IHVuaXRzKQorICAgIDogbV9waW5nQ2hhbm5lbCgmcGluZ0NoYW5uZWwsIE51bGxEZWxldGVyPERpZ2l0YWxPdXRwdXQ+KCkpLAorICAgICAgbV9lY2hvQ2hhbm5lbCgmZWNob0NoYW5uZWwsIE51bGxEZWxldGVyPERpZ2l0YWxJbnB1dD4oKSksCisgICAgICBtX2NvdW50ZXIobV9lY2hvQ2hhbm5lbCkgeworICBtX3VuaXRzID0gdW5pdHM7CisgIEluaXRpYWxpemUoKTsKK30KKworLyoqCisgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gVWx0cmFzb25pYyBTZW5zb3IgZnJvbSBhIERpZ2l0YWxJbnB1dCBmb3IgdGhlIGVjaG8KKyAqIGNoYW5uZWwgYW5kIGEgRGlnaXRhbE91dHB1dAorICogZm9yIHRoZSBwaW5nIGNoYW5uZWwuCisgKiBAcGFyYW0gcGluZ0NoYW5uZWwgVGhlIGRpZ2l0YWwgb3V0cHV0IG9iamVjdCB0aGF0IHN0YXJ0cyB0aGUgc2Vuc29yIGRvaW5nIGEKKyAqIHBpbmcuIFJlcXVpcmVzIGEgMTB1UyBwdWxzZSB0byBzdGFydC4KKyAqIEBwYXJhbSBlY2hvQ2hhbm5lbCBUaGUgZGlnaXRhbCBpbnB1dCBvYmplY3QgdGhhdCB0aW1lcyB0aGUgcmV0dXJuIHB1bHNlIHRvCisgKiBkZXRlcm1pbmUgdGhlIHJhbmdlLgorICogQHBhcmFtIHVuaXRzIFRoZSB1bml0cyByZXR1cm5lZCBpbiBlaXRoZXIga0luY2hlcyBvciBrTWlsbGlNZXRlcnMKKyAqLworVWx0cmFzb25pYzo6VWx0cmFzb25pYyhzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbE91dHB1dD4gcGluZ0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsSW5wdXQ+IGVjaG9DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICBEaXN0YW5jZVVuaXQgdW5pdHMpCisgICAgOiBtX3BpbmdDaGFubmVsKHBpbmdDaGFubmVsKSwKKyAgICAgIG1fZWNob0NoYW5uZWwoZWNob0NoYW5uZWwpLAorICAgICAgbV9jb3VudGVyKG1fZWNob0NoYW5uZWwpIHsKKyAgbV91bml0cyA9IHVuaXRzOworICBJbml0aWFsaXplKCk7Cit9CisKKy8qKgorICogRGVzdHJ1Y3RvciBmb3IgdGhlIHVsdHJhc29uaWMgc2Vuc29yLgorICogRGVsZXRlIHRoZSBpbnN0YW5jZSBvZiB0aGUgdWx0cmFzb25pYyBzZW5zb3IgYnkgZnJlZWluZyB0aGUgYWxsb2NhdGVkIGRpZ2l0YWwKKyAqIGNoYW5uZWxzLgorICogSWYgdGhlIHN5c3RlbSB3YXMgaW4gYXV0b21hdGljIG1vZGUgKHJvdW5kIHJvYmluKSwgdGhlbiBpdCBpcyBzdG9wcGVkLCB0aGVuCisgKiBzdGFydGVkIGFnYWluCisgKiBhZnRlciB0aGlzIHNlbnNvciBpcyByZW1vdmVkIChwcm92aWRlZCB0aGlzIHdhc24ndCB0aGUgbGFzdCBzZW5zb3IpLgorICovCitVbHRyYXNvbmljOjp+VWx0cmFzb25pYygpIHsKKyAgYm9vbCB3YXNBdXRvbWF0aWNNb2RlID0gbV9hdXRvbWF0aWNFbmFibGVkOworICBTZXRBdXRvbWF0aWNNb2RlKGZhbHNlKTsKKyAgd3BpX2Fzc2VydChtX2ZpcnN0U2Vuc29yICE9IG51bGxwdHIpOworCisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisgICAgaWYgKHRoaXMgPT0gbV9maXJzdFNlbnNvcikgeworICAgICAgbV9maXJzdFNlbnNvciA9IG1fbmV4dFNlbnNvcjsKKyAgICAgIGlmIChtX2ZpcnN0U2Vuc29yID09IG51bGxwdHIpIHsKKyAgICAgICAgU2V0QXV0b21hdGljTW9kZShmYWxzZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHdwaV9hc3NlcnQobV9maXJzdFNlbnNvci0+bV9uZXh0U2Vuc29yICE9IG51bGxwdHIpOworICAgICAgZm9yIChVbHRyYXNvbmljICpzID0gbV9maXJzdFNlbnNvcjsgcyAhPSBudWxscHRyOyBzID0gcy0+bV9uZXh0U2Vuc29yKSB7CisgICAgICAgIGlmICh0aGlzID09IHMtPm1fbmV4dFNlbnNvcikgeworICAgICAgICAgIHMtPm1fbmV4dFNlbnNvciA9IHMtPm1fbmV4dFNlbnNvci0+bV9uZXh0U2Vuc29yOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChtX2ZpcnN0U2Vuc29yICE9IG51bGxwdHIgJiYgd2FzQXV0b21hdGljTW9kZSkgU2V0QXV0b21hdGljTW9kZSh0cnVlKTsKK30KKworLyoqCisgKiBUdXJuIEF1dG9tYXRpYyBtb2RlIG9uL29mZi4KKyAqIFdoZW4gaW4gQXV0b21hdGljIG1vZGUsIGFsbCBzZW5zb3JzIHdpbGwgZmlyZSBpbiByb3VuZCByb2Jpbiwgd2FpdGluZyBhIHNldAorICogdGltZSBiZXR3ZWVuIGVhY2ggc2Vuc29yLgorICogQHBhcmFtIGVuYWJsaW5nIFNldCB0byB0cnVlIGlmIHJvdW5kIHJvYmluIHNjaGVkdWxpbmcgc2hvdWxkIHN0YXJ0IGZvciBhbGwKKyAqIHRoZSB1bHRyYXNvbmljIHNlbnNvcnMuIFRoaXMKKyAqIHNjaGVkdWxpbmcgbWV0aG9kIGFzc3VyZXMgdGhhdCB0aGUgc2Vuc29ycyBhcmUgbm9uLWludGVyZmVyaW5nIGJlY2F1c2Ugbm8gdHdvCisgKiBzZW5zb3JzIGZpcmUgYXQgdGhlIHNhbWUgdGltZS4KKyAqIElmIGFub3RoZXIgc2NoZWR1bGluZyBhbGdvcml0aG0gaXMgcHJlZmVyZWQsIGl0IGNhbiBiZSBpbXBsZW1lbnRlZCBieQorICogcGluZ2luZyB0aGUgc2Vuc29ycyBtYW51YWxseSBhbmQgd2FpdGluZworICogZm9yIHRoZSByZXN1bHRzIHRvIGNvbWUgYmFjay4KKyAqLwordm9pZCBVbHRyYXNvbmljOjpTZXRBdXRvbWF0aWNNb2RlKGJvb2wgZW5hYmxpbmcpIHsKKyAgaWYgKGVuYWJsaW5nID09IG1fYXV0b21hdGljRW5hYmxlZCkgcmV0dXJuOyAgLy8gaWdub3JlIHRoZSBjYXNlIG9mIG5vIGNoYW5nZQorCisgIG1fYXV0b21hdGljRW5hYmxlZCA9IGVuYWJsaW5nOworICBpZiAoZW5hYmxpbmcpIHsKKyAgICAvLyBlbmFibGluZyBhdXRvbWF0aWMgbW9kZS4KKyAgICAvLyBDbGVhciBhbGwgdGhlIGNvdW50ZXJzIHNvIG5vIGRhdGEgaXMgdmFsaWQKKyAgICBmb3IgKFVsdHJhc29uaWMgKnUgPSBtX2ZpcnN0U2Vuc29yOyB1ICE9IG51bGxwdHI7IHUgPSB1LT5tX25leHRTZW5zb3IpIHsKKyAgICAgIHUtPm1fY291bnRlci5SZXNldCgpOworICAgIH0KKyAgICAvLyBTdGFydCByb3VuZCByb2JpbiB0YXNrCisgICAgd3BpX2Fzc2VydChtX3Rhc2suVmVyaWZ5KCkgPT0KKyAgICAgICAgICAgICAgIGZhbHNlKTsgIC8vIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB3YXMgcHJldmlvdXNseSBkaXNhYmxlZAorICAgIG1fdGFzayA9IFRhc2soIlVsdHJhc29uaWNDaGVja2VyIiwgJlVsdHJhc29uaWM6OlVsdHJhc29uaWNDaGVja2VyKTsKKworICAgIC8vIFRPRE86IEN1cnJlbnRseSwgbHZ1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbnMgdG8gc2V0IHRhc2sgcHJpb3JpdGllcy4KKyAgICAvLyBVbnRpbCB0aGF0IGlzIHRoZSBjYXNlLCB1bmNvbW1lbnRpbmcgdGhpcyB3aWxsIGJyZWFrIHVzZXIgY29kZSB0aGF0IGNhbGxzCisgICAgLy8gVWx0cmFzb25pYzo6U2V0QXV0b21pY01vZGUoKS4KKyAgICAvL21fdGFzay5TZXRQcmlvcml0eShrUHJpb3JpdHkpOworICB9IGVsc2UgeworICAgIC8vIGRpc2FibGluZyBhdXRvbWF0aWMgbW9kZS4gV2FpdCBmb3IgYmFja2dyb3VuZCB0YXNrIHRvIHN0b3AgcnVubmluZy4KKyAgICB3aGlsZSAobV90YXNrLlZlcmlmeSgpKQorICAgICAgV2FpdCgwLjE1KTsgIC8vIGp1c3QgYSBsaXR0bGUgbG9uZ2VyIHRoYW4gdGhlIHBpbmcgdGltZSBmb3Igcm91bmQtcm9iaW4gdG8KKyAgICAgICAgICAgICAgICAgICAvLyBzdG9wCisKKyAgICAvLyBjbGVhciBhbGwgdGhlIGNvdW50ZXJzIChkYXRhIG5vdyBpbnZhbGlkKSBzaW5jZSBhdXRvbWF0aWMgbW9kZSBpcyBzdG9wcGVkCisgICAgZm9yIChVbHRyYXNvbmljICp1ID0gbV9maXJzdFNlbnNvcjsgdSAhPSBudWxscHRyOyB1ID0gdS0+bV9uZXh0U2Vuc29yKSB7CisgICAgICB1LT5tX2NvdW50ZXIuUmVzZXQoKTsKKyAgICB9CisgICAgbV9hdXRvbWF0aWNFbmFibGVkID0gZmFsc2U7CisgICAgbV90YXNrLmpvaW4oKTsKKyAgfQorfQorCisvKioKKyAqIFNpbmdsZSBwaW5nIHRvIHVsdHJhc29uaWMgc2Vuc29yLgorICogU2VuZCBvdXQgYSBzaW5nbGUgcGluZyB0byB0aGUgdWx0cmFzb25pYyBzZW5zb3IuIFRoaXMgb25seSB3b3JrcyBpZiBhdXRvbWF0aWMKKyAqIChyb3VuZCByb2JpbikKKyAqIG1vZGUgaXMgZGlzYWJsZWQuIEEgc2luZ2xlIHBpbmcgaXMgc2VudCBvdXQsIGFuZCB0aGUgY291bnRlciBzaG91bGQgY291bnQgdGhlCisgKiBzZW1pLXBlcmlvZAorICogd2hlbiBpdCBjb21lcyBpbi4gVGhlIGNvdW50ZXIgaXMgcmVzZXQgdG8gbWFrZSB0aGUgY3VycmVudCB2YWx1ZSBpbnZhbGlkLgorICovCit2b2lkIFVsdHJhc29uaWM6OlBpbmcoKSB7CisgIHdwaV9hc3NlcnQoIW1fYXV0b21hdGljRW5hYmxlZCk7CisgIG1fY291bnRlci5SZXNldCgpOyAgLy8gcmVzZXQgdGhlIGNvdW50ZXIgdG8gemVybyAoaW52YWxpZCBkYXRhIG5vdykKKyAgbV9waW5nQ2hhbm5lbC0+UHVsc2UoCisgICAgICBrUGluZ1RpbWUpOyAgLy8gZG8gdGhlIHBpbmcgdG8gc3RhcnQgZ2V0dGluZyBhIHNpbmdsZSByYW5nZQorfQorCisvKioKKyAqIENoZWNrIGlmIHRoZXJlIGlzIGEgdmFsaWQgcmFuZ2UgbWVhc3VyZW1lbnQuCisgKiBUaGUgcmFuZ2VzIGFyZSBhY2N1bXVsYXRlZCBpbiBhIGNvdW50ZXIgdGhhdCB3aWxsIGluY3JlbWVudCBvbiBlYWNoIGVkZ2Ugb2YKKyAqIHRoZSBlY2hvIChyZXR1cm4pCisgKiBzaWduYWwuIElmIHRoZSBjb3VudCBpcyBub3QgYXQgbGVhc3QgMiwgdGhlbiB0aGUgcmFuZ2UgaGFzIG5vdCB5ZXQgYmVlbgorICogbWVhc3VyZWQsIGFuZCBpcyBpbnZhbGlkLgorICovCitib29sIFVsdHJhc29uaWM6OklzUmFuZ2VWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fY291bnRlci5HZXQoKSA+IDE7IH0KKworLyoqCisgKiBHZXQgdGhlIHJhbmdlIGluIGluY2hlcyBmcm9tIHRoZSB1bHRyYXNvbmljIHNlbnNvci4KKyAqIEByZXR1cm4gZG91YmxlIFJhbmdlIGluIGluY2hlcyBvZiB0aGUgdGFyZ2V0IHJldHVybmVkIGZyb20gdGhlIHVsdHJhc29uaWMKKyAqIHNlbnNvci4gSWYgdGhlcmUgaXMKKyAqIG5vIHZhbGlkIHZhbHVlIHlldCwgaS5lLiBhdCBsZWFzdCBvbmUgbWVhc3VyZW1lbnQgaGFzbid0IGNvbXBsZXRlZCwgdGhlbgorICogcmV0dXJuIDAuCisgKi8KK2RvdWJsZSBVbHRyYXNvbmljOjpHZXRSYW5nZUluY2hlcygpIGNvbnN0IHsKKyAgaWYgKElzUmFuZ2VWYWxpZCgpKQorICAgIHJldHVybiBtX2NvdW50ZXIuR2V0UGVyaW9kKCkgKiBrU3BlZWRPZlNvdW5kSW5jaGVzUGVyU2VjIC8gMi4wOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2V0IHRoZSByYW5nZSBpbiBtaWxsaW1ldGVycyBmcm9tIHRoZSB1bHRyYXNvbmljIHNlbnNvci4KKyAqIEByZXR1cm4gZG91YmxlIFJhbmdlIGluIG1pbGxpbWV0ZXJzIG9mIHRoZSB0YXJnZXQgcmV0dXJuZWQgYnkgdGhlIHVsdHJhc29uaWMKKyAqIHNlbnNvci4KKyAqIElmIHRoZXJlIGlzIG5vIHZhbGlkIHZhbHVlIHlldCwgaS5lLiBhdCBsZWFzdCBvbmUgbWVhc3VyZW1lbnQgaGFzbid0CisgKiBjb21wbHRlZCwgdGhlbiByZXR1cm4gMC4KKyAqLworZG91YmxlIFVsdHJhc29uaWM6OkdldFJhbmdlTU0oKSBjb25zdCB7IHJldHVybiBHZXRSYW5nZUluY2hlcygpICogMjUuNDsgfQorCisvKioKKyAqIEdldCB0aGUgcmFuZ2UgaW4gdGhlIGN1cnJlbnQgRGlzdGFuY2VVbml0IGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LgorICoKKyAqIEByZXR1cm4gVGhlIHJhbmdlIGluIERpc3RhbmNlVW5pdAorICovCitkb3VibGUgVWx0cmFzb25pYzo6UElER2V0KCkgeworICBzd2l0Y2ggKG1fdW5pdHMpIHsKKyAgICBjYXNlIFVsdHJhc29uaWM6OmtJbmNoZXM6CisgICAgICByZXR1cm4gR2V0UmFuZ2VJbmNoZXMoKTsKKyAgICBjYXNlIFVsdHJhc29uaWM6OmtNaWxsaU1ldGVyczoKKyAgICAgIHJldHVybiBHZXRSYW5nZU1NKCk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwLjA7CisgIH0KK30KKwordm9pZCBVbHRyYXNvbmljOjpTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7CisgIGlmICh3cGlfYXNzZXJ0KHBpZFNvdXJjZSA9PSBQSURTb3VyY2VUeXBlOjprRGlzcGxhY2VtZW50KSkgeworICAgIG1fcGlkU291cmNlID0gcGlkU291cmNlOworICB9Cit9CisKKy8qKgorICogU2V0IHRoZSBjdXJyZW50IERpc3RhbmNlVW5pdCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgUElEU291cmNlIGJhc2UKKyAqIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gdW5pdHMgVGhlIERpc3RhbmNlVW5pdCB0aGF0IHNob3VsZCBiZSB1c2VkLgorICovCit2b2lkIFVsdHJhc29uaWM6OlNldERpc3RhbmNlVW5pdHMoRGlzdGFuY2VVbml0IHVuaXRzKSB7IG1fdW5pdHMgPSB1bml0czsgfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBEaXN0YW5jZVVuaXQgdGhhdCBpcyB1c2VkIGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LgorICoKKyAqIEByZXR1cm4gVGhlIHR5cGUgb2YgRGlzdGFuY2VVbml0IHRoYXQgaXMgYmVpbmcgdXNlZC4KKyAqLworVWx0cmFzb25pYzo6RGlzdGFuY2VVbml0IFVsdHJhc29uaWM6OkdldERpc3RhbmNlVW5pdHMoKSBjb25zdCB7CisgIHJldHVybiBtX3VuaXRzOworfQorCit2b2lkIFVsdHJhc29uaWM6OlVwZGF0ZVRhYmxlKCkgeworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldFJhbmdlSW5jaGVzKCkpOworICB9Cit9CisKK3ZvaWQgVWx0cmFzb25pYzo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHt9CisKK3ZvaWQgVWx0cmFzb25pYzo6U3RvcExpdmVXaW5kb3dNb2RlKCkge30KKworc3RkOjpzdHJpbmcgVWx0cmFzb25pYzo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeyByZXR1cm4gIlVsdHJhc29uaWMiOyB9CisKK3ZvaWQgVWx0cmFzb25pYzo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSB7CisgIG1fdGFibGUgPSBzdWJUYWJsZTsKKyAgVXBkYXRlVGFibGUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gVWx0cmFzb25pYzo6R2V0VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvVXRpbGl0eS5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvVXRpbGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5OGYwZgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9VdGlsaXR5LmNwcApAQCAtMCwwICsxLDIyMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgiCisjaW5jbHVkZSAiSEFML0hBTC5ocHAiCisjaW5jbHVkZSAiVGFzay5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxleGVjaW5mby5oPgorI2luY2x1ZGUgPGN4eGFiaS5oPgorI2luY2x1ZGUgIm5pdmlzaW9uLmgiCisKKy8qKgorICogQXNzZXJ0IGltcGxlbWVudGF0aW9uLgorICogVGhpcyBhbGxvd3MgYnJlYWtwb2ludHMgdG8gYmUgc2V0IG9uIGFuIGFzc2VydC4KKyAqIFRoZSB1c2VycyBkb24ndCBjYWxsIHRoaXMsIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgd3BpX2Fzc2VydCBtYWNyb3MgaW4KKyAqIFV0aWxpdHkuaC4KKyAqLworYm9vbCB3cGlfYXNzZXJ0X2ltcGwoYm9vbCBjb25kaXRpb25WYWx1ZSwgY29uc3QgY2hhciAqY29uZGl0aW9uVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZU51bWJlciwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgaWYgKCFjb25kaXRpb25WYWx1ZSkgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yU3RyZWFtOworCisgICAgZXJyb3JTdHJlYW0gPDwgIkFzc2VydGlvbiBcIiIgPDwgY29uZGl0aW9uVGV4dCA8PCAiXCIgIjsKKyAgICBlcnJvclN0cmVhbSA8PCAib24gbGluZSAiIDw8IGxpbmVOdW1iZXIgPDwgIiAiOworICAgIGVycm9yU3RyZWFtIDw8ICJvZiAiIDw8IGJhc2VuYW1lKGZpbGVOYW1lKSA8PCAiICI7CisKKyAgICBpZiAobWVzc2FnZVswXSAhPSAnXDAnKSB7CisgICAgICBlcnJvclN0cmVhbSA8PCAiZmFpbGVkOiAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOworICAgIH0gZWxzZSB7CisgICAgICBlcnJvclN0cmVhbSA8PCAiZmFpbGVkLiIgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIGVycm9yU3RyZWFtIDw8IEdldFN0YWNrVHJhY2UoMik7CisKKyAgICBzdGQ6OnN0cmluZyBlcnJvciA9IGVycm9yU3RyZWFtLnN0cigpOworCisgICAgLy8gUHJpbnQgdGhlIGVycm9yIGFuZCBzZW5kIGl0IHRvIHRoZSBEcml2ZXJTdGF0aW9uCisgICAgc3RkOjpjb3V0IDw8IGVycm9yIDw8IHN0ZDo6ZW5kbDsKKyAgICBIQUxTZXRFcnJvckRhdGEoZXJyb3IuY19zdHIoKSwgZXJyb3Iuc2l6ZSgpLCAxMDApOworICB9CisKKyAgcmV0dXJuIGNvbmRpdGlvblZhbHVlOworfQorCisvKioKKyAqIENvbW1vbiBlcnJvciByb3V0aW5lcyBmb3Igd3BpX2Fzc2VydEVxdWFsX2ltcGwgYW5kIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsCisgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5OyBpdCBzaG91bGQgb25seSBiZSB1c2VkIGJ5CisgKiB3cGlfYXNzZXJ0RXF1YWxfaW1wbAorICogYW5kIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsLgorICovCit2b2lkIHdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbChjb25zdCBjaGFyICp2YWx1ZUEsIGNvbnN0IGNoYXIgKnZhbHVlQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVxdWFsaXR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvclN0cmVhbTsKKworICBlcnJvclN0cmVhbSA8PCAiQXNzZXJ0aW9uIFwiIiA8PCB2YWx1ZUEgPDwgIiAiIDw8IGVxdWFsaXR5VHlwZSA8PCAiICIKKyAgICAgICAgICAgICAgPDwgdmFsdWVCIDw8ICJcIiAiOworICBlcnJvclN0cmVhbSA8PCAib24gbGluZSAiIDw8IGxpbmVOdW1iZXIgPDwgIiAiOworICBlcnJvclN0cmVhbSA8PCAib2YgIiA8PCBiYXNlbmFtZShmaWxlTmFtZSkgPDwgIiAiOworCisgIGlmIChtZXNzYWdlWzBdICE9ICdcMCcpIHsKKyAgICBlcnJvclN0cmVhbSA8PCAiZmFpbGVkOiAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOworICB9IGVsc2UgeworICAgIGVycm9yU3RyZWFtIDw8ICJmYWlsZWQuIiA8PCBzdGQ6OmVuZGw7CisgIH0KKworICBlcnJvclN0cmVhbSA8PCBHZXRTdGFja1RyYWNlKDMpOworCisgIHN0ZDo6c3RyaW5nIGVycm9yID0gZXJyb3JTdHJlYW0uc3RyKCk7CisKKyAgLy8gUHJpbnQgdGhlIGVycm9yIGFuZCBzZW5kIGl0IHRvIHRoZSBEcml2ZXJTdGF0aW9uCisgIHN0ZDo6Y291dCA8PCBlcnJvciA8PCBzdGQ6OmVuZGw7CisgIEhBTFNldEVycm9yRGF0YShlcnJvci5jX3N0cigpLCBlcnJvci5zaXplKCksIDEwMCk7Cit9CisKKy8qKgorICogQXNzZXJ0IGVxdWFsIGltcGxlbWVudGF0aW9uLgorICogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHR3byBnaXZlbiBpbnRlZ2VycyBhcmUgZXF1YWwuIElmIG5vdCwKKyAqIHRoZSB2YWx1ZSBvZiBlYWNoIGlzIHByaW50ZWQgYWxvbmcgd2l0aCBhbiBvcHRpb25hbCBtZXNzYWdlIHN0cmluZy4KKyAqIFRoZSB1c2VycyBkb24ndCBjYWxsIHRoaXMsIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgd3BpX2Fzc2VydEVxdWFsIG1hY3JvcyBpbgorICogVXRpbGl0eS5oLgorICovCitib29sIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLCBjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwgdWludDMyX3QgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgaWYgKCEodmFsdWVBID09IHZhbHVlQikpIHsKKyAgICB3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwodmFsdWVBU3RyaW5nLCB2YWx1ZUJTdHJpbmcsICI9PSIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBmdW5jTmFtZSk7CisgIH0KKyAgcmV0dXJuIHZhbHVlQSA9PSB2YWx1ZUI7Cit9CisKKy8qKgorICogQXNzZXJ0IG5vdCBlcXVhbCBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0d28gZ2l2ZW4gaW50ZWdlcnMgYXJlIGVxdWFsLiBJZiBzbywKKyAqIHRoZSB2YWx1ZSBvZiBlYWNoIGlzIHByaW50ZWQgYWxvbmcgd2l0aCBhbiBvcHRpb25hbCBtZXNzYWdlIHN0cmluZy4KKyAqIFRoZSB1c2VycyBkb24ndCBjYWxsIHRoaXMsIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgd3BpX2Fzc2VydE5vdEVxdWFsIG1hY3JvcyBpbgorICogVXRpbGl0eS5oLgorICovCitib29sIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLCBjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwgdWludDMyX3QgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgaWYgKCEodmFsdWVBICE9IHZhbHVlQikpIHsKKyAgICB3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwodmFsdWVBU3RyaW5nLCB2YWx1ZUJTdHJpbmcsICIhPSIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBmdW5jTmFtZSk7CisgIH0KKyAgcmV0dXJuIHZhbHVlQSAhPSB2YWx1ZUI7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBGUEdBIFZlcnNpb24gbnVtYmVyLgorICogRm9yIG5vdywgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGV0aXRpb24geWVhci4KKyAqIEByZXR1cm4gRlBHQSBWZXJzaW9uIG51bWJlci4KKyAqLwordWludDE2X3QgR2V0RlBHQVZlcnNpb24oKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgdWludDE2X3QgdmVyc2lvbiA9IGdldEZQR0FWZXJzaW9uKCZzdGF0dXMpOworICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIGdldEhBTEVycm9yTWVzc2FnZShzdGF0dXMpKTsKKyAgcmV0dXJuIHZlcnNpb247Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBGUEdBIFJldmlzaW9uIG51bWJlci4KKyAqIFRoZSBmb3JtYXQgb2YgdGhlIHJldmlzaW9uIGlzIDMgbnVtYmVycy4KKyAqIFRoZSAxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBNYWpvciBSZXZpc2lvbi4KKyAqIHRoZSBuZXh0IDggYml0cyBhcmUgdGhlIE1pbm9yIFJldmlzaW9uLgorICogVGhlIDEyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBCdWlsZCBOdW1iZXIuCisgKiBAcmV0dXJuIEZQR0EgUmV2aXNpb24gbnVtYmVyLgorICovCit1aW50MzJfdCBHZXRGUEdBUmV2aXNpb24oKSB7CisgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgdWludDMyX3QgcmV2aXNpb24gPSBnZXRGUEdBUmV2aXNpb24oJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gcmV2aXNpb247Cit9CisKKy8qKgorICogUmVhZCB0aGUgbWljcm9zZWNvbmQtcmVzb2x1dGlvbiB0aW1lciBvbiB0aGUgRlBHQS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRpbWUgaW4gbWljcm9zZWNvbmRzIGFjY29yZGluZyB0byB0aGUgRlBHQSAoc2luY2UgRlBHQQorICogcmVzZXQpLgorICovCit1aW50MzJfdCBHZXRGUEdBVGltZSgpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICB1aW50MzJfdCB0aW1lID0gZ2V0RlBHQVRpbWUoJnN0YXR1cyk7CisgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgZ2V0SEFMRXJyb3JNZXNzYWdlKHN0YXR1cykpOworICByZXR1cm4gdGltZTsKK30KKworLyoqCisgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSAiVVNFUiIgYnV0dG9uIG9uIHRoZSBSb2JvUklPCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGJ1dHRvbiBpcyBjdXJyZW50bHkgcHJlc3NlZCBkb3duCisgKi8KK2Jvb2wgR2V0VXNlckJ1dHRvbigpIHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgIGJvb2wgdmFsdWUgPSBnZXRGUEdBQnV0dG9uKCZzdGF0dXMpOworICB3cGlfc2V0R2xvYmFsRXJyb3Ioc3RhdHVzKTsKKworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogRGVtYW5nbGUgYSBDKysgc3ltYm9sLCB1c2VkIGZvciBwcmludGluZyBzdGFjayB0cmFjZXMuCisgKi8KK3N0YXRpYyBzdGQ6OnN0cmluZyBkZW1hbmdsZShjaGFyIGNvbnN0ICptYW5nbGVkU3ltYm9sKSB7CisgIGNoYXIgYnVmZmVyWzI1Nl07CisgIHNpemVfdCBsZW5ndGg7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKHNzY2FuZihtYW5nbGVkU3ltYm9sLCAiJSpbXihdJSpbKF0lMjU1W14pK10iLCBidWZmZXIpKSB7CisgICAgY2hhciAqc3ltYm9sID0gYWJpOjpfX2N4YV9kZW1hbmdsZShidWZmZXIsIG51bGxwdHIsICZsZW5ndGgsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgcmV0dXJuIHN5bWJvbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgdGhlIHN5bWJvbCBjb3VsZG4ndCBiZSBkZW1hbmdsZWQsIGl0J3MgcHJvYmFibHkgYSBDIGZ1bmN0aW9uLAorICAgICAgLy8gc28ganVzdCByZXR1cm4gaXQgYXMtaXMuCisgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKyAgfQorCisgIC8vIElmIGV2ZXJ5dGhpbmcgZWxzZSBmYWlsZWQsIGp1c3QgcmV0dXJuIHRoZSBtYW5nbGVkIHN5bWJvbAorICByZXR1cm4gbWFuZ2xlZFN5bWJvbDsKK30KKworLyoqCisgKiBHZXQgYSBzdGFjayB0cmFjZSwgaWdub3JpbmcgdGhlIGZpcnN0ICJvZmZzZXQiIHN5bWJvbHMuCisgKiBAcGFyYW0gb2Zmc2V0IFRoZSBudW1iZXIgb2Ygc3ltYm9scyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB0byBpZ25vcmUKKyAqLworc3RkOjpzdHJpbmcgR2V0U3RhY2tUcmFjZSh1aW50MzJfdCBvZmZzZXQpIHsKKyAgdm9pZCAqc3RhY2tUcmFjZVsxMjhdOworICBpbnQgc3RhY2tTaXplID0gYmFja3RyYWNlKHN0YWNrVHJhY2UsIDEyOCk7CisgIGNoYXIgKiptYW5nbGVkU3ltYm9scyA9IGJhY2t0cmFjZV9zeW1ib2xzKHN0YWNrVHJhY2UsIHN0YWNrU2l6ZSk7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHRyYWNlOworCisgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBzdGFja1NpemU7IGkrKykgeworICAgIC8vIE9ubHkgcHJpbnQgcmVjdXJzaXZlIGZ1bmN0aW9ucyBvbmNlIGluIGEgcm93LgorICAgIGlmIChpID09IDAgfHwgc3RhY2tUcmFjZVtpXSAhPSBzdGFja1RyYWNlW2kgLSAxXSkgeworICAgICAgdHJhY2UgPDwgIlx0YXQgIiA8PCBkZW1hbmdsZShtYW5nbGVkU3ltYm9sc1tpXSkgPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorCisgIGZyZWUobWFuZ2xlZFN5bWJvbHMpOworCisgIHJldHVybiB0cmFjZS5zdHIoKTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9WaWN0b3IuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1ZpY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhNDk3MAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9WaWN0b3IuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpY3Rvci5oIgorCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIGEgVmljdG9yCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhlIFZpY3RvciBpcyBhdHRhY2hlZCB0by4gMC05IGFyZQorICogb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKKyAqLworVmljdG9yOjpWaWN0b3IodWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpIHsKKyAgLyogTm90ZSB0aGF0IHRoZSBWaWN0b3IgdXNlcyB0aGUgZm9sbG93aW5nIGJvdW5kcyBmb3IgUFdNIHZhbHVlcy4gIFRoZXNlCisgICAqIHZhbHVlcyB3ZXJlIGRldGVybWluZWQgZW1waXJpY2FsbHkgYW5kIG9wdGltaXplZCBmb3IgdGhlIFZpY3RvciA4ODguIFRoZXNlCisgICAqIHZhbHVlcyBzaG91bGQgd29yayByZWFzb25hYmx5IHdlbGwgZm9yIFZpY3RvciA4ODQgY29udHJvbGxlcnMgYXMgd2VsbCBidXQKKyAgICogaWYgdXNlcnMgZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW91ciBhcm91bmQgdGhlIGRlYWRiYW5kCisgICAqIG9yIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLCBjYWxpYnJhdGlvbiBpcworICAgKiByZWNvbW1lbmRlZC4gVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFZpY3RvciA4ODQgVXNlcgorICAgKiBNYW51YWwgYXZhaWxhYmxlIGZyb20gSUZJLgorICAgKgorICAgKiAgIDIuMDI3bXMgPSBmdWxsICJmb3J3YXJkIgorICAgKiAgIDEuNTI1bXMgPSB0aGUgImhpZ2ggZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAgICogICAxLjUwN21zID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQorICAgKiAgIDEuNDltcyA9IHRoZSAibG93IGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgICAqICAgMS4wMjZtcyA9IGZ1bGwgInJldmVyc2UiCisgICAqLworICBTZXRCb3VuZHMoMi4wMjcsIDEuNTI1LCAxLjUwNywgMS40OSwgMS4wMjYpOworICBTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzJYKTsKKyAgU2V0UmF3KG1fY2VudGVyUHdtKTsKKyAgU2V0WmVyb0xhdGNoKCk7CisKKyAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkQWN0dWF0b3IoIlZpY3RvciIsIEdldENoYW5uZWwoKSwgdGhpcyk7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9WaWN0b3IsIEdldENoYW5uZWwoKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUuCisgKgorICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQorICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorICogQHBhcmFtIHN5bmNHcm91cCBVbnVzZWQgaW50ZXJmYWNlLgorICovCit2b2lkIFZpY3Rvcjo6U2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCkgeworICBTZXRTcGVlZChtX2lzSW52ZXJ0ZWQgPyAtc3BlZWQgOiBzcGVlZCk7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWNlbnRseSBzZXQgdmFsdWUgb2YgdGhlIFBXTS4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgdGhlIFBXTSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgVmljdG9yOjpHZXQoKSBjb25zdCB7IHJldHVybiBHZXRTcGVlZCgpOyB9CisKKy8qKgorICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCisgKi8KK3ZvaWQgVmljdG9yOjpEaXNhYmxlKCkgeyBTZXRSYXcoa1B3bURpc2FibGVkKTsgfQorLyoqCisqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGludmVydGluZyBkaXJlY3Rpb24gb2YgYSBzcGVlZCBjb250cm9sbGVyLgorKiBAcGFyYW0gaXNJbnZlcnRlZCBUaGUgc3RhdGUgb2YgaW52ZXJzaW9uLCB0cnVlIGlzIGludmVydGVkLgorKi8KK3ZvaWQgVmljdG9yOjpTZXRJbnZlcnRlZChib29sIGlzSW52ZXJ0ZWQpIHsgbV9pc0ludmVydGVkID0gaXNJbnZlcnRlZDsgfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZSBpbnZlcnRpbmcgZGlyZWN0aW9uIG9mIGEgc3BlZWQgY29udHJvbGxlci4KKyAqCisgKiBAcmV0dXJuIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KKyAqCisgKi8KK2Jvb2wgVmljdG9yOjpHZXRJbnZlcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJbnZlcnRlZDsgfQorCisvKioKKyAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIFZpY3Rvcjo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KSB7IFNldChvdXRwdXQpOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvVmljdG9yU1AuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1ZpY3RvclNQLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JjMTYzCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1ZpY3RvclNQLmNwcApAQCAtMCwwICsxLDg4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaWN0b3JTUC5oIgorCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKKy8qKgorICogTm90ZSB0aGF0IHRoZSBWaWN0b3JTUCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMKKyAqIHNob3VsZCB3b3JrIHJlYXNvbmFibHkgd2VsbCBmb3IKKyAqIG1vc3QgY29udHJvbGxlcnMsIGJ1dCBpZiB1c2VycyBleHBlcmllbmNlIGlzc3VlcyBzdWNoIGFzIGFzeW1tZXRyaWMgYmVoYXZpb3IKKyAqIGFyb3VuZAorICogdGhlIGRlYWRiYW5kIG9yIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLAorICogY2FsaWJyYXRpb24gaXMgcmVjb21tZW5kZWQuCisgKiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVmljdG9yU1AgVXNlciBNYW51YWwgYXZhaWxhYmxlCisgKiBmcm9tIFZleC4KKyAqCisgKiAgIDIuMDA0bXMgPSBmdWxsICJmb3J3YXJkIgorICogICAxLjUybXMgPSB0aGUgImhpZ2ggZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqICAgMS41MG1zID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQorICogICAxLjQ4bXMgPSB0aGUgImxvdyBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICogICAwLjk5N21zID0gZnVsbCAicmV2ZXJzZSIKKyAqLworCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBhIFZpY3RvclNQCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgVmljdG9yU1AgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUKKyAqIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0CisgKi8KK1ZpY3RvclNQOjpWaWN0b3JTUCh1aW50MzJfdCBjaGFubmVsKSA6IFNhZmVQV00oY2hhbm5lbCkgeworICBTZXRCb3VuZHMoMi4wMDQsIDEuNTIsIDEuNTAsIDEuNDgsIC45OTcpOworICBTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKKyAgU2V0UmF3KG1fY2VudGVyUHdtKTsKKyAgU2V0WmVyb0xhdGNoKCk7CisKKyAgSEFMUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1ZpY3RvclNQLCBHZXRDaGFubmVsKCkpOworICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRBY3R1YXRvcigiVmljdG9yU1AiLCBHZXRDaGFubmVsKCksIHRoaXMpOworfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlLgorICoKKyAqIFRoZSBQV00gdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkKKyAqIHNjYWxpbmcgdGhlIHZhbHVlIGZvciB0aGUgRlBHQS4KKyAqCisgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgMS4wIHRvIHNldC4KKyAqIEBwYXJhbSBzeW5jR3JvdXAgVW51c2VkIGludGVyZmFjZS4KKyAqLwordm9pZCBWaWN0b3JTUDo6U2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCkgeworICBTZXRTcGVlZChtX2lzSW52ZXJ0ZWQgPyAtc3BlZWQgOiBzcGVlZCk7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWNlbnRseSBzZXQgdmFsdWUgb2YgdGhlIFBXTS4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgdGhlIFBXTSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgVmljdG9yU1A6OkdldCgpIGNvbnN0IHsgcmV0dXJuIEdldFNwZWVkKCk7IH0KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBpbnZlcnRpbmcgZGlyZWN0aW9uIG9mIGEgc3BlZWQgY29udHJvbGxlci4KKyAqIEBwYXJhbSBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCisgKi8KK3ZvaWQgVmljdG9yU1A6OlNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgeyBtX2lzSW52ZXJ0ZWQgPSBpc0ludmVydGVkOyB9CisKKy8qKgorICogQ29tbW9uIGludGVyZmFjZSBmb3IgdGhlIGludmVydGluZyBkaXJlY3Rpb24gb2YgYSBzcGVlZCBjb250cm9sbGVyLgorICoKKyAqIEByZXR1cm4gaXNJbnZlcnRlZCBUaGUgc3RhdGUgb2YgaW52ZXJzaW9uLCB0cnVlIGlzIGludmVydGVkLgorICoKKyAqLworYm9vbCBWaWN0b3JTUDo6R2V0SW52ZXJ0ZWQoKSBjb25zdCB7IHJldHVybiBtX2lzSW52ZXJ0ZWQ7IH0KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyAqLwordm9pZCBWaWN0b3JTUDo6RGlzYWJsZSgpIHsgU2V0UmF3KGtQd21EaXNhYmxlZCk7IH0KKworLyoqCisgKiBXcml0ZSBvdXQgdGhlIFBJRCB2YWx1ZSBhcyBzZWVuIGluIHRoZSBQSURPdXRwdXQgYmFzZSBvYmplY3QuCisgKgorICogQHBhcmFtIG91dHB1dCBXcml0ZSBvdXQgdGhlIFBXTSB2YWx1ZSBhcyB3YXMgZm91bmQgaW4gdGhlIFBJRENvbnRyb2xsZXIKKyAqLwordm9pZCBWaWN0b3JTUDo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KSB7IFNldChvdXRwdXQpOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvVmlzaW9uL0F4aXNDYW1lcmEuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9BeGlzQ2FtZXJhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTBjNjhhCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9BeGlzQ2FtZXJhLmNwcApAQCAtMCwwICsxLDU5NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vQXhpc0NhbWVyYS5oIgorCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxUaW1lci5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga01heFBhY2tldFNpemUgPSAxNTM2Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrSW1hZ2VCdWZmZXJBbGxvY2F0aW9uSW5jcmVtZW50ID0gMTAwMDsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtXaGl0ZUJhbGFuY2VTdHJpbmdzW10gPSB7CisgICAgImF1dG8iLCAgICAgICAgICJob2xkIiwgICAgICAgICAiZml4ZWRfb3V0ZG9vcjEiLCAiZml4ZWRfb3V0ZG9vcjIiLAorICAgICJmaXhlZF9pbmRvb3IiLCAiZml4ZWRfZmx1b3IxIiwgImZpeGVkX2ZsdW9yMiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0V4cG9zdXJlQ29udHJvbFN0cmluZ3NbXSA9IHsKKyAgICAiYXV0byIsICJob2xkIiwgImZsaWNrZXJmcmVlNTAiLCAiZmxpY2tlcmZyZWU2MCIsCit9OworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1Jlc29sdXRpb25TdHJpbmdzW10gPSB7CisgICAgIjY0MHg0ODAiLCAiNDgweDM2MCIsICIzMjB4MjQwIiwgIjI0MHgxODAiLCAiMTc2eDE0NCIsICIxNjB4MTIwIiwKK307CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUm90YXRpb25TdHJpbmdzW10gPSB7CisgICAgIjAiLCAiMTgwIiwKK307CisKKy8qKgorICogQXhpc0NhbWVyYSBjb25zdHJ1Y3RvcgorICogQHBhcmFtIGNhbWVyYUhvc3QgVGhlIGhvc3QgdG8gZmluZCB0aGUgY2FtZXJhIGF0LCB0eXBpY2FsbHkgYW4gSVAgYWRkcmVzcworICovCitBeGlzQ2FtZXJhOjpBeGlzQ2FtZXJhKHN0ZDo6c3RyaW5nIGNvbnN0ICZjYW1lcmFIb3N0KQorICAgIDogbV9jYW1lcmFIb3N0KGNhbWVyYUhvc3QpIHsKKyAgbV9jYXB0dXJlVGhyZWFkID0gc3RkOjp0aHJlYWQoJkF4aXNDYW1lcmE6OkNhcHR1cmUsIHRoaXMpOworfQorCitBeGlzQ2FtZXJhOjp+QXhpc0NhbWVyYSgpIHsKKyAgbV9kb25lID0gdHJ1ZTsKKyAgbV9jYXB0dXJlVGhyZWFkLmpvaW4oKTsKK30KKworLyoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBsYXRlc3QgaW1hZ2UgZnJvbSB0aGUgY2FtZXJhIGhhcyBub3QgYmVlbiByZXRyaWV2ZWQgYnkKKyAqIGNhbGxpbmcgR2V0SW1hZ2UoKSB5ZXQuCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGltYWdlIGhhcyBub3QgYmVlbiByZXRyaWV2ZWQgeWV0LgorICovCitib29sIEF4aXNDYW1lcmE6OklzRnJlc2hJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJlc2hJbWFnZTsgfQorCisvKioKKyAqIEdldCBhbiBpbWFnZSBmcm9tIHRoZSBjYW1lcmEgYW5kIHN0b3JlIGl0IGluIHRoZSBwcm92aWRlZCBpbWFnZS4KKyAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hcSBpbWFnZSB0byBzdG9yZSB0aGUgcmVzdWx0IGluLiBUaGlzIG11c3QgYmUgYW4gSFNMIG9yCisgKiBSR0IgaW1hZ2UuCisgKiBAcmV0dXJuIDEgdXBvbiBzdWNjZXNzLCB6ZXJvIG9uIGEgZmFpbHVyZQorICovCitpbnQgQXhpc0NhbWVyYTo6R2V0SW1hZ2UoSW1hZ2UgKmltYWdlKSB7CisgIGlmIChtX2ltYWdlRGF0YS5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1faW1hZ2VEYXRhTXV0ZXgpOworCisgIFByaXZfUmVhZEpQRUdTdHJpbmdfQyhpbWFnZSwgbV9pbWFnZURhdGEuZGF0YSgpLCBtX2ltYWdlRGF0YS5zaXplKCkpOworCisgIG1fZnJlc2hJbWFnZSA9IGZhbHNlOworCisgIHJldHVybiAxOworfQorCisvKioKKyAqIEdldCBhbiBpbWFnZSBmcm9tIHRoZSBjYW1lcmEgYW5kIHN0b3JlIGl0IGluIHRoZSBwcm92aWRlZCBpbWFnZS4KKyAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gVGhpcyBtdXN0IGJlIGFuIEhTTCBvciBSR0IKKyAqIGltYWdlCisgKiBAcmV0dXJuIDEgdXBvbiBzdWNjZXNzLCB6ZXJvIG9uIGEgZmFpbHVyZQorICovCitpbnQgQXhpc0NhbWVyYTo6R2V0SW1hZ2UoQ29sb3JJbWFnZSAqaW1hZ2UpIHsKKyAgcmV0dXJuIEdldEltYWdlKGltYWdlLT5HZXRJbWFxSW1hZ2UoKSk7Cit9CisKKy8qKgorICogSW5zdGFudGlhdGUgYSBuZXcgaW1hZ2Ugb2JqZWN0IGFuZCBmaWxsIGl0IHdpdGggdGhlIGxhdGVzdCBpbWFnZSBmcm9tIHRoZQorICogY2FtZXJhLgorICoKKyAqIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIGlzIHRoZWlyIHJlc3BvbnNpYmlsaXR5IHRvCisgKiBkZWxldGUuCisgKiBAcmV0dXJuIGEgcG9pbnRlciB0byBhbiBIU0xJbWFnZSBvYmplY3QKKyAqLworSFNMSW1hZ2UgKkF4aXNDYW1lcmE6OkdldEltYWdlKCkgeworICBhdXRvIGltYWdlID0gbmV3IEhTTEltYWdlKCk7CisgIEdldEltYWdlKGltYWdlKTsKKyAgcmV0dXJuIGltYWdlOworfQorCisvKioKKyAqIENvcHkgYW4gaW1hZ2UgaW50byBhbiBleGlzdGluZyBidWZmZXIuCisgKiBUaGlzIGNvcGllcyBhbiBpbWFnZSBpbnRvIGFuIGV4aXN0aW5nIGJ1ZmZlciByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBpbWFnZQorICogaW4gbWVtb3J5LiBUaGF0IHdheSBhIG5ldyBpbWFnZSBpcyBvbmx5IGFsbG9jYXRlZCB3aGVuIHRoZSBpbWFnZSBiZWluZyBjb3BpZWQKKyAqIGlzCisgKiBsYXJnZXIgdGhhbiB0aGUgZGVzdGluYXRpb24uCisgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFBDVmlkZW9TZXJ2ZXIgY2xhc3MuCisgKiBAcGFyYW0gaW1hZ2VEYXRhIFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyAqIEBwYXJhbSBudW1CeXRlcyBUaGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCisgKiBAcmV0dXJuIDAgaWYgZmFpbGVkIChubyBzb3VyY2UgaW1hZ2Ugb3Igbm8gbWVtb3J5KSwgMSBpZiBzdWNjZXNzLgorICovCitpbnQgQXhpc0NhbWVyYTo6Q29weUpQRUcoY2hhciAqKmRlc3RJbWFnZSwgdW5zaWduZWQgaW50ICZkZXN0SW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAmZGVzdEltYWdlQnVmZmVyU2l6ZSkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9pbWFnZURhdGFNdXRleCk7CisgIGlmIChkZXN0SW1hZ2UgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJkZXN0SW1hZ2UgbXVzdCBub3QgYmUgbnVsbHB0ciIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG1faW1hZ2VEYXRhLnNpemUoKSA9PSAwKSByZXR1cm4gMDsgIC8vIGlmIG5vIHNvdXJjZSBpbWFnZQorCisgIGlmIChkZXN0SW1hZ2VCdWZmZXJTaXplIDwKKyAgICAgIG1faW1hZ2VEYXRhLnNpemUoKSkgIC8vIGlmIGN1cnJlbnQgZGVzdGluYXRpb24gYnVmZmVyIHRvbyBzbWFsbAorICB7CisgICAgaWYgKCpkZXN0SW1hZ2UgIT0gbnVsbHB0cikgZGVsZXRlW10gKiBkZXN0SW1hZ2U7CisgICAgZGVzdEltYWdlQnVmZmVyU2l6ZSA9IG1faW1hZ2VEYXRhLnNpemUoKSArIGtJbWFnZUJ1ZmZlckFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgKmRlc3RJbWFnZSA9IG5ldyBjaGFyW2Rlc3RJbWFnZUJ1ZmZlclNpemVdOworICAgIGlmICgqZGVzdEltYWdlID09IG51bGxwdHIpIHJldHVybiAwOworICB9CisgIC8vIGNvcHkgdGhpcyBpbWFnZSBpbnRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICBpZiAoKmRlc3RJbWFnZSA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgIipkZXN0SW1hZ2UgbXVzdCBub3QgYmUgbnVsbHB0ciIpOworICB9CisKKyAgc3RkOjpjb3B5KG1faW1hZ2VEYXRhLmJlZ2luKCksIG1faW1hZ2VEYXRhLmVuZCgpLCAqZGVzdEltYWdlKTsKKyAgZGVzdEltYWdlU2l6ZSA9IG1faW1hZ2VEYXRhLnNpemUoKTsKKyAgOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBSZXF1ZXN0IGEgY2hhbmdlIGluIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBjYW1lcmEgaW1hZ2VzLgorICogQHBhcmFtIGJyaWdodG5lc3MgdmFsaWQgdmFsdWVzIDAgLi4gMTAwCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6V3JpdGVCcmlnaHRuZXNzKGludCBicmlnaHRuZXNzKSB7CisgIGlmIChicmlnaHRuZXNzIDwgMCB8fCBicmlnaHRuZXNzID4gMTAwKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJpZ2h0bmVzcyBtdXN0IGJlIGZyb20gMCB0byAxMDAiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisgIGlmIChtX2JyaWdodG5lc3MgIT0gYnJpZ2h0bmVzcykgeworICAgIG1fYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisgICAgbV9wYXJhbWV0ZXJzRGlydHkgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgY29uZmlndXJlZCBicmlnaHRuZXNzIG9mIHRoZSBjYW1lcmEgaW1hZ2VzCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpHZXRCcmlnaHRuZXNzKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworICByZXR1cm4gbV9icmlnaHRuZXNzOworfQorCisvKioKKyAqIFJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlIHdoaXRlIGJhbGFuY2Ugb24gdGhlIGNhbWVyYS4KKyAqIEBwYXJhbSB3aGl0ZUJhbGFuY2UgVmFsaWQgdmFsdWVzIGZyb20gdGhlIDxjb2RlPldoaXRlQmFsYW5jZTwvY29kZT4gZW51bS4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZVdoaXRlQmFsYW5jZShBeGlzQ2FtZXJhOjpXaGl0ZUJhbGFuY2Ugd2hpdGVCYWxhbmNlKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKyAgaWYgKG1fd2hpdGVCYWxhbmNlICE9IHdoaXRlQmFsYW5jZSkgeworICAgIG1fd2hpdGVCYWxhbmNlID0gd2hpdGVCYWxhbmNlOworICAgIG1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgd2hpdGUgYmFsYW5jZXMgb2YgdGhlIGNhbWVyYSBpbWFnZXMKKyAqLworQXhpc0NhbWVyYTo6V2hpdGVCYWxhbmNlIEF4aXNDYW1lcmE6OkdldFdoaXRlQmFsYW5jZSgpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKyAgcmV0dXJuIG1fd2hpdGVCYWxhbmNlOworfQorCisvKioKKyAqIFJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlIGNvbG9yIGxldmVsIG9mIHRoZSBjYW1lcmEgaW1hZ2VzLgorICogQHBhcmFtIGNvbG9yTGV2ZWwgdmFsaWQgdmFsdWVzIGFyZSAwIC4uIDEwMAorICovCit2b2lkIEF4aXNDYW1lcmE6OldyaXRlQ29sb3JMZXZlbChpbnQgY29sb3JMZXZlbCkgeworICBpZiAoY29sb3JMZXZlbCA8IDAgfHwgY29sb3JMZXZlbCA+IDEwMCkgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbG9yIGxldmVsIG11c3QgYmUgZnJvbSAwIHRvIDEwMCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKyAgaWYgKG1fY29sb3JMZXZlbCAhPSBjb2xvckxldmVsKSB7CisgICAgbV9jb2xvckxldmVsID0gY29sb3JMZXZlbDsKKyAgICBtX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisgIH0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIGNvbG9yIGxldmVsIG9mIHRoZSBjYW1lcmEgaW1hZ2VzCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpHZXRDb2xvckxldmVsKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworICByZXR1cm4gbV9jb2xvckxldmVsOworfQorCisvKioKKyAqIFJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlIGNhbWVyYSdzIGV4cG9zdXJlIG1vZGUuCisgKiBAcGFyYW0gZXhwb3N1cmVDb250cm9sIEEgbW9kZSB0byB3cml0ZSBpbiB0aGUgPGNvZGU+RXhwb3N1cmU8L2NvZGU+IGVudW0uCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6V3JpdGVFeHBvc3VyZUNvbnRyb2woCisgICAgQXhpc0NhbWVyYTo6RXhwb3N1cmVDb250cm9sIGV4cG9zdXJlQ29udHJvbCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisgIGlmIChtX2V4cG9zdXJlQ29udHJvbCAhPSBleHBvc3VyZUNvbnRyb2wpIHsKKyAgICBtX2V4cG9zdXJlQ29udHJvbCA9IGV4cG9zdXJlQ29udHJvbDsKKyAgICBtX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisgIH0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIGV4cG9zdXJlIGNvbnRyb2wgbW9kZSBvZiB0aGUgY2FtZXJhCisgKi8KK0F4aXNDYW1lcmE6OkV4cG9zdXJlQ29udHJvbCBBeGlzQ2FtZXJhOjpHZXRFeHBvc3VyZUNvbnRyb2woKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisgIHJldHVybiBtX2V4cG9zdXJlQ29udHJvbDsKK30KKworLyoqCisgKiBSZXF1ZXN0IGEgY2hhbmdlIGluIHRoZSBleHBvc3VyZSBwcmlvcml0eSBvZiB0aGUgY2FtZXJhLgorICogQHBhcmFtIGV4cG9zdXJlUHJpb3JpdHkgVmFsaWQgdmFsdWVzIGFyZSAwLCA1MCwgMTAwLgorICogMCA9IFByaW9yaXRpemUgaW1hZ2UgcXVhbGl0eQorICogNTAgPSBOb25lCisgKiAxMDAgPSBQcmlvcml0aXplIGZyYW1lIHJhdGUKKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZUV4cG9zdXJlUHJpb3JpdHkoaW50IGV4cG9zdXJlUHJpb3JpdHkpIHsKKyAgaWYgKGV4cG9zdXJlUHJpb3JpdHkgIT0gMCAmJiBleHBvc3VyZVByaW9yaXR5ICE9IDUwICYmCisgICAgICBleHBvc3VyZVByaW9yaXR5ICE9IDEwMCkgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cG9zdXJlIHByaW9yaXR5IG11c3QgYmUgZnJvbSAwLCA1MCwgb3IgMTAwIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKworICBpZiAobV9leHBvc3VyZVByaW9yaXR5ICE9IGV4cG9zdXJlUHJpb3JpdHkpIHsKKyAgICBtX2V4cG9zdXJlUHJpb3JpdHkgPSBleHBvc3VyZVByaW9yaXR5OworICAgIG1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgZXhwb3N1cmUgcHJpb3JpdHkgb2YgdGhlIGNhbWVyYQorICovCitpbnQgQXhpc0NhbWVyYTo6R2V0RXhwb3N1cmVQcmlvcml0eSgpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKyAgcmV0dXJuIG1fZXhwb3N1cmVQcmlvcml0eTsKK30KKworLyoqCisgKiBXcml0ZSB0aGUgbWF4aW11bSBmcmFtZXMgcGVyIHNlY29uZCB0aGF0IHRoZSBjYW1lcmEgc2hvdWxkIHNlbmQKKyAqIFdyaXRlIDAgdG8gc2VuZCBhcyBtYW55IGFzIHBvc3NpYmxlLgorICogQHBhcmFtIG1heEZQUyBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0aGUgY2FtZXJhIHNob3VsZCBzZW5kIGluIGEgc2Vjb25kLAorICogZXhwb3N1cmUgcGVybWl0dGluZy4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZU1heEZQUyhpbnQgbWF4RlBTKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKyAgaWYgKG1fbWF4RlBTICE9IG1heEZQUykgeworICAgIG1fbWF4RlBTID0gbWF4RlBTOworICAgIG1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3N0cmVhbURpcnR5ID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgbWF4aW11bSBGUFMgb2YgdGhlIGNhbWVyYQorICovCitpbnQgQXhpc0NhbWVyYTo6R2V0TWF4RlBTKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworICByZXR1cm4gbV9tYXhGUFM7Cit9CisKKy8qKgorICogV3JpdGUgcmVzb2x1dGlvbiB2YWx1ZSB0byBjYW1lcmEuCisgKiBAcGFyYW0gcmVzb2x1dGlvbiBUaGUgY2FtZXJhIHJlc29sdXRpb24gdmFsdWUgdG8gd3JpdGUgdG8gdGhlIGNhbWVyYS4KKyAqLwordm9pZCBBeGlzQ2FtZXJhOjpXcml0ZVJlc29sdXRpb24oQXhpc0NhbWVyYTo6UmVzb2x1dGlvbiByZXNvbHV0aW9uKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKyAgaWYgKG1fcmVzb2x1dGlvbiAhPSByZXNvbHV0aW9uKSB7CisgICAgbV9yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKyAgICBtX3BhcmFtZXRlcnNEaXJ0eSA9IHRydWU7CisgICAgbV9zdHJlYW1EaXJ0eSA9IHRydWU7CisgIH0KK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIHJlc29sdXRpb24gb2YgdGhlIGNhbWVyYSAobm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lCisgKiByZXNvbHV0aW9uIGFzIHRoZSBtb3N0IHJlY2VudCBpbWFnZSwgaWYgaXQgd2FzIGNoYW5nZWQgcmVjZW50bHkuKQorICovCitBeGlzQ2FtZXJhOjpSZXNvbHV0aW9uIEF4aXNDYW1lcmE6OkdldFJlc29sdXRpb24oKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisgIHJldHVybiBtX3Jlc29sdXRpb247Cit9CisKKy8qKgorICogV3JpdGUgdGhlIHJvdGF0aW9uIHZhbHVlIHRvIHRoZSBjYW1lcmEuCisgKiBJZiB5b3UgbW91bnQgeW91ciBjYW1lcmEgdXBzaWRlIGRvd24sIHVzZSB0aGlzIHRvIGFkanVzdCB0aGUgaW1hZ2UgZm9yIHlvdS4KKyAqIEBwYXJhbSByb3RhdGlvbiBUaGUgYW5nbGUgdG8gcm90YXRlIHRoZSBjYW1lcmEKKyAqICg8Y29kZT5BeGlzQ2FtZXJhOjpSb3RhdGlvbjo6azA8L2NvZGU+CisgKiBvciA8Y29kZT5BeGlzQ2FtZXJhOjpSb3RhdGlvbjo6azE4MDwvY29kZT4pCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6V3JpdGVSb3RhdGlvbihBeGlzQ2FtZXJhOjpSb3RhdGlvbiByb3RhdGlvbikgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworCisgIGlmIChtX3JvdGF0aW9uICE9IHJvdGF0aW9uKSB7CisgICAgbV9yb3RhdGlvbiA9IHJvdGF0aW9uOworICAgIG1fcGFyYW1ldGVyc0RpcnR5ID0gdHJ1ZTsKKyAgICBtX3N0cmVhbURpcnR5ID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgcm90YXRpb24gbW9kZSBvZiB0aGUgY2FtZXJhCisgKi8KK0F4aXNDYW1lcmE6OlJvdGF0aW9uIEF4aXNDYW1lcmE6OkdldFJvdGF0aW9uKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9wYXJhbWV0ZXJzTXV0ZXgpOworICByZXR1cm4gbV9yb3RhdGlvbjsKK30KKworLyoqCisgKiBXcml0ZSB0aGUgY29tcHJlc3Npb24gdmFsdWUgdG8gdGhlIGNhbWVyYS4KKyAqIEBwYXJhbSBjb21wcmVzc2lvbiBWYWx1ZXMgYmV0d2VlbiAwIGFuZCAxMDAuCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6V3JpdGVDb21wcmVzc2lvbihpbnQgY29tcHJlc3Npb24pIHsKKyAgaWYgKGNvbXByZXNzaW9uIDwgMCB8fCBjb21wcmVzc2lvbiA+IDEwMCkgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXByZXNzaW9uIG11c3QgYmUgZnJvbSAwIHRvIDEwMCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX3BhcmFtZXRlcnNNdXRleCk7CisKKyAgaWYgKG1fY29tcHJlc3Npb24gIT0gY29tcHJlc3Npb24pIHsKKyAgICBtX2NvbXByZXNzaW9uID0gY29tcHJlc3Npb247CisgICAgbV9wYXJhbWV0ZXJzRGlydHkgPSB0cnVlOworICAgIG1fc3RyZWFtRGlydHkgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogQHJldHVybiBUaGUgY29uZmlndXJlZCBjb21wcmVzc2lvbiBsZXZlbCBvZiB0aGUgY2FtZXJhCisgKi8KK2ludCBBeGlzQ2FtZXJhOjpHZXRDb21wcmVzc2lvbigpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fcGFyYW1ldGVyc011dGV4KTsKKyAgcmV0dXJuIG1fY29tcHJlc3Npb247Cit9CisKKy8qKgorICogTWV0aG9kIGNhbGxlZCBpbiB0aGUgY2FwdHVyZSB0aHJlYWQgdG8gcmVjZWl2ZSBpbWFnZXMgZnJvbSB0aGUgY2FtZXJhCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6Q2FwdHVyZSgpIHsKKyAgaW50IGNvbnNlY3V0aXZlRXJyb3JzID0gMDsKKworICAvLyBMb29wIG9uIHRyeWluZyB0byBzZXR1cCB0aGUgY2FtZXJhIGNvbm5lY3Rpb24uIFRoaXMgaGFwcGVucyBpbiBhIGJhY2tncm91bmQKKyAgLy8gdGhyZWFkIHNvIGl0IHNob3VsZG4ndCBlZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB1c2VyIHByb2dyYW1zLgorICB3aGlsZSAoIW1fZG9uZSkgeworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RTdHJpbmcgPQorICAgICAgICAiR0VUIC9tanBnL3ZpZGVvLm1qcGcgSFRUUC8xLjFcbiIKKyAgICAgICAgIlVzZXItQWdlbnQ6IEhUVFBTdHJlYW1DbGllbnRcbiIKKyAgICAgICAgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmVcbiIKKyAgICAgICAgIkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlXG4iCisgICAgICAgICJBdXRob3JpemF0aW9uOiBCYXNpYyBSbEpET2taU1F3PT1cblxuIjsKKyAgICBtX2NhcHR1cmVNdXRleC5sb2NrKCk7CisgICAgbV9jYW1lcmFTb2NrZXQgPSBDcmVhdGVDYW1lcmFTb2NrZXQocmVxdWVzdFN0cmluZywgY29uc2VjdXRpdmVFcnJvcnMgPiA1KTsKKyAgICBpZiAobV9jYW1lcmFTb2NrZXQgIT0gLTEpIHsKKyAgICAgIFJlYWRJbWFnZXNGcm9tQ2FtZXJhKCk7CisgICAgICBjb25zZWN1dGl2ZUVycm9ycyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnNlY3V0aXZlRXJyb3JzKys7CisgICAgfQorICAgIG1fY2FwdHVyZU11dGV4LnVubG9jaygpOworICAgIFdhaXQoMC41KTsKKyAgfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgcmVhZHMgdGhlIGltYWdlcyBmcm9tIHRoZSBjYW1lcmEuCisgKi8KK3ZvaWQgQXhpc0NhbWVyYTo6UmVhZEltYWdlc0Zyb21DYW1lcmEoKSB7CisgIGNoYXIgKmltZ0J1ZmZlciA9IG51bGxwdHI7CisgIGludCBpbWdCdWZmZXJMZW5ndGggPSAwOworCisgIC8vIFRPRE86IHRoZXNlIHJlY3YgY2FsbHMgbXVzdCBiZSBub24tYmxvY2tpbmcuIE90aGVyd2lzZSBpZiB0aGUgY2FtZXJhCisgIC8vIGZhaWxzIGR1cmluZyBhIHJlYWQsIHRoZSBjb2RlIGhhbmdzIGFuZCBuZXZlciByZXRyaWVzIHdoZW4gdGhlIGNhbWVyYSBjb21lcworICAvLyBiYWNrIHVwLgorCisgIGludCBjb3VudGVyID0gMjsKKyAgd2hpbGUgKCFtX2RvbmUpIHsKKyAgICBjaGFyIGluaXRpYWxSZWFkQnVmZmVyW2tNYXhQYWNrZXRTaXplXSA9ICIiOworICAgIGNoYXIgaW50ZXJtZWRpYXRlQnVmZmVyWzFdOworICAgIGNoYXIgKnRyYWlsaW5nUHRyID0gaW5pdGlhbFJlYWRCdWZmZXI7CisgICAgaW50IHRyYWlsaW5nQ291bnRlciA9IDA7CisgICAgd2hpbGUgKGNvdW50ZXIpIHsKKyAgICAgIC8vIFRPRE86IGZpeCBtZS4uLiB0aGlzIGNhbm5vdCBiZSB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGFwcHJvYWNoIHRoaXMsCisgICAgICAvLyByZWFkaW5nIG9uZSBieXRlIGF0IGEgdGltZS4KKyAgICAgIGlmIChyZWN2KG1fY2FtZXJhU29ja2V0LCBpbnRlcm1lZGlhdGVCdWZmZXIsIDEsIDApID09IC0xKSB7CisgICAgICAgIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIkZhaWxlZCB0byByZWFkIGltYWdlIGhlYWRlciIpOworICAgICAgICBjbG9zZShtX2NhbWVyYVNvY2tldCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHN0cm5jYXQoaW5pdGlhbFJlYWRCdWZmZXIsIGludGVybWVkaWF0ZUJ1ZmZlciwgMSk7CisgICAgICAvLyB0cmFpbGluZ0NvdW50ZXIgZW5zdXJlcyB0aGF0IHdlIHN0YXJ0IGxvb2tpbmcgZm9yIHRoZSA0IGJ5dGUgc3RyaW5nCisgICAgICAvLyBhZnRlcgorICAgICAgLy8gdGhlcmUgaXMgYXQgbGVhc3QgNCBieXRlcyB0b3RhbC4gS2luZCBvZiBvYnNjdXJlLgorICAgICAgLy8gbG9vayBmb3IgMiBibGFuayBsaW5lcyAoXHJcbikKKyAgICAgIGlmIChudWxscHRyICE9IHN0cnN0cih0cmFpbGluZ1B0ciwgIlxyXG5cclxuIikpIHsKKyAgICAgICAgLS1jb3VudGVyOworICAgICAgfQorICAgICAgaWYgKCsrdHJhaWxpbmdDb3VudGVyID49IDQpIHsKKyAgICAgICAgdHJhaWxpbmdQdHIrKzsKKyAgICAgIH0KKyAgICB9CisgICAgY291bnRlciA9IDE7CisgICAgY2hhciAqY29udGVudExlbmd0aCA9IHN0cnN0cihpbml0aWFsUmVhZEJ1ZmZlciwgIkNvbnRlbnQtTGVuZ3RoOiAiKTsKKyAgICBpZiAoY29udGVudExlbmd0aCA9PSBudWxscHRyKSB7CisgICAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNvbnRlbnQtbGVuZ3RoIHRva2VuIGZvdW5kIGluIHBhY2tldCIpOworICAgICAgY2xvc2UobV9jYW1lcmFTb2NrZXQpOworICAgICAgaWYgKGltZ0J1ZmZlcikgZGVsZXRlW10gaW1nQnVmZmVyOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb250ZW50TGVuZ3RoID0gY29udGVudExlbmd0aCArIDE2OyAgICAvLyBza2lwIHBhc3QgImNvbnRlbnQgbGVuZ3RoIgorICAgIGludCByZWFkTGVuZ3RoID0gYXRvbChjb250ZW50TGVuZ3RoKTsgIC8vIGdldCB0aGUgaW1hZ2UgYnl0ZSBjb3VudAorCisgICAgLy8gTWFrZSBzdXJlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2gKKyAgICBpZiAoaW1nQnVmZmVyTGVuZ3RoIDwgcmVhZExlbmd0aCkgeworICAgICAgaWYgKGltZ0J1ZmZlcikgZGVsZXRlW10gaW1nQnVmZmVyOworICAgICAgaW1nQnVmZmVyTGVuZ3RoID0gcmVhZExlbmd0aCArIGtJbWFnZUJ1ZmZlckFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgICBpbWdCdWZmZXIgPSBuZXcgY2hhcltpbWdCdWZmZXJMZW5ndGhdOworICAgICAgaWYgKGltZ0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGltZ0J1ZmZlckxlbmd0aCA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWQgdGhlIGltYWdlIGRhdGEgZm9yICJDb250ZW50LUxlbmd0aCIgYnl0ZXMKKyAgICBpbnQgYnl0ZXNSZWFkID0gMDsKKyAgICBpbnQgcmVtYWluaW5nID0gcmVhZExlbmd0aDsKKyAgICB3aGlsZSAoYnl0ZXNSZWFkIDwgcmVhZExlbmd0aCkgeworICAgICAgaW50IGJ5dGVzVGhpc1JlY3YgPQorICAgICAgICAgIHJlY3YobV9jYW1lcmFTb2NrZXQsICZpbWdCdWZmZXJbYnl0ZXNSZWFkXSwgcmVtYWluaW5nLCAwKTsKKyAgICAgIGJ5dGVzUmVhZCArPSBieXRlc1RoaXNSZWN2OworICAgICAgcmVtYWluaW5nIC09IGJ5dGVzVGhpc1JlY3Y7CisgICAgfQorCisgICAgLy8gVXBkYXRlIGltYWdlCisgICAgeworICAgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1faW1hZ2VEYXRhTXV0ZXgpOworCisgICAgICBtX2ltYWdlRGF0YS5hc3NpZ24oaW1nQnVmZmVyLCBpbWdCdWZmZXIgKyBpbWdCdWZmZXJMZW5ndGgpOworICAgICAgbV9mcmVzaEltYWdlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoV3JpdGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGNsb3NlKG1fY2FtZXJhU29ja2V0KTsKK30KKworLyoqCisgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgY2FtZXJhIHRvIHNldCBhbGwgb2YgdGhlIHBhcmFtZXRlcnMuICBUaGlzIGlzIGNhbGxlZAorICogaW4gdGhlIGNhcHR1cmUgdGhyZWFkIGJldHdlZW4gZWFjaCBmcmFtZS4gVGhpcyBzdHJhdGVneSBhdm9pZHMgbWFraW5nIGxvdHMKKyAqIG9mIHJlZHVuZGFudCBIVFRQIHJlcXVlc3RzLCBhY2NvdW50cyBmb3IgZmFpbGVkIGluaXRpYWwgcmVxdWVzdHMsIGFuZAorICogYXZvaWRzIGJsb2NraW5nIGNhbGxzIGluIHRoZSBtYWluIHRocmVhZCB1bmxlc3MgbmVjZXNzYXJ5LgorICoKKyAqIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpZiBubyBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdCBsYXN0CisgKiBjb21wbGV0ZWx5IHN1Y2Nlc3NmdWxseS4KKyAqCisgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJlYW0gc2hvdWxkIGJlIHJlc3RhcnRlZCBkdWUgdG8gYQorICogcGFyYW1ldGVyIGNoYW5naW5nLgorICovCitib29sIEF4aXNDYW1lcmE6OldyaXRlUGFyYW1ldGVycygpIHsKKyAgaWYgKG1fcGFyYW1ldGVyc0RpcnR5KSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVxdWVzdDsKKyAgICByZXF1ZXN0IDw8ICJHRVQgL2F4aXMtY2dpL2FkbWluL3BhcmFtLmNnaT9hY3Rpb249dXBkYXRlIjsKKworICAgIG1fcGFyYW1ldGVyc011dGV4LmxvY2soKTsKKyAgICByZXF1ZXN0IDw8ICImSW1hZ2VTb3VyY2UuSTAuU2Vuc29yLkJyaWdodG5lc3M9IiA8PCBtX2JyaWdodG5lc3M7CisgICAgcmVxdWVzdCA8PCAiJkltYWdlU291cmNlLkkwLlNlbnNvci5XaGl0ZUJhbGFuY2U9IgorICAgICAgICAgICAgPDwga1doaXRlQmFsYW5jZVN0cmluZ3NbbV93aGl0ZUJhbGFuY2VdOworICAgIHJlcXVlc3QgPDwgIiZJbWFnZVNvdXJjZS5JMC5TZW5zb3IuQ29sb3JMZXZlbD0iIDw8IG1fY29sb3JMZXZlbDsKKyAgICByZXF1ZXN0IDw8ICImSW1hZ2VTb3VyY2UuSTAuU2Vuc29yLkV4cG9zdXJlPSIKKyAgICAgICAgICAgIDw8IGtFeHBvc3VyZUNvbnRyb2xTdHJpbmdzW21fZXhwb3N1cmVDb250cm9sXTsKKyAgICByZXF1ZXN0IDw8ICImSW1hZ2VTb3VyY2UuSTAuU2Vuc29yLkV4cG9zdXJlUHJpb3JpdHk9IiA8PCBtX2V4cG9zdXJlUHJpb3JpdHk7CisgICAgcmVxdWVzdCA8PCAiJkltYWdlLkkwLlN0cmVhbS5GUFM9IiA8PCBtX21heEZQUzsKKyAgICByZXF1ZXN0IDw8ICImSW1hZ2UuSTAuQXBwZWFyYW5jZS5SZXNvbHV0aW9uPSIKKyAgICAgICAgICAgIDw8IGtSZXNvbHV0aW9uU3RyaW5nc1ttX3Jlc29sdXRpb25dOworICAgIHJlcXVlc3QgPDwgIiZJbWFnZS5JMC5BcHBlYXJhbmNlLkNvbXByZXNzaW9uPSIgPDwgbV9jb21wcmVzc2lvbjsKKyAgICByZXF1ZXN0IDw8ICImSW1hZ2UuSTAuQXBwZWFyYW5jZS5Sb3RhdGlvbj0iIDw8IGtSb3RhdGlvblN0cmluZ3NbbV9yb3RhdGlvbl07CisgICAgbV9wYXJhbWV0ZXJzTXV0ZXgudW5sb2NrKCk7CisKKyAgICByZXF1ZXN0IDw8ICIgSFRUUC8xLjEiIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXF1ZXN0IDw8ICJVc2VyLUFnZW50OiBIVFRQU3RyZWFtQ2xpZW50IiA8PCBzdGQ6OmVuZGw7CisgICAgcmVxdWVzdCA8PCAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgPDwgc3RkOjplbmRsOworICAgIHJlcXVlc3QgPDwgIkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlIiA8PCBzdGQ6OmVuZGw7CisgICAgcmVxdWVzdCA8PCAiQXV0aG9yaXphdGlvbjogQmFzaWMgUmxKRE9rWlNRdz09IiA8PCBzdGQ6OmVuZGw7CisgICAgcmVxdWVzdCA8PCBzdGQ6OmVuZGw7CisKKyAgICBpbnQgc29ja2V0ID0gQ3JlYXRlQ2FtZXJhU29ja2V0KHJlcXVlc3Quc3RyKCksIGZhbHNlKTsKKyAgICBpZiAoc29ja2V0ID09IC0xKSB7CisgICAgICB3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KCJFcnJvciBzZXR0aW5nIGNhbWVyYSBwYXJhbWV0ZXJzIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsb3NlKHNvY2tldCk7CisgICAgICBtX3BhcmFtZXRlcnNEaXJ0eSA9IGZhbHNlOworCisgICAgICBpZiAobV9zdHJlYW1EaXJ0eSkgeworICAgICAgICBtX3N0cmVhbURpcnR5ID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBzb2NrZXQgY29ubmVjdGVkIHRvIGNhbWVyYQorICogVXNlZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uIHRvIHRoZSBjYW1lcmEgZm9yIGJvdGggY2FwdHVyaW5nIGltYWdlcyBhbmQKKyAqIHNldHRpbmcgcGFyYW1ldGVycy4KKyAqIEBwYXJhbSByZXF1ZXN0U3RyaW5nIFRoZSBpbml0aWFsIHJlcXVlc3Qgc3RyaW5nIHRvIHNlbmQgdXBvbiBzdWNjZXNzZnVsCisgKiBjb25uZWN0aW9uLgorICogQHBhcmFtIHNldEVycm9yIElmIHRydWUsIHJhaXMgYW4gZXJyb3IgaWYgdGhlcmUncyBhIHByb2JsZW0gY3JlYXRpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICogVGhpcyBpcyBvbmx5IGVuYWJsZWQgYWZ0ZXIgc2V2ZXJhbCB1bnN1Y2Vzc2Z1bCBjb25uZWN0aW9ucywgc28gYSBzaW5nbGUgb25lCisgKiBkb2Vzbid0CisgKiBjYXVzZSBhbiBlcnJvciBtZXNzYWdlIHRvIGJlIHByaW50ZWQgaWYgaXQgaW1tZWRpYXRlbHkgcmVjb3ZlcnMuCisgKiBAcmV0dXJuIC0xIGlmIGZhaWxlZCwgc29ja2V0IGhhbmRsZSBpZiBzdWNjZXNzZnVsLgorICovCitpbnQgQXhpc0NhbWVyYTo6Q3JlYXRlQ2FtZXJhU29ja2V0KHN0ZDo6c3RyaW5nIGNvbnN0ICZyZXF1ZXN0U3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldEVycm9yKSB7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcmVzcyA9IG51bGxwdHI7CisgIGludCBjYW1Tb2NrZXQ7CisKKyAgLyogY3JlYXRlIHNvY2tldCAqLworICBpZiAoKGNhbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKSB7CisgICAgaWYgKHNldEVycm9yKQorICAgICAgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgY2FtZXJhIHNvY2tldCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChnZXRhZGRyaW5mbyhtX2NhbWVyYUhvc3QuY19zdHIoKSwgIjgwIiwgbnVsbHB0ciwgJmFkZHJlc3MpID09IC0xKSB7CisgICAgaWYgKHNldEVycm9yKSB7CisgICAgICB3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBjYW1lcmEgc29ja2V0Iik7CisgICAgICBjbG9zZShjYW1Tb2NrZXQpOworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBjb25uZWN0IHRvIHNlcnZlciAqLworICBpZiAoY29ubmVjdChjYW1Tb2NrZXQsIGFkZHJlc3MtPmFpX2FkZHIsIGFkZHJlc3MtPmFpX2FkZHJsZW4pID09IC0xKSB7CisgICAgaWYgKHNldEVycm9yKQorICAgICAgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIGNhbWVyYSIpOworICAgIGZyZWVhZGRyaW5mbyhhZGRyZXNzKTsKKyAgICBjbG9zZShjYW1Tb2NrZXQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGZyZWVhZGRyaW5mbyhhZGRyZXNzKTsKKworICBpbnQgc2VudCA9IHNlbmQoY2FtU29ja2V0LCByZXF1ZXN0U3RyaW5nLmNfc3RyKCksIHJlcXVlc3RTdHJpbmcuc2l6ZSgpLCAwKTsKKyAgaWYgKHNlbnQgPT0gLTEpIHsKKyAgICBpZiAoc2V0RXJyb3IpCisgICAgICB3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KCJGYWlsZWQgdG8gc2VuZCBhIHJlcXVlc3QgdG8gdGhlIGNhbWVyYSIpOworICAgIGNsb3NlKGNhbVNvY2tldCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIGNhbVNvY2tldDsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vQmFlVXRpbGl0aWVzLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vQmFlVXRpbGl0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDllYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9CYWVVdGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEsMzY5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgIlZpc2lvbi9CYWVVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTZXJ2by5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisKKy8qKiBAZmlsZQorICogICBVdGlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qKgorICogZGVidWcgb3V0cHV0IGZsYWcgb3B0aW9uczoKKyAqIERFQlVHX09GRiwgREVCVUdfTU9TVExZX09GRiwgREVCVUdfU0NSRUVOX09OTFksIERFQlVHX0ZJTEVfT05MWSwKKyAqIERFQlVHX1NDUkVFTl9BTkRfRklMRQorICovCitzdGF0aWMgRGVidWdPdXRwdXRUeXBlIGRwcmludGZGbGFnID0gREVCVUdfT0ZGOworCisvKioKKyAqIFNldCB0aGUgZGVidWcgZmxhZyB0byBwcmludCB0byBzY3JlZW4sIGZpbGUgb24gY1JJTywgYm90aCBvciBuZWl0aGVyCisgKiBAcGFyYW0gdGVtcFN0cmluZyBUaGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZCBTZXREZWJ1Z0ZsYWcoRGVidWdPdXRwdXRUeXBlIGZsYWcpIHsgZHByaW50ZkZsYWcgPSBmbGFnOyB9CisKKy8qKgorICogRGVidWcgcHJpbnQgdG8gYSBmaWxlIGFuZC9vciBhIHRlcm1pbmFsIHdpbmRvdy4KKyAqIENhbGwgbGlrZSB5b3Ugd291bGQgY2FsbCBwcmludGYuCisgKiBTZXQgZnVuY3Rpb25OYW1lIGluIHRoZSBmdW5jdGlvbiBpZiB5b3Ugd2FudCB0aGUgY29ycmVjdCBmdW5jdGlvbiBuYW1lIHRvCisgKiBwcmludCBvdXQuCisgKiBUaGUgZmlsZSBsaW5lIG51bWJlciB3aWxsIGFsc28gYmUgcHJpbnRlZC4KKyAqIEBwYXJhbSB0ZW1wU3RyaW5nIFRoZSBmb3JtYXQgc3RyaW5nLgorICovCit2b2lkIGRwcmludGYoY29uc3QgY2hhciAqdGVtcFN0cmluZywgLi4uKSAvKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0ICovCit7CisgIHZhX2xpc3QgYXJnczsgICAgLyogSW5wdXQgYXJndW1lbnQgbGlzdCAqLworICBpbnQgbGluZV9udW1iZXI7IC8qIExpbmUgbnVtYmVyIHBhc3NlZCBpbiBhcmd1bWVudCAqLworICBpbnQgdHlwZTsKKyAgY29uc3QgY2hhciAqZnVuY3Rpb25OYW1lOyAvKiBGb3JtYXQgcGFzc2VkIGluIGFyZ3VtZW50ICovCisgIGNvbnN0IGNoYXIgKmZtdDsgICAgICAgICAgLyogRm9ybWF0IHBhc3NlZCBpbiBhcmd1bWVudCAqLworICBjaGFyIHRleHRbNTEyXTsgICAgICAgICAgIC8qIFRleHQgc3RyaW5nICovCisgIGNoYXIgb3V0dGV4dFs1MTJdOyAgICAgICAgLyogVGV4dCBzdHJpbmcgKi8KKyAgRklMRSAqb3V0ZmlsZV9mZDsgICAgICAgICAvKiBPdXRwdXQgZmlsZSBwb2ludGVyICovCisgIGNoYXIgZmlsZXBhdGhbMTI4XTsgICAgICAgLyogVGV4dCBzdHJpbmcgKi8KKyAgaW50IGZhdGFsRmxhZyA9IDA7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICBpbnQgaW5kZXg7CisgIGludCB0ZW1wU3RyaW5nTGVuOworCisgIGlmIChkcHJpbnRmRmxhZyA9PSBERUJVR19PRkYpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YV9zdGFydChhcmdzLCB0ZW1wU3RyaW5nKTsKKworICB0ZW1wU3RyaW5nTGVuID0gc3RybGVuKHRlbXBTdHJpbmcpOworICBmaWxlbmFtZSA9IHRlbXBTdHJpbmc7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRlbXBTdHJpbmdMZW47IGluZGV4KyspIHsKKyAgICBpZiAodGVtcFN0cmluZ1tpbmRleF0gPT0gJyAnKSB7CisgICAgICBwcmludGYoIkVSUk9SIGluIGRwcmludGY6IG1hbGZvcm1lZCBjYWxsaW5nIHNlcXVlbmNlICglcylcbiIsIHRlbXBTdHJpbmcpOworICAgICAgdmFfZW5kKGFyZ3MpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodGVtcFN0cmluZ1tpbmRleF0gPT0gJ1xcJyB8fCB0ZW1wU3RyaW5nW2luZGV4XSA9PSAnLycpCisgICAgICBmaWxlbmFtZSA9IHRlbXBTdHJpbmcgKyBpbmRleCArIDE7CisgIH0KKworICAvKiBFeHRyYWN0IGZ1bmN0aW9uIG5hbWUgKi8KKyAgZnVuY3Rpb25OYW1lID0gdmFfYXJnKGFyZ3MsIGNvbnN0IGNoYXIgKik7CisKKyAgLyogRXh0cmFjdCBsaW5lIG51bWJlciBmcm9tIGFyZ3VtZW50IGxpc3QgKi8KKyAgbGluZV9udW1iZXIgPSB2YV9hcmcoYXJncywgaW50KTsKKworICAvKiBFeHRyYWN0IGluZm9ybWF0aW9uIHR5cGUgZnJvbSBhcmd1bWVudCBsaXN0ICovCisgIHR5cGUgPSB2YV9hcmcoYXJncywgaW50KTsKKworICAvKiBFeHRyYWN0IGZvcm1hdCBmcm9tIGFyZ3VtZW50IGxpc3QgKi8KKyAgZm10ID0gdmFfYXJnKGFyZ3MsIGNvbnN0IGNoYXIgKik7CisKKyAgdnNwcmludGYodGV4dCwgZm10LCBhcmdzKTsKKworICB2YV9lbmQoYXJncyk7CisKKyAgLyogRm9ybWF0IG91dHB1dCBzdGF0ZW1lbnQgKi8KKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBERUJVR19UWVBFOgorICAgICAgc3ByaW50ZihvdXR0ZXh0LCAiWyVzOiVzQCUwNGRdIERFQlVHICVzXG4iLCBmaWxlbmFtZSwgZnVuY3Rpb25OYW1lLAorICAgICAgICAgICAgICBsaW5lX251bWJlciwgdGV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElORk9fVFlQRToKKyAgICAgIHNwcmludGYob3V0dGV4dCwgIlslczolc0AlMDRkXSBJTkZPICVzXG4iLCBmaWxlbmFtZSwgZnVuY3Rpb25OYW1lLAorICAgICAgICAgICAgICBsaW5lX251bWJlciwgdGV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVSUk9SX1RZUEU6CisgICAgICBzcHJpbnRmKG91dHRleHQsICJbJXM6JXNAJTA0ZF0gRVJST1IgJXNcbiIsIGZpbGVuYW1lLCBmdW5jdGlvbk5hbWUsCisgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLCB0ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JJVElDQUxfVFlQRToKKyAgICAgIHNwcmludGYob3V0dGV4dCwgIlslczolc0AlMDRkXSBDUklUSUNBTCAlc1xuIiwgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgbGluZV9udW1iZXIsIHRleHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGQVRBTF9UWVBFOgorICAgICAgZmF0YWxGbGFnID0gMTsKKyAgICAgIHNwcmludGYob3V0dGV4dCwgIlslczolc0AlMDRkXSBGQVRBTCAlc1xuIiwgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgbGluZV9udW1iZXIsIHRleHQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50ZigiRVJST1IgaW4gZHByaW50ZjogbWFsZm9ybWVkIGNhbGxpbmcgc2VxdWVuY2VcbiIpOworICAgICAgcmV0dXJuOworICAgICAgYnJlYWs7CisgIH0KKworICBzcHJpbnRmKGZpbGVwYXRoLCAiJXMuZGVidWciLCBmaWxlbmFtZSk7CisKKyAgLyogV3JpdGUgb3V0cHV0IHN0YXRlbWVudCAqLworICBzd2l0Y2ggKGRwcmludGZGbGFnKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIERFQlVHX09GRjoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVCVUdfTU9TVExZX09GRjoKKyAgICAgIGlmIChmYXRhbEZsYWcpIHsKKyAgICAgICAgaWYgKChvdXRmaWxlX2ZkID0gZm9wZW4oZmlsZXBhdGgsICJhKyIpKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgZndyaXRlKG91dHRleHQsIHNpemVvZihjaGFyKSwgc3RybGVuKG91dHRleHQpLCBvdXRmaWxlX2ZkKTsKKyAgICAgICAgICBmY2xvc2Uob3V0ZmlsZV9mZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVCVUdfU0NSRUVOX09OTFk6CisgICAgICBwcmludGYoIiVzIiwgb3V0dGV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX0ZJTEVfT05MWToKKyAgICAgIGlmICgob3V0ZmlsZV9mZCA9IGZvcGVuKGZpbGVwYXRoLCAiYSsiKSkgIT0gbnVsbHB0cikgeworICAgICAgICBmd3JpdGUob3V0dGV4dCwgc2l6ZW9mKGNoYXIpLCBzdHJsZW4ob3V0dGV4dCksIG91dGZpbGVfZmQpOworICAgICAgICBmY2xvc2Uob3V0ZmlsZV9mZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX1NDUkVFTl9BTkRfRklMRTogIC8vIEJPVEgKKyAgICAgIHByaW50ZigiJXMiLCBvdXR0ZXh0KTsKKyAgICAgIGlmICgob3V0ZmlsZV9mZCA9IGZvcGVuKGZpbGVwYXRoLCAiYSsiKSkgIT0gbnVsbHB0cikgeworICAgICAgICBmd3JpdGUob3V0dGV4dCwgc2l6ZW9mKGNoYXIpLCBzdHJsZW4ob3V0dGV4dCksIG91dGZpbGVfZmQpOworICAgICAgICBmY2xvc2Uob3V0ZmlsZV9mZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBOb3JtYWxpemVzIGEgdmFsdWUgaW4gYSByYW5nZSwgdXNlZCBmb3IgZHJpdmUgaW5wdXQKKyAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gaW4gdGhlIHJhbmdlLCBzdGFydGluZyBhdCAwCisgKiBAcGFyYW0gcmFuZ2UgVGhlIHNpemUgb2YgdGhlIHJhbmdlIHRoYXQgcG9zaXRpb24gaXMgaW4KKyAqIEByZXR1cm4gVGhlIG5vcm1hbGl6ZWQgcG9zaXRpb24gZnJvbSAtMSB0byArMQorICovCitkb3VibGUgUmFuZ2VUb05vcm1hbGl6ZWQoZG91YmxlIHBvc2l0aW9uLCBpbnQgcmFuZ2UpIHsKKyAgcmV0dXJuICgoKHBvc2l0aW9uICogMi4wKSAvIChkb3VibGUpcmFuZ2UpIC0gMS4wKTsKK30KKworLyoqCisgKiBAYnJpZWYgQ29udmVydCBhIG5vcm1hbGl6ZWQgdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gYSByYW5nZS4KKyAqIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IG5vcm1hbGl6ZWQgdmFsdWVzIHRvIHRoZSBzZXJ2byBjb21tYW5kIHJhbmdlLgorICogQHBhcmFtIG5vcm1hbGl6ZWRWYWx1ZSBUaGUgbm9ybWFsaXplZCB2YWx1ZSAoaW4gdGhlIC0xIHRvICsxIHJhbmdlKQorICogQHBhcmFtIG1pblJhbmdlIFRoZSBtaW5pbXVtIG9mIHRoZSByYW5nZSAoMCBpcyBkZWZhdWx0KQorICogQHBhcmFtIG1heFJhbmdlIFRoZSBtYXhpbXVtIG9mIHRoZSByYW5nZSAoMSBpcyBkZWZhdWx0KQorICogQHJldHVybiBUaGUgdmFsdWUgaW4gdGhlIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IG5vcm1hbGl6ZWQgdmFsdWUKKyAqLworZmxvYXQgTm9ybWFsaXplVG9SYW5nZShmbG9hdCBub3JtYWxpemVkVmFsdWUsIGZsb2F0IG1pblJhbmdlLCBmbG9hdCBtYXhSYW5nZSkgeworICBmbG9hdCByYW5nZSA9IG1heFJhbmdlIC0gbWluUmFuZ2U7CisgIGZsb2F0IHRlbXAgPSAoZmxvYXQpKChub3JtYWxpemVkVmFsdWUgLyAyLjApICsgMC41KSAqIHJhbmdlOworICByZXR1cm4gKHRlbXAgKyBtaW5SYW5nZSk7Cit9CitmbG9hdCBOb3JtYWxpemVUb1JhbmdlKGZsb2F0IG5vcm1hbGl6ZWRWYWx1ZSkgeworICByZXR1cm4gKGZsb2F0KSgobm9ybWFsaXplZFZhbHVlIC8gMi4wKSArIDAuNSk7Cit9CisKKy8qKgorICogQGJyaWVmIERpc3BsYXlzIGFuIGFjdGl2aXR5IGluZGljYXRvciB0byBjb25zb2xlLgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGxpa2UgeW91IHdvdWxkIGNhbGwgcHJpbnRmLgorICogQHBhcmFtIGZtdCBUaGUgZm9ybWF0IHN0cmluZworKi8KK3ZvaWQgU2hvd0FjdGl2aXR5KGNoYXIgKmZtdCwgLi4uKSB7CisgIHN0YXRpYyBjaGFyIGFjdGl2aXR5X2luZGljYXRpb25fc3RyaW5nW10gPSAifC8tXFwiOworICBzdGF0aWMgaW50IGFpID0gMzsKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyIHRleHRbMTAyNF07CisKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKworICB2c3ByaW50Zih0ZXh0LCBmbXQsIGFyZ3MpOworCisgIGFpID0gYWkgPT0gMyA/IDAgOiBhaSArIDE7CisKKyAgcHJpbnRmKCIlYyAlcyBcciIsIGFjdGl2aXR5X2luZGljYXRpb25fc3RyaW5nW2FpXSwgdGV4dCk7CisgIGZmbHVzaChzdGRvdXQpOworCisgIHZhX2VuZChhcmdzKTsKK30KKworI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5CisvKioKKyAqIEBicmllZiBDYWxjdWxhdGUgc2luZSB3YXZlIGluY3JlbWVudHMgKC0xLjAgdG8gMS4wKS4KKyAqIFRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkLCBpdCBzZXRzIHVwIHRoZSB0aW1lIGluY3JlbWVudC4gU3Vic2VxdWVudAorICogY2FsbHMKKyAqIHdpbGwgZ2l2ZSB2YWx1ZXMgYWxvbmcgdGhlIHNpbmUgd2F2ZSBkZXBlbmRpbmcgb24gY3VycmVudCB0aW1lLiBJZiB0aGUgd2F2ZQorICogaXMKKyAqIHN0b3BwZWQgYW5kIHJlc3RhcnRlZCwgaXQgbXVzdCBiZSByZWluaXRpYWxpemVkIHdpdGggYSBuZXcgImZpcnN0IGNhbGwiLgorICoKKyAqIEBwYXJhbSBwZXJpb2QgbGVuZ3RoIG9mIHRpbWUgdG8gY29tcGxldGUgYSBjb21wbGV0ZSB3YXZlCisgKiBAcGFyYW0gc2luU3RhcnQgV2hlcmUgdG8gc3RhcnQgdGhlIHNpbmUgd2F2ZSAoMC4wID0gMiBwaSwgcGkvMiA9IDEuMCwgZXRjLikKKyAqLworZG91YmxlIFNpblBvc2l0aW9uKGRvdWJsZSAqcGVyaW9kLCBkb3VibGUgc2luU3RhcnQpIHsKKyAgZG91YmxlIHJ0blZhbDsKKyAgc3RhdGljIGRvdWJsZSBzaW5lUGVyaW9kID0gMC4wOworICBzdGF0aWMgZG91YmxlIHRpbWVzdGFtcDsKKyAgZG91YmxlIHNpbkFyZzsKKworICAvLyAxc3QgY2FsbAorICBpZiAocGVyaW9kICE9IG51bGxwdHIpIHsKKyAgICBzaW5lUGVyaW9kID0gKnBlcmlvZDsKKyAgICB0aW1lc3RhbXAgPSBHZXRUaW1lKCk7CisgICAgcmV0dXJuIDAuMDsKKyAgfQorCisgIC8vIE11bHRpcGx5aW5nIGJ5IDIqcGkgdG8gdGhlIHRpbWUgZGlmZmVyZW5jZSBtYWtlcyBzaW5lUGVyaW9kIHdvcmsgaWYgaXQncworICAvLyBtZWFzdXJlZCBpbiBzZWNvbmRzLgorICAvLyBBZGRpbmcgc2luU3RhcnQgdG8gdGhlIHBhcnQgbXVsdGlwbGllZCBieSBQSSwgYnV0IG5vdCBieSAyLCBhbGxvd3MgaXQgdG8KKyAgLy8gd29yayBhcyBkZXNjcmliZWQgaW4gdGhlIGNvbW1lbnRzLgorICBzaW5BcmcgPSBQSSAqICgoMi4wICogKEdldFRpbWUoKSAtIHRpbWVzdGFtcCkpICsgc2luU3RhcnQpIC8gc2luZVBlcmlvZDsKKyAgcnRuVmFsID0gc2luKHNpbkFyZyk7CisgIHJldHVybiAocnRuVmFsKTsKK30KKworLyoqCisgKiBAYnJpZWYgRmluZCB0aGUgZWxhcHNlZCB0aW1lIHNpbmNlIGEgc3BlY2lmaWVkIHRpbWUuCisgKiBAcGFyYW0gc3RhcnRUaW1lIFRoZSBzdGFydGluZyB0aW1lCisgKiBAcmV0dXJuIEhvdyBsb25nIGl0IGhhcyBiZWVuIHNpbmNlIHRoZSBzdGFydGluZyB0aW1lCisgKi8KK2RvdWJsZSBFbGFwc2VkVGltZShkb3VibGUgc3RhcnRUaW1lKSB7CisgIGRvdWJsZSByZWFsVGltZSA9IEdldFRpbWUoKTsKKyAgcmV0dXJuIChyZWFsVGltZSAtIHN0YXJ0VGltZSk7Cit9CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemUgcGFuIHBhcmFtZXRlcnMKKyAqIEBwYXJhbSBwZXJpb2QgVGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGNvbXBsZXRlIG9uZSBwYW4KKyAqLwordm9pZCBwYW5Jbml0KCkgeworICBkb3VibGUgcGVyaW9kID0gMy4wOyAgICAgICAgLy8gbnVtYmVyIG9mIHNlY29uZHMgZm9yIG9uZSBjb21wbGV0ZSBwYW4KKyAgU2luUG9zaXRpb24oJnBlcmlvZCwgMC4wKTsgIC8vIGluaXRpYWwgY2FsbCB0byBzZXQgdXAgdGltZQorfQorCit2b2lkIHBhbkluaXQoZG91YmxlIHBlcmlvZCkgeworICBpZiAocGVyaW9kIDwgMC4wKSBwZXJpb2QgPSAzLjA7CisgIFNpblBvc2l0aW9uKCZwZXJpb2QsIDAuMCk7ICAvLyBpbml0aWFsIGNhbGwgdG8gc2V0IHVwIHRpbWUKK30KKworLyoqCisgKiBAYnJpZWYgTW92ZSB0aGUgaG9yaXpvbnRhbCBzZXJ2byBiYWNrIGFuZCBmb3J0aC4KKyAqIEBwYXJhbSBwYW5TZXJ2byBUaGUgc2Vydm8gb2JqZWN0IHRvIG1vdmUKKyAqIEBwYXJhbSBzaW5TdGFydCBUaGUgcG9zaXRpb24gb24gdGhlIHNpbmUgd2F2ZSB0byBiZWdpbiB0aGUgcGFuCisgKi8KK3ZvaWQgcGFuRm9yVGFyZ2V0KFNlcnZvICpwYW5TZXJ2bykgeyBwYW5Gb3JUYXJnZXQocGFuU2Vydm8sIDAuMCk7IH0KKwordm9pZCBwYW5Gb3JUYXJnZXQoU2Vydm8gKnBhblNlcnZvLCBkb3VibGUgc2luU3RhcnQpIHsKKyAgZmxvYXQgbm9ybWFsaXplZFNpblBvc2l0aW9uID0gKGZsb2F0KVNpblBvc2l0aW9uKG51bGxwdHIsIHNpblN0YXJ0KTsKKyAgZmxvYXQgbmV3U2Vydm9Qb3NpdGlvbiA9IE5vcm1hbGl6ZVRvUmFuZ2Uobm9ybWFsaXplZFNpblBvc2l0aW9uKTsKKyAgcGFuU2Vydm8tPlNldChuZXdTZXJ2b1Bvc2l0aW9uKTsKKyAgLy8gU2hvd0FjdGl2aXR5ICgicGFuIHg6IG5vcm1hbGl6ZWQgJWYgbmV3U2Vydm9Qb3NpdGlvbiA9ICVmIiAsCisgIC8vCQlub3JtYWxpemVkU2luUG9zaXRpb24sIG5ld1NlcnZvUG9zaXRpb24gKTsKK30KKworLyoqIEBicmllZiBSZWFkIGEgZmlsZSBhbmQgcmV0dXJuIG5vbi1jb21tZW50IG91dHB1dCBzdHJpbmcKKworQ2FsbCB0aGUgZmlyc3QgdGltZSB3aXRoIDAgbGluZU51bWJlciB0byBnZXQgdGhlIG51bWJlciBvZiBsaW5lcyB0byByZWFkCitUaGVuIGNhbGwgd2l0aCBlYWNoIGxpbmVOdW1iZXIgdG8gZ2V0IG9uZSBjYW1lcmEgcGFyYW1ldGVyLiBUaGVyZSBzaG91bGQKK2JlIG9uZSBwcm9wZXJ0eT12YWx1ZSBlbnRyeSBvbiBlYWNoIGxpbmUsIGkuZS4gImV4cG9zdXJlPWF1dG8iCisKKyAqIEBwYXJhbSBpbnB1dEZpbGUgZmlsZW5hbWUgdG8gcmVhZAorICogQHBhcmFtIG91dHB1dFN0cmluZyBvbmUgc3RyaW5nCisgKiBAcGFyYW0gbGluZU51bWJlciBpZiAwLCByZXR1cm4gbnVtYmVyIG9mIGxpbmVzOyBlbHNlIHJldHVybiB0aGF0IGxpbmUgbnVtYmVyCisgKiBAcmV0dXJuIGludCBudW1iZXIgb2YgbGluZXMgb3IgLTEgaWYgZXJyb3IKKyAqKi8KK2ludCBwcm9jZXNzRmlsZShjaGFyICppbnB1dEZpbGUsIGNoYXIgKm91dHB1dFN0cmluZywgaW50IGxpbmVOdW1iZXIpIHsKKyAgRklMRSAqaW5maWxlOworICBjb25zdCBpbnQgc3RyaW5nU2l6ZSA9IDgwOyAgLy8gbWF4IHNpemUgb2Ygb25lIGxpbmUgaW4gZmlsZQorICBjaGFyIGlucHV0U3RyW3N0cmluZ1NpemVdOworICBpbnB1dFN0clswXSA9ICdcMCc7CisgIGludCBsaW5lQ291bnQgPSAwOworCisgIGlmIChsaW5lTnVtYmVyIDwgMCkgcmV0dXJuICgtMSk7CisKKyAgaWYgKChpbmZpbGUgPSBmb3BlbihpbnB1dEZpbGUsICJyIikpID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIkZhdGFsIGVycm9yIG9wZW5pbmcgZmlsZSAlc1xuIiwgaW5wdXRGaWxlKTsKKyAgICByZXR1cm4gKDApOworICB9CisKKyAgd2hpbGUgKCFmZW9mKGluZmlsZSkpIHsKKyAgICBpZiAoZmdldHMoaW5wdXRTdHIsIHN0cmluZ1NpemUsIGluZmlsZSkgIT0gbnVsbHB0cikgeworICAgICAgLy8gU2tpcCBlbXB0eSBsaW5lcworICAgICAgaWYgKGVtcHR5U3RyaW5nKGlucHV0U3RyKSkgY29udGludWU7CisgICAgICAvLyBTa2lwIGNvbW1lbnQgbGluZXMKKyAgICAgIGlmIChpbnB1dFN0clswXSA9PSAnIycgfHwgaW5wdXRTdHJbMF0gPT0gJyEnKSBjb250aW51ZTsKKworICAgICAgbGluZUNvdW50Kys7CisgICAgICBpZiAobGluZU51bWJlciA9PSAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGVsc2UgeworICAgICAgICBpZiAobGluZUNvdW50ID09IGxpbmVOdW1iZXIpIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNsb3NlIGZpbGUKKyAgZmNsb3NlKGluZmlsZSk7CisgIC8vIGlmIG51bWJlciBsaW5lcyByZXF1ZXN0ZWQgcmV0dXJuIHRoZSBjb3VudAorICBpZiAobGluZU51bWJlciA9PSAwKSByZXR1cm4gKGxpbmVDb3VudCk7CisgIC8vIGNoZWNrIGZvciBpbnB1dCBvdXQgb2YgcmFuZ2UKKyAgaWYgKGxpbmVOdW1iZXIgPiBsaW5lQ291bnQpIHJldHVybiAoLTEpOworICAvLyByZXR1cm4gdGhlIGxpbmUgc2VsZWN0ZWQ7IGxpbmVDb3VudCBndWFyYW50ZWVkIHRvIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCisgIHN0cmlwU3RyaW5nKGlucHV0U3RyKTsKKyAgc3RyY3B5KG91dHB1dFN0cmluZywgaW5wdXRTdHIpOworICByZXR1cm4gKGxpbmVDb3VudCk7Cit9CisKKy8qKiBJZ25vcmUgZW1wdHkgc3RyaW5nCisgKiBAcGFyYW0gc3RyaW5nIHRvIGNoZWNrIGlmIGVtcHR5CisgKiovCitpbnQgZW1wdHlTdHJpbmcoY2hhciAqc3RyaW5nKSB7CisgIGludCBpLCBsZW47CisKKyAgaWYgKHN0cmluZyA9PSBudWxscHRyKSByZXR1cm4gKDEpOworCisgIGxlbiA9IHN0cmxlbihzdHJpbmcpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAvLyBJZ25vcmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzCisgICAgaWYgKHN0cmluZ1tpXSA9PSAnXG4nIHx8IHN0cmluZ1tpXSA9PSAnXHInIHx8IHN0cmluZ1tpXSA9PSAnXHQnIHx8CisgICAgICAgIHN0cmluZ1tpXSA9PSAnICcpCisgICAgICBjb250aW51ZTsKKyAgICByZXR1cm4gKDApOworICB9CisgIHJldHVybiAoMSk7Cit9CisKKy8qKiBSZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGZyb20gc3RyaW5nCisgKiBAcGFyYW0gc3RyaW5nIHRvIHByb2Nlc3MKKyAqKi8KK3ZvaWQgc3RyaXBTdHJpbmcoY2hhciAqc3RyaW5nKSB7CisgIGludCBpLCBqLCBsZW47CisKKyAgaWYgKHN0cmluZyA9PSBudWxscHRyKSByZXR1cm47CisKKyAgbGVuID0gc3RybGVuKHN0cmluZyk7CisgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAvLyBSZW1vdmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZworICAgIGlmIChzdHJpbmdbaV0gPT0gJ1xuJyB8fCBzdHJpbmdbaV0gPT0gJ1xyJyB8fCBzdHJpbmdbaV0gPT0gJ1wiJykgY29udGludWU7CisgICAgLy8gQ29weSBhbnl0aGluZyBlbHNlCisgICAgc3RyaW5nW2orK10gPSBzdHJpbmdbaV07CisgIH0KKyAgc3RyaW5nW2pdID0gJ1wwJzsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vQmluYXJ5SW1hZ2UuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9CaW5hcnlJbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExNGNiYwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vQmluYXJ5SW1hZ2UuY3BwCkBAIC0wLDAgKzEsMjI4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vQmluYXJ5SW1hZ2UuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvKioKKyAqIEdldCB0aGVuIG51bWJlciBvZiBwYXJ0aWNsZXMgZm9yIHRoZSBpbWFnZS4KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFydGljbGVzIGZvdW5kIGZvciB0aGUgaW1hZ2UuCisgKi8KK2ludCBCaW5hcnlJbWFnZTo6R2V0TnVtYmVyUGFydGljbGVzKCkgeworICBpbnQgbnVtUGFydGljbGVzID0gMDsKKyAgaW50IHN1Y2Nlc3MgPSBpbWFxQ291bnRQYXJ0aWNsZXMobV9pbWFxSW1hZ2UsIDEsICZudW1QYXJ0aWNsZXMpOworICB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGNvdW50aW5nIHBhcnRpY2xlcyIpOworICByZXR1cm4gbnVtUGFydGljbGVzOworfQorCisvKioKKyAqIEdldCBhIHNpbmdsZSBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnQuCisgKiBHZXQgb25lIChvZiBwb3NzaWJseSBtYW55KSBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnRzIGZvciBhbiBpbWFnZS4KKyAqIEBwYXJhbSBwYXJ0aWNsZU51bWJlciBXaGljaCBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnQgdG8gcmV0dXJuLgorICogQHJldHVybnMgdGhlIHNlbGVjdGVkIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydAorICovCitQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IEJpbmFyeUltYWdlOjpHZXRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0KAorICAgIGludCBwYXJ0aWNsZU51bWJlcikgeworICBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IHBhcjsKKyAgR2V0UGFydGljbGVBbmFseXNpc1JlcG9ydChwYXJ0aWNsZU51bWJlciwgJnBhcik7CisgIHJldHVybiBwYXI7Cit9CisKKy8qKgorICogR2V0IGEgc2luZ2xlIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydC4KKyAqIEdldCBvbmUgKG9mIHBvc3NpYmx5IG1hbnkpIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydHMgZm9yIGFuIGltYWdlLgorICogVGhpcyB2ZXJzaW9uIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHdoZW4gY29weWluZyBtYW55IHJlcG9ydHMuCisgKiBAcGFyYW0gcGFydGljbGVOdW1iZXIgV2hpY2ggcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0IHRvIHJldHVybi4KKyAqIEBwYXJhbSBwYXIgdGhlIHNlbGVjdGVkIHBhcnRpY2xlIGFuYWx5c2lzIHJlcG9ydAorICovCit2b2lkIEJpbmFyeUltYWdlOjpHZXRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0KGludCBwYXJ0aWNsZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGljbGVBbmFseXNpc1JlcG9ydCAqcGFyKSB7CisgIGludCBzdWNjZXNzOworICBpbnQgbnVtUGFydGljbGVzID0gMDsKKworICBzdWNjZXNzID0gaW1hcUdldEltYWdlU2l6ZShtX2ltYXFJbWFnZSwgJnBhci0+aW1hZ2VXaWR0aCwgJnBhci0+aW1hZ2VIZWlnaHQpOworICB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGdldHRpbmcgaW1hZ2Ugc2l6ZSIpOworICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisKKyAgc3VjY2VzcyA9IGltYXFDb3VudFBhcnRpY2xlcyhtX2ltYXFJbWFnZSwgMSwgJm51bVBhcnRpY2xlcyk7CisgIHdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiRXJyb3IgY291bnRpbmcgcGFydGljbGVzIik7CisgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKKworICBpZiAocGFydGljbGVOdW1iZXIgPj0gbnVtUGFydGljbGVzKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInBhcnRpY2xlTnVtYmVyIik7CisgICAgcmV0dXJuOworICB9CisKKyAgcGFyLT5wYXJ0aWNsZUluZGV4ID0gcGFydGljbGVOdW1iZXI7CisgIC8vIERvbid0IGJvdGhlciBtZWFzdXJpbmcgdGhlIHJlc3Qgb2YgdGhlIHBhcnRpY2xlIGlmIG9uZSBmYWlscworICBib29sIGdvb2QgPSBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhci0+Y2VudGVyX21hc3NfeCk7CisgIGdvb2QgPSBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQ0VOVEVSX09GX01BU1NfWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyLT5jZW50ZXJfbWFzc195KTsKKyAgZ29vZCA9IGdvb2QgJiYKKyAgICAgICAgIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQVJFQSwgJnBhci0+cGFydGljbGVBcmVhKTsKKyAgZ29vZCA9IGdvb2QgJiYgUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgSU1BUV9NVF9CT1VORElOR19SRUNUX1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyLT5ib3VuZGluZ1JlY3QudG9wKTsKKyAgZ29vZCA9IGdvb2QgJiYgUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgSU1BUV9NVF9CT1VORElOR19SRUNUX0xFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhci0+Ym91bmRpbmdSZWN0LmxlZnQpOworICBnb29kID0KKyAgICAgIGdvb2QgJiYgUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwgSU1BUV9NVF9CT1VORElOR19SRUNUX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyLT5ib3VuZGluZ1JlY3QuaGVpZ2h0KTsKKyAgZ29vZCA9CisgICAgICBnb29kICYmIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyLT5ib3VuZGluZ1JlY3Qud2lkdGgpOworICBnb29kID0gZ29vZCAmJiBQYXJ0aWNsZU1lYXN1cmVtZW50KHBhcnRpY2xlTnVtYmVyLCBJTUFRX01UX0FSRUFfQllfSU1BR0VfQVJFQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyLT5wYXJ0aWNsZVRvSW1hZ2VQZXJjZW50KTsKKyAgZ29vZCA9IGdvb2QgJiYgUGFydGljbGVNZWFzdXJlbWVudChwYXJ0aWNsZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX01UX0FSRUFfQllfUEFSVElDTEVfQU5EX0hPTEVTX0FSRUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhci0+cGFydGljbGVRdWFsaXR5KTsKKworICBpZiAoZ29vZCkgeworICAgIC8qIG5vcm1hbGl6ZWQgcG9zaXRpb24gKC0xIHRvIDEpICovCisgICAgcGFyLT5jZW50ZXJfbWFzc194X25vcm1hbGl6ZWQgPQorICAgICAgICBOb3JtYWxpemVGcm9tUmFuZ2UocGFyLT5jZW50ZXJfbWFzc194LCBwYXItPmltYWdlV2lkdGgpOworICAgIHBhci0+Y2VudGVyX21hc3NfeV9ub3JtYWxpemVkID0KKyAgICAgICAgTm9ybWFsaXplRnJvbVJhbmdlKHBhci0+Y2VudGVyX21hc3NfeSwgcGFyLT5pbWFnZUhlaWdodCk7CisgIH0KK30KKworLyoqCisgKiBHZXQgYW4gb3JkZXJlZCB2ZWN0b3Igb2YgcGFydGljbGVzIGZvciB0aGUgaW1hZ2UuCisgKiBDcmVhdGUgYSB2ZWN0b3Igb2YgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0cyBzb3J0ZWQgYnkgc2l6ZSBmb3IgYW4gaW1hZ2UuCisgKiBUaGUgdmVjdG9yIGNvbnRhaW5zIHRoZSBhY3R1YWwgcmVwb3J0IHN0cnVjdHVyZXMuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZlY3RvciBvZiBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnRzLiBUaGUgY2FsbGVyCisgKiBtdXN0IGRlbGV0ZSB0aGUKKyAqIHZlY3RvciB3aGVuIGZpbmlzaGVkIHVzaW5nIGl0LgorICovCit2ZWN0b3I8UGFydGljbGVBbmFseXNpc1JlcG9ydD4gKgorQmluYXJ5SW1hZ2U6OkdldE9yZGVyZWRQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0cygpIHsKKyAgYXV0byBwYXJ0aWNsZXMgPSBuZXcgdmVjdG9yPFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQ+OworICBpbnQgcGFydGljbGVDb3VudCA9IEdldE51bWJlclBhcnRpY2xlcygpOworICBmb3IgKGludCBwYXJ0aWNsZUluZGV4ID0gMDsgcGFydGljbGVJbmRleCA8IHBhcnRpY2xlQ291bnQ7IHBhcnRpY2xlSW5kZXgrKykgeworICAgIHBhcnRpY2xlcy0+cHVzaF9iYWNrKEdldFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQocGFydGljbGVJbmRleCkpOworICB9CisgIC8vIFRPRE86IFRoaXMgaXMgcHJldHR5IGluZWZmaWNpZW50IHNpbmNlIGVhY2ggY29tcGFyZSBpbiB0aGUgc29ydCBjb3BpZXMKKyAgLy8gICBib3RoIHJlcG9ydHMgYmVpbmcgY29tcGFyZWQuLi4gZG8gaXQgbWFudWFsbHkgaW5zdGVhZC4uLiB3aGlsZSB3ZSdyZQorICAvLyAgIGF0IGl0LCB3ZSBzaG91bGQgcHJvdmlkZSBhIHZlcnNpb24gdGhhdCBhbGxvd3MgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyIG9mCisgIC8vICAgUGFydGljbGVBbmFseXNpc1JlcG9ydCBzdHJ1Y3R1cmVzCisgIHNvcnQocGFydGljbGVzLT5iZWdpbigpLCBwYXJ0aWNsZXMtPmVuZCgpLCBDb21wYXJlUGFydGljbGVTaXplcyk7CisgIHJldHVybiBwYXJ0aWNsZXM7Cit9CisKKy8qKgorICogV3JpdGUgYSBiaW5hcnkgaW1hZ2UgdG8gZmxhc2guCisgKiBXcml0ZXMgdGhlIGJpbmFyeSBpbWFnZSB0byBmbGFzaCBvbiB0aGUgY1JJTyBmb3IgbGF0ZXIgaW5zcGVjdGlvbi4KKyAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgaW1hZ2UgZmlsZSB3cml0dGVuIHRvIHRoZSBmbGFzaC4KKyAqLwordm9pZCBCaW5hcnlJbWFnZTo6V3JpdGUoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKyAgUkdCVmFsdWUgY29sb3JUYWJsZVsyNTZdOworICBtZW1zZXQoY29sb3JUYWJsZSwgMCwgc2l6ZW9mKGNvbG9yVGFibGUpKTsKKyAgY29sb3JUYWJsZVswXS5SID0gMDsKKyAgY29sb3JUYWJsZVsxXS5SID0gMjU1OworICBjb2xvclRhYmxlWzBdLkcgPSBjb2xvclRhYmxlWzFdLkcgPSAwOworICBjb2xvclRhYmxlWzBdLkIgPSBjb2xvclRhYmxlWzFdLkIgPSAwOworICBjb2xvclRhYmxlWzBdLmFscGhhID0gY29sb3JUYWJsZVsxXS5hbHBoYSA9IDA7CisgIGltYXFXcml0ZUZpbGUobV9pbWFxSW1hZ2UsIGZpbGVOYW1lLCBjb2xvclRhYmxlKTsKK30KKworLyoqCisgKiBNZWFzdXJlIGEgc2luZ2xlIHBhcmFtZXRlciBmb3IgYW4gaW1hZ2UuCisgKiBHZXQgdGhlIG1lYXN1cmVtZW50IGZvciBhIHNpbmdsZSBwYXJhbWV0ZXIgYWJvdXQgYW4gaW1hZ2UgYnkgY2FsbGluZyB0aGUKKyAqIGltYXFNZWFzdXJlUGFydGljbGUKKyAqIGZ1bmN0aW9uIGZvciB0aGUgc2VsZWN0ZWQgcGFyYW1ldGVyLgorICogQHBhcmFtIHBhcnRpY2xlTnVtYmVyIHdoaWNoIHBhcnRpY2xlIGluIHRoZSBzZXQgb2YgcGFydGljbGVzCisgKiBAcGFyYW0gd2hhdFRvTWVhc3VyZSB0aGUgaW1hcSBNZWFzdXJlbWVudFR5cGUgKHdoYXQgdG8gbWVhc3VyZSkKKyAqIEBwYXJhbSByZXN1bHQgdGhlIHZhbHVlIG9mIHRoZSBtZWFzdXJlbWVudAorICogQHJldHVybnMgZmFsc2Ugb24gZmFpbHVyZSwgdHJ1ZSBvbiBzdWNjZXNzCisgKi8KK2Jvb2wgQmluYXJ5SW1hZ2U6OlBhcnRpY2xlTWVhc3VyZW1lbnQoaW50IHBhcnRpY2xlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlbWVudFR5cGUgd2hhdFRvTWVhc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZXN1bHQpIHsKKyAgZG91YmxlIHJlc3VsdERvdWJsZTsKKyAgYm9vbCBzdWNjZXNzID0KKyAgICAgIFBhcnRpY2xlTWVhc3VyZW1lbnQocGFydGljbGVOdW1iZXIsIHdoYXRUb01lYXN1cmUsICZyZXN1bHREb3VibGUpOworICAqcmVzdWx0ID0gKGludClyZXN1bHREb3VibGU7CisgIHJldHVybiBzdWNjZXNzOworfQorCisvKioKKyAqIE1lYXN1cmUgYSBzaW5nbGUgcGFyYW1ldGVyIGZvciBhbiBpbWFnZS4KKyAqIEdldCB0aGUgbWVhc3VyZW1lbnQgZm9yIGEgc2luZ2xlIHBhcmFtZXRlciBhYm91dCBhbiBpbWFnZSBieSBjYWxsaW5nIHRoZQorICogaW1hcU1lYXN1cmVQYXJ0aWNsZQorICogZnVuY3Rpb24gZm9yIHRoZSBzZWxlY3RlZCBwYXJhbWV0ZXIuCisgKiBAcGFyYW0gcGFydGljbGVOdW1iZXIgd2hpY2ggcGFydGljbGUgaW4gdGhlIHNldCBvZiBwYXJ0aWNsZXMKKyAqIEBwYXJhbSB3aGF0VG9NZWFzdXJlIHRoZSBpbWFxIE1lYXN1cmVtZW50VHlwZSAod2hhdCB0byBtZWFzdXJlKQorICogQHBhcmFtIHJlc3VsdCB0aGUgdmFsdWUgb2YgdGhlIG1lYXN1cmVtZW50CisgKiBAcmV0dXJucyB0cnVlIG9uIGZhaWx1cmUsIGZhbHNlIG9uIHN1Y2Nlc3MKKyAqLworYm9vbCBCaW5hcnlJbWFnZTo6UGFydGljbGVNZWFzdXJlbWVudChpbnQgcGFydGljbGVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVtZW50VHlwZSB3aGF0VG9NZWFzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKnJlc3VsdCkgeworICBpbnQgc3VjY2VzczsKKyAgc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUobV9pbWFxSW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCB3aGF0VG9NZWFzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIG1lYXN1cmluZyBwYXJ0aWNsZSIpOworICByZXR1cm4gIVN0YXR1c0lzRmF0YWwoKTsKK30KKworLy8gTm9ybWFsaXplcyB0byBbLTEsMV0KK2RvdWJsZSBCaW5hcnlJbWFnZTo6Tm9ybWFsaXplRnJvbVJhbmdlKGRvdWJsZSBwb3NpdGlvbiwgaW50IHJhbmdlKSB7CisgIHJldHVybiAocG9zaXRpb24gKiAyLjAgLyAoZG91YmxlKXJhbmdlKSAtIDEuMDsKK30KKworLyoqCisgKiBUaGUgY29tcGFyZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHNvcnQuCisgKiBUaGlzIGZ1bmN0aW9uIGNvbXBhcmVzIHR3byBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnRzIGFzIGEgaGVscGVyIGZvciB0aGUgc29ydAorICogZnVuY3Rpb24uCisgKiBAcGFyYW0gcGFydGljbGUxIFRoZSBmaXJzdCBwYXJ0aWNsZSB0byBjb21wYXJlCisgKiBAcGFyYW0gcGFydGljbGUyIHRoZSBzZWNvbmQgcGFydGljbGUgdG8gY29tcGFyZQorICogQHJldHVybnMgdHJ1ZSBpZiBwYXJ0aWNsZTEgaXMgZ3JlYXRlciB0aGFuIHBhcnRpY2xlMgorICovCitib29sIEJpbmFyeUltYWdlOjpDb21wYXJlUGFydGljbGVTaXplcyhQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0IHBhcnRpY2xlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgcGFydGljbGUyKSB7CisgIC8vIHdlIHdhbnQgZGVzY2VuZGluZyBzb3J0IG9yZGVyCisgIHJldHVybiBwYXJ0aWNsZTEucGFydGljbGVUb0ltYWdlUGVyY2VudCA+IHBhcnRpY2xlMi5wYXJ0aWNsZVRvSW1hZ2VQZXJjZW50OworfQorCitCaW5hcnlJbWFnZSAqQmluYXJ5SW1hZ2U6OlJlbW92ZVNtYWxsT2JqZWN0cyhib29sIGNvbm5lY3Rpdml0eTgsIGludCBlcm9zaW9ucykgeworICBhdXRvIHJlc3VsdCA9IG5ldyBCaW5hcnlJbWFnZSgpOworICBpbnQgc3VjY2VzcyA9IGltYXFTaXplRmlsdGVyKHJlc3VsdC0+R2V0SW1hcUltYWdlKCksIG1faW1hcUltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpdml0eTgsIGVyb3Npb25zLCBJTUFRX0tFRVBfTEFSR0UsIG51bGxwdHIpOworICB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGluIFJlbW92ZVNtYWxsT2JqZWN0cyIpOworICByZXR1cm4gcmVzdWx0OworfQorCitCaW5hcnlJbWFnZSAqQmluYXJ5SW1hZ2U6OlJlbW92ZUxhcmdlT2JqZWN0cyhib29sIGNvbm5lY3Rpdml0eTgsIGludCBlcm9zaW9ucykgeworICBhdXRvIHJlc3VsdCA9IG5ldyBCaW5hcnlJbWFnZSgpOworICBpbnQgc3VjY2VzcyA9IGltYXFTaXplRmlsdGVyKHJlc3VsdC0+R2V0SW1hcUltYWdlKCksIG1faW1hcUltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpdml0eTgsIGVyb3Npb25zLCBJTUFRX0tFRVBfU01BTEwsIG51bGxwdHIpOworICB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkVycm9yIGluIFJlbW92ZUxhcmdlT2JqZWN0cyIpOworICByZXR1cm4gcmVzdWx0OworfQorCitCaW5hcnlJbWFnZSAqQmluYXJ5SW1hZ2U6OkNvbnZleEh1bGwoYm9vbCBjb25uZWN0aXZpdHk4KSB7CisgIGF1dG8gcmVzdWx0ID0gbmV3IEJpbmFyeUltYWdlKCk7CisgIGludCBzdWNjZXNzID0KKyAgICAgIGltYXFDb252ZXhIdWxsKHJlc3VsdC0+R2V0SW1hcUltYWdlKCksIG1faW1hcUltYWdlLCBjb25uZWN0aXZpdHk4KTsKKyAgd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJFcnJvciBpbiBjb252ZXggaHVsbCBvcGVyYXRpb24iKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworQmluYXJ5SW1hZ2UgKkJpbmFyeUltYWdlOjpQYXJ0aWNsZUZpbHRlcihQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiAqY3JpdGVyaWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjcml0ZXJpYUNvdW50KSB7CisgIGF1dG8gcmVzdWx0ID0gbmV3IEJpbmFyeUltYWdlKCk7CisgIGludCBudW1QYXJ0aWNsZXM7CisgIFBhcnRpY2xlRmlsdGVyT3B0aW9uczIgZmlsdGVyT3B0aW9ucyA9IHswLCAwLCAwLCAxfTsKKyAgaW50IHN1Y2Nlc3MgPQorICAgICAgaW1hcVBhcnRpY2xlRmlsdGVyNChyZXN1bHQtPkdldEltYXFJbWFnZSgpLCBtX2ltYXFJbWFnZSwgY3JpdGVyaWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhQ291bnQsICZmaWx0ZXJPcHRpb25zLCBudWxscHRyLCAmbnVtUGFydGljbGVzKTsKKyAgd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJFcnJvciBpbiBwYXJ0aWNsZSBmaWx0ZXIgb3BlcmF0aW9uIik7CisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvVmlzaW9uL0NvbG9ySW1hZ2UuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9Db2xvckltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmJjMjQyCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9Db2xvckltYWdlLmNwcApAQCAtMCwwICsxLDQ0NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vQ29sb3JJbWFnZS5oIgorCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKK0NvbG9ySW1hZ2U6OkNvbG9ySW1hZ2UoSW1hZ2VUeXBlIHR5cGUpIDogSW1hZ2VCYXNlKHR5cGUpIHt9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBvcGVyYXRpb24gb24gYSBDb2xvckltYWdlLgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBvcGVyYXRpb24gb24gYSBDb2xvckltYWdlIHVzaW5nIHRoZSBDb2xvck1vZGUgc3VwcGxpZWQKKyAqIGFzIGEgcGFyYW1ldGVyLgorICogQHBhcmFtIGNvbG9yTW9kZSBUaGUgdHlwZSBvZiBjb2xvcnNwYWNlIHRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgaW4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIGJpbmFyeSBpbWFnZQorICovCitCaW5hcnlJbWFnZSAqQ29sb3JJbWFnZTo6Q29tcHV0ZVRocmVzaG9sZChDb2xvck1vZGUgY29sb3JNb2RlLCBpbnQgbG93MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaWdoMSwgaW50IGxvdzIsIGludCBoaWdoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3czLCBpbnQgaGlnaDMpIHsKKyAgYXV0byByZXN1bHQgPSBuZXcgQmluYXJ5SW1hZ2UoKTsKKyAgUmFuZ2UgcmFuZ2UxID0ge2xvdzEsIGhpZ2gxfSwgcmFuZ2UyID0ge2xvdzIsIGhpZ2gyfSwgcmFuZ2UzID0ge2xvdzMsIGhpZ2gzfTsKKworICBpbnQgc3VjY2VzcyA9IGltYXFDb2xvclRocmVzaG9sZChyZXN1bHQtPkdldEltYXFJbWFnZSgpLCBtX2ltYXFJbWFnZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNb2RlLCAmcmFuZ2UxLCAmcmFuZ2UyLCAmcmFuZ2UzKTsKKyAgd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxVGhyZXNob2xkIGVycm9yIik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBSR0Igc3BhY2UuCisgKiBAcGFyYW0gcmVkTG93IFJlZCBsb3cgdmFsdWUKKyAqIEBwYXJhbSByZWRIaWdoIFJlZCBoaWdoIHZhbHVlCisgKiBAcGFyYW0gZ3JlZW5Mb3cgR3JlZW4gbG93IHZhbHVlCisgKiBAcGFyYW0gZ3JlZW5IaWdoIEdyZWVuIGhpZ2ggdmFsdWUKKyAqIEBwYXJhbSBibHVlTG93IEJsdWUgbG93IHZhbHVlCisgKiBAcGFyYW0gYmx1ZUhpZ2ggQmx1ZSBoaWdoIHZhbHVlCisgKiBAcmV0dXJucyBBIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUKKyAqIHRocmVzaG9sZCBvcGVyYXRpb24uCisgKi8KK0JpbmFyeUltYWdlICpDb2xvckltYWdlOjpUaHJlc2hvbGRSR0IoaW50IHJlZExvdywgaW50IHJlZEhpZ2gsIGludCBncmVlbkxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuSGlnaCwgaW50IGJsdWVMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibHVlSGlnaCkgeworICByZXR1cm4gQ29tcHV0ZVRocmVzaG9sZChJTUFRX1JHQiwgcmVkTG93LCByZWRIaWdoLCBncmVlbkxvdywgZ3JlZW5IaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlTG93LCBibHVlSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBSR0Igc3BhY2UuCisgKiBAcGFyYW0gdGhyZXNob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBUaHJlc2hvbGQgb2JqZWN0IHRvIHVzZS4KKyAqIEByZXR1cm5zIEEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZQorICogdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZFJHQihUaHJlc2hvbGQgJnQpIHsKKyAgcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9SR0IsIHQucGxhbmUxTG93LCB0LnBsYW5lMUhpZ2gsIHQucGxhbmUyTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LnBsYW5lMkhpZ2gsIHQucGxhbmUzTG93LCB0LnBsYW5lM0hpZ2gpOworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gSFNMIHNwYWNlLgorICogQHBhcmFtIGh1ZUxvdyBMb3cgdmFsdWUgZm9yIGh1ZQorICogQHBhcmFtIGh1ZUhpZ2ggSGlnaCB2YWx1ZSBmb3IgaHVlCisgKiBAcGFyYW0gc2F0dXJhdGlvbkxvdyBMb3cgdmFsdWUgZm9yIHNhdHVyYXRpb24KKyAqIEBwYXJhbSBzYXR1cmF0aW9uSGlnaCBIaWdoIHZhbHVlIGZvciBzYXR1cmF0aW9uCisgKiBAcGFyYW0gbHVtaW5lbmNlTG93IExvdyB2YWx1ZSBmb3IgbHVtaW5lbmNlCisgKiBAcGFyYW0gbHVtaW5lbmNlSGlnaCBIaWdoIHZhbHVlIGZvciBsdW1pbmVuY2UKKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZQorICogdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZEhTTChpbnQgaHVlTG93LCBpbnQgaHVlSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhdHVyYXRpb25Mb3csIGludCBzYXR1cmF0aW9uSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1bWluZW5jZUxvdywgaW50IGx1bWluZW5jZUhpZ2gpIHsKKyAgcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9IU0wsIGh1ZUxvdywgaHVlSGlnaCwgc2F0dXJhdGlvbkxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbkhpZ2gsIGx1bWluZW5jZUxvdywgbHVtaW5lbmNlSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBIU0wgc3BhY2UuCisgKiBAcGFyYW0gdGhyZXNob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBUaHJlc2hvbGQgb2JqZWN0IHRvIHVzZS4KKyAqIEByZXR1cm5zIEEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZQorICogdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZEhTTChUaHJlc2hvbGQgJnQpIHsKKyAgcmV0dXJuIENvbXB1dGVUaHJlc2hvbGQoSU1BUV9IU0wsIHQucGxhbmUxTG93LCB0LnBsYW5lMUhpZ2gsIHQucGxhbmUyTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LnBsYW5lMkhpZ2gsIHQucGxhbmUzTG93LCB0LnBsYW5lM0hpZ2gpOworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gSFNWIHNwYWNlLgorICogQHBhcmFtIGh1ZUxvdyBMb3cgdmFsdWUgZm9yIGh1ZQorICogQHBhcmFtIGh1ZUhpZ2ggSGlnaCB2YWx1ZSBmb3IgaHVlCisgKiBAcGFyYW0gc2F0dXJhdGlvbkxvdyBMb3cgdmFsdWUgZm9yIHNhdHVyYXRpb24KKyAqIEBwYXJhbSBzYXR1cmF0aW9uSGlnaCBIaWdoIHZhbHVlIGZvciBzYXR1cmF0aW9uCisgKiBAcGFyYW0gdmFsdWVMb3cgTG93IHZhbHVlCisgKiBAcGFyYW0gdmFsdWVIaWdoIEhpZ2ggdmFsdWUKKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIEJpbmFyeUltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHRoZQorICogdGhyZXNob2xkIG9wZXJhdGlvbi4KKyAqLworQmluYXJ5SW1hZ2UgKkNvbG9ySW1hZ2U6OlRocmVzaG9sZEhTVihpbnQgaHVlTG93LCBpbnQgaHVlSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhdHVyYXRpb25Mb3csIGludCBzYXR1cmF0aW9uSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlTG93LCBpbnQgdmFsdWVIaWdoKSB7CisgIHJldHVybiBDb21wdXRlVGhyZXNob2xkKElNQVFfSFNWLCBodWVMb3csIGh1ZUhpZ2gsIHNhdHVyYXRpb25Mb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb25IaWdoLCB2YWx1ZUxvdywgdmFsdWVIaWdoKTsKK30KKworLyoqCisgKiBQZXJmb3JtIGEgdGhyZXNob2xkIGluIEhTViBzcGFjZS4KKyAqIEBwYXJhbSB0aHJlc2hvbGQgYSByZWZlcmVuY2UgdG8gdGhlIFRocmVzaG9sZCBvYmplY3QgdG8gdXNlLgorICogQHJldHVybnMgQSBwb2ludGVyIHRvIGEgQmluYXJ5SW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgdGhlCisgKiB0aHJlc2hvbGQgb3BlcmF0aW9uLgorICovCitCaW5hcnlJbWFnZSAqQ29sb3JJbWFnZTo6VGhyZXNob2xkSFNWKFRocmVzaG9sZCAmdCkgeworICByZXR1cm4gQ29tcHV0ZVRocmVzaG9sZChJTUFRX0hTViwgdC5wbGFuZTFMb3csIHQucGxhbmUxSGlnaCwgdC5wbGFuZTJMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIHQucGxhbmUySGlnaCwgdC5wbGFuZTNMb3csIHQucGxhbmUzSGlnaCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBhIHRocmVzaG9sZCBpbiBIU0kgc3BhY2UuCisgKiBAcGFyYW0gaHVlTG93IExvdyB2YWx1ZSBmb3IgaHVlCisgKiBAcGFyYW0gaHVlSGlnaCBIaWdoIHZhbHVlIGZvciBodWUKKyAqIEBwYXJhbSBzYXR1cmF0aW9uTG93IExvdyB2YWx1ZSBmb3Igc2F0dXJhdGlvbgorICogQHBhcmFtIHNhdHVyYXRpb25IaWdoIEhpZ2ggdmFsdWUgZm9yIHNhdHVyYXRpb24KKyAqIEBwYXJhbSB2YWx1ZUxvdyBMb3cgaW50ZW5zaXR5CisgKiBAcGFyYW0gdmFsdWVIaWdoIEhpZ2ggaW50ZW5zaXR5CisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUKKyAqIHRocmVzaG9sZCBvcGVyYXRpb24uCisgKi8KK0JpbmFyeUltYWdlICpDb2xvckltYWdlOjpUaHJlc2hvbGRIU0koaW50IGh1ZUxvdywgaW50IGh1ZUhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYXR1cmF0aW9uTG93LCBpbnQgc2F0dXJhdGlvbkhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlbnNpdHlMb3csIGludCBpbnRlbnNpdHlIaWdoKSB7CisgIHJldHVybiBDb21wdXRlVGhyZXNob2xkKElNQVFfSFNJLCBodWVMb3csIGh1ZUhpZ2gsIHNhdHVyYXRpb25Mb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb25IaWdoLCBpbnRlbnNpdHlMb3csIGludGVuc2l0eUhpZ2gpOworfQorCisvKioKKyAqIFBlcmZvcm0gYSB0aHJlc2hvbGQgaW4gSFNJIHNwYWNlLgorICogQHBhcmFtIHRocmVzaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgVGhyZXNob2xkIG9iamVjdCB0byB1c2UuCisgKiBAcmV0dXJucyBBIHBvaW50ZXIgdG8gYSBCaW5hcnlJbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiB0aGUKKyAqIHRocmVzaG9sZCBvcGVyYXRpb24uCisgKi8KK0JpbmFyeUltYWdlICpDb2xvckltYWdlOjpUaHJlc2hvbGRIU0koVGhyZXNob2xkICZ0KSB7CisgIHJldHVybiBDb21wdXRlVGhyZXNob2xkKElNQVFfSFNJLCB0LnBsYW5lMUxvdywgdC5wbGFuZTFIaWdoLCB0LnBsYW5lMkxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wbGFuZTJIaWdoLCB0LnBsYW5lM0xvdywgdC5wbGFuZTNIaWdoKTsKK30KKworLyoqCisgKiBFeHRyYWN0IGEgY29sb3IgcGxhbmUgZnJvbSB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBtb2RlIFRoZSBDb2xvck1vZGUgdG8gdXNlIGZvciB0aGUgcGxhbmUgZXh0cmFjdGlvbgorICogQHBhcmFtIHBsYW5lTnVtYmVyIFdoaWNoIHBsYW5lIGlzIHRvIGJlIGV4dHJhY3RlZAorICogQHJldHVybnMgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgcmVwcmVzZW50cyB0aGUgZXh0cmFjdGVkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkV4dHJhY3RDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlLCBpbnQgcGxhbmVOdW1iZXIpIHsKKyAgYXV0byByZXN1bHQgPSBuZXcgTW9ub0ltYWdlKCk7CisgIGlmIChtX2ltYXFJbWFnZSA9PSBudWxscHRyKSB3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisgIGludCBzdWNjZXNzID0gaW1hcUV4dHJhY3RDb2xvclBsYW5lcygKKyAgICAgIG1faW1hcUltYWdlLCBtb2RlLCAocGxhbmVOdW1iZXIgPT0gMSkgPyByZXN1bHQtPkdldEltYXFJbWFnZSgpIDogbnVsbHB0ciwKKyAgICAgIChwbGFuZU51bWJlciA9PSAyKSA/IHJlc3VsdC0+R2V0SW1hcUltYWdlKCkgOiBudWxscHRyLAorICAgICAgKHBsYW5lTnVtYmVyID09IDMpID8gcmVzdWx0LT5HZXRJbWFxSW1hZ2UoKSA6IG51bGxwdHIpOworICB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkltYXEgRXh0cmFjdENvbG9yUGxhbmVzIGZhaWxlZCIpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogRXh0cmFjdCB0aGUgZmlyc3QgY29sb3IgcGxhbmUgZm9yIGFuIGltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZQorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY3RlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpFeHRyYWN0Rmlyc3RDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlKSB7CisgIHJldHVybiBFeHRyYWN0Q29sb3JQbGFuZShtb2RlLCAxKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIHNlY29uZCBjb2xvciBwbGFuZSBmb3IgYW4gaW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjdGVkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkV4dHJhY3RTZWNvbmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlKSB7CisgIHJldHVybiBFeHRyYWN0Q29sb3JQbGFuZShtb2RlLCAyKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIHRoaXJkIGNvbG9yIHBsYW5lIGZvciBhbiBpbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUKKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWN0ZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6RXh0cmFjdFRoaXJkQ29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSkgeworICByZXR1cm4gRXh0cmFjdENvbG9yUGxhbmUobW9kZSwgMyk7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSByZWQgcGxhbmUgZnJvbSBhbiBSR0IgaW1hZ2UuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6R2V0UmVkUGxhbmUoKSB7CisgIHJldHVybiBFeHRyYWN0Rmlyc3RDb2xvclBsYW5lKElNQVFfUkdCKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIGdyZWVuIHBsYW5lIGZyb20gYW4gUkdCIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEdyZWVuUGxhbmUoKSB7CisgIHJldHVybiBFeHRyYWN0U2Vjb25kQ29sb3JQbGFuZShJTUFRX1JHQik7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBibHVlIHBsYW5lIGZyb20gYW4gUkdCIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEJsdWVQbGFuZSgpIHsKKyAgcmV0dXJuIEV4dHJhY3RUaGlyZENvbG9yUGxhbmUoSU1BUV9SR0IpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgSHVlIHBsYW5lIGZyb20gYW4gSFNMIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEhTTEh1ZVBsYW5lKCkgeworICByZXR1cm4gRXh0cmFjdEZpcnN0Q29sb3JQbGFuZShJTUFRX0hTTCk7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBIdWUgcGxhbmUgZnJvbSBhbiBIU1YgaW1hZ2UuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6R2V0SFNWSHVlUGxhbmUoKSB7CisgIHJldHVybiBFeHRyYWN0Rmlyc3RDb2xvclBsYW5lKElNQVFfSFNWKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIEh1ZSBwbGFuZSBmcm9tIGFuIEhTSSBpbWFnZS4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWNlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpHZXRIU0lIdWVQbGFuZSgpIHsKKyAgcmV0dXJuIEV4dHJhY3RGaXJzdENvbG9yUGxhbmUoSU1BUV9IU0kpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgTHVtaW5hbmNlIHBsYW5lIGZyb20gYW4gSFNMIGltYWdlLgorICogQHJldHVybnMgYSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgaXMgdGhlIGV4dHJhY2VkIHBsYW5lLgorICovCitNb25vSW1hZ2UgKkNvbG9ySW1hZ2U6OkdldEx1bWluYW5jZVBsYW5lKCkgeworICByZXR1cm4gRXh0cmFjdFRoaXJkQ29sb3JQbGFuZShJTUFRX0hTTCk7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBWYWx1ZSBwbGFuZSBmcm9tIGFuIEhTViBpbWFnZS4KKyAqIEByZXR1cm5zIGEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IGlzIHRoZSBleHRyYWNlZCBwbGFuZS4KKyAqLworTW9ub0ltYWdlICpDb2xvckltYWdlOjpHZXRWYWx1ZVBsYW5lKCkgeworICByZXR1cm4gRXh0cmFjdFRoaXJkQ29sb3JQbGFuZShJTUFRX0hTVik7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBJbnRlbnNpdHkgcGxhbmUgZnJvbSBhbiBIU0kgaW1hZ2UuCisgKiBAcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCBpcyB0aGUgZXh0cmFjZWQgcGxhbmUuCisgKi8KK01vbm9JbWFnZSAqQ29sb3JJbWFnZTo6R2V0SW50ZW5zaXR5UGxhbmUoKSB7CisgIHJldHVybiBFeHRyYWN0VGhpcmRDb2xvclBsYW5lKElNQVFfSFNJKTsKK30KKworLyoqCisgKiBSZXBsYWNlIGEgcGxhbmUgaW4gdGhlIENvbG9ySW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZQorICogUmVwbGFjZXMgYSBzaW5nbGUgcGxhbmUgaW4gdGhlIGltYWdlIHdpdGggYSBNb25vSW1hZ2UKKyAqIEBwYXJhbSBtb2RlIFRoZSBDb2xvck1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZQorICogQHBhcmFtIHBsYW5lIFRoZSBwb2ludGVyIHRvIHRoZSByZXBsYWNlbWVudCBwbGFuZSBhcyBhIE1vbm9JbWFnZQorICogQHBhcmFtIHBsYW5lTnVtYmVyIFRoZSBwbGFuZSBudW1iZXIgKDEsIDIsIDMpIHRvIHJlcGxhY2UKKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlUGxhbmUoQ29sb3JNb2RlIG1vZGUsIE1vbm9JbWFnZSAqcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmVOdW1iZXIpIHsKKyAgaW50IHN1Y2Nlc3MgPQorICAgICAgaW1hcVJlcGxhY2VDb2xvclBsYW5lcyhtX2ltYXFJbWFnZSwgKGNvbnN0IEltYWdlICopbV9pbWFxSW1hZ2UsIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbGFuZU51bWJlciA9PSAxKSA/IHBsYW5lLT5HZXRJbWFxSW1hZ2UoKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbGFuZU51bWJlciA9PSAyKSA/IHBsYW5lLT5HZXRJbWFxSW1hZ2UoKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbGFuZU51bWJlciA9PSAzKSA/IHBsYW5lLT5HZXRJbWFxSW1hZ2UoKSA6IG51bGxwdHIpOworICB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoc3VjY2VzcywgIkltYXEgUmVwbGFjZUNvbG9yUGxhbmVzIGZhaWxlZCIpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIGZpcnN0IGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yCisgKiBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlRmlyc3RDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlLCBNb25vSW1hZ2UgKnBsYW5lKSB7CisgIFJlcGxhY2VQbGFuZShtb2RlLCBwbGFuZSwgMSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgc2Vjb25kIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yCisgKiBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlU2Vjb25kQ29sb3JQbGFuZShDb2xvck1vZGUgbW9kZSwgTW9ub0ltYWdlICpwbGFuZSkgeworICBSZXBsYWNlUGxhbmUobW9kZSwgcGxhbmUsIDIpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIHRoaXJkIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yCisgKiBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlVGhpcmRDb2xvclBsYW5lKENvbG9yTW9kZSBtb2RlLCBNb25vSW1hZ2UgKnBsYW5lKSB7CisgIFJlcGxhY2VQbGFuZShtb2RlLCBwbGFuZSwgMyk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgcmVkIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yCisgKiBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlUmVkUGxhbmUoTW9ub0ltYWdlICpwbGFuZSkgeworICBSZXBsYWNlRmlyc3RDb2xvclBsYW5lKElNQVFfUkdCLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgZ3JlZW4gY29sb3IgcGxhbmUgd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IKKyAqIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VHcmVlblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpIHsKKyAgUmVwbGFjZVNlY29uZENvbG9yUGxhbmUoSU1BUV9SR0IsIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBibHVlIGNvbG9yIHBsYW5lIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yCisgKiBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlQmx1ZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpIHsKKyAgUmVwbGFjZVRoaXJkQ29sb3JQbGFuZShJTUFRX1JHQiwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIEh1ZSBjb2xvciBwbGFuZSBpbiBhIEhTTCBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvcgorICogcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUhTTEh1ZVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpIHsKKyAgcmV0dXJuIFJlcGxhY2VGaXJzdENvbG9yUGxhbmUoSU1BUV9IU0wsIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBIdWUgY29sb3IgcGxhbmUgaW4gYSBIU1YgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IKKyAqIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VIU1ZIdWVQbGFuZShNb25vSW1hZ2UgKnBsYW5lKSB7CisgIHJldHVybiBSZXBsYWNlRmlyc3RDb2xvclBsYW5lKElNQVFfSFNWLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgZmlyc3QgSHVlIHBsYW5lIGluIGEgSFNJIGltYWdlIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yCisgKiBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlSFNJSHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSkgeworICByZXR1cm4gUmVwbGFjZUZpcnN0Q29sb3JQbGFuZShJTUFRX0hTSSwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIFNhdHVyYXRpb24gY29sb3IgcGxhbmUgaW4gYW4gSFNMIGltYWdlIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yCisgKiBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlSFNMU2F0dXJhdGlvblBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpIHsKKyAgcmV0dXJuIFJlcGxhY2VTZWNvbmRDb2xvclBsYW5lKElNQVFfSFNMLCBwbGFuZSk7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgU2F0dXJhdGlvbiBjb2xvciBwbGFuZSBpbiBhIEhTViBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvcgorICogcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUhTVlNhdHVyYXRpb25QbGFuZShNb25vSW1hZ2UgKnBsYW5lKSB7CisgIHJldHVybiBSZXBsYWNlU2Vjb25kQ29sb3JQbGFuZShJTUFRX0hTViwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIFNhdHVyYXRpb24gY29sb3IgcGxhbmUgaW4gYSBIU0kgaW1hZ2Ugd2l0aCBhIE1vbm9JbWFnZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBjb2xvciBtb2RlIGluIHdoaWNoIHRvIG9wZXJhdGUuCisgKiBAcGFyYW0gcGxhbmUgQSBwb2ludGVyIHRvIGEgTW9ub0ltYWdlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBzcGVjaWZpZWQgY29sb3IKKyAqIHBsYW5lLgorICovCit2b2lkIENvbG9ySW1hZ2U6OlJlcGxhY2VIU0lTYXR1cmF0aW9uUGxhbmUoTW9ub0ltYWdlICpwbGFuZSkgeworICByZXR1cm4gUmVwbGFjZVNlY29uZENvbG9yUGxhbmUoSU1BUV9IU0ksIHBsYW5lKTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBMdW1pbmFuY2UgY29sb3IgcGxhbmUgaW4gYW4gSFNMIGltYWdlIHdpdGggYSBNb25vSW1hZ2UuCisgKiBAcGFyYW0gbW9kZSBUaGUgY29sb3IgbW9kZSBpbiB3aGljaCB0byBvcGVyYXRlLgorICogQHBhcmFtIHBsYW5lIEEgcG9pbnRlciB0byBhIE1vbm9JbWFnZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbG9yCisgKiBwbGFuZS4KKyAqLwordm9pZCBDb2xvckltYWdlOjpSZXBsYWNlTHVtaW5hbmNlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSkgeworICByZXR1cm4gUmVwbGFjZVRoaXJkQ29sb3JQbGFuZShJTUFRX0hTTCwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIFZhbHVlIGNvbG9yIHBsYW5lIGluIGFuIEhTViB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvcgorICogcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZVZhbHVlUGxhbmUoTW9ub0ltYWdlICpwbGFuZSkgeworICByZXR1cm4gUmVwbGFjZVRoaXJkQ29sb3JQbGFuZShJTUFRX0hTViwgcGxhbmUpOworfQorCisvKioKKyAqIFJlcGxhY2UgdGhlIEludGVuc2l0eSBjb2xvciBwbGFuZSBpbiBhIEhTSSBpbWFnZSB3aXRoIGEgTW9ub0ltYWdlLgorICogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIG1vZGUgaW4gd2hpY2ggdG8gb3BlcmF0ZS4KKyAqIEBwYXJhbSBwbGFuZSBBIHBvaW50ZXIgdG8gYSBNb25vSW1hZ2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb2xvcgorICogcGxhbmUuCisgKi8KK3ZvaWQgQ29sb3JJbWFnZTo6UmVwbGFjZUludGVuc2l0eVBsYW5lKE1vbm9JbWFnZSAqcGxhbmUpIHsKKyAgcmV0dXJuIFJlcGxhY2VUaGlyZENvbG9yUGxhbmUoSU1BUV9IU0ksIHBsYW5lKTsKK30KKworLy8gVE9ETzogZnJjQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50CisvLyBjb2xvckVxdWFsaXphdGlvbikgbmVlZHMgdG8gYmUgbW9kaWZpZWQKKy8vIFRoZSBjb2xvckVxdWFsaXphdGlvbiBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkIGFuZCBpcyBzZXQgdG8gVFJVRSBpbiB0aGUgY2FsbAorLy8gdG8gaW1hcUNvbG9yRXF1YWxpemUuCit2b2lkIENvbG9ySW1hZ2U6OkVxdWFsaXplKGJvb2wgYWxsUGxhbmVzKSB7CisgIC8vIE5vdGUgdGhhdCB0aGlzIGNhbGwgdXNlcyBOSS1kZWZpbmVkIFRSVUUgYW5kIEZBTFNFCisgIGludCBzdWNjZXNzID0gaW1hcUNvbG9yRXF1YWxpemUobV9pbWFxSW1hZ2UsIChjb25zdCBJbWFnZSAqKW1faW1hcUltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxQbGFuZXMpID8gVFJVRSA6IEZBTFNFKTsKKyAgd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxIENvbG9yRXF1YWxpemUgZXJyb3IiKTsKK30KKwordm9pZCBDb2xvckltYWdlOjpDb2xvckVxdWFsaXplKCkgeyBFcXVhbGl6ZSh0cnVlKTsgfQorCit2b2lkIENvbG9ySW1hZ2U6Okx1bWluYW5jZUVxdWFsaXplKCkgeyBFcXVhbGl6ZShmYWxzZSk7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vRnJjRXJyb3IuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9GcmNFcnJvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiNDcyNQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vRnJjRXJyb3IuY3BwCkBAIC0wLDAgKzEsMjQwMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJuaXZpc2lvbi5oIgorI2luY2x1ZGUgIlZpc2lvbi9GcmNFcnJvci5oIgorCisvKioKKyAqIEdldCB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBmcm9tIHRoZSBOSSBWaXNpb24gbGlicmFyeQorICogQHJldHVybiBUaGUgbGFzdCBlcnJvciBjb2RlLgorICovCitpbnQgR2V0TGFzdFZpc2lvbkVycm9yKCkgeworICAvLyBpbnQgZXJyb3JDb2RlID0gaW1hcUdldExhc3RWaXNpb25FcnJvcigpOyAgICAgLy8gZXJyb3IgY29kZTogMCA9IG5vIGVycm9yCisgIC8vIGNoYXIqIGVycm9yVGV4dCA9IEdldFZpc2lvbkVycm9yVGV4dChlcnJvckNvZGUpOworICAvLyBkcHJpbnRmIChMT0dfREVCVUcsICJFcnJvciA9ICVpICAlcyAiLCBlcnJvckNvZGUsIGVycm9yVGV4dCk7CisgIHJldHVybiBpbWFxR2V0TGFzdEVycm9yKCk7Cit9CisKKy8qKgorKiBHZXQgdGhlIGVycm9yIHRleHQgZm9yIGFuIE5JIFZpc2lvbiBlcnJvciBjb2RlLgorKiBOb3RlOiBpbWFxR2V0RXJyb3JUZXh0KCkgaXMgbm90IHN1cHBvcnRlZCBvbiByZWFsIHRpbWUgc3lzdGVtLCBzbworKiBzbyByZWxldmFudCBzdHJpbmdzIGFyZSBoYXJkY29kZWQgaGVyZSAtIHRoZSBtYWludGFpbmVkIHZlcnNpb24gaXMKKyogaW4gdGhlIExhYldpbmRvd3MvQ1ZJIGhlbHAgZmlsZS4KKyogQHBhcmFtIGVycm9yQ29kZSBUaGUgZXJyb3IgY29kZSB0byBmaW5kIHRoZSB0ZXh0IGZvci4KKyogQHJldHVybiBUaGUgZXJyb3IgdGV4dAorKi8KK2NvbnN0IGNoYXIqIEdldFZpc2lvbkVycm9yVGV4dChpbnQgZXJyb3JDb2RlKSB7CisgIGNvbnN0IGNoYXIqIGVycm9yVGV4dDsKKworICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgIGRlZmF1bHQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJVTktOT1dOX0VSUk9SIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTM4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9SRUdJT05fVE9PX1NNQUxMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTM5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lNQVFfUVJfRElNRU5TSU9OX0lOVkFMSUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNDA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0NIQVJfUkVQT1JUX0NPUlJVUFRFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE0MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfTk9fVEVYVF9GT1VORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE0MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9RUl9ERVRFQ1RJT05fTU9ERUxUWVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTQzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1FSX0RFVEVDVElPTl9NT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTQ0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1FSX0lOVkFMSURfQkFSQ09ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE0NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9RUl9JTlZBTElEX1JFQUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNDY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfUVJfREVURUNUSU9OX1ZFUlNJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNDc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9SU1NMSU1JVEVEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTQ4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09WRVJMQVlfR1JPVVBfTk9UX0ZPVU5EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTQ5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0RVUExJQ0FURV9UUkFOU0ZPUk1fVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE1MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQ09SUkVDVElPTl9GQUlMRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNTU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX09SSUVOVF9ERVRFQ1RfRkFJTEVEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTU2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9TS0VXX0RFVEVDVF9GQUlMRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNTg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQ09OVFJBU1RNT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTU5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX1RPTEVSQU5DRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE2MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9NQVhQT0lOVFNJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNjE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQ09SUkVDVElPTkxFVkVMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTYyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NPUlJFQ1RJT05NT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTYzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NIQVJBQ1RFUlBSRUZFUkVOQ0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNjQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0FERF9XT1JEX0ZBSUxFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE2NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfV1RTX0RJUl9OT1RfRk9VTkQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNjY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0JJTl9ESVJfTk9UX0ZPVU5EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTY3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX09VVFBVVERFTElNSVRFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE2ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9BVVRPQ09SUkVDVElPTk1PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNjk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfUkVDT0dOSVRJT05NT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MTcwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NIQVJBQ1RFUlRZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNzE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOSV9GSUxFX05PVF9GT1VORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE3MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9DSEFSQUNURVJTRVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNzM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfTEFOR1VBR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNzQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQVVUT09SSUVOVE1PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNzU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0JBRF9VU0VSX0RJQ1RJT05BUlkiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUxNzg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX1JFQ09HTklUSU9OX0ZBSUxFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTE3OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfUFJFUFJPQ0VTU0lOR19GQUlMRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyMDA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfUEFSQU1FVEVSIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjAxOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9MT0FEX0xJQlJBUlkiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyMDM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX0xJQl9JTklUIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjEwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09DUl9DQU5OT1RfTUFUQ0hfVEVYVF9URU1QTEFURSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTIxMTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQkFEX1RFWFRfVEVNUExBVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyMTI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT0NSX1RFTVBMQVRFX1dST05HX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyMzM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfSU1BR0VfVE9PX0xBUkdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjM0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0lNQUdFX1RPT19TTUFMTCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTIzNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9JTUFHRV9DT05UUkFTVF9UT09fTE9XIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjM3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTIzODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SX05PU0hJRlQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyMzk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI0MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzEiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNDE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1JPVEFUSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjQyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNDM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl80IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjQ0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfMyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI0NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNDY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl8xIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjQ3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1IiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNDg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfUk9UQVRJT05fQU5HTEVfUkFOR0VTIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjQ5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPVEFUSU9OX0FOR0xFX1JBTkdFX1RPT19MQVJHRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI1MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9NQVRDSF9TRVRVUF9EQVRBIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjUxOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hfTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI1MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9MRUFSTl9TRVRVUF9EQVRBIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjUzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTEVBUk5fTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI1NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9FVkVOX1dJTkRPV19TSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjU3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRURHRV9ESVIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNTg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQkFEX0ZJTFRFUl9XSURUSCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI2MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9IRUFQX1RSQVNIRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNjE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfR0lQX1JBTkdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjYyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0xDRF9CQURfTUFUQ0giOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNjM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTENEX05PX1NFR01FTlRTIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjY1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBUkNPREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNjc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09NUExFWF9ST09UIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjY4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0xJTkVBUl9DT0VGRiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI2OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9udWxscHRyX1BPSU5URVIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNzA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRElWX0JZX1pFUk8iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNzU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CUk9XU0VSX0lNQUdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Mjc2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0xJTkVTX1BBUkFMTEVMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Mjc3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ0hFQ0tTVU0iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyNzg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTENEX05PVF9OVU1FUklDIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Mjc5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPSV9OT1RfUE9MWUdPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI4MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ST0lfTk9UX1JFQ1QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyODE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU1BR0VfU01BTExFUl9USEFOX0JPUkRFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI4MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQU5UX0RSQVdfSU5UT19WSUVXRVIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyODM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SQUtFX0RJUkVDVElPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI4NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfUFJPQ0VTUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI4NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NQT0tFX0RJUkVDVElPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI4NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTkNFTlRSSUNfUkFLRV9ESVJFQ1RJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyODc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MSU5FIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MjkwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1NIQVBFTUFUQ0hfQkFEVEVNUExBVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyOTE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfU0hBUEVNQVRDSF9CQURJTUFHRURBVEEiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyOTI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfUE9JTlRTX0FSRV9DT0xMSU5FQVIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyOTM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09OVE9VUklEX05PVF9GT1VORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI5NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT05UT1VSX0lOREVYX09VVF9PRl9SQU5HRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI5NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfSU5URVJQT0xBVEVQT0lOVFMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyOTY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CQVJDT0RFVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI5NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFSU5GT01PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUyOTg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09NUExFWFBMQU5FX05PVF9SRUFMX09SX0lNQUdJTkFSWSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTI5OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTVBMRVhQTEFORSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMwMDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01FVEVSQVJDTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMwMTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ST0lfTk9UXzJfTElORVMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMDI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9USFJFU0hPTERNRVRIT0QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMDM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OVU1fT0ZfQ0xBU1NFUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMwNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVEhUUkFOU0ZPUk1NRVRIT0QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMDU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SRUZFUkVOQ0VNT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzA2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVE9PTCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMwNzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9QUkVDSVNJT05fTk9UX0dUUl9USEFOXzAiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMDg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT0xPUlNFTlNJVElWSVRZIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzA5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfV0lORE9XX1RIUkVBRF9QT0xJQ1kiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMTA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQUxFVFRFX1RZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMTE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT0xPUl9TUEVDVFJVTSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMxMjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9MQ0RfQ0FMSUJSQVRFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzEzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1dSSVRFX0ZJTEVfTk9UX1NVUFBPUlRFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMxNjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0tFUk5FTF9DT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzE3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1VOREVGX1BPSU5UIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzE4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOU0ZfUE9JTlRTIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzE5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU1VCUElYX1RZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMjA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfRU1QVFkiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMjE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NT1JQSE9MT0dZTUVUSE9EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzIyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVEVYVEFMSUdOTUVOVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMyMzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0ZPTlRDT0xPUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMyNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NIQVBFTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMyNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RSQVdNT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzI2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRFJBV01PREVfRk9SX0xJTkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMjc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TQ0FMSU5HTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMyODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMjk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9PVVRMSU5FTUVUSE9EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzMwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQk9SREVSX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMzE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CT1JERVJNRVRIT0QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMzI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT01QQVJFRlVOQ1RJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMzM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9WRVJUSUNBTF9URVhUX0FMSUdOTUVOVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMzNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTlZFUlNJT05TVFlMRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTMzNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ESVNQQVRDSF9TVEFUVVNfQ09ORkxJQ1QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzMzY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVU5LTk9XTl9BTEdPUklUSE0iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNDA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TSVpFVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM0MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0ZJTEVOQU1FX251bGxwdHIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNDU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9GTElQQVhJUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM0NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfRk9SX1JPVEFURSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM0NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzNERElSRUNUSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzQ4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfM0RQTEFORSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM0OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NLRUxFVE9OTUVUSE9EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzUwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVklTSU9OX0lORk8iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNTE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SRUNUIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzUyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRkVBVFVSRV9NT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzUzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0VBUkNIX1NUUkFURUdZIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzU0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfV0VJR0hUIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzU1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTlVNX01BVENIRVNfUkVRVUVTVEVEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzU2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOX01BVENIX1NDT1JFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzU3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfSUdOT1JFX01PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNjA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09NUExFWF9QTEFORSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM2MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NURUVQTkVTUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM2MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dJRFRIIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzYzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU1VCU0FNUExJTkdfUkFUSU8iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNjQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSUdOT1JFX0NPTE9SX1NQRUNUUlVNX1NFVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM2NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU1BFQ1RSVU0iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNjY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NIQVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzY3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fNSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM2ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNjk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9ST1RBVElPTl8zIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzcwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fMiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM3MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzEiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNzI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1JPVEFUSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzczOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNzQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8yIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Mzc1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfU0hJRlRfMSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM3NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU0hJRlQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNzc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM3ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzYiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzNzk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl81IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzgwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM4MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SXzMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzODI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl8yIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1MzgzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM4NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Mzg1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1JPVEFUSU9OX1JFUVVJUkVTX1NIQVBFX0ZFQVRVUkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzODY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfTUFUQ0hfU0VUVVBfREFUQV9TSEFQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM4NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9NQVRDSF9TRVRVUF9EQVRBIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Mzg4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX0xFQVJOX1NFVFVQX0RBVEFfU0hBUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzODk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfTEVBUk5fU0VUVVBfREFUQSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM5MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9MVU1JTkFOQ0VfQ09OVFJBU1RfVE9PX0xPVyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM5MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9IVUVfQ09OVFJBU1RfVE9PX0xPVyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM5MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9UT09fTEFSR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzOTM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfVE9PX1NNQUxMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Mzk0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1NQRUNUUlVNX01BU0siOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzOTU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfSU1BR0VfUkVRVUlSRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTUzOTc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09NUExFWF9JTUFHRV9SRVFVSVJFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTM5OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9NVUxUSUNPUkVfSU5WQUxJRF9BUkdVTUVOVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTQwMDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9NVUxUSUNPUkVfT1BFUkFUSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NDAxOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hGQUNUT1IiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU0MDI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhQT0lOVFMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU0MDM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRVhUUkFJTkZPX1ZFUlNJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU0MDQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9JTlRFUlBPTEFUSU9OTUVUSE9EX0ZPUl9VTldSQVAiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU0MDU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9URVhUT1JJRU5UQVRJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU0MDY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09PUkRTWVNfTk9UX0ZPVU5EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NDA3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09OVFJBU1QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU0MDg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ERVRFQ1RJT05fTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTQwOTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NVQlBJWEVMX0RJVklTSU9OUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTQxMDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lDT05TX1BFUl9MSU5FIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTQ5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX09CSkVDVFNfVE9fVkVSSUZZIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTUwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1ZBTFVFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTUxOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX1JFTkFNRV9SRUZDSEFSIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTUyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX05PVF9BX1ZBTElEX0NIQVJBQ1RFUl9TRVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NTM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9NSU5fQk9VTkRJTkdfUkVDVF9IRUlHSFQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NTQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9SRUFEX1JFU09MVVRJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NTU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9TUEFDSU5HX1JBTkdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTU2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQk9VTkRJTkdfUkVDVF9IRUlHSFRfUkFOR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NTc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9CT1VORElOR19SRUNUX1dJRFRIX1JBTkdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTU4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NJWkVfUkFOR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NTk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9SRUFEX09QVElPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU2MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX09CSkVDVF9JTkRFWCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU2MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9DSEFSQUNURVJTIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTYyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0JPT0xFQU5fVkFMVUVfRk9SX1NUUklOR19BVFRSSUJVVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NjM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfVU5MSUNFTlNFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU2NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1BSRURFRklORURfQ0hBUkFDVEVSIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTY1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX01VU1RfQkVfU0lOR0xFX0NIQVJBQ1RFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU2NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9CT09MRUFOX1ZBTFVFX0ZPUl9JTlRFR0VSX0FUVFJJQlVURSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU2NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9TVFJJTkdfVkFMVUVfRk9SX0JPT0xFQU5fQVRUUklCVVRFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTY4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX1NUUklOR19WQUxVRV9GT1JfSU5URUdFUl9BVFRSSUJVVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1Njk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9BVFRSSUJVVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NzA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5URUdFUl9WQUxVRV9GT1JfQk9PTEVBTl9BVFRSSUJVVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NzE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfR0VUX09OTFlfQVRUUklCVVRFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTcyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVEVHRVJfVkFMVUVfRk9SX1NUUklOR19BVFRSSUJVVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1NzM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0VUX0ZJTEVfVkVSU0lPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU3NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9DSEFSQUNURVJfU0VUX0RFU0NSSVBUSU9OX1RPT19MT05HIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTc1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTlVNQkVSX09GX0VST1NJT05TIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTc2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0NIQVJBQ1RFUl9WQUxVRV9UT09fTE9ORyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU3NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9DSEFSQUNURVJfVkFMVUVfQ0FOTk9UX0JFX0VNUFRZU1RSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTc4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NFVF9GSUxFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTc5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQVNQRUNUX1JBVElPIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTgwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUlOX0JPVU5ESU5HX1JFQ1RfV0lEVEgiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1ODE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9NQVhfVkVSVF9FTEVNRU5UX1NQQUNJTkciOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1ODI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9NQVhfSE9SSVpfRUxFTUVOVF9TUEFDSU5HIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTgzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUlOX0NIQVJfU1BBQ0lORyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU4NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9MSU1JVFMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1ODU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9VUFBFUl9USFJFU0hPTERfTElNSVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1ODY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9MT1dFUl9USFJFU0hPTERfTElNSVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1ODc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9USFJFU0hPTERfUkFOR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1ODg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9ISUdIX1RIUkVTSE9MRF9WQUxVRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU4OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0xPV19USFJFU0hPTERfVkFMVUUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1OTA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfVkFMSURfQ0hBUkFDVEVSX1BPU0lUSU9OUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU5MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9JTkRFWCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU5MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1JFQURfU1RSQVRFR1kiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1OTM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfQkxPQ0tTIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTk0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfU1VCU1RJVFVUSU9OX0NIQVJBQ1RFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU5NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9NT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NTk2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU1OTc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfTk9UX0FfVkFMSURfU0VTU0lPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTU5ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0FDQ0VQVEFOQ0VfTEVWRUwiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MDA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5GT19OT1RfRk9VTkQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MDE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FREdFX1RIUkVTSE9MRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYwMjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTklNVU1fQ1VSVkVfTEVOR1RIIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjAzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUk9XX1NURVAiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MDQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT0xVTU5fU1RFUCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYwNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWElNVU1fRU5EX1BPSU5UX0dBUCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYwNjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRVNfVE9fTUFUQ0giOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MDc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhJTVVNX0ZFQVRVUkVTX1BFUl9NQVRDSCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYwODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NVQlBJWEVMX0lURVJBVElPTlMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MDk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVUJQSVhFTF9UT0xFUkFOQ0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MTA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9JTklUSUFMX01BVENIX0xJU1RfTEVOR1RIIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjExOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9SRUNUQU5HTEVfRElNRU5TSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjEyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX1JBRElVUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYxMzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTklNVU1fRkVBVFVSRV9MRU5HVEgiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MTQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfQVNQRUNUX1JBVElPIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjE1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFX1NUUkVOR1RIIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjE2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRURHRV9GSUxURVJfU0laRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYxNzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX05VTUJFUl9PRl9GRUFUVVJFU19SQU5HRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYxODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9UT09fTUFOWV9TQ0FMRV9SQU5HRVMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MTk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfT0NDTFVTSU9OX1JBTkdFUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYyMDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NVUlZFX0VYVFJBQ1RJT05fTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYyMTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xFQVJOX0dFT01FVFJJQ19QQVRURVJOX1NFVFVQX0RBVEEiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MjI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRDSF9HRU9NRVRSSUNfUEFUVEVSTl9TRVRVUF9EQVRBIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjIzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTEVfUkFOR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MjQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9PQ0NMVVNJT05fUkFOR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MjU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRDSF9DT05TVFJBSU5UX1RZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MjY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTk9UX0VOT1VHSF9URU1QTEFURV9GRUFUVVJFUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYyNzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OT1RfRU5PVUdIX1RFTVBMQVRFX0ZFQVRVUkVTXzEiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2Mjg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9HRU9NRVRSSUNfTUFUQ0hJTkdfVEVNUExBVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2Mjk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhJTVVNX1BJWEVMX0RJU1RBTkNFX0ZST01fTElORSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYzMDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWElNVU1fRkVBVFVSRVNfTEVBUk5FRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYzMTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTl9NQVRDSF9TRVBBUkFUSU9OX0RJU1RBTkNFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjMyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOX01BVENIX1NFUEFSQVRJT05fQU5HTEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2MzM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0VQQVJBVElPTl9TQ0FMRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYzNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWF9NQVRDSF9PVkVSTEFQIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjM1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0hBUEVfREVTQ1JJUFRPUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYzNjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX05PVF9GT1VORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYzNzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9IQVJEV0FSRV9ET0VTTlRfU1VQUE9SVF9OT05URUFSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjM4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRklMTF9TVFlMRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTYzOTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0hBVENIX1NUWUxFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjQwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX1pPTkVTIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjQxOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0RVUExJQ0FURV9MQUJFTCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTY0MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9MQUJFTF9OT1RfRk9VTkQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NDM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OVU1CRVJfT0ZfTUFUQ0hfT1BUSU9OUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTY0NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9MQUJFTF9UT09fTE9ORyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTY0NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX05VTUJFUl9PRl9MQUJFTFMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NDY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTk9fVEVNUExBVEVfVE9fTEVBUk4iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NDc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NVUxUSVBMRV9HRU9NRVRSSUNfVEVNUExBVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NDg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfTk9UX0xFQVJORUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NDk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9HRU9NRVRSSUNfRkVBVFVSRV9UWVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjUwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NVUlZFX0VYVFJBQ1RJT05fTU9ERV9NVVNUX0JFX1NBTUUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NTE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRURHRV9GSUxURVJfU0laRV9NVVNUX0JFX1NBTUUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NTI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9HRU9NRVRSSUNfTUFUQ0hJTkdfVEVNUExBVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NTM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9NVUxUSVBMRV9HRU9NRVRSSUNfVEVNUExBVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NTQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfR1JBRElOR19JTkZPUk1BVElPTl9OT1RfRk9VTkQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU2NTU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRU5BQkxFX0NBTElCUkFUSU9OX1NVUFBPUlRfTVVTVF9CRV9TQU1FIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NjU2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1NNT09USF9DT05UT1VSU19NVVNUX0JFX1NBTUUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3MDA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfUkVRVUlSRVNfV0lOMjAwMF9PUl9ORVdFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcwMTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVFJJWF9TSVpFX1JBTkdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzAyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTEVOR1RIIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzAzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVFlQRV9PRl9GTEFUVEVOIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzA0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09NUFJFU1NJT05fVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcwNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9EQVRBX0NPUlJVUFRFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcwNjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9BVklfU0VTU0lPTl9BTFJFQURZX09QRU4iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3MDc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQVZJX1dSSVRFX1NFU1NJT05fUkVRVUlSRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3MDg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQVZJX1JFQURfU0VTU0lPTl9SRVFVSVJFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcwOTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9BVklfVU5PUEVORURfU0VTU0lPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcxMDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9UT09fTUFOWV9QQVJUSUNMRVMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3MTE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTk9UX0VOT1VHSF9SRUdJT05TIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzEyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1dST05HX1JFR0lPTl9UWVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzEzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1ZBTFVFX05PVF9JTl9FTlVNIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzE0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQVhJU19PUklFTlRBVElPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcxNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NBTElCUkFUSU9OX1VOSVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3MTY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TQ0FMSU5HX01FVEhPRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcxNzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1JBTkdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzE4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0xBQl9WRVJTSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzE5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBRF9ST0lfQk9YIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzIwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBRF9ST0kiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3MjE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CSVRfREVQVEgiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3MjI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0xBU1NJRklFUl9DTEFTU0lGWV9JTUFHRV9XSVRIX0NVU1RPTV9TRVNTSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzIzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NVU1RPTURBVEFfS0VZX05PVF9GT1VORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcyNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DVVNUT01EQVRBX0lOVkFMSURfU0laRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcyNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9EQVRBX1ZFUlNJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3MjY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTUFUQ0hGQUNUT1JfT0JTT0xFVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3Mjc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVU5TVVBQT1JURURfMkRfQkFSQ09ERV9TRUFSQ0hfTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTcyODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfU0VBUkNIX01PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3NTQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVFJJR19USU1FT1VUIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzU2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0RMTF9GVU5DVElPTl9OT1RfRk9VTkQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3NTc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRExMX05PVF9GT1VORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc1ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9CT0FSRF9OT1RfT1BFTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc2MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9CT0FSRF9OT1RfRk9VTkQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3NjI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OSUJMQUNLX0RFVklBVElPTl9GQUNUT1IiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3NjM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OT1JNQUxJWkFUSU9OX01FVEhPRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc2NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ERVBSRUNBVEVEX0ZVTkNUSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzY3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQUxJR05NRU5UIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzY4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3Njk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FREdFX1RISUNLTkVTUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc3MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOU1BFQ1RJT05fVEVNUExBVEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3NzE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9JTlNQRUNUSU9OX1RFTVBMQVRFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzcyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUkVHSVNUUkFUSU9OX01FVEhPRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc3MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OT19ERVNUX0lNQUdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Nzc0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05PX0xBQkVMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Nzc1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPSV9IQVNfT1BFTl9DT05UT1VSUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc3NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1VTRV9PRl9DT01QQUNUX1NFU1NJT05fRklMRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc3NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTkNPTVBBVElCTEVfQ0xBU1NJRklFUl9UWVBFUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc3ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0tFUk5FTF9TSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Nzc5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTk5PVF9DT01QQUNUX1VOVFJBSU5FRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc4MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFX1RZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3ODE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0xBU1NJRklFUl9JTlZBTElEX0VOR0lORV9UWVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzgyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0RFU0NSSVBUSU9OX1RPT19MT05HIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1NzgzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBRF9TQU1QTEVfSU5ERVgiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3ODQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MSU1JVFMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3ODU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTk9fUEFSVElDTEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3ODY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRV9PUFRJT05TIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Nzg3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ0xBU1NJRklFUl9UWVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Nzg4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05PX1NBTVBMRVMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3ODk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9DTEFTU0lGSUVSX1NFU1NJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3OTA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ESVNUQU5DRV9NRVRSSUMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3OTE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0xBU1NJRklFUl9JTlZBTElEX1NFU1NJT05fVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc5MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DTEFTU0lGSUVSX1NFU1NJT05fTk9UX1RSQUlORUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3OTM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9PUEVSQVRJT05fT05fQ09NUEFDVF9TRVNTSU9OX0FUVEVNUFRFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc5NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9LX1RPT19ISUdIIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Nzk1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0tfVE9PX0xPVyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTc5NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0tOTl9NRVRIT0QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3OTc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DTEFTU0lGSUVSX1NFU1NJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU3OTg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DVVNUT01fU0FNUExFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1Nzk5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVEVSTkFMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1ODAwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1BST1RFQ1RJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU4MDE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfQ09OVE9VUlMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU4Mzc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT01QUkVTU0lPTl9SQVRJTyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTg0MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9CQURfSU5ERVgiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU4NzU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9QSEFSTUFDT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1ODc2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1VOU1VQUE9SVEVEX0NPTE9SX01PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU4Nzc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ09MT1JNT0RFX1JFUVVJUkVTX0NIQU5HRUNPTE9SU1BBQ0UyIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1ODc4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1BST1BfTk9ERV9XUklURV9OT1RfU1VQUE9SVEVEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1ODc5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBRF9NRUFTVVJFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1ODgwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1BBUlRJQ0xFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTIwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05VTUJFUl9DTEFTUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk1MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dBVkVMRVRfVFJBTlNGT1JNX01PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5NTQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9RVUFOVElaQVRJT05fU1RFUF9TSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTU1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYX1dBVkVMRVRfVFJBTlNGT1JNX0xFVkVMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTU2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUVVBTElUWSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk1NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9BUlJBWV9TSVpFX01JU01BVENIIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTU4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1dJTkRPV19JRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk1OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DUkVBVEVfV0lORE9XIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTYwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOSVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5NzE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9PRkZTRVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5NzI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWF9FTlVNRVJBVEVfRklMVEVSUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk3MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9KUEVHMjAwMF9VTlNVUFBPUlRFRF9NVUxUSVBMRV9MQVlFUlMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5NzQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVU5TVVBQT1JURURfSlBFRzIwMDBfQ09MT1JTUEFDRV9NRVRIT0QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5NzU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQVZJX1RJTUVPVVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5NzY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTlVNQkVSX09GX1BBTEVUVEVfQ09MT1JTIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTc3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0FWSV9WRVJTSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTc4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUEFSVElDTEVfTlVNQkVSIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTc5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUEFSVElDTEVfSU5GTyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk4MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT01fSU5JVElBTElaRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk4MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlNVRkZJQ0lFTlRfQlVGRkVSX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5ODI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9GUkFNRVNfUEVSX1NFQ09ORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk4MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX05PX1NQQUNFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTg0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0ZJTEVfSU5WQUxJRF9EQVRBX1RZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5ODU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRklMRV9PUEVSQVRJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5ODY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRklMRV9GT1JNQVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5ODc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRklMRV9FT0YiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5ODg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRklMRV9XUklURSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk4OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX1JFQUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5OTA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRklMRV9HRVRfSU5GTyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk5MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0lOVkFMSURfVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk5MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX1BFUk1JU1NJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5OTM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRklMRV9JT19FUlIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTU5OTQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRklMRV9UT09fTUFOWV9PUEVOIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTk1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0ZJTEVfTk9UX0ZPVU5EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTk2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0ZJTEVfT1BFTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk5NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0FSR0VSUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NTk5ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0NPTE9SX1RBQkxFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk1OTk5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0ZJTEVfRklMRV9UWVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDAwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0ZJTEVfRklMRV9IRUFERVIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMDE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfQVZJX1NFU1NJT05TIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDAyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTElORUdBVUdFTUVUSE9EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDAzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0FWSV9EQVRBX0VYQ0VFRFNfQlVGRkVSX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMDQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWF9DRVJUSUZJQ0FUSU9OX0ZBSUxVUkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMDU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9BVklfU0VTU0lPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAwNjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX1VOS05PV05fQ09NUFJFU1NJT05fRklMVEVSIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDA3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfSU5DT01QQVRJQkxFX0NPTVBSRVNTSU9OX0ZJTFRFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAwODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX05PX0ZJTFRFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAwOTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDEwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRlJBTUVfTlVNQkVSIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDExOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JQQ19CSU5EIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDEyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JQQ19FWEVDVVRFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDEzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVklERU9fTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAxNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1ZJREVPX0JMSVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMTU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfUlBDX0VYRUNVVEVfSVZCIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDE2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX05PX1ZJREVPX0RSSVZFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAxNzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9PUEVOSU5HX05FV0VSX0FJTV9HUkFESU5HX0RBVEEiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMTg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FREdFX1BPTEFSSVRZX1NFQVJDSF9NT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDE5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVEhSRVNIT0xEX1BFUkNFTlRBR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMjA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9HUkFESU5HX01PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMjE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9LRVJORUxfU0laRV9GT1JfRURHRV9ERVRFQ1RJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMjI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TRUFSQ0hfTU9ERV9GT1JfU1RSQUlHSFRfRURHRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAyMzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FOR0xFX1RPTF9GT1JfU1RSQUlHSFRfRURHRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAyNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTl9DT1ZFUkFHRV9GT1JfU1RSQUlHSFRfRURHRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAyNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FOR0xFX1JBTkdFX0ZPUl9TVFJBSUdIVF9FREdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDI2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUFJPQ0VTU19UWVBFX0ZPUl9FREdFX0RFVEVDVElPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAzMjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURURFU0NSSVBUT1JfUk9UQVRJT05fU0VBUkNIU1RSQVRFR1kiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMzM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVERVNDUklQVE9SX0xFQVJOU0VUVVBEQVRBIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDM0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFSU1BR0VfRURHRUlORk8iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwMzU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVJTUFHRV9OT0NJUkNMRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAzNjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NLRUxFVE9OTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjAzNzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9USU1FT1VUIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDM4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0ZJTkRfQ09PUkRTWVNfTU9SRV9USEFOX09ORV9FREdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDM5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lPX0VSUk9SIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDQwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0RSSVZFUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA0MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA0MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfQ09OVFJBU1QiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNDM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NFTExfU0hBUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNDQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX1NIQVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDQ1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TVUJUWVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDQ2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9DT05UUkFTVF9GT1JfUk9JIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDQ3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTElORUFSX0FWRVJBR0VfTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA0ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NFTExfU0FNUExFX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNDk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRSSVhfUE9MQVJJVFkiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNTA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FQ0NfVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA1MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NFTExfRklMVEVSX01PREUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNTI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ERU1PRFVMQVRJT05fTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA1MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JPUkRFUl9JTlRFR1JJVFkiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNTQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DRUxMX0ZJTExfVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA1NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FTUEVDVF9SQVRJTyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA1NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVFJJWF9NSVJST1JfTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA1NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NFQVJDSF9WRUNUT1JfV0lEVEgiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNTg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ST1RBVElPTl9NT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDU5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYX0lURVJBVElPTlMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNjA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSlBFRzIwMDBfTE9TU0xFU1NfV0lUSF9GTE9BVElOR19QT0lOVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA2MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dJTkRPV19TSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDYyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVE9MRVJBTkNFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDYzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0VYVEVSTkFMX0FMSUdOTUVOVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA2NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9FWFRFUk5BTF9OT1RfU1VQUE9SVEVEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDY1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTlRfUkVTSVpFX0VYVEVSTkFMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDY2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUE9JTlRTWU1CT0wiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNjc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU1BR0VTX05PVF9ESUZGIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDY4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQUNUSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDY5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA3MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0ZVTkNUSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDcxOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTl9ESVJFQ1RJT04iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNzI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CT1JERVIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwNzM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTUFTS19PVVRTSURFX0lNQUdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDc0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOQ09NUF9TSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDc1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPT1JEX1NZU19TRUNPTkRfQVhJUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA3NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DT09SRF9TWVNfRklSU1RfQVhJUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA3NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTkNPTVBfVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA3OTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01FVEFGSUxFX0hBTkRMRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA4MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lNQUdFX1RZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwODE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQkFEX1BBU1NXT1JEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDgyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1BBTEVUVEVfTk9UX1NVUFBPUlRFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA4MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19USU1FT1VUIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDg0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX0RFTEVURV9USU1FUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA4NTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19JTklUX1RJTUVSIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDg2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1NUQVJUX1RJTUVSIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDg3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1NUT1BfVElNRVIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwODg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDg5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX1JFSU5JVElBTElaRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA5MDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9FTkFCTEVEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDkxOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX1VOSU5JVElBTElaRURfRU5BQkxFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDkyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX05PTl9FTVBUWV9JTklUSUFMSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDkzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX0xPQ0tFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA5NDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9DQU5OT1RfVU5MT0NLIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MDk1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0RVUExJQ0FURV9SRUZFUkVOQ0VfUE9JTlQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwOTY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTk9UX0FOX09CSkVDVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA5NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFX1BBUkFNRVRFUl9WQUxVRSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjA5ODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9SRVNFUlZFRF9NVVNUX0JFX251bGxwdHIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYwOTk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT19TSU1QTEVfVFJBTlNGT1JNIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTAwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fUEVSU1BFQ1RJVkVfUFJPSkVDVElPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjEwMTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPX01JQ1JPX1BMQU5FIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTAyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fNiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjEwMzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMDQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT180IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTA1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fMyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjEwNjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMDc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT18xIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTA4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0VSUk9STUFQIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTA5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lOVkFMSURfU0NBTElOR19GQUNUT1IiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMTA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5GT19WRVJTSU9OIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTExOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0ZBSUxFRF9UT19GSU5EX0dSSUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMTI6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5DT01QX01BVFJJWF9TSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTEzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lNQUdFX1VOQ0FMSUJSQVRFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjExNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTlZBTElEX1JPSSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjExNTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTUFHRV9DT1JSRUNURUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMTY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5TRl9QT0lOVFMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMTc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTUFUUklYX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMTg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVEVQX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMTk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ1VTVE9NREFUQV9JTlZBTElEX0tFWSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjEyMDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9OT1RfSU1BR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMjE6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfU0FUVVJBVElPTl9USFJFU0hPTERfT1VUX09GX1JBTkdFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTIyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0RSQVdURVhUX0NPTE9SX01VU1RfQkVfR1JBWVNDQUxFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTIzOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ0FMSUJSQVRJT05fTU9ERSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjEyNDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NBTElCUkFUSU9OX1JPSV9NT0RFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTI1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09OVFJBU1RfVEhSRVNIT0xEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTI2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX0NPTkZMSUNUXzEiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMjc6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfQ09ORkxJQ1RfMiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjEyODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9DT05GTElDVF8zIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTI5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1VOQk9VTkRFRF9JTlRFUkZBQ0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMzA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTk9UX1JFQ1RfT1JfUk9UQVRFRF9SRUNUIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTMyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX01BU0tfTk9UX1RFTVBMQVRFX1NJWkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMzM6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfVEhSRUFEX0NPVUxEX05PVF9JTklUSUFMSVpFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTM0OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1RIUkVBRF9JTklUSUFMSVpJTkciOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMzU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CVVRUT05fTEFCRUwiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxMzY6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWF9JTlZBTElEX0ZJTFRFUl9RVUFMSVRZIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTM3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfRExMX05PVF9GT1VORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjEzODogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19OT1RfU1VQUE9SVEVEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTM5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX09VVF9PRl9NRU1PUlkiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxNDA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFMTI4X1NFVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjE0MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREUxMjhfRk5DIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTQyOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfSU5WQUxJRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjE0MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX1RZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxNDQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFOTNfU0hJRlQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxNDU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9VUENBIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTQ2OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfTVNJIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTQ3OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfSTI1IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTQ4OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfRUFOMTMiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxNDk6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9FQU44IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTUwOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ09ERTEyOCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjE1MTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREU5MyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjE1MjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREUzOSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjE1MzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREFCQVIiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxNTQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfSU1BR0VfVE9PX1NNQUxMIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTU1OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1VOSU5JVCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjE1NjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9ORUVEX0ZVTExfVkVSU0lPTiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMTA3NDM5NjE1NzogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9VTlJFR0lTVEVSRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxNTg6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfTUVNT1JZX0VSUk9SIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIC0xMDc0Mzk2MTU5OiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX09VVF9PRl9NRU1PUlkiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgLTEwNzQzOTYxNjA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfU1lTVEVNX0VSUk9SIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDA6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfU1VDQ0VTUyI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gZW5kIE5hdGlvbmFsIEluc3RydW1lbnRzIGRlZmluZWQgZXJyb3JzCisKKyAgICAvLyBiZWdpbiBCQUUgZGVmaW5lZCBlcnJvcnMKKyAgICBjYXNlIEVSUl9WSVNJT05fR0VORVJBTF9FUlJPUjogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9WSVNJT05fR0VORVJBTF9FUlJPUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFUlJfQ09MT1JfTk9UX0ZPVU5EOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX0NPTE9SX05PVF9GT1VORCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFUlJfUEFSVElDTEVfVE9PX1NNQUxMOiB7CisgICAgICBlcnJvclRleHQgPSAiRVJSX1BBUlRJQ0xFX1RPT19TTUFMTCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFUlJfQ0FNRVJBX0ZBSUxVUkU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX0ZBSUxVUkUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9TT0NLRVRfQ1JFQVRFX0ZBSUxFRDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfU09DS0VUX0NSRUFURV9GQUlMRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9DT05ORUNUX0ZBSUxFRDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfQ09OTkVDVF9GQUlMRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9TVEFMRV9JTUFHRTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfU1RBTEVfSU1BR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9OT1RfSU5JVElBTElaRUQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX05PVF9JTklUSUFMSVpFRCI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFUlJfQ0FNRVJBX05PX0JVRkZFUl9BVkFJTEFCTEU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX05PX0JVRkZFUl9BVkFJTEFCTEUiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9IRUFERVJfRVJST1I6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX0hFQURFUl9FUlJPUiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFUlJfQ0FNRVJBX0JMT0NLSU5HX1RJTUVPVVQ6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX0JMT0NLSU5HX1RJTUVPVVQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9BVVRIT1JJWkFUSU9OX0ZBSUxFRDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfQVVUSE9SSVpBVElPTl9GQUlMRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9UQVNLX1NQQVdOX0ZBSUxFRDogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfVEFTS19TUEFXTl9GQUlMRUQiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9UQVNLX0lOUFVUX09VVF9PRl9SQU5HRTogeworICAgICAgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfVEFTS19JTlBVVF9PVVRfT0ZfUkFOR0UiOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRVJSX0NBTUVSQV9DT01NQU5EX0ZBSUxVUkU6IHsKKyAgICAgIGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX0NPTU1BTkRfRkFJTFVSRSI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyb3JUZXh0OworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9IU0xJbWFnZS5jcHAgYi93cGlsaWJjL0F0aGVuYS9zcmMvVmlzaW9uL0hTTEltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjExNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9IU0xJbWFnZS5jcHAKQEAgLTAsMCArMSwyMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vSFNMSW1hZ2UuaCIKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW1hZ2UgdGhhdCB1c2VzIHRoZSBIdWUsIFNhdHVyYXRpb24sIGFuZCBMdW1pbmFuY2UgcGxhbmVzLgorICovCitIU0xJbWFnZTo6SFNMSW1hZ2UoKSA6IENvbG9ySW1hZ2UoSU1BUV9JTUFHRV9IU0wpIHt9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGltYWdlIGJ5IGxvYWRpbmcgYSBmaWxlLgorICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGxvYWQuCisgKi8KK0hTTEltYWdlOjpIU0xJbWFnZShjb25zdCBjaGFyICpmaWxlTmFtZSkgOiBDb2xvckltYWdlKElNQVFfSU1BR0VfSFNMKSB7CisgIGludCBzdWNjZXNzID0gaW1hcVJlYWRGaWxlKG1faW1hcUltYWdlLCBmaWxlTmFtZSwgbnVsbHB0ciwgbnVsbHB0cik7CisgIHdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiSW1hcSBSZWFkRmlsZSBlcnJvciIpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9JbWFnZUJhc2UuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9JbWFnZUJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTIzNGEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvVmlzaW9uL0ltYWdlQmFzZS5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vSW1hZ2VCYXNlLmgiCisjaW5jbHVkZSAibml2aXNpb24uaCIKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gSW1hZ2VCYXNlLgorICogSW1hZ2ViYXNlIGlzIHRoZSBiYXNlIG9mIGFsbCB0aGUgb3RoZXIgaW1hZ2UgY2xhc3Nlcy4gVGhlIGNvbnN0cnVjdG9yCisgKiBjcmVhdGVzIGFueSB0eXBlIG9mIGltYWdlIGFuZCBzdG9yZXMgdGhlIHBvaW50ZXIgdG8gaXQgaW4gdGhlIGNsYXNzLgorICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgaW1hZ2UgdG8gY3JlYXRlCisgKi8KK0ltYWdlQmFzZTo6SW1hZ2VCYXNlKEltYWdlVHlwZSB0eXBlKSB7CisgIG1faW1hcUltYWdlID0gaW1hcUNyZWF0ZUltYWdlKHR5cGUsIERFRkFVTFRfQk9SREVSX1NJWkUpOworfQorCisvKioKKyAqIEZyZWVzIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYW4gSW1hZ2VCYXNlLgorICogRGVzdHJ1Y3RvciBmcmVlcyB0aGUgaW1hcSBpbWFnZSBhbGxvY2F0ZWQgd2l0aCB0aGUgY2xhc3MuCisgKi8KK0ltYWdlQmFzZTo6fkltYWdlQmFzZSgpIHsKKyAgaWYgKG1faW1hcUltYWdlKSBpbWFxRGlzcG9zZShtX2ltYXFJbWFnZSk7Cit9CisKKy8qKgorICogV3JpdGVzIGFuIGltYWdlIHRvIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBmaWxlbmFtZS4KKyAqIFdyaXRlIHRoZSBpbWFnZSB0byBhIGZpbGUgaW4gdGhlIGZsYXNoIG9uIHRoZSBjUklPLgorICogQHBhcmFtIGZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlCisgKi8KK3ZvaWQgSW1hZ2VCYXNlOjpXcml0ZShjb25zdCBjaGFyICpmaWxlTmFtZSkgeworICBpbnQgc3VjY2VzcyA9IGltYXFXcml0ZUZpbGUobV9pbWFxSW1hZ2UsIGZpbGVOYW1lLCBudWxscHRyKTsKKyAgd3BpX3NldEltYXFFcnJvcldpdGhDb250ZXh0KHN1Y2Nlc3MsICJJbWFxIEltYWdlIHdyaXRlRmlsZSBlcnJvciIpOworfQorCisvKioKKyAqIEdldHMgdGhlIGhlaWdodCBvZiBhbiBpbWFnZS4KKyAqIEByZXR1cm4gVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzLgorICovCitpbnQgSW1hZ2VCYXNlOjpHZXRIZWlnaHQoKSB7CisgIGludCBoZWlnaHQ7CisgIGltYXFHZXRJbWFnZVNpemUobV9pbWFxSW1hZ2UsIG51bGxwdHIsICZoZWlnaHQpOworICByZXR1cm4gaGVpZ2h0OworfQorCisvKioKKyAqIEdldHMgdGhlIHdpZHRoIG9mIGFuIGltYWdlLgorICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIGltYWdlIGluIHBpeGVscy4KKyAqLworaW50IEltYWdlQmFzZTo6R2V0V2lkdGgoKSB7CisgIGludCB3aWR0aDsKKyAgaW1hcUdldEltYWdlU2l6ZShtX2ltYXFJbWFnZSwgJndpZHRoLCBudWxscHRyKTsKKyAgcmV0dXJuIHdpZHRoOworfQorCisvKioKKyAqIEFjY2VzcyB0aGUgaW50ZXJuYWwgSU1BUSBJbWFnZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgSU1BUSBJbWFnZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworSW1hZ2UgKkltYWdlQmFzZTo6R2V0SW1hcUltYWdlKCkgeyByZXR1cm4gbV9pbWFxSW1hZ2U7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vTW9ub0ltYWdlLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vTW9ub0ltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDcwM2MwCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9Nb25vSW1hZ2UuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVmlzaW9uL01vbm9JbWFnZS5oIgorI2luY2x1ZGUgIm5pdmlzaW9uLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK01vbm9JbWFnZTo6TW9ub0ltYWdlKCkgOiBJbWFnZUJhc2UoSU1BUV9JTUFHRV9VOCkge30KKworLyoqCisgKiBMb29rIGZvciBlbGxpcHNlcyBpbiBhbiBpbWFnZS4KKyAqIEdpdmVuIHNvbWUgaW5wdXQgcGFyYW1ldGVycywgbG9vayBmb3IgYW55IG51bWJlciBvZiBlbGxpcHNlcyBpbiBhbiBpbWFnZS4KKyAqIEBwYXJhbSBlbGxpcHNlRGVzY3JpcHRvciBFbGxpcHNlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBjdXJ2ZU9wdGlvbnMgQ3VydmUgb3B0aW9ucworICogQHBhcmFtIHNoYXBlRGV0ZWN0aW9uT3B0aW9ucyBTaGFwZSBkZXRlY3Rpb24gb3B0aW9ucworICogQHBhcmFtIHJvaSBSZWdpb24gb2YgSW50ZXJlc3QKKyAqIEByZXR1cm5zIGEgdmVjdG9yIG9mIEVsbGlwc2VNYXRjaCBzdHJ1Y3R1cmVzICgwIGxlbmd0aCB2ZWN0b3Igb24gbm8gbWF0Y2gpCisgKi8KK3ZlY3RvcjxFbGxpcHNlTWF0Y2g+ICpNb25vSW1hZ2U6OkRldGVjdEVsbGlwc2VzKAorICAgIEVsbGlwc2VEZXNjcmlwdG9yICplbGxpcHNlRGVzY3JpcHRvciwgQ3VydmVPcHRpb25zICpjdXJ2ZU9wdGlvbnMsCisgICAgU2hhcGVEZXRlY3Rpb25PcHRpb25zICpzaGFwZURldGVjdGlvbk9wdGlvbnMsIFJPSSAqcm9pKSB7CisgIGludCBudW1iZXJPZk1hdGNoZXM7CisgIEVsbGlwc2VNYXRjaCAqZSA9CisgICAgICBpbWFxRGV0ZWN0RWxsaXBzZXMobV9pbWFxSW1hZ2UsIGVsbGlwc2VEZXNjcmlwdG9yLCBjdXJ2ZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVEZXRlY3Rpb25PcHRpb25zLCByb2ksICZudW1iZXJPZk1hdGNoZXMpOworICBhdXRvIGVsbGlwc2VzID0gbmV3IHZlY3RvcjxFbGxpcHNlTWF0Y2g+OworICBpZiAoZSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGVsbGlwc2VzOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZNYXRjaGVzOyBpKyspIHsKKyAgICBlbGxpcHNlcy0+cHVzaF9iYWNrKGVbaV0pOworICB9CisgIGltYXFEaXNwb3NlKGUpOworICByZXR1cm4gZWxsaXBzZXM7Cit9CisKK3ZlY3RvcjxFbGxpcHNlTWF0Y2g+ICpNb25vSW1hZ2U6OkRldGVjdEVsbGlwc2VzKAorICAgIEVsbGlwc2VEZXNjcmlwdG9yICplbGxpcHNlRGVzY3JpcHRvcikgeworICB2ZWN0b3I8RWxsaXBzZU1hdGNoPiAqZWxsaXBzZXMgPQorICAgICAgRGV0ZWN0RWxsaXBzZXMoZWxsaXBzZURlc2NyaXB0b3IsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOworICByZXR1cm4gZWxsaXBzZXM7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL0F0aGVuYS9zcmMvVmlzaW9uL1JHQkltYWdlLmNwcCBiL3dwaWxpYmMvQXRoZW5hL3NyYy9WaXNpb24vUkdCSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjkxMjIKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvVmlzaW9uL1JHQkltYWdlLmNwcApAQCAtMCwwICsxLDIxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpc2lvbi9SR0JJbWFnZS5oIgorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBpbWFnZSB0aGF0IHVzZXMgUmVkLCBHcmVlbiwgYW5kIEJsdWUgcGxhbmVzLgorICovCitSR0JJbWFnZTo6UkdCSW1hZ2UoKSA6IENvbG9ySW1hZ2UoSU1BUV9JTUFHRV9SR0IpIHt9CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IGltYWdlIGJ5IGxvYWRpbmcgYSBmaWxlLgorICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGxvYWQuCisgKi8KK1JHQkltYWdlOjpSR0JJbWFnZShjb25zdCBjaGFyICpmaWxlTmFtZSkgOiBDb2xvckltYWdlKElNQVFfSU1BR0VfUkdCKSB7CisgIGludCBzdWNjZXNzID0gaW1hcVJlYWRGaWxlKG1faW1hcUltYWdlLCBmaWxlTmFtZSwgbnVsbHB0ciwgbnVsbHB0cik7CisgIHdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChzdWNjZXNzLCAiSW1hcSBSZWFkRmlsZSBlcnJvciIpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9UaHJlc2hvbGQuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9UaHJlc2hvbGQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTcyNDMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvVmlzaW9uL1RocmVzaG9sZC5jcHAKQEAgLTAsMCArMSwxOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJWaXNpb24vVGhyZXNob2xkLmgiCisKK1RocmVzaG9sZDo6VGhyZXNob2xkKGludCBuZXdfcGxhbmUxTG93LCBpbnQgbmV3X3BsYW5lMUhpZ2gsIGludCBuZXdfcGxhbmUyTG93LAorICAgICAgICAgICAgICAgICAgICAgaW50IG5ld19wbGFuZTJIaWdoLCBpbnQgbmV3X3BsYW5lM0xvdywKKyAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfcGxhbmUzSGlnaCkgeworICBwbGFuZTFMb3cgPSBuZXdfcGxhbmUxTG93OworICBwbGFuZTFIaWdoID0gbmV3X3BsYW5lMUhpZ2g7CisgIHBsYW5lMkxvdyA9IG5ld19wbGFuZTJMb3c7CisgIHBsYW5lMkhpZ2ggPSBuZXdfcGxhbmUySGlnaDsKKyAgcGxhbmUzTG93ID0gbmV3X3BsYW5lM0xvdzsKKyAgcGxhbmUzSGlnaCA9IG5ld19wbGFuZTNIaWdoOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9WaXNpb25BUEkuY3BwIGIvd3BpbGliYy9BdGhlbmEvc3JjL1Zpc2lvbi9WaXNpb25BUEkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzcyMWQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL0F0aGVuYS9zcmMvVmlzaW9uL1Zpc2lvbkFQSS5jcHAKQEAgLTAsMCArMSw4MjEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJWaXNpb24vQmFlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiVmlzaW9uL0ZyY0Vycm9yLmgiCisjaW5jbHVkZSAiVmlzaW9uL1Zpc2lvbkFQSS5oIgorCitpbnQgVmlzaW9uQVBJX2RlYnVnRmxhZyA9IDE7CisjZGVmaW5lIERQUklOVEYgXAorICBpZiAoVmlzaW9uQVBJX2RlYnVnRmxhZykgZHByaW50ZgorCisvKiogQGZpbGUKKyAqICAgIEltYWdlIE1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKi8KKworLyoqCisqIEBicmllZiBDcmVhdGUgYW4gaW1hZ2Ugb2JqZWN0CisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9DT01QTEVYLAorKiBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wsIElNQVFfSU1BR0VfUkdCX1U2NAorKiBUaGUgYm9yZGVyIHNpemUgaXMgZGVmYXVsdGVkIHRvIDMgc28gdGhhdCBjb252b2x1dGlvbmFsIGFsZ29yaXRobXMgd29yayBhdCB0aGUKKyogZWRnZXMuCisqIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBjcmVhdGVkIGltYWdlLCBkaXNwb3NlIG9mIGl0IGJ5IGNhbGxpbmcKKyogZnJjRGlzcG9zZSgpLgorKiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqCisqIEBwYXJhbSB0eXBlIFR5cGUgb2YgaW1hZ2UgdG8gY3JlYXRlCisqIEByZXR1cm4gSW1hZ2UqIE9uIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3JlYXRlZCBpbWFnZS4gT24KKyogZmFpbHVyZSwgaXQgcmV0dXJucyBudWxscHRyLgorKi8KK0ltYWdlKiBmcmNDcmVhdGVJbWFnZShJbWFnZVR5cGUgdHlwZSkgeworICByZXR1cm4gaW1hcUNyZWF0ZUltYWdlKHR5cGUsIERFRkFVTFRfQk9SREVSX1NJWkUpOworfQorCisvKioKKyogQGJyaWVmIERpc3Bvc2Ugb2Ygb25lIG9iamVjdC4gU3VwcG9ydHMgYW55IG9iamVjdCBjcmVhdGVkIG9uIHRoZSBoZWFwLgorKgorKiBAcGFyYW0gb2JqZWN0IG9iamVjdCB0byBkaXNwb3NlIG9mCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisqIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNEaXNwb3NlKHZvaWQqIG9iamVjdCkgeyByZXR1cm4gaW1hcURpc3Bvc2Uob2JqZWN0KTsgfQorLyoqCisqIEBicmllZiBEaXNwb3NlIG9mIGEgbGlzdCBvZiBvYmplY3RzLiBTdXBwb3J0cyBhbnkgb2JqZWN0IGNyZWF0ZWQgb24gdGhlIGhlYXAuCisqCisqIEBwYXJhbSBmdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisqIEBwYXJhbSAuLi4gQSBsaXN0IG9mIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgdGhhdCBuZWVkIHRvIGJlIGRpc3Bvc2VkIG9mLgorKiBUaGUgbGFzdCBwb2ludGVyIGluIHRoZSBsaXN0IHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIG51bGxwdHIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisqIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNEaXNwb3NlKGNvbnN0IGNoYXIqIGZ1bmN0aW9uTmFtZSwgLi4uKSAvKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0ICovCit7CisgIHZhX2xpc3QgZGlzcG9zYWxQdHJMaXN0OyAvKiBJbnB1dCBhcmd1bWVudCBsaXN0ICovCisgIHZvaWQqIGRpc3Bvc2FsUHRyOyAgICAgICAvKiBGb3IgaXRlcmF0aW9uICovCisgIGludCBzdWNjZXNzLCByZXR1cm5WYWx1ZSA9IDE7CisKKyAgdmFfc3RhcnQoZGlzcG9zYWxQdHJMaXN0LCBmdW5jdGlvbk5hbWUpOyAvKiBzdGFydCBvZiB2YXJpYWJsZSBsaXN0ICovCisgIGRpc3Bvc2FsUHRyID0gdmFfYXJnKGRpc3Bvc2FsUHRyTGlzdCwgdm9pZCopOworICB3aGlsZSAoZGlzcG9zYWxQdHIgIT0gbnVsbHB0cikgeworICAgIHN1Y2Nlc3MgPSBpbWFxRGlzcG9zZShkaXNwb3NhbFB0cik7CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICByZXR1cm5WYWx1ZSA9IDA7CisgICAgfQorICAgIGRpc3Bvc2FsUHRyID0gdmFfYXJnKGRpc3Bvc2FsUHRyTGlzdCwgdm9pZCopOworICB9CisgIHZhX2VuZChkaXNwb3NhbFB0ckxpc3QpOworICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CisKKy8qKgorKiBAYnJpZWYgQ29weSBhbiBpbWFnZSBvYmplY3QuCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9SR0IsCisqIElNQVFfSU1BR0VfSFNMLgorKgorKiBAcGFyYW0gZGVzdCBDb3B5IG9mIGltYWdlLiBPbiBmYWlsdXJlLCBkZXN0IGlzIG51bGxwdHIuIE11c3QgaGF2ZSBhbHJlYWR5IGJlZW4KKyogY3JlYXRlZCB1c2luZyBmcmNDcmVhdGVJbWFnZSgpLgorKiBXaGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgY3JlYXRlZCBpbWFnZSwgZGlzcG9zZSBvZiBpdCBieSBjYWxsaW5nCisqIGZyY0Rpc3Bvc2UoKS4KKyogQHBhcmFtIHNvdXJjZSBJbWFnZSB0byBjb3B5CisqCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisqIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNDb3B5SW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpIHsKKyAgcmV0dXJuIGltYXFEdXBsaWNhdGUoZGVzdCwgc291cmNlKTsKK30KKworLyoqCisqIEBicmllZiBDcm9wIGltYWdlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNjYWxlLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfUkdCLAorKiBJTUFRX0lNQUdFX0hTTC4KKyoKKyogQHBhcmFtIGRlc3QgTW9kaWZpZWQgaW1hZ2UKKyogQHBhcmFtIHNvdXJjZSBJbWFnZSB0byBjcm9wCisqIEBwYXJhbSByZWN0IHJlZ2lvbiB0byBwcm9jZXNzLCBvciBJTUFRX05PX1JFQ1QKKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwKKyogR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0Nyb3AoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFJlY3QgcmVjdCkgeworICByZXR1cm4gaW1hcVNjYWxlKGRlc3QsIHNvdXJjZSwgMSwgMSwgSU1BUV9TQ0FMRV9MQVJHRVIsIHJlY3QpOworfQorCisvKioKKyogQGJyaWVmIFNjYWxlcyB0aGUgZW50aXJlIGltYWdlIGxhcmdlciBvciBzbWFsbGVyLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfUkdCLAorKiBJTUFRX0lNQUdFX0hTTC4KKyoKKyogQHBhcmFtIGRlc3QgTW9kaWZpZWQgaW1hZ2UKKyogQHBhcmFtIHNvdXJjZSBJbWFnZSB0byBzY2FsZQorKiBAcGFyYW0geFNjYWxlIHRoZSBob3Jpem9udGFsIHJlZHVjdGlvbiByYXRpbworKiBAcGFyYW0geVNjYWxlIHRoZSB2ZXJ0aWNhbCByZWR1Y3Rpb24gcmF0aW8KKyogQHBhcmFtIHNjYWxlTW9kZSBJTUFRX1NDQUxFX0xBUkdFUiBvciBJTUFRX1NDQUxFX1NNQUxMRVIKKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwKKyogR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1NjYWxlKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgeFNjYWxlLCBpbnQgeVNjYWxlLAorICAgICAgICAgICAgIFNjYWxpbmdNb2RlIHNjYWxlTW9kZSkgeworICBSZWN0IHJlY3QgPSBJTUFRX05PX1JFQ1Q7CisgIHJldHVybiBpbWFxU2NhbGUoZGVzdCwgc291cmNlLCB4U2NhbGUsIHlTY2FsZSwgc2NhbGVNb2RlLCByZWN0KTsKK30KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBpbWFnZSBvYmplY3QgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWxlLiBUaGUgZmlsZSBjYW4gYmUKKyAqIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CisgKiBQTkcsIEpQRUcsIEpQRUcyMDAwLCBUSUZGLCBBSVBELCBvciBCTVAuCisgKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfQ09NUExFWCwKKyAqIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTCwgSU1BUV9JTUFHRV9SR0JfVTY0LgorICoKKyAqIEBwYXJhbSBpbWFnZSBJbWFnZSByZWFkIGluCisgKiBAcGFyYW0gZmlsZU5hbWUgRmlsZSB0byByZWFkLiBDYW5ub3QgYmUgbnVsbHB0cgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisgKiBHZXRMYXN0RXJyb3IoKS4KKyAqLworaW50IGZyY1JlYWRJbWFnZShJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lKSB7CisgIHJldHVybiBpbWFxUmVhZEZpbGUoaW1hZ2UsIGZpbGVOYW1lLCBudWxscHRyLCBudWxscHRyKTsKK30KKworLyoqCisqIEBicmllZiBXcml0ZSBpbWFnZSB0byBhIGZpbGUuCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9DT01QTEVYLAorKiBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wsIElNQVFfSU1BR0VfUkdCX1U2NC4KKyoKKyogVGhlIGZpbGUgdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBleHRlbnNpb24sIGFzIGZvbGxvd3M6CisqCisqIAkJRXh0ZW5zaW9uIAkJCQkJRmlsZSBUeXBlCisqIAkJYWlwZCBvciAuYXBkIAkJCQlBSVBECisqIAkJLmJtcCAJCQkJCQlCTVAKKyogCQkuanBnIG9yIC5qcGVnIAkJCQlKUEVHCisqIAkJLmpwMiAJCQkJCQlKUEVHMjAwMAorKiAJCS5wbmcgCQkJCQkJUE5HCisqIAkJLnRpZiBvciAudGlmZiAJCQkJVElGRgorKgorKgorKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgc3VwcG9ydGVkIGltYWdlIHR5cGVzIGZvciBlYWNoIGZpbGUgdHlwZToKKyoKKyogCQlGaWxlIFR5cGVzIAkJCQkJSW1hZ2UgVHlwZXMKKyogCQlBSVBEIAkJCQkJCWFsbCBpbWFnZSB0eXBlcworKiAJCUJNUCwgSlBFRyAJCQkJCTgtYml0LCBSR0IKKyogCQlQTkcsIFRJRkYsIEpQRUcyMDAwIAkJOC1iaXQsIDE2LWJpdCwgUkdCLCBSR0JVNjQKKyoKKyogQHBhcmFtIGltYWdlIEltYWdlIHRvIHdyaXRlCisqIEBwYXJhbSBmaWxlTmFtZSBGaWxlIHRvIHJlYWQuIENhbm5vdCBiZSBudWxscHRyLiBUaGUgZXh0ZW5zaW9uIGRldGVybWluZXMgdGhlCisqIGZpbGUgZm9ybWF0IHRoYXQgaXMgd3JpdHRlbi4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwKKyogR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1dyaXRlSW1hZ2UoY29uc3QgSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSkgeworICBSR0JWYWx1ZSogY29sb3JUYWJsZSA9IG51bGxwdHI7CisgIHJldHVybiBpbWFxV3JpdGVGaWxlKGltYWdlLCBmaWxlTmFtZSwgY29sb3JUYWJsZSk7Cit9CisKKy8qICBNZWFzdXJlIEludGVuc2l0eSBmdW5jdGlvbnMgKi8KKworLyoqCisqIEBicmllZiBNZWFzdXJlcyB0aGUgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gYSByZWN0YW5nbGUgb2YgYW4gaW1hZ2UuCisqIE91dHB1dHMgaW50ZW5zaXR5IGJhc2VkIHN0YXRpc3RpY3MgYWJvdXQgYW4gaW1hZ2Ugc3VjaCBhcyBNYXgsIE1pbiwgTWVhbiBhbmQKKyogU3RkIERldiBvZiBwaXhlbCB2YWx1ZS4KKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLgorKgorKiAgUGFyYW1ldGVyIERpc2N1c3Npb24JOgorKiAJCVJlbGV2YW50IHBhcmFtZXRlcnMgb2YgdGhlIEhpc3RvZ3JhbVJlcG9ydCBpbmNsdWRlOgorKiAJCQltaW4sIG1heCwgbWVhbiBhbmQgc3RkRGV2CisqCQltaW4vbWF4IJdTZXR0aW5nIGJvdGggbWluIGFuZCBtYXggdG8gMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIHNldAorKiBtaW4gdG8gMAorKiAJCQlhbmQgdGhlIG1heCB0byAyNTUgZm9yIDgtYml0IGltYWdlcyBhbmQgdG8gdGhlIGFjdHVhbAorKiBtaW5pbXVtIHZhbHVlIGFuZAorKiAJCQltYXhpbXVtIHZhbHVlIG9mIHRoZSBpbWFnZSBmb3IgYWxsIG90aGVyIGltYWdlIHR5cGVzLgorKgkJbWF4l1NldHRpbmcgYm90aCBtaW4gYW5kIG1heCB0byAwIGNhdXNlcyB0aGUgZnVuY3Rpb24gdG8gc2V0IG1heAorKiB0byAyNTUKKyogCQkJZm9yIDgtYml0IGltYWdlcyBhbmQgdG8gdGhlIGFjdHVhbCBtYXhpbXVtIHZhbHVlIG9mIHRoZQorKiBpbWFnZSBmb3IKKyogCQkJYWxsIG90aGVyIGltYWdlIHR5cGVzLgorKgorKiBAcGFyYW0gaW1hZ2UgSW1hZ2Ugd2hvc2UgaGlzdG9ncmFtIHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzLgorKiBAcGFyYW0gbnVtQ2xhc3NlcyBUaGUgbnVtYmVyIG9mIGNsYXNzZXMgaW50byB3aGljaCB0aGUgZnVuY3Rpb24gc2VwYXJhdGVzIHRoZQorKiBwaXhlbHMuCisqIERldGVybWluZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGlzdG9ncmFtIGFycmF5IHJldHVybmVkCisqIEBwYXJhbSBtaW4gVGhlIG1pbmltdW0gcGl4ZWwgdmFsdWUgdG8gY29uc2lkZXIgZm9yIHRoZSBoaXN0b2dyYW0uCisqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb3VudCBwaXhlbHMgd2l0aCB2YWx1ZXMgbGVzcyB0aGFuIG1pbi4KKyogQHBhcmFtIG1heCBUaGUgbWF4aW11bSBwaXhlbCB2YWx1ZSB0byBjb25zaWRlciBmb3IgdGhlIGhpc3RvZ3JhbS4KKyogVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvdW50IHBpeGVscyB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gbWF4LgorKiBAcGFyYW0gcmVjdCBSZWdpb24gb2YgaW50ZXJlc3QgaW4gdGhlIGltYWdlLiBJZiBub3QgaW5jbHVkZWQsIHRoZSBlbnRpcmUgaW1hZ2UKKyogaXMgdXNlZC4KKyogQHJldHVybiBPbiBzdWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSByZXBvcnQgZGVzY3JpYmluZyB0aGUgcGl4ZWwgdmFsdWUKKyogY2xhc3NpZmljYXRpb24uCisqIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoZSByZXBvcnQsIGRpc3Bvc2Ugb2YgaXQgYnkgY2FsbGluZyBmcmNEaXNwb3NlKCkuCisqIE9uIGZhaWx1cmUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBudWxscHRyLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sCisqIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqCisqLworSGlzdG9ncmFtUmVwb3J0KiBmcmNIaXN0b2dyYW0oY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywgZmxvYXQgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4KSB7CisgIFJlY3QgcmVjdCA9IElNQVFfTk9fUkVDVDsKKyAgcmV0dXJuIGZyY0hpc3RvZ3JhbShpbWFnZSwgbnVtQ2xhc3NlcywgbWluLCBtYXgsIHJlY3QpOworfQorSGlzdG9ncmFtUmVwb3J0KiBmcmNIaXN0b2dyYW0oY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywgZmxvYXQgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4LCBSZWN0IHJlY3QpIHsKKyAgaW50IHN1Y2Nlc3M7CisgIGludCBmaWxsVmFsdWUgPSAxOworCisgIC8qIGNyZWF0ZSB0aGUgcmVnaW9uIG9mIGludGVyZXN0ICovCisgIFJPSSogcFJvaSA9IGltYXFDcmVhdGVST0koKTsKKyAgc3VjY2VzcyA9IGltYXFBZGRSZWN0Q29udG91cihwUm9pLCByZWN0KTsKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgR2V0TGFzdFZpc2lvbkVycm9yKCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvKiBtYWtlIGEgbWFzayBmcm9tIHRoZSBST0kgKi8KKyAgSW1hZ2UqIHBNYXNrID0gZnJjQ3JlYXRlSW1hZ2UoSU1BUV9JTUFHRV9VOCk7CisgIHN1Y2Nlc3MgPSBpbWFxUk9JVG9NYXNrKHBNYXNrLCBwUm9pLCBmaWxsVmFsdWUsIG51bGxwdHIsIG51bGxwdHIpOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBHZXRMYXN0VmlzaW9uRXJyb3IoKTsKKyAgICBmcmNEaXNwb3NlKF9fRlVOQ1RJT05fXywgcFJvaSwgbnVsbHB0cik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvKiBnZXQgYSBoaXN0b2dyYW0gcmVwb3J0ICovCisgIEhpc3RvZ3JhbVJlcG9ydCogcEhyID0gbnVsbHB0cjsKKyAgcEhyID0gaW1hcUhpc3RvZ3JhbShpbWFnZSwgbnVtQ2xhc3NlcywgbWluLCBtYXgsIHBNYXNrKTsKKworICAvKiBjbGVhbiB1cCAqLworICBmcmNEaXNwb3NlKF9fRlVOQ1RJT05fXywgcFJvaSwgcE1hc2ssIG51bGxwdHIpOworCisgIHJldHVybiBwSHI7Cit9CisKKy8qKgorKiBAYnJpZWYgQ2FsY3VsYXRlcyB0aGUgaGlzdG9ncmFtLCBvciBwaXhlbCBkaXN0cmlidXRpb24sIG9mIGEgY29sb3IgaW1hZ2UuCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTC4KKyoKKyogQHBhcmFtIGltYWdlIEltYWdlIHdob3NlIGhpc3RvZ3JhbSB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcy4KKyogQHBhcmFtIG51bUNsYXNzZXMgVGhlIG51bWJlciBvZiBjbGFzc2VzIGludG8gd2hpY2ggdGhlIGZ1bmN0aW9uIHNlcGFyYXRlcyB0aGUKKyogcGl4ZWxzLgorKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhpc3RvZ3JhbSBhcnJheSByZXR1cm5lZAorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgaW4gd2hpY2ggdG8gcGVyZm9ybSB0aGUgaGlzdG9ncmFtLiBQb3NzaWJsZSB2YWx1ZXMKKyogaW5jbHVkZSBJTUFRX1JHQiBhbmQgSU1BUV9IU0wuCisqIEBwYXJhbSBtYXNrIEFuIG9wdGlvbmFsIG1hc2sgaW1hZ2UuIFRoaXMgaW1hZ2UgbXVzdCBiZSBhbiBJTUFRX0lNQUdFX1U4IGltYWdlLgorKiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgaGlzdG9ncmFtIHVzaW5nIG9ubHkgdGhvc2UgcGl4ZWxzIGluIHRoZSBpbWFnZQorKiB3aG9zZQorKiBjb3JyZXNwb25kaW5nIHBpeGVscyBpbiB0aGUgbWFzayBhcmUgbm9uLXplcm8uIFNldCB0aGlzIHBhcmFtZXRlciB0byBudWxscHRyIHRvCisqIGNhbGN1bGF0ZQorKiB0aGUgaGlzdG9ncmFtIG9mIHRoZSBlbnRpcmUgaW1hZ2UsIG9yIHVzZSB0aGUgc2ltcGxpZmllZCBjYWxsLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlcG9ydCBkZXNjcmliaW5nIHRoZQorKiBjbGFzc2lmaWNhdGlvbgorKiBvZiBlYWNoIHBsYW5lIGluIGEgSGlzdG9ncmFtUmVwb3J0LgorKiBXaGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgcmVwb3J0LCBkaXNwb3NlIG9mIGl0IGJ5IGNhbGxpbmcgZnJjRGlzcG9zZSgpLgorKiBPbiBmYWlsdXJlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbHB0ci4KKyogVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIGltYXFHZXRMYXN0RXJyb3IoKS4KKyovCitDb2xvckhpc3RvZ3JhbVJlcG9ydCogZnJjQ29sb3JIaXN0b2dyYW0oY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvck1vZGUgbW9kZSkgeworICByZXR1cm4gZnJjQ29sb3JIaXN0b2dyYW0oaW1hZ2UsIG51bUNsYXNzZXMsIG1vZGUsIG51bGxwdHIpOworfQorCitDb2xvckhpc3RvZ3JhbVJlcG9ydCogZnJjQ29sb3JIaXN0b2dyYW0oY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvck1vZGUgbW9kZSwgSW1hZ2UqIG1hc2spIHsKKyAgcmV0dXJuIGltYXFDb2xvckhpc3RvZ3JhbTIoKEltYWdlKilpbWFnZSwgbnVtQ2xhc3NlcywgbW9kZSwgbnVsbHB0ciwgbWFzayk7Cit9CisKKy8qKgorKiBAYnJpZWYgTWVhc3VyZXMgdGhlIHBpeGVsIGludGVuc2l0aWVzIGluIGEgcmVjdGFuZ2xlIG9mIGFuIGltYWdlLgorKiBPdXRwdXRzIGludGVuc2l0eSBiYXNlZCBzdGF0aXN0aWNzIGFib3V0IGFuIGltYWdlIHN1Y2ggYXMgTWF4LCBNaW4sIE1lYW4gYW5kCisqIFN0ZCBEZXYgb2YgcGl4ZWwgdmFsdWUuCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTggKGdyYXlzY2FsZSkgSU1BUV9JTUFHRV9SR0IgKGNvbG9yKSBJTUFRX0lNQUdFX0hTTAorKiAoY29sb3ItSFNMKS4KKyoKKyogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB3aG9zZSBwaXhlbCB2YWx1ZSB0aGUgZnVuY3Rpb24gcXVlcmllcworKiBAcGFyYW0gcGl4ZWwgVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwaXhlbCB0aGF0IHRoZSBmdW5jdGlvbiBxdWVyaWVzCisqIEBwYXJhbSB2YWx1ZSBPbiByZXR1cm4sIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIHBpeGVsLiBUaGlzIHBhcmFtZXRlcgorKiBjYW5ub3QgYmUgbnVsbHB0ci4KKyogVGhpcyBkYXRhIHN0cnVjdHVyZSBjb250YWlucyBlaXRoZXIgZ3JheXNjYWxlLCBSR0IsIEhTTCwgQ29tcGxleCBvcgorKiBSR0JVNjRWYWx1ZSBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgaW1hZ2UuCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisqIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNHZXRQaXhlbFZhbHVlKGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgcGl4ZWwsIFBpeGVsVmFsdWUqIHZhbHVlKSB7CisgIHJldHVybiBpbWFxR2V0UGl4ZWwoaW1hZ2UsIHBpeGVsLCB2YWx1ZSk7Cit9CisKKy8qICAgUGFydGljbGUgQW5hbHlzaXMgZnVuY3Rpb25zICovCisKKy8qKgorKiBAYnJpZWYgRmlsdGVycyBwYXJ0aWNsZXMgb3V0IG9mIGFuIGltYWdlIGJhc2VkIG9uIHRoZWlyIG1lYXN1cmVtZW50cy4KKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLgorKgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuIElmIGRlc3QgaXMgdXNlZCwgaXQgbXVzdCBiZSB0aGUgc2FtZSBzaXplCisqIGFzIHRoZSBTb3VyY2UgaW1hZ2UuIEl0IHdpbGwgY29udGFpbiBvbmx5IHRoZSBmaWx0ZXJlZCBwYXJ0aWNsZXMuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIGNvbnRhaW5pbmcgdGhlIHBhcnRpY2xlcyB0byBmaWx0ZXIuCisqIEBwYXJhbSBjcml0ZXJpYSBBbiBhcnJheSBvZiBjcml0ZXJpYSB0byBhcHBseSB0byB0aGUgcGFydGljbGVzIGluIHRoZSBzb3VyY2UKKyogaW1hZ2UuIFRoaXMgYXJyYXkgY2Fubm90IGJlIG51bGxwdHIuCisqIFNlZSB0aGUgTklWaXNpb25DVkkuY2htIGhlbHAgZmlsZSBmb3IgZGVmaW5pdGlvbnMgb2YgY3JpdGVyaWEuCisqIEBwYXJhbSBjcml0ZXJpYUNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNyaXRlcmlhIGFycmF5LgorKiBAcGFyYW0gb3B0aW9ucyBCaW5hcnkgZmlsdGVyIG9wdGlvbnMsIGluY2x1ZGluZyByZWplY3RNYXRjaGVzLCByZWplY3RCb3JkZXIsCisqIGFuZCBjb25uZWN0aXZpdHk4LgorKiBAcGFyYW0gcmVjdCBBcmVhIG9mIGltYWdlIHRvIGZpbHRlci4gSWYgb21pdHRlZCwgdGhlIGRlZmF1bHQgaXMgZW50aXJlIGltYWdlLgorKiBAcGFyYW0gbnVtUGFydGljbGVzIE9uIHJldHVybiwgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgbGVmdCBpbiB0aGUgaW1hZ2UKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwKKyogR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1BhcnRpY2xlRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpY2xlRmlsdGVyQ3JpdGVyaWEyKiBjcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY3JpdGVyaWFDb3VudCwgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zKiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIGludCogbnVtUGFydGljbGVzKSB7CisgIFJlY3QgcmVjdCA9IElNQVFfTk9fUkVDVDsKKyAgcmV0dXJuIGZyY1BhcnRpY2xlRmlsdGVyKGRlc3QsIHNvdXJjZSwgY3JpdGVyaWEsIGNyaXRlcmlhQ291bnQsIG9wdGlvbnMsIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1QYXJ0aWNsZXMpOworfQorCitpbnQgZnJjUGFydGljbGVGaWx0ZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjcml0ZXJpYUNvdW50LCBjb25zdCBQYXJ0aWNsZUZpbHRlck9wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgUmVjdCByZWN0LCBpbnQqIG51bVBhcnRpY2xlcykgeworICBST0kqIHJvaSA9IGltYXFDcmVhdGVST0koKTsKKyAgaW1hcUFkZFJlY3RDb250b3VyKHJvaSwgcmVjdCk7CisgIHJldHVybiBpbWFxUGFydGljbGVGaWx0ZXIzKGRlc3QsIHNvdXJjZSwgY3JpdGVyaWEsIGNyaXRlcmlhQ291bnQsIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvaSwgbnVtUGFydGljbGVzKTsKK30KKworLyoqCisqIEBicmllZiBQZXJmb3JtcyBtb3JwaG9sb2dpY2FsIHRyYW5zZm9ybWF0aW9ucyBvbiBiaW5hcnkgaW1hZ2VzLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LgorKgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuIFRoZSBib3JkZXIgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UgaXMKKyogbm90IGltcG9ydGFudC4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2Ugb24gd2hpY2ggdGhlIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBtb3JwaG9sb2dpY2FsCisqIG9wZXJhdGlvbnMuIFRoZSBjYWxjdWxhdGlvbgorKiBtb2RpZmllcyB0aGUgYm9yZGVyIG9mIHRoZSBzb3VyY2UgaW1hZ2UuIFRoZSBib3JkZXIgbXVzdCBiZSBhdCBsZWFzdCBoYWxmIGFzCisqIGxhcmdlIGFzIHRoZSBsYXJnZXIKKyogZGltZW5zaW9uICBvZiB0aGUgc3RydWN0dXJpbmcgZWxlbWVudC4gIFRoZSBjb25uZWN0ZWQgc291cmNlIGltYWdlIGZvciBhCisqIG1vcnBob2xvZ2ljYWwgdHJhbnNmb3JtYXRpb24KKyogbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgYm9yZGVyIGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGUgc2l6ZSBvZiB0aGUKKyogc3RydWN0dXJpbmcgZWxlbWVudC4KKyogQSAzIGJ5IDMgc3RydWN0dXJpbmcgZWxlbWVudCByZXF1aXJlcyBhIG1pbmltYWwgYm9yZGVyIG9mIDEsIGEgNSBieSA1CisqIHN0cnVjdHVyaW5nIGVsZW1lbnQgcmVxdWlyZXMgYSBtaW5pbWFsIGJvcmRlciBvZiAyLCBhbmQgc28gb24uCisqIEBwYXJhbSBtZXRob2QgVGhlIG1vcnBob2xvZ2ljYWwgdHJhbnNmb3JtIHRvIGFwcGx5LgorKiBAcGFyYW0gc3RydWN0dXJpbmdFbGVtZW50IFRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50IHVzZWQgaW4gdGhlIG9wZXJhdGlvbi4gT21pdAorKiB0aGlzIHBhcmFtZXRlciBpZiB5b3UgZG8gbm90IHdhbnQgYSBjdXN0b20gc3RydWN0dXJpbmcgZWxlbWVudC4KKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwKKyogR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY01vcnBob2xvZ3koSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE1vcnBob2xvZ3lNZXRob2QgbWV0aG9kKSB7CisgIHJldHVybiBpbWFxTW9ycGhvbG9neShkZXN0LCBzb3VyY2UsIG1ldGhvZCwgbnVsbHB0cik7Cit9CisKK2ludCBmcmNNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KSB7CisgIHJldHVybiBpbWFxTW9ycGhvbG9neShkZXN0LCBzb3VyY2UsIG1ldGhvZCwgc3RydWN0dXJpbmdFbGVtZW50KTsKK30KKworLyoqCisqIEBicmllZiBFbGltaW5hdGVzIHBhcnRpY2xlcyB0aGF0IHRvdWNoIHRoZSBib3JkZXIgb2YgdGhlIGltYWdlLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LgorKgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBpbWFnZS4gSWYgdGhlIGltYWdlIGhhcyBhIGJvcmRlciwgdGhlIGZ1bmN0aW9uIHNldHMKKyogYWxsIGJvcmRlciBwaXhlbCB2YWx1ZXMgdG8gMC4KKyogQHBhcmFtIGNvbm5lY3Rpdml0eTggc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGNvbm5lY3Rpdml0eSB1c2VkIGJ5IHRoZSBhbGdvcml0aG0KKyogZm9yIHBhcnRpY2xlIGRldGVjdGlvbi4KKyogVGhlIGNvbm5lY3Rpdml0eSBtb2RlIGRpcmVjdGx5IGRldGVybWluZXMgd2hldGhlciBhbiBhZGphY2VudCBwaXhlbCBiZWxvbmdzIHRvCisqIHRoZSBzYW1lIHBhcnRpY2xlIG9yIGEKKyogZGlmZmVyZW50IHBhcnRpY2xlLiBTZXQgdG8gVFJVRSB0byB1c2UgY29ubmVjdGl2aXR5LTggdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyogcGFydGljbGVzIGFyZSB0b3VjaGluZworKiBTZXQgdG8gRkFMU0UgdG8gdXNlIGNvbm5lY3Rpdml0eS00IHRvIGRldGVybWluZSB3aGV0aGVyIHBhcnRpY2xlcyBhcmUKKyogdG91Y2hpbmcuCisqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBzaW1wbGlmaWVkIGNhbGwgaXMgVFJVRQorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbAorKiBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjUmVqZWN0Qm9yZGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlKSB7CisgIHJldHVybiBpbWFxUmVqZWN0Qm9yZGVyKGRlc3QsIHNvdXJjZSwgVFJVRSk7Cit9CisKK2ludCBmcmNSZWplY3RCb3JkZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIGludCBjb25uZWN0aXZpdHk4KSB7CisgIHJldHVybiBpbWFxUmVqZWN0Qm9yZGVyKGRlc3QsIHNvdXJjZSwgY29ubmVjdGl2aXR5OCk7Cit9CisKKy8qKgorKiBAYnJpZWYgQ291bnRzIHRoZSBudW1iZXIgb2YgcGFydGljbGVzIGluIGEgYmluYXJ5IGltYWdlLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wuCisqIEBwYXJhbSBpbWFnZSBiaW5hcnkgKHRocmVzaG9sZGVkKSBpbWFnZQorKiBAcGFyYW0gbnVtUGFydGljbGVzIE9uIHJldHVybiwgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMuCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisqIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNDb3VudFBhcnRpY2xlcyhJbWFnZSogaW1hZ2UsIGludCogbnVtUGFydGljbGVzKSB7CisgIHJldHVybiBpbWFxQ291bnRQYXJ0aWNsZXMoaW1hZ2UsIDEsIG51bVBhcnRpY2xlcyk7Cit9CisKKy8qKgorKiBAYnJpZWYgQ29uZHVjdCBtZWFzdXJlbWVudHMgZm9yIGEgc2luZ2xlIHBhcnRpY2xlIGluIGFuIGltYWdlcy4KKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLgorKgorKiBAcGFyYW0gaW1hZ2UgaW1hZ2Ugd2l0aCB0aGUgcGFydGljbGUgdG8gYW5hbHl6ZS4gVGhpcyBmdW5jdGlvbiBtb2RpZmllcyB0aGUKKyogc291cmNlIGltYWdlLgorKiBJZiB5b3UgbmVlZCB0aGUgb3JpZ2luYWwgaW1hZ2UsIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGltYWdlIHVzaW5nIGZyY0NvcHkoKQorKiBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyogQHBhcmFtIHBhcnRpY2xlTnVtYmVyIFRoZSBudW1iZXIgb2YgdGhlIHBhcnRpY2xlIHRvIGdldCBpbmZvcm1hdGlvbiBvbgorKiBAcGFyYW0gcGFyIG9uIHJldHVybiwgYSBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dAorKiB0aGUgcGFydGljbGUuIFRoaXMgc3RydWN0dXJlIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgY2FsbGVyLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbAorKiBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjUGFydGljbGVBbmFseXNpcyhJbWFnZSogaW1hZ2UsIGludCBwYXJ0aWNsZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQqIHBhcikgeworICBpbnQgc3VjY2VzcyA9IDA7CisKKyAgLyogaW1hZ2UgaW5mb3JtYXRpb24gKi8KKyAgaW50IGhlaWdodCwgd2lkdGg7CisgIGlmICghaW1hcUdldEltYWdlU2l6ZShpbWFnZSwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgIHJldHVybiBzdWNjZXNzOworICB9CisgIHBhci0+aW1hZ2VXaWR0aCA9IHdpZHRoOworICBwYXItPmltYWdlSGVpZ2h0ID0gaGVpZ2h0OworICBwYXItPnBhcnRpY2xlSW5kZXggPSBwYXJ0aWNsZU51bWJlcjsKKworICAvKiBjZW50ZXIgb2YgbWFzcyBwb2ludCBvZiB0aGUgbGFyZ2VzdCBwYXJ0aWNsZQkqLworICBkb3VibGUgcmV0dXJuRG91YmxlOworICBzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfTVRfQ0VOVEVSX09GX01BU1NfWCwgJnJldHVybkRvdWJsZSk7CisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiBzdWNjZXNzOworICB9CisgIHBhci0+Y2VudGVyX21hc3NfeCA9IChpbnQpcmV0dXJuRG91YmxlOyAgLy8gcGl4ZWwKKworICBzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfTVRfQ0VOVEVSX09GX01BU1NfWSwgJnJldHVybkRvdWJsZSk7CisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiBzdWNjZXNzOworICB9CisgIHBhci0+Y2VudGVyX21hc3NfeSA9IChpbnQpcmV0dXJuRG91YmxlOyAgLy8gcGl4ZWwKKworICAvKiBwYXJ0aWNsZSBzaXplIHN0YXRpc3RpY3MgKi8KKyAgc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0FSRUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR1cm5Eb3VibGUpOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICByZXR1cm4gc3VjY2VzczsKKyAgfQorICBwYXItPnBhcnRpY2xlQXJlYSA9IHJldHVybkRvdWJsZTsKKworICBzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9UT1AsICZyZXR1cm5Eb3VibGUpOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICByZXR1cm4gc3VjY2VzczsKKyAgfQorICBwYXItPmJvdW5kaW5nUmVjdC50b3AgPSAoaW50KXJldHVybkRvdWJsZTsKKworICBzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfTVRfQk9VTkRJTkdfUkVDVF9MRUZULCAmcmV0dXJuRG91YmxlKTsKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKyAgcGFyLT5ib3VuZGluZ1JlY3QubGVmdCA9IChpbnQpcmV0dXJuRG91YmxlOworCisgIHN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9NVF9CT1VORElOR19SRUNUX0hFSUdIVCwgJnJldHVybkRvdWJsZSk7CisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiBzdWNjZXNzOworICB9CisgIHBhci0+Ym91bmRpbmdSZWN0LmhlaWdodCA9IChpbnQpcmV0dXJuRG91YmxlOworCisgIHN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BUV9NVF9CT1VORElOR19SRUNUX1dJRFRILCAmcmV0dXJuRG91YmxlKTsKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKyAgcGFyLT5ib3VuZGluZ1JlY3Qud2lkdGggPSAoaW50KXJldHVybkRvdWJsZTsKKworICAvKiBwYXJ0aWNsZSBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKyAgc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFRX01UX0FSRUFfQllfSU1BR0VfQVJFQSwgJnJldHVybkRvdWJsZSk7CisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiBzdWNjZXNzOworICB9CisgIHBhci0+cGFydGljbGVUb0ltYWdlUGVyY2VudCA9IHJldHVybkRvdWJsZTsKKworICBzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQVFfTVRfQVJFQV9CWV9QQVJUSUNMRV9BTkRfSE9MRVNfQVJFQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldHVybkRvdWJsZSk7CisgIGlmICghc3VjY2VzcykgeworICAgIHJldHVybiBzdWNjZXNzOworICB9CisgIHBhci0+cGFydGljbGVRdWFsaXR5ID0gcmV0dXJuRG91YmxlOworCisgIC8qIG5vcm1hbGl6ZWQgcG9zaXRpb24gKC0xIHRvIDEpICovCisgIHBhci0+Y2VudGVyX21hc3NfeF9ub3JtYWxpemVkID0gUmFuZ2VUb05vcm1hbGl6ZWQocGFyLT5jZW50ZXJfbWFzc194LCB3aWR0aCk7CisgIHBhci0+Y2VudGVyX21hc3NfeV9ub3JtYWxpemVkID0gUmFuZ2VUb05vcm1hbGl6ZWQocGFyLT5jZW50ZXJfbWFzc195LCBoZWlnaHQpOworCisgIHJldHVybiBzdWNjZXNzOworfQorCisvKiAgIEltYWdlIEVuaGFuY2VtZW50IGZ1bmN0aW9ucyAqLworCisvKioKKyogQGJyaWVmIEltcHJvdmVzIGNvbnRyYXN0IG9uIGEgZ3JheXNjYWxlIGltYWdlLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNi4KKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byBlcXVhbGl6ZQorKiBAcGFyYW0gbWluIHRoZSBzbWFsbGVzdCB2YWx1ZSB1c2VkIGZvciBwcm9jZXNzaW5nLiBBZnRlciBwcm9jZXNzaW5nLCBhbGwgcGl4ZWwKKyogdmFsdWVzIHRoYXQgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgTWluaW11bSBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UgYXJlIHNldAorKiB0byAwIGZvciBhbiA4LWJpdCBpbWFnZS4gSW4gMTYtYml0IGFuZCBmbG9hdGluZy1wb2ludCBpbWFnZXMsIHRoZXNlIHBpeGVsCisqIHZhbHVlcyBhcmUgc2V0IHRvIHRoZSBzbWFsbGVzdCBwaXhlbCB2YWx1ZSBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UuCisqIEBwYXJhbSBtYXggdGhlIGxhcmdlc3QgdmFsdWUgdXNlZCBmb3IgcHJvY2Vzc2luZy4gQWZ0ZXIgcHJvY2Vzc2luZywgYWxsIHBpeGVsCisqIHZhbHVlcyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIE1heGltdW0gaW4gdGhlIG9yaWdpbmFsIGltYWdlIGFyZQorKiBzZXQgdG8gMjU1IGZvciBhbiA4LWJpdCBpbWFnZS4gSW4gMTYtYml0IGFuZCBmbG9hdGluZy1wb2ludCBpbWFnZXMsIHRoZXNlIHBpeGVsCisqIHZhbHVlcyBhcmUgc2V0IHRvIHRoZSBsYXJnZXN0IHBpeGVsIHZhbHVlIGZvdW5kIGluIHRoZSBvcmlnaW5hbCBpbWFnZS4KKyogQHBhcmFtIG1hc2sgYW4gOC1iaXQgaW1hZ2UgdGhhdCBzcGVjaWZpZXMgdGhlIHJlZ2lvbiBvZiB0aGUgc21hbGwgaW1hZ2UgdGhhdAorKiB3aWxsIGJlIGNvcGllZC4gT25seSB0aG9zZSBwaXhlbHMgaW4gdGhlIEltYWdlIFNyYyAoU21hbGwpIGltYWdlIHRoYXQKKyogY29ycmVzcG9uZCB0byBhbiBlcXVpdmFsZW50IG5vbi16ZXJvIHBpeGVsIGluIHRoZSBtYXNrIGltYWdlIGFyZSBjb3BpZWQuIEFsbAorKiBvdGhlciBwaXhlbHMga2VlcCB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuIFRoZSBlbnRpcmUgaW1hZ2UgaXMgcHJvY2Vzc2VkIGlmIEltYWdlCisqIE1hc2sgaXMgbnVsbHB0ciBvciB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbAorKiBHZXRMYXN0RXJyb3IoKS4KKyoKKyogIG9wdGlvbiBkZWZhdWx0czoKKyogICAgICAgc2VhcmNoUmVjdCA9IElNQVFfTk9fUkVDVAorKiAJCW1pbk1hdGNoU2NvcmUgPSBERUZBVUxUX01JTk1BWF9TQ09SRSAoODAwKQorKi8KK2ludCBmcmNFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgbWluLCBmbG9hdCBtYXgpIHsKKyAgcmV0dXJuIGZyY0VxdWFsaXplKGRlc3QsIHNvdXJjZSwgbWluLCBtYXgsIG51bGxwdHIpOworfQorCitpbnQgZnJjRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LAorICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlKiBtYXNrKSB7CisgIHJldHVybiBpbWFxRXF1YWxpemUoZGVzdCwgc291cmNlLCBtaW4sIG1heCwgbWFzayk7Cit9CisKKy8qKgorKiBAYnJpZWYgSW1wcm92ZXMgY29udHJhc3Qgb24gYSBjb2xvciBpbWFnZS4KKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMCisqCisqIG9wdGlvbiBkZWZhdWx0czogY29sb3JFcXVhbGl6YXRpb24gPSBUUlVFIHRvIGVxdWFsaXplIGFsbCB0aHJlZSBwbGFuZXMgb2YgdGhlCisqIGltYWdlCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisqIEdldExhc3RFcnJvcigpLgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIGVxdWFsaXplCisqIEBwYXJhbSBjb2xvckVxdWFsaXphdGlvbiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gVFJVRSB0byBlcXVhbGl6ZSBhbGwgdGhyZWUKKyogcGxhbmVzIG9mIHRoZSBpbWFnZSAodGhlIGRlZmF1bHQpLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gRkFMU0UgdG8gZXF1YWxpemUgb25seQorKiB0aGUgbHVtaW5hbmNlIHBsYW5lLgorKi8KK2ludCBmcmNDb2xvckVxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKSB7CisgIHJldHVybiBpbWFxQ29sb3JFcXVhbGl6ZShkZXN0LCBzb3VyY2UsIFRSVUUpOworfQorCitpbnQgZnJjQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbG9yRXF1YWxpemF0aW9uKSB7CisgIHJldHVybiBpbWFxQ29sb3JFcXVhbGl6ZShkZXN0LCBzb3VyY2UsIFRSVUUpOworfQorCisvKiAgIEltYWdlIENvbnZlcnNpb24gZnVuY3Rpb25zICovCisKKy8qKgorKiBAYnJpZWYgQXV0b21hdGljYWxseSB0aHJlc2hvbGRzIGEgZ3JheXNjYWxlIGltYWdlIGludG8gYSBiaW5hcnkgaW1hZ2UgZm9yCisqIFBhcnRpY2xlIEFuYWx5c2lzIGJhc2VkIG9uIGEgc21hcnQgdGhyZXNob2xkLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9JMTYKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQKKyogQHBhcmFtIHdpbmRvd1dpZHRoIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwgb24KKyogd2hpY2ggdGhlIGZ1bmN0aW9uCisqICBwZXJmb3JtcyB0aGUgbG9jYWwgdGhyZXNob2xkLiBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDMgYW5kIGNhbm5vdCBiZQorKiBsYXJnZXIgdGhhbiB0aGUgd2lkdGggb2Ygc291cmNlCisqIEBwYXJhbSB3aW5kb3dIZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwgb24KKyogd2hpY2ggdGhlIGZ1bmN0aW9uCisqIHBlcmZvcm1zIHRoZSBsb2NhbCB0aHJlc2hvbGQuIFRoaXMgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgMyBhbmQgY2Fubm90IGJlCisqIGxhcmdlciB0aGFuIHRoZSBoZWlnaHQgb2Ygc291cmNlCisqIEBwYXJhbSBtZXRob2QgU3BlY2lmaWVzIHRoZSBsb2NhbCB0aHJlc2hvbGRpbmcgbWV0aG9kIHRoZSBmdW5jdGlvbiB1c2VzLiBWYWx1ZQorKiBjYW4gYmUgSU1BUV9OSUJMQUNLCisqICh3aGljaCBjb21wdXRlcyB0aHJlc2hvbGRzIGZvciBlYWNoIHBpeGVsIGJhc2VkIG9uIGl0cyBsb2NhbCBzdGF0aXN0aWNzIHVzaW5nCisqIHRoZSBOaWJsYWNrIGxvY2FsIHRocmVzaG9sZGluZworKiBhbGdvcml0aG0uKSwgb3IgSU1BUV9CQUNLR1JPVU5EX0NPUlJFQ1RJT04gKHdoaWNoIGRvZXMgYmFja2dyb3VuZCBjb3JyZWN0aW9uCisqIGZpcnN0IHRvIGVsaW1pbmF0ZSBub24tdW5pZm9ybQorKiBsaWdodGluZyBlZmZlY3RzLCB0aGVuIHBlcmZvcm1zIHRocmVzaG9sZGluZyB1c2luZyB0aGUgT3RzdSB0aHJlc2hvbGRpbmcKKyogYWxnb3JpdGhtKQorKiBAcGFyYW0gZGV2aWF0aW9uV2VpZ2h0IFNwZWNpZmllcyB0aGUgayBjb25zdGFudCB1c2VkIGluIHRoZSBOaWJsYWNrIGxvY2FsCisqIHRocmVzaG9sZGluZyBhbGdvcml0aG0sIHdoaWNoCisqIGRldGVybWluZXMgdGhlIHdlaWdodCBhcHBsaWVkIHRvIHRoZSB2YXJpYW5jZSBjYWxjdWxhdGlvbi4gVmFsaWQgayBjb25zdGFudHMKKyogcmFuZ2UgZnJvbSAwIHRvIDEuIFNldHRpbmcKKyogdGhpcyB2YWx1ZSB0byAwIHdpbGwgaW5jcmVhc2UgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBmdW5jdGlvbiBiZWNhdXNlIHRoZQorKiBmdW5jdGlvbiB3aWxsIG5vdCBjYWxjdWxhdGUgdGhlCisqIHZhcmlhbmNlIGZvciBhbnkgb2YgdGhlIHBpeGVscy4gVGhlIGZ1bmN0aW9uIGlnbm9yZXMgdGhpcyB2YWx1ZSBpZiBtZXRob2QgaXMKKyogbm90IHNldCB0byBJTUFRX05JQkxBQ0sKKyogQHBhcmFtIHR5cGUgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIG9iamVjdHMgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGxvb2suIFZhbHVlcworKiBjYW4gYmUgSU1BUV9CUklHSFRfT0JKRUNUUworKiBvciBJTUFRX0RBUktfT0JKRUNUUy4KKyogQHBhcmFtIHJlcGxhY2VWYWx1ZSBTcGVjaWZpZXMgdGhlIHJlcGxhY2VtZW50IHZhbHVlIHRoZSBmdW5jdGlvbiB1c2VzIGZvciB0aGUKKyogcGl4ZWxzIG9mIHRoZSBrZXB0IG9iamVjdHMKKyogaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbAorKiBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjU21hcnRUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHdpbmRvd1dpZHRoLCB1bnNpZ25lZCBpbnQgd2luZG93SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIExvY2FsVGhyZXNob2xkTWV0aG9kIG1ldGhvZCwgZG91YmxlIGRldmlhdGlvbldlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBPYmplY3RUeXBlIHR5cGUpIHsKKyAgZmxvYXQgcmVwbGFjZVZhbHVlID0gMS4wOworICByZXR1cm4gaW1hcUxvY2FsVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCwgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmlhdGlvbldlaWdodCwgdHlwZSwgcmVwbGFjZVZhbHVlKTsKK30KKworaW50IGZyY1NtYXJ0VGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB3aW5kb3dXaWR0aCwgdW5zaWduZWQgaW50IHdpbmRvd0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBMb2NhbFRocmVzaG9sZE1ldGhvZCBtZXRob2QsIGRvdWJsZSBkZXZpYXRpb25XZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSB0eXBlLCBmbG9hdCByZXBsYWNlVmFsdWUpIHsKKyAgcmV0dXJuIGltYXFMb2NhbFRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQsIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpYXRpb25XZWlnaHQsIHR5cGUsIHJlcGxhY2VWYWx1ZSk7Cit9CisKKy8qKgorKiBAYnJpZWYgQ29udmVydHMgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYSBiaW5hcnkgaW1hZ2UgZm9yIFBhcnRpY2xlIEFuYWx5c2lzCisqIGJhc2VkIG9uIGEgZml4ZWQgdGhyZXNob2xkLgorKiBUaGUgZnVuY3Rpb24gc2V0cyBwaXhlbHMgdmFsdWVzIG91dHNpZGUgb2YgdGhlIGdpdmVuIHJhbmdlIHRvIDAuIFRoZSBmdW5jdGlvbgorKiBzZXRzIHBpeGVsIHZhbHVlcworKiB3aXRoaW4gdGhlIHJhbmdlIHRvIGEgZ2l2ZW4gdmFsdWUgb3IgbGVhdmVzIHRoZSB2YWx1ZXMgdW5jaGFuZ2VkLgorKiBVc2UgdGhlIHNpbXBsaWZpZWQgY2FsbCB0byBsZWF2ZSBwaXhlbCB2YWx1ZXMgdW5jaGFuZ2VkLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9JMTYuCisqCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkCisqIEBwYXJhbSByYW5nZU1pbiBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIG9mIHBpeGVsIHZhbHVlcyB0byBrZWVwCisqIEBwYXJhbSByYW5nZU1heCBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIG9mIHBpeGVsIHZhbHVlcyB0byBrZWVwLgorKgorKiBAcmV0dXJuIGludCAtIGVycm9yIGNvZGU6IDAgPSBlcnJvci4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisqIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNTaW1wbGVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IHJhbmdlTWluLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByYW5nZU1heCkgeworICBpbnQgbmV3VmFsdWUgPSAyNTU7CisgIHJldHVybiBmcmNTaW1wbGVUaHJlc2hvbGQoZGVzdCwgc291cmNlLCByYW5nZU1pbiwgcmFuZ2VNYXgsIG5ld1ZhbHVlKTsKK30KKworLyoqCisqIEBicmllZiBDb252ZXJ0cyBhIGdyYXlzY2FsZSBpbWFnZSB0byBhIGJpbmFyeSBpbWFnZSBmb3IgUGFydGljbGUgQW5hbHlzaXMKKyogYmFzZWQgb24gYSBmaXhlZCB0aHJlc2hvbGQuCisqIFRoZSBmdW5jdGlvbiBzZXRzIHBpeGVscyB2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgZ2l2ZW4gcmFuZ2UgdG8gMC4gVGhlIGZ1bmN0aW9uCisqIHNldHMKKyogcGl4ZWwgdmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgdG8gdGhlIGdpdmVuIHZhbHVlLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9JMTYuCisqCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkCisqIEBwYXJhbSByYW5nZU1pbiBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIG9mIHBpeGVsIHZhbHVlcyB0byBrZWVwCisqIEBwYXJhbSByYW5nZU1heCBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIG9mIHBpeGVsIHZhbHVlcyB0byBrZWVwLgorKiBAcGFyYW0gbmV3VmFsdWUgVGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciBwaXhlbHMgd2l0aGluIHRoZSByYW5nZS4gVXNlIHRoZQorKiBzaW1wbGlmaWVkIGNhbGwgdG8gbGVhdmUgdGhlIHBpeGVsIHZhbHVlcyB1bmNoYW5nZWQKKyoKKyogQHJldHVybiBpbnQgLSBlcnJvciBjb2RlOiAwID0gZXJyb3IuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbAorKiBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjU2ltcGxlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCByYW5nZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmFuZ2VNYXgsIGZsb2F0IG5ld1ZhbHVlKSB7CisgIGludCB1c2VOZXdWYWx1ZSA9IFRSVUU7CisgIHJldHVybiBpbWFxVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmFuZ2VNaW4sIHJhbmdlTWF4LCB1c2VOZXdWYWx1ZSwgbmV3VmFsdWUpOworfQorCisvKioKKyogQGJyaWVmIEFwcGxpZXMgYSB0aHJlc2hvbGQgdG8gdGhlIFJlZCwgR3JlZW4sIGFuZCBCbHVlIHZhbHVlcyBvZiBhIFJHQiBpbWFnZQorKiBvciB0aGUgSHVlLAorKiBTYXR1cmF0aW9uLCBMdW1pbmFuY2UgdmFsdWVzIGZvciBhIEhTTCBpbWFnZS4KKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiBUaGlzIHNpbXBsZXIgdmVyc2lvbiBmaWx0ZXJzIGJhc2VkIG9uIGEgaHVlIHJhbmdlIGluIHRoZSBIU0wgbW9kZS4KKyoKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLiBUaGlzIG11c3QgYmUgYSBJTUFRX0lNQUdFX1U4IGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQKKyogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIHNwYWNlIHRvIHBlcmZvcm0gdGhlIHRocmVzaG9sZCBpbi4gdmFsaWQgdmFsdWVzIGFyZToKKyogSU1BUV9SR0IsIElNQVFfSFNMLgorKiBAcGFyYW0gcGxhbmUxUmFuZ2UgVGhlIHNlbGVjdGlvbiByYW5nZSBmb3IgdGhlIGZpcnN0IHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0CisqIHRoaXMgcGFyYW1ldGVyIHRvIG51bGxwdHIgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIEBwYXJhbSBwbGFuZTJSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgc2Vjb25kIHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0CisqIHRoaXMgcGFyYW1ldGVyIHRvIG51bGxwdHIgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIEBwYXJhbSBwbGFuZTNSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgdGhpcmQgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQKKyogdGhpcyBwYXJhbWV0ZXIgdG8gbnVsbHB0ciB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwKKyogR2V0TGFzdEVycm9yKCkuCisqICovCitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbG9yTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhbmdlKiBwbGFuZTFSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lMlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSkgeworICBpbnQgcmVwbGFjZVZhbHVlID0gMTsKKyAgcmV0dXJuIGltYXFDb2xvclRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHJlcGxhY2VWYWx1ZSwgbW9kZSwgcGxhbmUxUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUyUmFuZ2UsIHBsYW5lM1JhbmdlKTsKK30KKworLyoqCisqIEBicmllZiBBcHBsaWVzIGEgdGhyZXNob2xkIHRvIHRoZSBSZWQsIEdyZWVuLCBhbmQgQmx1ZSB2YWx1ZXMgb2YgYSBSR0IgaW1hZ2UKKyogb3IgdGhlIEh1ZSwKKyogU2F0dXJhdGlvbiwgTHVtaW5hbmNlIHZhbHVlcyBmb3IgYSBIU0wgaW1hZ2UuCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTC4KKyogVGhlIHNpbXBsZXIgdmVyc2lvbiBmaWx0ZXJzIGJhc2VkIG9uIGEgaHVlIHJhbmdlIGluIHRoZSBIU0wgbW9kZS4KKyoKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLiBUaGlzIG11c3QgYmUgYSBJTUFRX0lNQUdFX1U4IGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQKKyogQHBhcmFtIHJlcGxhY2VWYWx1ZSBWYWx1ZSB0byBhc3NpZ24gdG8gc2VsZWN0ZWQgcGl4ZWxzLiBEZWZhdWx0cyB0byAxIGlmCisqIHNpbXBsaWZpZWQgY2FsbCBpcyB1c2VkLgorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgdG8gcGVyZm9ybSB0aGUgdGhyZXNob2xkIGluLiB2YWxpZCB2YWx1ZXMgYXJlOgorKiBJTUFRX1JHQiwgSU1BUV9IU0wuCisqIEBwYXJhbSBwbGFuZTFSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgZmlyc3QgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQKKyogdGhpcyBwYXJhbWV0ZXIgdG8gbnVsbHB0ciB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogQHBhcmFtIHBsYW5lMlJhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSBzZWNvbmQgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQKKyogdGhpcyBwYXJhbWV0ZXIgdG8gbnVsbHB0ciB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogQHBhcmFtIHBsYW5lM1JhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSB0aGlyZCBwbGFuZSBvZiB0aGUgaW1hZ2UuIFNldAorKiB0aGlzIHBhcmFtZXRlciB0byBudWxscHRyIHRvIHVzZSBhIHNlbGVjdGlvbiByYW5nZSBmcm9tIDAgdG8gMjU1LgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbAorKiBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCByZXBsYWNlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgQ29sb3JNb2RlIG1vZGUsIGNvbnN0IFJhbmdlKiBwbGFuZTFSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSkgeworICByZXR1cm4gaW1hcUNvbG9yVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmVwbGFjZVZhbHVlLCBtb2RlLCBwbGFuZTFSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZTJSYW5nZSwgcGxhbmUzUmFuZ2UpOworfQorCisvKioKKyogQGJyaWVmIEEgc2ltcGxlciB2ZXJzaW9uIG9mIENvbG9yVGhyZXNob2xkIHRoYXQgdGhyZXNob2xkcyBodWUgcmFuZ2UgaW4gdGhlCisqIEhTTCBtb2RlLiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wuCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkCisqIEBwYXJhbSBodWVSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgaHVlIChjb2xvcikuCisqIEBwYXJhbSBtaW5TYXR1cmF0aW9uIFRoZSBtaW5pbXVtIHNhdHVyYXRpb24gdmFsdWUgKDEtMjU1KS4gIElmIG5vdCB1c2VkLAorKiBERUZBVUxUX1NBVFVSQVRJT05fVEhSRVNIT0xEIGlzIHRoZSBkZWZhdWx0LgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbAorKiBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjSHVlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBSYW5nZSogaHVlUmFuZ2UpIHsKKyAgcmV0dXJuIGZyY0h1ZVRocmVzaG9sZChkZXN0LCBzb3VyY2UsIGh1ZVJhbmdlLCBERUZBVUxUX1NBVFVSQVRJT05fVEhSRVNIT0xEKTsKK30KKworaW50IGZyY0h1ZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUmFuZ2UqIGh1ZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbWluU2F0dXJhdGlvbikgeworICAvLyBhc3N1bWUgSFNMIG1vZGUKKyAgQ29sb3JNb2RlIG1vZGUgPSBJTUFRX0hTTDsKKyAgLy8gU2V0IHNhdHVyYXRpb24gMTAwIC0gMjU1CisgIFJhbmdlIHNhdFJhbmdlOworICBzYXRSYW5nZS5taW5WYWx1ZSA9IG1pblNhdHVyYXRpb247CisgIHNhdFJhbmdlLm1heFZhbHVlID0gMjU1OworICAvLyBTZXQgbHVtaW5hbmNlIDEwMCAtIDI1NQorICBSYW5nZSBsdW1SYW5nZTsKKyAgbHVtUmFuZ2UubWluVmFsdWUgPSAxMDA7CisgIGx1bVJhbmdlLm1heFZhbHVlID0gMjU1OworICAvLyBSZXBsYWNlIHBpeGVscyB3aXRoIDEgaWYgcGFzcyB0aHJlc2hvbGQgZmlsdGVyCisgIGludCByZXBsYWNlVmFsdWUgPSAxOworICByZXR1cm4gaW1hcUNvbG9yVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmVwbGFjZVZhbHVlLCBtb2RlLCBodWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2F0UmFuZ2UsICZsdW1SYW5nZSk7Cit9CisKKy8qKgorKiBAYnJpZWYgRXh0cmFjdHMgdGhlIFJlZCwgR3JlZW4sIEJsdWUsIG9yIEh1ZSwgU2F0dXJhdGlvbiBvciBMdW1pbmFuY2UKKyogaW5mb3JtYXRpb24gZnJvbSBhIGNvbG9yIGltYWdlLgorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wsIElNQVFfSU1BR0VfUkdCX1U2NC4KKyoKKyogQHBhcmFtIGltYWdlIFRoZSBzb3VyY2UgaW1hZ2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lcyBmcm9tLgorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lcyBmcm9tLiBWYWxpZAorKiB2YWx1ZXMgYXJlIElNQVFfUkdCLCBJTUFRX0hTTCwgSU1BUV9IU1YsIElNQVFfSFNJLgorKiBAcGFyYW0gcGxhbmUxIE9uIHJldHVybiwgdGhlIGZpcnN0IGV4dHJhY3RlZCBwbGFuZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIG51bGxwdHIKKyogaWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFJHQi1SZWQsIEhTTC9IU1YvSFNJLUh1ZS4KKyogQHBhcmFtIHBsYW5lMiBPbiByZXR1cm4sIHRoZSBzZWNvbmQgZXh0cmFjdGVkIHBsYW5lLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8KKyogbnVsbHB0ciBpZiB5b3UgZG8gbm90IG5lZWQgdGhpcyBpbmZvcm1hdGlvbi4gUkdCLUdyZWVuLCBIU0wvSFNWL0hTSS1TYXR1cmF0aW9uLgorKiBAcGFyYW0gcGxhbmUzIE9uIHJldHVybiwgdGhlIHRoaXJkIGV4dHJhY3RlZCBwbGFuZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIG51bGxwdHIKKyogaWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFJHQi1CbHVlLCBIU0wtTHVtaW5hbmNlLCBIU1YtVmFsdWUsCisqIEhTSS1JbnRlbnNpdHkuCisqCisqIEByZXR1cm4gZXJyb3IgY29kZTogMCA9IGVycm9yLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwKKyogR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0V4dHJhY3RDb2xvclBsYW5lcyhjb25zdCBJbWFnZSogaW1hZ2UsIENvbG9yTW9kZSBtb2RlLCBJbWFnZSogcGxhbmUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSogcGxhbmUyLCBJbWFnZSogcGxhbmUzKSB7CisgIHJldHVybiBpbWFxRXh0cmFjdENvbG9yUGxhbmVzKGltYWdlLCBtb2RlLCBwbGFuZTEsIHBsYW5lMiwgcGxhbmUzKTsKK30KKworLyoqCisqIEBicmllZiBFeHRyYWN0cyB0aGUgSHVlIGluZm9ybWF0aW9uIGZyb20gYSBjb2xvciBpbWFnZS4gU3VwcG9ydHMKKyogSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLCBJTUFRX0lNQUdFX1JHQl9VNjQKKyoKKyogQHBhcmFtIGltYWdlIFRoZSBzb3VyY2UgaW1hZ2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lIGZyb20uCisqIEBwYXJhbSBodWVQbGFuZSBPbiByZXR1cm4sIHRoZSBleHRyYWN0ZWQgaHVlIHBsYW5lLgorKiBAcGFyYW0gbWluU2F0dXJhdGlvbiB0aGUgbWluaW11bSBzYXR1cmF0aW9uIGxldmVsIHJlcXVpcmVkIDAtMjU1ICh0cnkgNTApCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsCisqIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNFeHRyYWN0SHVlUGxhbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZSogaHVlUGxhbmUpIHsKKyAgcmV0dXJuIGZyY0V4dHJhY3RIdWVQbGFuZShpbWFnZSwgaHVlUGxhbmUsIERFRkFVTFRfU0FUVVJBVElPTl9USFJFU0hPTEQpOworfQorCitpbnQgZnJjRXh0cmFjdEh1ZVBsYW5lKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2UqIGh1ZVBsYW5lLCBpbnQgbWluU2F0dXJhdGlvbikgeworICByZXR1cm4gZnJjRXh0cmFjdENvbG9yUGxhbmVzKGltYWdlLCBJTUFRX0hTTCwgaHVlUGxhbmUsIG51bGxwdHIsIG51bGxwdHIpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9hdGhlbmEuZ3JhZGxlIGIvd3BpbGliYy9hdGhlbmEuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDljNWQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL2F0aGVuYS5ncmFkbGUKQEAgLTAsMCArMSwxMTUgQEAKK2RlZmluZU5ldHdvcmtUYWJsZXNQcm9wZXJ0aWVzKCkKKworbW9kZWwgeworICAgIGNvbXBvbmVudHMgeworICAgICAgICB3cGlsaWJfbm9uc2hhcmVkKE5hdGl2ZUxpYnJhcnlTcGVjKSB7CisgICAgICAgICAgICB0YXJnZXRQbGF0Zm9ybSAnYXJtJworICAgICAgICAgICAgYmluYXJpZXMuYWxsIHsKKyAgICAgICAgICAgICAgICB0YXNrcy53aXRoVHlwZShDcHBDb21waWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBhZGROaUxpYnJhcnlMaW5rcworICAgICAgICAgICAgICAgICAgICBkZXBlbmRzT24gYWRkTmV0d29ya1RhYmxlc0xpYnJhcnlMaW5rcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNvdXJjZXMgeworICAgICAgICAgICAgICAgIGNwcCB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWyIke3Byb2plY3Quc2hhcmVkfS9zcmMiLCAiJHtwcm9qZWN0LmF0aGVuYX0vc3JjIl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gWycqKi8qLmNwcCddCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbIiR7cHJvamVjdC5zaGFyZWR9L2luY2x1ZGUiLCAiJHtwcm9qZWN0LmF0aGVuYX0vaW5jbHVkZSIsIG5ldFRhYmxlc0luY2x1ZGVdCisgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IFsnKiovKi5oJ10KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsaWIgcHJvamVjdDogJzpoYWwnLCBsaWJyYXJ5OiAnSEFMQXRoZW5hJywgbGlua2FnZTogJ3N0YXRpYycKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Rhc2sgd3BpbGliY1ppcCh0eXBlOiBaaXApIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdaaXBzIGFsbCBvZiB0aGUgbGlicmFyaWVzIGZvciB3cGlsaWJjJworICAgIGdyb3VwID0gJ1dQSUxpYicKKyAgICBiYXNlTmFtZSA9ICd3cGlsaWJjJworICAgIGRlc3RpbmF0aW9uRGlyID0gcHJvamVjdC5idWlsZERpcgorCisgICAgLy8gSW5jbHVkZSB0aGUgc3RhdGljIGxpYnJhcnkgZmlsZSBhbmQgaGVhZGVyIGZpbGVzIGZyb20gdGhpcyBwcm9qZWN0CisgICAgYmluYXJpZXMud2l0aFR5cGUoU3RhdGljTGlicmFyeUJpbmFyeVNwZWMpIHsgc3BlYyAtPgorICAgICAgICBzcGVjLmhlYWRlckRpcnMuZWFjaCB7CisgICAgICAgICAgICBmcm9tKGl0KSB7CisgICAgICAgICAgICAgICAgaW50byAnaW5jbHVkZScKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcm9tKHNwZWMuc3RhdGljTGlicmFyeUZpbGUpIHsKKyAgICAgICAgICAgIGludG8gJ2xpYicKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEluY2x1ZGUgdGhlIHN0YXRpYyBsaWJyYXJ5IGZpbGUgYW5kIHNoYXJlZCBsaWJyYXJ5IG9iamVjdCBmcm9tIGhhbCBwcm9qZWN0CisgICAgZGVmIGhhbCA9IHByb2plY3QoJzpoYWwnKQorICAgIGhhbC5iaW5hcmllcy53aXRoVHlwZShTdGF0aWNMaWJyYXJ5QmluYXJ5U3BlYykgeyBzcGVjIC0+CisgICAgICAgIHNwZWMuaGVhZGVyRGlycy5lYWNoIHsKKyAgICAgICAgICAgIGZyb20oaXQpIHsKKyAgICAgICAgICAgICAgICBpbnRvICdpbmNsdWRlJworICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBhbnkgb2YgdGhlIC5jcHAgZmlsZXMgdGhhdCBhcmUgaW4gc29tZSBvZiB0aGUgaGVhZGVyIGRpcmVjdG9yaWVzCisgICAgICAgICAgICAgICAgZXhjbHVkZSAnKiovKi5jcHAnCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJvbShzcGVjLnN0YXRpY0xpYnJhcnlGaWxlKSB7CisgICAgICAgICAgICBpbnRvICdsaWInCisgICAgICAgIH0KKyAgICB9CisgICAgaGFsLmJpbmFyaWVzLndpdGhUeXBlKFNoYXJlZExpYnJhcnlCaW5hcnlTcGVjKSB7IHNwZWMgLT4KKyAgICAgICAgZnJvbShzcGVjLnNoYXJlZExpYnJhcnlGaWxlKSB7CisgICAgICAgICAgICBpbnRvICdsaWInCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbmNsdWRlIHRoZSBudGNvcmUgc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzCisgICAgZnJvbShuZXRTaGFyZWRMaWIpIHsKKyAgICAgICAgaW50byAnbGliJworICAgIH0KKyAgICBmcm9tKG5ldFN0YXRpY0xpYikgeworICAgICAgICBpbnRvICdsaWInCisgICAgfQorCisgICAgLy8gV2UgcmVuYW1lIHRoZSBsaWJIQUxBdGhlbmEuc28gb2JqZWN0IHRvIGxpYkhBTEF0aGVuYV9zaGFyZWQuc28sIGFuZCB0aGUgc2FtZSBmb3IgbGlibnRjb3JlLnNvCisgICAgcmVuYW1lKCcobGliSEFMQXRoZW5hKSguc28pJywgJyQxX3NoYXJlZCQyJykKKyAgICByZW5hbWUoJyhsaWJudGNvcmUpKC5zbyknLCAnJDFfc2hhcmVkJDInKQorCisgICAgLy8gRmluYWxseSwgaW5jbHVkZSBhbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IG9iamVjdHMgZnJvbSB0aGUgbmkgZGlyZWN0b3J5CisgICAgZnJvbShwcm9qZWN0LmZpbGUoJy4uL25pLWxpYnJhcmllcycpKSB7CisgICAgICAgIGludG8gJ2xpYicKKyAgICAgICAgZXhjbHVkZSAnZ2VubGlua3MnCisgICAgfQorfQorCisvLyBBZGQgdGhlIGRlcGVuZGVuY3kgb24gdGhlIHdwaWxpYl9ub25zaGFyZWRTdGF0aWNMaWJyYXJ5IHRhc2sgdG8gdGhlIHdwaWxpYmMgdGFzay4gQmVjYXVzZSBvZiB0aGUgZ3JhZGxlIGxpZmVjeWNsZSwKKy8vIHRoaXMgY2Fubm90IGJlIGRvbmUgcHVyZWx5IHdpdGggZGVwZW5kc09uIGluIHRoZSB0YXNrLCBhcyB0aGUgc3RhdGljIGxpYnJhcnkgdGFzayBkb2Vzbid0IGV4aXN0IHlldC4gU2FtZSBnb2VzIGZvcgorLy8gdGhlIG5ldHdvcmtUYWJsZXNTdGF0aWNMaWJyYXJ5IHRhc2sgYW5kIHRoZSB0d28gSEFMIHRhc2tzIGJlbG93Cit0YXNrcy53aGVuVGFza0FkZGVkIHsgdGFzayAtPgorICAgIGlmICh0YXNrLm5hbWUgPT0gJ3dwaWxpYl9ub25zaGFyZWRTdGF0aWNMaWJyYXJ5JykgeworICAgICAgICB3cGlsaWJjWmlwLmRlcGVuZHNPbiB0YXNrCisgICAgfQorfQorCisKKy8vIEFkZCB0aGUgaGFsIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBhcyBhIGRlcGVuZGVuY3kKK3Byb2plY3QoJzpoYWwnKS50YXNrcy53aGVuVGFza0FkZGVkIHsgdGFzayAtPgorICAgIGlmICh0YXNrLm5hbWUgPT0gJ2hBTEF0aGVuYVN0YXRpY0xpYnJhcnknIHx8IHRhc2submFtZSA9PSAnaEFMQXRoZW5hU2hhcmVkTGlicmFyeScpIHsKKyAgICAgICAgd3BpbGliY1ppcC5kZXBlbmRzT24gdGFzaworICAgIH0KK30KKworcHVibGlzaGluZyB7CisgICAgcHVibGljYXRpb25zIHsKKyAgICAgICAgd3BpbGliYyhNYXZlblB1YmxpY2F0aW9uKSB7CisgICAgICAgICAgICBhcnRpZmFjdCB3cGlsaWJjWmlwCisgICAgICAgICAgICBncm91cElkICdlZHUud3BpLmZpcnN0LndwaWxpYi5jbWFrZScKKyAgICAgICAgICAgIGFydGlmYWN0SWQgJ2NwcC1yb290JworICAgICAgICAgICAgdmVyc2lvbiAnMS4wLjAnCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZXR1cFdwaWxpYlJlcG8oaXQpCit9CmRpZmYgLS1naXQgYS93cGlsaWJjL2J1aWxkLmdyYWRsZSBiL3dwaWxpYmMvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzVjYWQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDIyIEBACithcHBseSBwbHVnaW46ICdjcHAnCithcHBseSBwbHVnaW46ICdtYXZlbi1wdWJsaXNoJworCitldmFsdWF0aW9uRGVwZW5kc09uKCc6aGFsJykKKworZXh0LnNoYXJlZCA9ICdzaGFyZWQnCitleHQuYXRoZW5hID0gJ0F0aGVuYScKK2V4dC5zaW11bGF0aW9uID0gJ3NpbWx1YXRpb24nCisKKy8vIEF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhlIGRveHlnZW4gY29tbWFuZC4gSWYgdGhlcmUgaXMgbm8gZXhjZXB0aW9uLCBkb3h5Z2VuIGV4aXN0cywgc28gcmV0dXJuIHRydWUuIElmIHRoZXJlJ3MKKy8vIGFuIElPRXhjZXB0aW9uLCBpdCBkb2Vzbid0IGV4aXN0LCBzbyByZXR1cm4gZmFsc2UKK2Jvb2xlYW4gY2hlY2tEb3h5Z2VuKCkgeworICAgIHRyeSB7CisgICAgICAgICdkb3h5Z2VuJy5leGVjdXRlKCkKKyAgICAgICAgdHJ1ZQorICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZmFsc2UKKyAgICB9Cit9CisKK2FwcGx5IGZyb206ICdhdGhlbmEuZ3JhZGxlJworYXBwbHkgZnJvbTogJ3NpbXVsYXRpb24uZ3JhZGxlJwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CYXNlLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI4MDZmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CYXNlLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKy8vIE1TVkMgMjAxMyBkb2Vzbid0IGFsbG93ICI9IGRlZmF1bHQiIG9uIG1vdmUgY29uc3RydWN0b3JzLCBidXQgc2luY2Ugd2UgYXJlCisvLyAoY3VycmVudGx5KSBvbmx5IGFjdHVhbGx5IHVzaW5nIHRoZSBtb3ZlIGNvbnN0cnVjdG9ycyBpbiBub24tTVNWQyBzaXR1YXRpb25zCisvLyAoaWUsIHdwaWxpYkMrK0RldmljZXMpLCB3ZSBjYW4ganVzdCBpZ25vcmUgaXQgaW4gTVNWQy4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgREVGQVVMVF9NT1ZFX0NPTlNUUlVDVE9SKENsYXNzTmFtZSkgICAgIFwKK0NsYXNzTmFtZShDbGFzc05hbWUgJiYpID0gZGVmYXVsdAorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9NT1ZFX0NPTlNUUlVDVE9SKENsYXNzTmFtZSkKKyNlbmRpZgorCisjaWYgKF9fY3BsdXNwbHVzIDwgMjAxMTAzTCkKKwkjaWYgIWRlZmluZWQoX01TQ19WRVIpCisJCSNkZWZpbmUgbnVsbHB0ciBOVUxMCisJI2VuZGlmCisJI2RlZmluZSBjb25zdGV4cHIgY29uc3QKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgI2RlZmluZSBub2V4Y2VwdCB0aHJvdygpCisjZW5kaWYKKworLy8gW1tkZXByZWNhdGVkKG1zZyldXSBpcyBhIEMrKzE0IGZlYXR1cmUgbm90IHN1cHBvcnRlZCBieSBNU1ZDIG9yIEdDQyA8IDQuOS4KKy8vIFdlIHByb3ZpZGUgYW4gZXF1aXZhbGVudCB3YXJuaW5nIGltcGxlbWVudGF0aW9uIGZvciB0aG9zZSBjb21waWxlcnMgaGVyZS4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAjZGVmaW5lIERFUFJFQ0FURUQobXNnKSBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQobXNnKSkKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisgICNpZiBfX0dOVUNfXyA+IDQgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPiA4KQorICAgICNkZWZpbmUgREVQUkVDQVRFRChtc2cpIFtbZGVwcmVjYXRlZChtc2cpXV0KKyAgI2Vsc2UKKyAgICAjZGVmaW5lIERFUFJFQ0FURUQobXNnKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKG1zZykpKQorICAjZW5kaWYKKyNlbGlmIF9fY3BsdXNwbHVzID4gMjAxMTAzTAorICAjZGVmaW5lIERFUFJFQ0FURUQobXNnKSBbW2RlcHJlY2F0ZWQobXNnKV1dCisjZWxzZQorICAjZGVmaW5lIERFUFJFQ0FURUQobXNnKSAvKm5vdGhpbmcqLworI2VuZGlmCisKKy8vIFByb3ZpZGUgc3RkOjpkZWNheV90IHdoZW4gdXNpbmcgR0NDIDwgNC45CisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgI2lmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPCA5CisgICAgI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorICAgIG5hbWVzcGFjZSBzdGQgeworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiB1c2luZyBkZWNheV90ID0gdHlwZW5hbWUgZGVjYXk8VD46OnR5cGU7CisgICAgfQorICAjZW5kaWYKKyNlbmRpZgorCisvLyBBIHN0cnVjdCB0byB1c2UgYXMgYSBkZWxldGVyIHdoZW4gYSBzdGQ6OnNoYXJlZF9wdHIgbXVzdCB3cmFwIGEgcmF3IHBvaW50ZXIKKy8vIHRoYXQgaXMgYmVpbmcgZGVsZXRlZCBieSBzb21lb25lIGVsc2UuCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RydWN0CitOdWxsRGVsZXRlciB7CisgIHZvaWQgb3BlcmF0b3IoKShUICopIGNvbnN0IG5vZXhjZXB0IHt9OworfTsKKworI2luY2x1ZGUgPGF0b21pYz4KKy8vIFVzZSB0aGlzIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBkZWZhdWx0IG1vdmUgY29uc3RydWN0b3IgaGFzIGJlZW4KKy8vIGNhbGxlZCBvbiBhIGNvbnRhaW5pbmcgb2JqZWN0LiBUaGlzIHNlcnZlcyB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1cyB0bworLy8gdXNlIHRoZSBkZWZhdWx0IG1vdmUgY29uc3RydWN0b3Igb2YgYW4gb2JqZWN0IGZvciBtb3ZpbmcgYWxsIHRoZSBkYXRhIGFyb3VuZAorLy8gd2hpbGUgYmVpbmcgYWJsZSB0byB1c2UgdGhpcyB0bywgZm9yIGluc3RhbmNlLCBjaG9zZSBub3QgdG8gZGUtYWxsb2NhdGUKKy8vIGEgUFdNIHBvcnQgaW4gYSBkZXN0cnVjdG9yLgorc3RydWN0IEhhc0JlZW5Nb3ZlZCB7CisgIEhhc0JlZW5Nb3ZlZChIYXNCZWVuTW92ZWQmJiBvdGhlcikgeworICAgIG90aGVyLm1vdmVkID0gdHJ1ZTsKKyAgICBtb3ZlZCA9IGZhbHNlOworICB9CisgIEhhc0JlZW5Nb3ZlZCgpID0gZGVmYXVsdDsKKyAgc3RkOjphdG9taWM8Ym9vbD4gbW92ZWR7ZmFsc2V9OworICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbW92ZWQ7IH0KK307CisKKy8vIERlZmluZSBtYWtlX3VuaXF1ZSBmb3IgQysrMTEtb25seSBjb21waWxlcnMKKyNpZiBfX2NwbHVzcGx1cyA9PSAyMDExMDNMCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgX1VuaXF1ZV9pZiB7CisgIHR5cGVkZWYgdW5pcXVlX3B0cjxUPiBfU2luZ2xlX29iamVjdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IF9VbmlxdWVfaWY8VFtdPiB7CisgIHR5cGVkZWYgdW5pcXVlX3B0cjxUW10+IF9Vbmtub3duX2JvdW5kOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPgorc3RydWN0IF9VbmlxdWVfaWY8VFtOXT4geworICB0eXBlZGVmIHZvaWQgX0tub3duX2JvdW5kOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIEFyZ3M+Cit0eXBlbmFtZSBfVW5pcXVlX2lmPFQ+OjpfU2luZ2xlX29iamVjdCBtYWtlX3VuaXF1ZShBcmdzICYmLi4uIGFyZ3MpIHsKKyAgcmV0dXJuIHVuaXF1ZV9wdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordHlwZW5hbWUgX1VuaXF1ZV9pZjxUPjo6X1Vua25vd25fYm91bmQgbWFrZV91bmlxdWUoc2l6ZV90IG4pIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlIFU7CisgIHJldHVybiB1bmlxdWVfcHRyPFQ+KG5ldyBVW25dKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4KK3R5cGVuYW1lIF9VbmlxdWVfaWY8VD46Ol9Lbm93bl9ib3VuZCBtYWtlX3VuaXF1ZShBcmdzICYmLi4uKSA9IGRlbGV0ZTsKK30gIC8vIG5hbWVzcGFjZSBzdGQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL0J1dHRvbi5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL0J1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OTc1NjkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvQnV0dG9uLmgKQEAgLTAsMCArMSwzNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fQlVUVE9OX0hfXworI2RlZmluZSBfX0JVVFRPTl9IX18KKworI2luY2x1ZGUgIkJ1dHRvbnMvVHJpZ2dlci5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGxpbmsgY29tbWFuZHMgdG8gT0kgaW5wdXRzLgorICoKKyAqIEl0IGlzIHZlcnkgZWFzeSB0byBsaW5rIGEgYnV0dG9uIHRvIGEgY29tbWFuZC4gIEZvciBpbnN0YW5jZSwgeW91IGNvdWxkCisgKiBsaW5rIHRoZSB0cmlnZ2VyIGJ1dHRvbiBvZiBhIGpveXN0aWNrIHRvIGEgInNjb3JlIiBjb21tYW5kLgorICoKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHN1YmNsYXNzIG9mIFRyaWdnZXIgdGhhdCBpcyBzcGVjaWZpY2FsbHkgYWltZWQgYXQKKyAqIGJ1dHRvbnMgb24gYW4gb3BlcmF0b3IgaW50ZXJmYWNlIGFzIGEgY29tbW9uIHVzZSBjYXNlIG9mIHRoZSBtb3JlIGdlbmVyYWxpemVkCisgKiBUcmlnZ2VyIG9iamVjdHMuIFRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgVHJpZ2dlciB3aXRoIHRoZSBtZXRob2QKKyAqIG5hbWVzCisgKiByZW5hbWVkIHRvIGZpdCB0aGUgQnV0dG9uIG9iamVjdCB1c2UuCisgKgorICogQGF1dGhvciBicmFkCisgKi8KK2NsYXNzIEJ1dHRvbiA6IHB1YmxpYyBUcmlnZ2VyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBXaGVuUHJlc3NlZChDb21tYW5kICpjb21tYW5kKTsKKyAgdmlydHVhbCB2b2lkIFdoaWxlSGVsZChDb21tYW5kICpjb21tYW5kKTsKKyAgdmlydHVhbCB2b2lkIFdoZW5SZWxlYXNlZChDb21tYW5kICpjb21tYW5kKTsKKyAgdmlydHVhbCB2b2lkIENhbmNlbFdoZW5QcmVzc2VkKENvbW1hbmQgKmNvbW1hbmQpOworICB2aXJ0dWFsIHZvaWQgVG9nZ2xlV2hlblByZXNzZWQoQ29tbWFuZCAqY29tbWFuZCk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjIyZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL0J1dHRvblNjaGVkdWxlci5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0JVVFRPTl9TQ0hFRFVMRVJfSF9fCisjZGVmaW5lIF9fQlVUVE9OX1NDSEVEVUxFUl9IX18KKworY2xhc3MgVHJpZ2dlcjsKK2NsYXNzIENvbW1hbmQ7CisKK2NsYXNzIEJ1dHRvblNjaGVkdWxlciB7CisgcHVibGljOgorICBCdXR0b25TY2hlZHVsZXIoYm9vbCBsYXN0LCBUcmlnZ2VyICpidXR0b24sIENvbW1hbmQgKm9yZGVycyk7CisgIHZpcnR1YWwgfkJ1dHRvblNjaGVkdWxlcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKSA9IDA7CisgIHZvaWQgU3RhcnQoKTsKKworIHByb3RlY3RlZDoKKyAgYm9vbCBtX3ByZXNzZWRMYXN0OworICBUcmlnZ2VyICptX2J1dHRvbjsKKyAgQ29tbWFuZCAqbV9jb21tYW5kOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvQ2FuY2VsQnV0dG9uU2NoZWR1bGVyLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvQ2FuY2VsQnV0dG9uU2NoZWR1bGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYmEyNAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9DYW5jZWxCdXR0b25TY2hlZHVsZXIuaApAQCAtMCwwICsxLDI2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19DQU5DRUxfQlVUVE9OX1NDSEVEVUxFUl9IX18KKyNkZWZpbmUgX19DQU5DRUxfQlVUVE9OX1NDSEVEVUxFUl9IX18KKworI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uU2NoZWR1bGVyLmgiCisKK2NsYXNzIFRyaWdnZXI7CitjbGFzcyBDb21tYW5kOworCitjbGFzcyBDYW5jZWxCdXR0b25TY2hlZHVsZXIgOiBwdWJsaWMgQnV0dG9uU2NoZWR1bGVyIHsKKyBwdWJsaWM6CisgIENhbmNlbEJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIgKmJ1dHRvbiwgQ29tbWFuZCAqb3JkZXJzKTsKKyAgdmlydHVhbCB+Q2FuY2VsQnV0dG9uU2NoZWR1bGVyKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZSgpOworCisgcHJpdmF0ZToKKyAgYm9vbCBwcmVzc2VkTGFzdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL0hlbGRCdXR0b25TY2hlZHVsZXIuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9IZWxkQnV0dG9uU2NoZWR1bGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjZDdhMwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9IZWxkQnV0dG9uU2NoZWR1bGVyLmgKQEAgLTAsMCArMSwyMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fSEVMRF9CVVRUT05fU0NIRURVTEVSX0hfXworI2RlZmluZSBfX0hFTERfQlVUVE9OX1NDSEVEVUxFUl9IX18KKworI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uU2NoZWR1bGVyLmgiCisKK2NsYXNzIFRyaWdnZXI7CitjbGFzcyBDb21tYW5kOworCitjbGFzcyBIZWxkQnV0dG9uU2NoZWR1bGVyIDogcHVibGljIEJ1dHRvblNjaGVkdWxlciB7CisgcHVibGljOgorICBIZWxkQnV0dG9uU2NoZWR1bGVyKGJvb2wgbGFzdCwgVHJpZ2dlciAqYnV0dG9uLCBDb21tYW5kICpvcmRlcnMpOworICB2aXJ0dWFsIH5IZWxkQnV0dG9uU2NoZWR1bGVyKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZSgpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvSW50ZXJuYWxCdXR0b24uaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9JbnRlcm5hbEJ1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYWQ2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvSW50ZXJuYWxCdXR0b24uaApAQCAtMCwwICsxLDI5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19JTlRFUk5BTF9CVVRUT05fSF9fCisjZGVmaW5lIF9fSU5URVJOQUxfQlVUVE9OX0hfXworCisjaW5jbHVkZSAiQnV0dG9ucy9CdXR0b24uaCIKKworY2xhc3MgSW50ZXJuYWxCdXR0b24gOiBwdWJsaWMgQnV0dG9uIHsKKyBwdWJsaWM6CisgIEludGVybmFsQnV0dG9uKCkgPSBkZWZhdWx0OworICBJbnRlcm5hbEJ1dHRvbihib29sIGludmVydGVkKTsKKyAgdmlydHVhbCB+SW50ZXJuYWxCdXR0b24oKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBTZXRJbnZlcnRlZChib29sIGludmVydGVkKTsKKyAgdm9pZCBTZXRQcmVzc2VkKGJvb2wgcHJlc3NlZCk7CisKKyAgdmlydHVhbCBib29sIEdldCgpOworCisgcHJpdmF0ZToKKyAgYm9vbCBtX3ByZXNzZWQgPSBmYWxzZTsKKyAgYm9vbCBtX2ludmVydGVkID0gZmFsc2U7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL0pveXN0aWNrQnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4ZWZlYQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0pPWVNUSUNLX0JVVFRPTl9IX18KKyNkZWZpbmUgX19KT1lTVElDS19CVVRUT05fSF9fCisKKyNpbmNsdWRlICJHZW5lcmljSElELmgiCisjaW5jbHVkZSAiQnV0dG9ucy9CdXR0b24uaCIKKworY2xhc3MgSm95c3RpY2tCdXR0b24gOiBwdWJsaWMgQnV0dG9uIHsKKyBwdWJsaWM6CisgIEpveXN0aWNrQnV0dG9uKEdlbmVyaWNISUQgKmpveXN0aWNrLCBpbnQgYnV0dG9uTnVtYmVyKTsKKyAgdmlydHVhbCB+Sm95c3RpY2tCdXR0b24oKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCBib29sIEdldCgpOworCisgcHJpdmF0ZToKKyAgR2VuZXJpY0hJRCAqbV9qb3lzdGljazsKKyAgaW50IG1fYnV0dG9uTnVtYmVyOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvTmV0d29ya0J1dHRvbi5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL05ldHdvcmtCdXR0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGNiYTU4Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL05ldHdvcmtCdXR0b24uaApAQCAtMCwwICsxLDI4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19ORVRXT1JLX0JVVFRPTl9IX18KKyNkZWZpbmUgX19ORVRXT1JLX0JVVFRPTl9IX18KKworI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4KKworY2xhc3MgTmV0d29ya0J1dHRvbiA6IHB1YmxpYyBCdXR0b24geworIHB1YmxpYzoKKyAgTmV0d29ya0J1dHRvbihjb25zdCBzdGQ6OnN0cmluZyAmdGFibGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyAmZmllbGQpOworICBOZXR3b3JrQnV0dG9uKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHRhYmxlLCBjb25zdCBzdGQ6OnN0cmluZyAmZmllbGQpOworICB2aXJ0dWFsIH5OZXR3b3JrQnV0dG9uKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgYm9vbCBHZXQoKTsKKworIHByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fbmV0VGFibGU7CisgIHN0ZDo6c3RyaW5nIG1fZmllbGQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9QcmVzc2VkQnV0dG9uU2NoZWR1bGVyLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvUHJlc3NlZEJ1dHRvblNjaGVkdWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZmY3YTgKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvUHJlc3NlZEJ1dHRvblNjaGVkdWxlci5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1BSRVNTRURfQlVUVE9OX1NDSEVEVUxFUl9IX18KKyNkZWZpbmUgX19QUkVTU0VEX0JVVFRPTl9TQ0hFRFVMRVJfSF9fCisKKyNpbmNsdWRlICJCdXR0b25zL0J1dHRvblNjaGVkdWxlci5oIgorCitjbGFzcyBUcmlnZ2VyOworY2xhc3MgQ29tbWFuZDsKKworY2xhc3MgUHJlc3NlZEJ1dHRvblNjaGVkdWxlciA6IHB1YmxpYyBCdXR0b25TY2hlZHVsZXIgeworIHB1YmxpYzoKKyAgUHJlc3NlZEJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIgKmJ1dHRvbiwgQ29tbWFuZCAqb3JkZXJzKTsKKyAgdmlydHVhbCB+UHJlc3NlZEJ1dHRvblNjaGVkdWxlcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvUmVsZWFzZWRCdXR0b25TY2hlZHVsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTI5OTgxCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmgKQEAgLTAsMCArMSwyMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fUkVMRUFTRURfQlVUVE9OX1NDSEVEVUxFUl9IX18KKyNkZWZpbmUgX19SRUxFQVNFRF9CVVRUT05fU0NIRURVTEVSX0hfXworCisjaW5jbHVkZSAiQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuaCIKKworY2xhc3MgVHJpZ2dlcjsKK2NsYXNzIENvbW1hbmQ7CisKK2NsYXNzIFJlbGVhc2VkQnV0dG9uU2NoZWR1bGVyIDogcHVibGljIEJ1dHRvblNjaGVkdWxlciB7CisgcHVibGljOgorICBSZWxlYXNlZEJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIgKmJ1dHRvbiwgQ29tbWFuZCAqb3JkZXJzKTsKKyAgdmlydHVhbCB+UmVsZWFzZWRCdXR0b25TY2hlZHVsZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9Ub2dnbGVCdXR0b25TY2hlZHVsZXIuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQnV0dG9ucy9Ub2dnbGVCdXR0b25TY2hlZHVsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzliNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL1RvZ2dsZUJ1dHRvblNjaGVkdWxlci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1RPR0dMRV9CVVRUT05fU0NIRURVTEVSX0hfXworI2RlZmluZSBfX1RPR0dMRV9CVVRUT05fU0NIRURVTEVSX0hfXworCisjaW5jbHVkZSAiQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuaCIKKworY2xhc3MgVHJpZ2dlcjsKK2NsYXNzIENvbW1hbmQ7CisKK2NsYXNzIFRvZ2dsZUJ1dHRvblNjaGVkdWxlciA6IHB1YmxpYyBCdXR0b25TY2hlZHVsZXIgeworIHB1YmxpYzoKKyAgVG9nZ2xlQnV0dG9uU2NoZWR1bGVyKGJvb2wgbGFzdCwgVHJpZ2dlciAqYnV0dG9uLCBDb21tYW5kICpvcmRlcnMpOworICB2aXJ0dWFsIH5Ub2dnbGVCdXR0b25TY2hlZHVsZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCk7CisKKyBwcml2YXRlOgorICBib29sIHByZXNzZWRMYXN0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0J1dHRvbnMvVHJpZ2dlci5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL1RyaWdnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTA1OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9CdXR0b25zL1RyaWdnZXIuaApAQCAtMCwwICsxLDUzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19UUklHR0VSX0hfXworI2RlZmluZSBfX1RSSUdHRVJfSF9fCisKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworY2xhc3MgQ29tbWFuZDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGxpbmsgY29tbWFuZHMgdG8gaW5wdXRzLgorICoKKyAqIEl0IGlzIHZlcnkgZWFzeSB0byBsaW5rIGEgcG9sbGVkIGlucHV0IHRvIGEgY29tbWFuZC4gIEZvciBpbnN0YW5jZSwgeW91IGNvdWxkCisgKiBsaW5rIHRoZSB0cmlnZ2VyIGJ1dHRvbiBvZiBhIGpveXN0aWNrIHRvIGEgInNjb3JlIiBjb21tYW5kIG9yIGFuIGVuY29kZXIKKyAqIHJlYWNoaW5nCisgKiBhIHBhcnRpY3VsYXIgdmFsdWUuCisgKgorICogSXQgaXMgZW5jb3VyYWdlZCB0aGF0IHRlYW1zIHdyaXRlIGEgc3ViY2xhc3Mgb2YgVHJpZ2dlciBpZiB0aGV5IHdhbnQgdG8gaGF2ZQorICogc29tZXRoaW5nIHVudXN1YWwgKGZvciBpbnN0YW5jZSwgaWYgdGhleSB3YW50IHRvIHJlYWN0IHRvIHRoZSB1c2VyIGhvbGRpbmcKKyAqIGEgYnV0dG9uIHdoaWxlIHRoZSByb2JvdCBpcyByZWFkaW5nIGEgY2VydGFpbiBzZW5zb3IgaW5wdXQpLiAgRm9yIHRoaXMsIHRoZXkKKyAqIG9ubHkgaGF2ZSB0byB3cml0ZSB0aGUge0BsaW5rIFRyaWdnZXIjR2V0KCl9IG1ldGhvZCB0byBnZXQgdGhlIGZ1bGwKKyAqIGZ1bmN0aW9uYWxpdHkKKyAqIG9mIHRoZSBUcmlnZ2VyIGNsYXNzLgorICoKKyAqIEBhdXRob3IgQnJhZCBNaWxsZXIsIEpvZSBHcmluc3RlYWQKKyAqLworY2xhc3MgVHJpZ2dlciA6IHB1YmxpYyBTZW5kYWJsZSB7CisgcHVibGljOgorICBUcmlnZ2VyKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5UcmlnZ2VyKCkgPSBkZWZhdWx0OworICBib29sIEdyYWIoKTsKKyAgdmlydHVhbCBib29sIEdldCgpID0gMDsKKyAgdm9pZCBXaGVuQWN0aXZlKENvbW1hbmQgKmNvbW1hbmQpOworICB2b2lkIFdoaWxlQWN0aXZlKENvbW1hbmQgKmNvbW1hbmQpOworICB2b2lkIFdoZW5JbmFjdGl2ZShDb21tYW5kICpjb21tYW5kKTsKKyAgdm9pZCBDYW5jZWxXaGVuQWN0aXZlKENvbW1hbmQgKmNvbW1hbmQpOworICB2b2lkIFRvZ2dsZVdoZW5BY3RpdmUoQ29tbWFuZCAqY29tbWFuZCk7CisKKyAgdmlydHVhbCB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiB0YWJsZSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9Db21tYW5kLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWM1NTEyCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9Db21tYW5kLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0NPTU1BTkRfSF9fCisjZGVmaW5lIF9fQ09NTUFORF9IX18KKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuaCIKKyNpbmNsdWRlICJ0YWJsZXMvSVRhYmxlTGlzdGVuZXIuaCIKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4KKworY2xhc3MgQ29tbWFuZEdyb3VwOworY2xhc3MgU3Vic3lzdGVtOworCisvKioKKyAqIFRoZSBDb21tYW5kIGNsYXNzIGlzIGF0IHRoZSB2ZXJ5IGNvcmUgb2YgdGhlIGVudGlyZSBjb21tYW5kIGZyYW1ld29yay4KKyAqIEV2ZXJ5IGNvbW1hbmQgY2FuIGJlIHN0YXJ0ZWQgd2l0aCBhIGNhbGwgdG8ge0BsaW5rIENvbW1hbmQjU3RhcnQoKSBTdGFydCgpfS4KKyAqIE9uY2UgYSBjb21tYW5kIGlzIHN0YXJ0ZWQgaXQgd2lsbCBjYWxsIHtAbGluayBDb21tYW5kI0luaXRpYWxpemUoKQorICogSW5pdGlhbGl6ZSgpfSwgYW5kIHRoZW4KKyAqIHdpbGwgcmVwZWF0ZWRseSBjYWxsIHtAbGluayBDb21tYW5kI0V4ZWN1dGUoKSBFeGVjdXRlKCl9IHVudGlsIHRoZSB7QGxpbmsKKyAqQ29tbWFuZCNJc0ZpbmlzaGVkKCkgSXNGaW5pc2hlZCgpfQorICogcmV0dXJucyB0cnVlLiAgT25jZSBpdCBkb2VzLCB7QGxpbmsgQ29tbWFuZCNFbmQoKSBFbmQoKX0gd2lsbCBiZSBjYWxsZWQuCisgKgorICogPHA+SG93ZXZlciwgaWYgYXQgYW55IHBvaW50IHdoaWxlIGl0IGlzIHJ1bm5pbmcge0BsaW5rIENvbW1hbmQjQ2FuY2VsKCkKKyAqIENhbmNlbCgpfSBpcyBjYWxsZWQsIHRoZW4KKyAqIHRoZSBjb21tYW5kIHdpbGwgYmUgc3RvcHBlZCBhbmQge0BsaW5rIENvbW1hbmQjSW50ZXJydXB0ZWQoKSBJbnRlcnJ1cHRlZCgpfQorICogd2lsbCBiZSBjYWxsZWQuPC9wPgorICoKKyAqIDxwPklmIGEgY29tbWFuZCB1c2VzIGEge0BsaW5rIFN1YnN5c3RlbX0sIHRoZW4gaXQgc2hvdWxkIHNwZWNpZnkgdGhhdCBpdCBkb2VzCisgKiBzbyBieQorICogY2FsbGluZyB0aGUge0BsaW5rIENvbW1hbmQjUmVxdWlyZXMoU3Vic3lzdGVtKSBSZXF1aXJlcyguLi4pfSBtZXRob2QKKyAqIGluIGl0cyBjb25zdHJ1Y3Rvci4gTm90ZSB0aGF0IGEgQ29tbWFuZCBtYXkgaGF2ZSBtdWx0aXBsZSByZXF1aXJlbWVudHMsIGFuZAorICoge0BsaW5rIENvbW1hbmQjUmVxdWlyZXMoU3Vic3lzdGVtKSBSZXF1aXJlcyguLi4pfSBzaG91bGQgYmUKKyAqIGNhbGxlZCBmb3IgZWFjaCBvbmUuPC9wPgorICoKKyAqIDxwPklmIGEgY29tbWFuZCBpcyBydW5uaW5nIGFuZCBhIG5ldyBjb21tYW5kIHdpdGggc2hhcmVkIHJlcXVpcmVtZW50cyBpcworICogc3RhcnRlZCwKKyAqIHRoZW4gb25lIG9mIHR3byB0aGluZ3Mgd2lsbCBoYXBwZW4uICBJZiB0aGUgYWN0aXZlIGNvbW1hbmQgaXMgaW50ZXJydXB0aWJsZSwKKyAqIHRoZW4ge0BsaW5rIENvbW1hbmQjQ2FuY2VsKCkgQ2FuY2VsKCl9IHdpbGwgYmUgY2FsbGVkIGFuZCB0aGUgY29tbWFuZCB3aWxsIGJlCisgKiByZW1vdmVkCisgKiB0byBtYWtlIHdheSBmb3IgdGhlIG5ldyBvbmUuICBJZiB0aGUgYWN0aXZlIGNvbW1hbmQgaXMgbm90IGludGVycnVwdGlibGUsIHRoZQorICogb3RoZXIgb25lIHdpbGwgbm90IGV2ZW4gYmUgc3RhcnRlZCwgYW5kIHRoZSBhY3RpdmUgb25lIHdpbGwgY29udGludWUKKyAqIGZ1bmN0aW9uaW5nLjwvcD4KKyAqCisgKiBAc2VlIENvbW1hbmRHcm91cAorICogQHNlZSBTdWJzeXN0ZW0KKyAqLworY2xhc3MgQ29tbWFuZCA6IHB1YmxpYyBFcnJvckJhc2UsIHB1YmxpYyBOYW1lZFNlbmRhYmxlLCBwdWJsaWMgSVRhYmxlTGlzdGVuZXIgeworICBmcmllbmQgY2xhc3MgQ29tbWFuZEdyb3VwOworICBmcmllbmQgY2xhc3MgU2NoZWR1bGVyOworCisgcHVibGljOgorICBDb21tYW5kKCk7CisgIENvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICBDb21tYW5kKGRvdWJsZSB0aW1lb3V0KTsKKyAgQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgZG91YmxlIHRpbWVvdXQpOworICB2aXJ0dWFsIH5Db21tYW5kKCk7CisgIGRvdWJsZSBUaW1lU2luY2VJbml0aWFsaXplZCgpIGNvbnN0OworICB2b2lkIFJlcXVpcmVzKFN1YnN5c3RlbSAqcyk7CisgIGJvb2wgSXNDYW5jZWxlZCgpIGNvbnN0OworICB2b2lkIFN0YXJ0KCk7CisgIGJvb2wgUnVuKCk7CisgIHZvaWQgQ2FuY2VsKCk7CisgIGJvb2wgSXNSdW5uaW5nKCkgY29uc3Q7CisgIGJvb2wgSXNJbnRlcnJ1cHRpYmxlKCkgY29uc3Q7CisgIHZvaWQgU2V0SW50ZXJydXB0aWJsZShib29sIGludGVycnVwdGlibGUpOworICBib29sIERvZXNSZXF1aXJlKFN1YnN5c3RlbSAqc3Vic3lzdGVtKSBjb25zdDsKKyAgdHlwZWRlZiBzdGQ6OnNldDxTdWJzeXN0ZW0gKj4gU3Vic3lzdGVtU2V0OworICBTdWJzeXN0ZW1TZXQgR2V0UmVxdWlyZW1lbnRzKCkgY29uc3Q7CisgIENvbW1hbmRHcm91cCAqR2V0R3JvdXAoKSBjb25zdDsKKyAgdm9pZCBTZXRSdW5XaGVuRGlzYWJsZWQoYm9vbCBydW4pOworICBib29sIFdpbGxSdW5XaGVuRGlzYWJsZWQoKSBjb25zdDsKKyAgaW50IEdldElEKCkgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VGltZW91dChkb3VibGUgdGltZW91dCk7CisgIGJvb2wgSXNUaW1lZE91dCgpIGNvbnN0OworICBib29sIEFzc2VydFVubG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZtZXNzYWdlKTsKKyAgdm9pZCBTZXRQYXJlbnQoQ29tbWFuZEdyb3VwICpwYXJlbnQpOworICAvKioKKyAgICogVGhlIGluaXRpYWxpemUgbWV0aG9kIGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZSB0aGlzIENvbW1hbmQgaXMgcnVuIGFmdGVyCisgICAqIGJlaW5nIHN0YXJ0ZWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZSgpID0gMDsKKyAgLyoqCisgICAqIFRoZSBleGVjdXRlIG1ldGhvZCBpcyBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCB0aGlzIENvbW1hbmQgZWl0aGVyIGZpbmlzaGVzCisgICAqIG9yIGlzIGNhbmNlbGVkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKSA9IDA7CisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb21tYW5kIGlzIGZpbmlzaGVkLgorICAgKiBJZiBpdCBpcywgdGhlbiB0aGUgY29tbWFuZCB3aWxsIGJlIHJlbW92ZWQKKyAgICogYW5kIHtAbGluayBDb21tYW5kI2VuZCgpIGVuZCgpfSB3aWxsIGJlIGNhbGxlZC4KKyAgICoKKyAgICogPHA+SXQgbWF5IGJlIHVzZWZ1bCBmb3IgYSB0ZWFtIHRvIHJlZmVyZW5jZSB0aGUge0BsaW5rIENvbW1hbmQjaXNUaW1lZE91dCgpCisgICAqIGlzVGltZWRPdXQoKX0gbWV0aG9kCisgICAqIGZvciB0aW1lLXNlbnNpdGl2ZSBjb21tYW5kcy48L3A+CisgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGNvbW1hbmQgaXMgZmluaXNoZWQuCisgICAqIEBzZWUgQ29tbWFuZCNpc1RpbWVkT3V0KCkgaXNUaW1lZE91dCgpCisgICAqLworICB2aXJ0dWFsIGJvb2wgSXNGaW5pc2hlZCgpID0gMDsKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGVuZGVkIHBlYWNlZnVsbHkuICBUaGlzIGlzIHdoZXJlIHlvdSBtYXkgd2FudAorICAgKiB0byB3cmFwIHVwIGxvb3NlIGVuZHMsIGxpa2Ugc2h1dHRpbmcgb2ZmIGEgbW90b3IgdGhhdCB3YXMgYmVpbmcgdXNlZAorICAgKiBpbiB0aGUgY29tbWFuZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBFbmQoKSA9IDA7CisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiB0aGUgY29tbWFuZCBlbmRzIGJlY2F1c2Ugc29tZWJvZHkgY2FsbGVkIHtAbGluaworICAgKkNvbW1hbmQjY2FuY2VsKCkgY2FuY2VsKCl9CisgICAqIG9yIGFub3RoZXIgY29tbWFuZCBzaGFyZWQgdGhlIHNhbWUgcmVxdWlyZW1lbnRzIGFzIHRoaXMgb25lLCBhbmQgYm9vdGVkCisgICAqIGl0IG91dC4KKyAgICoKKyAgICogPHA+VGhpcyBpcyB3aGVyZSB5b3UgbWF5IHdhbnQKKyAgICogdG8gd3JhcCB1cCBsb29zZSBlbmRzLCBsaWtlIHNodXR0aW5nIG9mZiBhIG1vdG9yIHRoYXQgd2FzIGJlaW5nIHVzZWQKKyAgICogaW4gdGhlIGNvbW1hbmQuPC9wPgorICAgKgorICAgKiA8cD5HZW5lcmFsbHksIGl0IGlzIHVzZWZ1bCB0byBzaW1wbHkgY2FsbCB0aGUge0BsaW5rIENvbW1hbmQjZW5kKCkgZW5kKCl9CisgICAqIG1ldGhvZAorICAgKiB3aXRoaW4gdGhpcyBtZXRob2Q8L3A+CisgICAqLworICB2aXJ0dWFsIHZvaWQgSW50ZXJydXB0ZWQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBfSW5pdGlhbGl6ZSgpOworICB2aXJ0dWFsIHZvaWQgX0ludGVycnVwdGVkKCk7CisgIHZpcnR1YWwgdm9pZCBfRXhlY3V0ZSgpOworICB2aXJ0dWFsIHZvaWQgX0VuZCgpOworICB2aXJ0dWFsIHZvaWQgX0NhbmNlbCgpOworCisgcHJpdmF0ZToKKyAgdm9pZCBMb2NrQ2hhbmdlcygpOworICAvKnN5bmNocm9uaXplZCovIHZvaWQgUmVtb3ZlZCgpOworICB2b2lkIFN0YXJ0UnVubmluZygpOworICB2b2lkIFN0YXJ0VGltaW5nKCk7CisKKyAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgY29tbWFuZCAqLworICBzdGQ6OnN0cmluZyBtX25hbWU7CisKKyAgLyoqIFRoZSB0aW1lIHNpbmNlIHRoaXMgY29tbWFuZCB3YXMgaW5pdGlhbGl6ZWQgKi8KKyAgZG91YmxlIG1fc3RhcnRUaW1lID0gLTE7CisKKyAgLyoqIFRoZSB0aW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgdGhpcyBjb21tYW5kICJ0aW1lcyBvdXQiIChvciAtMSBpZiBubworICAgKiB0aW1lb3V0KSAqLworICBkb3VibGUgbV90aW1lb3V0OworCisgIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKyAgYm9vbCBtX2luaXRpYWxpemVkID0gZmFsc2U7CisKKyAgLyoqIFRoZSByZXF1aXJlbWVudHMgKG9yIG51bGwgaWYgbm8gcmVxdWlyZW1lbnRzKSAqLworICBTdWJzeXN0ZW1TZXQgbV9yZXF1aXJlbWVudHM7CisKKyAgLyoqIFdoZXRoZXIgb3Igbm90IGl0IGlzIHJ1bm5pbmcgKi8KKyAgYm9vbCBtX3J1bm5pbmcgPSBmYWxzZTsKKworICAvKiogV2hldGhlciBvciBub3QgaXQgaXMgaW50ZXJydXB0aWJsZSovCisgIGJvb2wgbV9pbnRlcnJ1cHRpYmxlID0gdHJ1ZTsKKworICAvKiogV2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gY2FuY2VsZWQgKi8KKyAgYm9vbCBtX2NhbmNlbGVkID0gZmFsc2U7CisKKyAgLyoqIFdoZXRoZXIgb3Igbm90IGl0IGhhcyBiZWVuIGxvY2tlZCAqLworICBib29sIG1fbG9ja2VkID0gZmFsc2U7CisKKyAgLyoqIFdoZXRoZXIgdGhpcyBjb21tYW5kIHNob3VsZCBydW4gd2hlbiB0aGUgcm9ib3QgaXMgZGlzYWJsZWQgKi8KKyAgYm9vbCBtX3J1bldoZW5EaXNhYmxlZCA9IGZhbHNlOworCisgIC8qKiBUaGUge0BsaW5rIENvbW1hbmRHcm91cH0gdGhpcyBpcyBpbiAqLworICBDb21tYW5kR3JvdXAgKm1fcGFyZW50ID0gbnVsbHB0cjsKKworICBpbnQgbV9jb21tYW5kSUQgPSBtX2NvbW1hbmRDb3VudGVyKys7CisgIHN0YXRpYyBpbnQgbV9jb21tYW5kQ291bnRlcjsKKworIHB1YmxpYzoKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXROYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gdGFibGUpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Q7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBWYWx1ZUNoYW5nZWQoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpOworCisgcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmRHcm91cC5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9Db21tYW5kR3JvdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI4OWNhCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9Db21tYW5kR3JvdXAuaApAQCAtMCwwICsxLDc0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19DT01NQU5EX0dST1VQX0hfXworI2RlZmluZSBfX0NPTU1BTkRfR1JPVVBfSF9fCisKKyNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZEdyb3VwRW50cnkuaCIKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqCisgKiBBIHtAbGluayBDb21tYW5kR3JvdXB9IGlzIGEgbGlzdCBvZiBjb21tYW5kcyB3aGljaCBhcmUgZXhlY3V0ZWQgaW4gc2VxdWVuY2UuCisgKgorICogPHA+Q29tbWFuZHMgaW4gYSB7QGxpbmsgQ29tbWFuZEdyb3VwfSBhcmUgYWRkZWQgdXNpbmcgdGhlIHtAbGluaworICogQ29tbWFuZEdyb3VwI0FkZFNlcXVlbnRpYWwoQ29tbWFuZCkgQWRkU2VxdWVudGlhbCguLi4pfSBtZXRob2QKKyAqIGFuZCBhcmUgY2FsbGVkIHNlcXVlbnRpYWxseS4KKyAqIHtAbGluayBDb21tYW5kR3JvdXAgQ29tbWFuZEdyb3Vwc30gYXJlIHRoZW1zZWx2ZXMge0BsaW5rIENvbW1hbmQgQ29tbWFuZHN9CisgKiBhbmQgY2FuIGJlIGdpdmVuIHRvIG90aGVyIHtAbGluayBDb21tYW5kR3JvdXAgQ29tbWFuZEdyb3Vwc30uPC9wPgorICoKKyAqIDxwPntAbGluayBDb21tYW5kR3JvdXAgQ29tbWFuZEdyb3Vwc30gd2lsbCBjYXJyeSBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBvZgorICogdGhlaXIge0BsaW5rIENvbW1hbmQgc3ViY29tbWFuZHN9LiAgQWRkaXRpb25hbAorICogcmVxdWlyZW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgYnkgY2FsbGluZyB7QGxpbmsKKyAqQ29tbWFuZEdyb3VwI1JlcXVpcmVzKFN1YnN5c3RlbSkgUmVxdWlyZXMoLi4uKX0KKyAqIG5vcm1hbGx5IGluIHRoZSBjb25zdHJ1Y3Rvci48L1A+CisgKgorICogPHA+Q29tbWFuZEdyb3VwcyBjYW4gYWxzbyBleGVjdXRlIGNvbW1hbmRzIGluIHBhcmFsbGVsLCBzaW1wbHkgYnkgYWRkaW5nIHRoZW0KKyAqIHVzaW5nIHtAbGluayBDb21tYW5kR3JvdXAjQWRkUGFyYWxsZWwoQ29tbWFuZCkgQWRkUGFyYWxsZWwoLi4uKX0uPC9wPgorICoKKyAqIEBzZWUgQ29tbWFuZAorICogQHNlZSBTdWJzeXN0ZW0KKyAqLworY2xhc3MgQ29tbWFuZEdyb3VwIDogcHVibGljIENvbW1hbmQgeworIHB1YmxpYzoKKyAgQ29tbWFuZEdyb3VwKCkgPSBkZWZhdWx0OworICBDb21tYW5kR3JvdXAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICB2aXJ0dWFsIH5Db21tYW5kR3JvdXAoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBBZGRTZXF1ZW50aWFsKENvbW1hbmQgKmNvbW1hbmQpOworICB2b2lkIEFkZFNlcXVlbnRpYWwoQ29tbWFuZCAqY29tbWFuZCwgZG91YmxlIHRpbWVvdXQpOworICB2b2lkIEFkZFBhcmFsbGVsKENvbW1hbmQgKmNvbW1hbmQpOworICB2b2lkIEFkZFBhcmFsbGVsKENvbW1hbmQgKmNvbW1hbmQsIGRvdWJsZSB0aW1lb3V0KTsKKyAgYm9vbCBJc0ludGVycnVwdGlibGUoKSBjb25zdDsKKyAgaW50IEdldFNpemUoKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKTsKKyAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKTsKKyAgdmlydHVhbCBib29sIElzRmluaXNoZWQoKTsKKyAgdmlydHVhbCB2b2lkIEVuZCgpOworICB2aXJ0dWFsIHZvaWQgSW50ZXJydXB0ZWQoKTsKKyAgdmlydHVhbCB2b2lkIF9Jbml0aWFsaXplKCk7CisgIHZpcnR1YWwgdm9pZCBfSW50ZXJydXB0ZWQoKTsKKyAgdmlydHVhbCB2b2lkIF9FeGVjdXRlKCk7CisgIHZpcnR1YWwgdm9pZCBfRW5kKCk7CisKKyBwcml2YXRlOgorICB2b2lkIENhbmNlbENvbmZsaWN0cyhDb21tYW5kICpjb21tYW5kKTsKKworICAvKiogVGhlIGNvbW1hbmRzIGluIHRoaXMgZ3JvdXAgKHN0b3JlZCBpbiBlbnRyaWVzKSAqLworICBzdGQ6OnZlY3RvcjxDb21tYW5kR3JvdXBFbnRyeT4gbV9jb21tYW5kczsKKworICAvKiogVGhlIGFjdGl2ZSBjaGlsZHJlbiBpbiB0aGlzIGdyb3VwIChzdG9yZWQgaW4gZW50cmllcykgKi8KKyAgc3RkOjpsaXN0PENvbW1hbmRHcm91cEVudHJ5PiBtX2NoaWxkcmVuOworCisgIC8qKiBUaGUgY3VycmVudCBjb21tYW5kLCAtMSBzaWduaWZpZXMgdGhhdCBub25lIGhhdmUgYmVlbiBydW4gKi8KKyAgaW50IG1fY3VycmVudENvbW1hbmRJbmRleCA9IC0xOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmRHcm91cEVudHJ5LmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmRHcm91cEVudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyYTAyYwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQ29tbWFuZHMvQ29tbWFuZEdyb3VwRW50cnkuaApAQCAtMCwwICsxLDMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19DT01NQU5EX0dST1VQX0VOVFJZX0hfXworI2RlZmluZSBfX0NPTU1BTkRfR1JPVVBfRU5UUllfSF9fCisKK2NsYXNzIENvbW1hbmQ7CisKK2NsYXNzIENvbW1hbmRHcm91cEVudHJ5IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgZW51bSB7CisgICAga1NlcXVlbmNlX0luU2VxdWVuY2UsCisgICAga1NlcXVlbmNlX0JyYW5jaFBlZXIsCisgICAga1NlcXVlbmNlX0JyYW5jaENoaWxkCisgIH0gU2VxdWVuY2U7CisKKyAgQ29tbWFuZEdyb3VwRW50cnkoKSA9IGRlZmF1bHQ7CisgIENvbW1hbmRHcm91cEVudHJ5KENvbW1hbmQgKmNvbW1hbmQsIFNlcXVlbmNlIHN0YXRlLCBkb3VibGUgdGltZW91dCA9IC0xLjApOworICBib29sIElzVGltZWRPdXQoKSBjb25zdDsKKworICBkb3VibGUgbV90aW1lb3V0ID0gLTEuMDsKKyAgQ29tbWFuZCAqbV9jb21tYW5kID0gbnVsbHB0cjsKKyAgU2VxdWVuY2UgbV9zdGF0ZSA9IGtTZXF1ZW5jZV9JblNlcXVlbmNlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1BJRENvbW1hbmQuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQ29tbWFuZHMvUElEQ29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2N2MwNjMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1BJRENvbW1hbmQuaApAQCAtMCwwICsxLDU4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19QSURfQ09NTUFORF9IX18KKyNkZWZpbmUgX19QSURfQ09NTUFORF9IX18KKworI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKyNpbmNsdWRlICJQSURDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK2NsYXNzIFBJRENvbW1hbmQgOiBwdWJsaWMgQ29tbWFuZCwgcHVibGljIFBJRE91dHB1dCwgcHVibGljIFBJRFNvdXJjZSB7CisgcHVibGljOgorICBQSURDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKTsKKyAgUElEQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIHBlcmlvZCk7CisgIFBJRENvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIGRvdWJsZSBmLAorICAgICAgICAgICAgIGRvdWJsZSBwZXJpb2QpOworICBQSURDb21tYW5kKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworICBQSURDb21tYW5kKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIGRvdWJsZSBwZXJpb2QpOworICBQSURDb21tYW5kKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIGRvdWJsZSBmLCBkb3VibGUgcGVyaW9kKTsKKyAgdmlydHVhbCB+UElEQ29tbWFuZCgpID0gZGVmYXVsdDsKKworICB2b2lkIFNldFNldHBvaW50UmVsYXRpdmUoZG91YmxlIGRlbHRhU2V0cG9pbnQpOworCisgIC8vIFBJRE91dHB1dCBpbnRlcmZhY2UKKyAgdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCk7CisKKyAgLy8gUElEU291cmNlIGludGVyZmFjZQorICB2aXJ0dWFsIGRvdWJsZSBQSURHZXQoKTsKKworIHByb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFBJRENvbnRyb2xsZXI+IEdldFBJRENvbnRyb2xsZXIoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIF9Jbml0aWFsaXplKCk7CisgIHZpcnR1YWwgdm9pZCBfSW50ZXJydXB0ZWQoKTsKKyAgdmlydHVhbCB2b2lkIF9FbmQoKTsKKyAgdm9pZCBTZXRTZXRwb2ludChkb3VibGUgc2V0cG9pbnQpOworICBkb3VibGUgR2V0U2V0cG9pbnQoKSBjb25zdDsKKyAgZG91YmxlIEdldFBvc2l0aW9uKCk7CisKKyAgdmlydHVhbCBkb3VibGUgUmV0dXJuUElESW5wdXQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBVc2VQSURPdXRwdXQoZG91YmxlIG91dHB1dCkgPSAwOworCisgcHJpdmF0ZToKKyAgLyoqIFRoZSBpbnRlcm5hbCB7QGxpbmsgUElEQ29udHJvbGxlcn0gKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFBJRENvbnRyb2xsZXI+IG1fY29udHJvbGxlcjsKKworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiB0YWJsZSk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQ29tbWFuZHMvUElEU3Vic3lzdGVtLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1BJRFN1YnN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDU1MTQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1BJRFN1YnN5c3RlbS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1BJRF9TVUJTWVNURU1fSF9fCisjZGVmaW5lIF9fUElEX1NVQlNZU1RFTV9IX18KKworI2luY2x1ZGUgIkNvbW1hbmRzL1N1YnN5c3RlbS5oIgorI2luY2x1ZGUgIlBJRENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURTb3VyY2UuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHtAbGluayBTdWJzeXN0ZW19CisgKiB3aGljaCB1c2VzIGEgc2luZ2xlIHtAbGluayBQSURDb250cm9sbGVyfSBhbG1vc3QgY29uc3RhbnRseSAoZm9yIGluc3RhbmNlLAorICogYW4gZWxldmF0b3Igd2hpY2ggYXR0ZW1wdHMgdG8gc3RheSBhdCBhIGNvbnN0YW50IGhlaWdodCkuCisgKgorICogPHA+SXQgcHJvdmlkZXMgc29tZSBjb252ZW5pZW5jZSBtZXRob2RzIHRvIHJ1biBhbiBpbnRlcm5hbCB7QGxpbmsKKyAqIFBJRENvbnRyb2xsZXJ9LgorICogSXQgYWxzbyBhbGxvd3MgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbCB7QGxpbmsgUElEQ29udHJvbGxlcn0gaW4gb3JkZXIgdG8gZ2l2ZQorICogdG90YWwgY29udHJvbAorICogdG8gdGhlIHByb2dyYW1tZXIuPC9wPgorICoKKyAqLworY2xhc3MgUElEU3Vic3lzdGVtIDogcHVibGljIFN1YnN5c3RlbSwgcHVibGljIFBJRE91dHB1dCwgcHVibGljIFBJRFNvdXJjZSB7CisgcHVibGljOgorICBQSURTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOworICBQSURTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIGRvdWJsZSBmKTsKKyAgUElEU3Vic3lzdGVtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZiwKKyAgICAgICAgICAgICAgIGRvdWJsZSBwZXJpb2QpOworICBQSURTdWJzeXN0ZW0oZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7CisgIFBJRFN1YnN5c3RlbShkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZik7CisgIFBJRFN1YnN5c3RlbShkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZiwgZG91YmxlIHBlcmlvZCk7CisgIHZpcnR1YWwgflBJRFN1YnN5c3RlbSgpID0gZGVmYXVsdDsKKworICB2b2lkIEVuYWJsZSgpOworICB2b2lkIERpc2FibGUoKTsKKworICAvLyBQSURPdXRwdXQgaW50ZXJmYWNlCisgIHZpcnR1YWwgdm9pZCBQSURXcml0ZShmbG9hdCBvdXRwdXQpOworCisgIC8vIFBJRFNvdXJjZSBpbnRlcmZhY2UKKyAgdmlydHVhbCBkb3VibGUgUElER2V0KCk7CisgIHZvaWQgU2V0U2V0cG9pbnQoZG91YmxlIHNldHBvaW50KTsKKyAgdm9pZCBTZXRTZXRwb2ludFJlbGF0aXZlKGRvdWJsZSBkZWx0YVNldHBvaW50KTsKKyAgdm9pZCBTZXRJbnB1dFJhbmdlKGZsb2F0IG1pbmltdW1JbnB1dCwgZmxvYXQgbWF4aW11bUlucHV0KTsKKyAgdm9pZCBTZXRPdXRwdXRSYW5nZShmbG9hdCBtaW5pbXVtT3V0cHV0LCBmbG9hdCBtYXhpbXVtT3V0cHV0KTsKKyAgZG91YmxlIEdldFNldHBvaW50KCk7CisgIGRvdWJsZSBHZXRQb3NpdGlvbigpOworICBkb3VibGUgR2V0UmF0ZSgpOworCisgIHZpcnR1YWwgdm9pZCBTZXRBYnNvbHV0ZVRvbGVyYW5jZShmbG9hdCBhYnNWYWx1ZSk7CisgIHZpcnR1YWwgdm9pZCBTZXRQZXJjZW50VG9sZXJhbmNlKGZsb2F0IHBlcmNlbnQpOworICB2aXJ0dWFsIGJvb2wgT25UYXJnZXQoKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFBJRENvbnRyb2xsZXI+IEdldFBJRENvbnRyb2xsZXIoKTsKKworICB2aXJ0dWFsIGRvdWJsZSBSZXR1cm5QSURJbnB1dCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFVzZVBJRE91dHB1dChkb3VibGUgb3V0cHV0KSA9IDA7CisKKyBwcml2YXRlOgorICAvKiogVGhlIGludGVybmFsIHtAbGluayBQSURDb250cm9sbGVyfSAqLworICBzdGQ6OnNoYXJlZF9wdHI8UElEQ29udHJvbGxlcj4gbV9jb250cm9sbGVyOworCisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHRhYmxlKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9QcmludENvbW1hbmQuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQ29tbWFuZHMvUHJpbnRDb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiM2U1ZQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQ29tbWFuZHMvUHJpbnRDb21tYW5kLmgKQEAgLTAsMCArMSwzMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fUFJJTlRfQ09NTUFORF9IX18KKyNkZWZpbmUgX19QUklOVF9DT01NQU5EX0hfXworCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgUHJpbnRDb21tYW5kIDogcHVibGljIENvbW1hbmQgeworIHB1YmxpYzoKKyAgUHJpbnRDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICZtZXNzYWdlKTsKKyAgdmlydHVhbCB+UHJpbnRDb21tYW5kKCkgPSBkZWZhdWx0OworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZSgpOworICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZSgpOworICB2aXJ0dWFsIGJvb2wgSXNGaW5pc2hlZCgpOworICB2aXJ0dWFsIHZvaWQgRW5kKCk7CisgIHZpcnR1YWwgdm9pZCBJbnRlcnJ1cHRlZCgpOworCisgcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbV9tZXNzYWdlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1NjaGVkdWxlci5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9TY2hlZHVsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVmYmFkCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9TY2hlZHVsZXIuaApAQCAtMCwwICsxLDcwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19TQ0hFRFVMRVJfSF9fCisjZGVmaW5lIF9fU0NIRURVTEVSX0hfXworCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgorI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuaCIKKyNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oIgorI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmgiCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgIkhBTC9jcHAvcHJpb3JpdHlfbXV0ZXguaCIKKworY2xhc3MgQnV0dG9uU2NoZWR1bGVyOworY2xhc3MgU3Vic3lzdGVtOworCitjbGFzcyBTY2hlZHVsZXIgOiBwdWJsaWMgRXJyb3JCYXNlLCBwdWJsaWMgTmFtZWRTZW5kYWJsZSB7CisgcHVibGljOgorICBzdGF0aWMgU2NoZWR1bGVyICpHZXRJbnN0YW5jZSgpOworCisgIHZvaWQgQWRkQ29tbWFuZChDb21tYW5kICpjb21tYW5kKTsKKyAgdm9pZCBBZGRCdXR0b24oQnV0dG9uU2NoZWR1bGVyICpidXR0b24pOworICB2b2lkIFJlZ2lzdGVyU3Vic3lzdGVtKFN1YnN5c3RlbSAqc3Vic3lzdGVtKTsKKyAgdm9pZCBSdW4oKTsKKyAgdm9pZCBSZW1vdmUoQ29tbWFuZCAqY29tbWFuZCk7CisgIHZvaWQgUmVtb3ZlQWxsKCk7CisgIHZvaWQgUmVzZXRBbGwoKTsKKyAgdm9pZCBTZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKKyAgdm9pZCBVcGRhdGVUYWJsZSgpOworICBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdDsKKyAgdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0OworICBzdGQ6OnN0cmluZyBHZXROYW1lKCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIEdldFR5cGUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIFNjaGVkdWxlcigpOworICB2aXJ0dWFsIH5TY2hlZHVsZXIoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBQcm9jZXNzQ29tbWFuZEFkZGl0aW9uKENvbW1hbmQgKmNvbW1hbmQpOworCisgIENvbW1hbmQ6OlN1YnN5c3RlbVNldCBtX3N1YnN5c3RlbXM7CisgIHByaW9yaXR5X211dGV4IG1fYnV0dG9uc0xvY2s7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QnV0dG9uU2NoZWR1bGVyICo+IEJ1dHRvblZlY3RvcjsKKyAgQnV0dG9uVmVjdG9yIG1fYnV0dG9uczsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDb21tYW5kICo+IENvbW1hbmRWZWN0b3I7CisgIHByaW9yaXR5X211dGV4IG1fYWRkaXRpb25zTG9jazsKKyAgQ29tbWFuZFZlY3RvciBtX2FkZGl0aW9uczsKKyAgdHlwZWRlZiBzdGQ6OnNldDxDb21tYW5kICo+IENvbW1hbmRTZXQ7CisgIENvbW1hbmRTZXQgbV9jb21tYW5kczsKKyAgYm9vbCBtX2FkZGluZyA9IGZhbHNlOworICBib29sIG1fZW5hYmxlZCA9IHRydWU7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb21tYW5kczsKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBpZHM7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdG9DYW5jZWw7CisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fdGFibGU7CisgIGJvb2wgbV9ydW5uaW5nQ29tbWFuZHNDaGFuZ2VkID0gZmFsc2U7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1N0YXJ0Q29tbWFuZC5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9TdGFydENvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjUzZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9TdGFydENvbW1hbmQuaApAQCAtMCwwICsxLDI5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19TVEFSVF9DT01NQU5EX0hfXworI2RlZmluZSBfX1NUQVJUX0NPTU1BTkRfSF9fCisKKyNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCisKK2NsYXNzIFN0YXJ0Q29tbWFuZCA6IHB1YmxpYyBDb21tYW5kIHsKKyBwdWJsaWM6CisgIFN0YXJ0Q29tbWFuZChDb21tYW5kICpjb21tYW5kVG9TdGFydCk7CisgIHZpcnR1YWwgflN0YXJ0Q29tbWFuZCgpID0gZGVmYXVsdDsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKTsKKyAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKTsKKyAgdmlydHVhbCBib29sIElzRmluaXNoZWQoKTsKKyAgdmlydHVhbCB2b2lkIEVuZCgpOworICB2aXJ0dWFsIHZvaWQgSW50ZXJydXB0ZWQoKTsKKworIHByaXZhdGU6CisgIENvbW1hbmQgKm1fY29tbWFuZFRvRm9yazsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9TdWJzeXN0ZW0uaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQ29tbWFuZHMvU3Vic3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2MmVjOAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQ29tbWFuZHMvU3Vic3lzdGVtLmgKQEAgLTAsMCArMSw1MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fU1VCU1lTVEVNX0hfXworI2RlZmluZSBfX1NVQlNZU1RFTV9IX18KKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorCitjbGFzcyBDb21tYW5kOworCitjbGFzcyBTdWJzeXN0ZW0gOiBwdWJsaWMgRXJyb3JCYXNlLCBwdWJsaWMgTmFtZWRTZW5kYWJsZSB7CisgIGZyaWVuZCBjbGFzcyBTY2hlZHVsZXI7CisKKyBwdWJsaWM6CisgIFN1YnN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisgIHZpcnR1YWwgflN1YnN5c3RlbSgpID0gZGVmYXVsdDsKKworICB2b2lkIFNldERlZmF1bHRDb21tYW5kKENvbW1hbmQgKmNvbW1hbmQpOworICBDb21tYW5kICpHZXREZWZhdWx0Q29tbWFuZCgpOworICB2b2lkIFNldEN1cnJlbnRDb21tYW5kKENvbW1hbmQgKmNvbW1hbmQpOworICBDb21tYW5kICpHZXRDdXJyZW50Q29tbWFuZCgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgSW5pdERlZmF1bHRDb21tYW5kKCk7CisKKyBwcml2YXRlOgorICB2b2lkIENvbmZpcm1Db21tYW5kKCk7CisKKyAgQ29tbWFuZCAqbV9jdXJyZW50Q29tbWFuZCA9IG51bGxwdHI7CisgIGJvb2wgbV9jdXJyZW50Q29tbWFuZENoYW5nZWQgPSB0cnVlOworICBDb21tYW5kICptX2RlZmF1bHRDb21tYW5kID0gbnVsbHB0cjsKKyAgc3RkOjpzdHJpbmcgbV9uYW1lOworICBib29sIG1faW5pdGlhbGl6ZWREZWZhdWx0Q29tbWFuZCA9IGZhbHNlOworCisgcHVibGljOgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldE5hbWUoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiB0YWJsZSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9XYWl0Q29tbWFuZC5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9XYWl0Q29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjZkYWMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1dhaXRDb21tYW5kLmgKQEAgLTAsMCArMSwyNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fV0FJVF9DT01NQU5EX0hfXworI2RlZmluZSBfX1dBSVRfQ09NTUFORF9IX18KKworI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKworY2xhc3MgV2FpdENvbW1hbmQgOiBwdWJsaWMgQ29tbWFuZCB7CisgcHVibGljOgorICBXYWl0Q29tbWFuZChkb3VibGUgdGltZW91dCk7CisgIFdhaXRDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBkb3VibGUgdGltZW91dCk7CisgIHZpcnR1YWwgfldhaXRDb21tYW5kKCkgPSBkZWZhdWx0OworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZSgpOworICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZSgpOworICB2aXJ0dWFsIGJvb2wgSXNGaW5pc2hlZCgpOworICB2aXJ0dWFsIHZvaWQgRW5kKCk7CisgIHZpcnR1YWwgdm9pZCBJbnRlcnJ1cHRlZCgpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1dhaXRGb3JDaGlsZHJlbi5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9XYWl0Rm9yQ2hpbGRyZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThkMjQzCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9XYWl0Rm9yQ2hpbGRyZW4uaApAQCAtMCwwICsxLDI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19XQUlUX0ZPUl9DSElMRFJFTl9IX18KKyNkZWZpbmUgX19XQUlUX0ZPUl9DSElMRFJFTl9IX18KKworI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKworY2xhc3MgV2FpdEZvckNoaWxkcmVuIDogcHVibGljIENvbW1hbmQgeworIHB1YmxpYzoKKyAgV2FpdEZvckNoaWxkcmVuKGRvdWJsZSB0aW1lb3V0KTsKKyAgV2FpdEZvckNoaWxkcmVuKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBkb3VibGUgdGltZW91dCk7CisgIHZpcnR1YWwgfldhaXRGb3JDaGlsZHJlbigpID0gZGVmYXVsdDsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKTsKKyAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKTsKKyAgdmlydHVhbCBib29sIElzRmluaXNoZWQoKTsKKyAgdmlydHVhbCB2b2lkIEVuZCgpOworICB2aXJ0dWFsIHZvaWQgSW50ZXJydXB0ZWQoKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbW1hbmRzL1dhaXRVbnRpbENvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDc3ZjhlCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Db21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmgKQEAgLTAsMCArMSwzMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fV0FJVF9VTlRJTF9DT01NQU5EX0hfXworI2RlZmluZSBfX1dBSVRfVU5USUxfQ09NTUFORF9IX18KKworI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKworY2xhc3MgV2FpdFVudGlsQ29tbWFuZCA6IHB1YmxpYyBDb21tYW5kIHsKKyBwdWJsaWM6CisgIFdhaXRVbnRpbENvbW1hbmQoZG91YmxlIHRpbWUpOworICBXYWl0VW50aWxDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBkb3VibGUgdGltZSk7CisgIHZpcnR1YWwgfldhaXRVbnRpbENvbW1hbmQoKSA9IGRlZmF1bHQ7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCk7CisgIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCk7CisgIHZpcnR1YWwgYm9vbCBJc0ZpbmlzaGVkKCk7CisgIHZpcnR1YWwgdm9pZCBFbmQoKTsKKyAgdmlydHVhbCB2b2lkIEludGVycnVwdGVkKCk7CisKKyBwcml2YXRlOgorICBkb3VibGUgbV90aW1lOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbnRyb2xsZXIuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NTIzMDcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0NvbnRyb2xsZXIuaApAQCAtMCwwICsxLDMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisvKioKKyAqIEludGVyZmFjZSBmb3IgQ29udHJvbGxlcnMKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGNvbnRyb2xsZXJzLiBDb250cm9sbGVycyBydW4gY29udHJvbCBsb29wcywgdGhlIG1vc3QKKyAqIGNvbW1vbgorICogYXJlIFBJRCBjb250cm9sbGVycyBhbmQgdGhlaXIgdmFyaWFudHMsIGJ1dCB0aGlzIGluY2x1ZGVzIGFueXRoaW5nIHRoYXQgaXMKKyAqIGNvbnRyb2xsaW5nCisgKiBhbiBhY3R1YXRvciBpbiBhIHNlcGFyYXRlIHRocmVhZC4KKyAqLworY2xhc3MgQ29udHJvbGxlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5Db250cm9sbGVyKCkgPSBkZWZhdWx0OworCisgIC8qKgorICAgKiBBbGxvd3MgdGhlIGNvbnRyb2wgbG9vcCB0byBydW4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBFbmFibGUoKSA9IDA7CisKKyAgLyoqCisgICAqIFN0b3BzIHRoZSBjb250cm9sIGxvb3AgZnJvbSBydW5uaW5nIHVudGlsIGV4cGxpY2l0bHkgcmUtZW5hYmxlZCBieSBjYWxsaW5nCisgICAqIGVuYWJsZSgpCisgICAqLworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpID0gMDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0Vycm9yLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllMzAxZAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvRXJyb3IuaApAQCAtMCwwICsxLDU5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkJhc2UuaCIKKworI2lmZGVmIF9XSU4zMgorCSNpbmNsdWRlIDxXaW5kb3dzLmg+CisJLy9XaW5kb3dzLmggZGVmaW5lcyAjZGVmaW5lIEdldE1lc3NhZ2UgR2V0TWVzc2FnZVcsIHdoaWNoIGlzIHN0dXBpZCBhbmQgd2UgZG9uJ3Qgd2FudCBpdC4KKwkjdW5kZWYgR2V0TWVzc2FnZQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKKworLy8gIEZvcndhcmQgZGVjbGFyYXRpb25zCitjbGFzcyBFcnJvckJhc2U7CisKKy8qKgorICogRXJyb3Igb2JqZWN0IHJlcHJlc2VudHMgYSBsaWJyYXJ5IGVycm9yLgorICovCitjbGFzcyBFcnJvciB7CisgcHVibGljOgorICB0eXBlZGVmIGludDMyX3QgQ29kZTsKKworICBFcnJvcigpID0gZGVmYXVsdDsKKworICBFcnJvcihjb25zdCBFcnJvciYpID0gZGVsZXRlOworICBFcnJvciYgb3BlcmF0b3I9KGNvbnN0IEVycm9yJikgPSBkZWxldGU7CisKKyAgdm9pZCBDbG9uZShjb25zdCBFcnJvciYgZXJyb3IpOworICBDb2RlIEdldENvZGUoKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgR2V0TWVzc2FnZSgpIGNvbnN0OworICBzdGQ6OnN0cmluZyBHZXRGaWxlbmFtZSgpIGNvbnN0OworICBzdGQ6OnN0cmluZyBHZXRGdW5jdGlvbigpIGNvbnN0OworICB1aW50MzJfdCBHZXRMaW5lTnVtYmVyKCkgY29uc3Q7CisgIGNvbnN0IEVycm9yQmFzZSogR2V0T3JpZ2luYXRpbmdPYmplY3QoKSBjb25zdDsKKyAgZG91YmxlIEdldFRpbWVzdGFtcCgpIGNvbnN0OworICB2b2lkIENsZWFyKCk7CisgIHZvaWQgU2V0KENvZGUgY29kZSwgbGx2bTo6U3RyaW5nUmVmIGNvbnRleHRNZXNzYWdlLAorICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsIGxsdm06OlN0cmluZ1JlZiBmdW5jdGlvbiwKKyAgICAgICAgICAgdWludDMyX3QgbGluZU51bWJlciwgY29uc3QgRXJyb3JCYXNlKiBvcmlnaW5hdGluZ09iamVjdCk7CisKKyBwcml2YXRlOgorICB2b2lkIFJlcG9ydCgpOworCisgIENvZGUgbV9jb2RlID0gMDsKKyAgc3RkOjpzdHJpbmcgbV9tZXNzYWdlOworICBzdGQ6OnN0cmluZyBtX2ZpbGVuYW1lOworICBzdGQ6OnN0cmluZyBtX2Z1bmN0aW9uOworICB1aW50MzJfdCBtX2xpbmVOdW1iZXIgPSAwOworICBjb25zdCBFcnJvckJhc2UqIG1fb3JpZ2luYXRpbmdPYmplY3QgPSBudWxscHRyOworICBkb3VibGUgbV90aW1lc3RhbXAgPSAwLjA7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9FcnJvckJhc2UuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvRXJyb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMGEyOQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvRXJyb3JCYXNlLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQmFzZS5oIgorI2luY2x1ZGUgIkVycm9yLmgiCisKKyNpbmNsdWRlICJIQUwvY3BwL3ByaW9yaXR5X211dGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKKworI2RlZmluZSB3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KGNvbnRleHQpIFwKKyAgdGhpcy0+U2V0RXJybm9FcnJvcigoY29udGV4dCksIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2RlZmluZSB3cGlfc2V0RXJybm9FcnJvcigpIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoIiIpCisjZGVmaW5lIHdwaV9zZXRJbWFxRXJyb3JXaXRoQ29udGV4dChjb2RlLCBjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKGNvZGUpICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aGlzLT5TZXRJbWFxRXJyb3IoKGNvZGUpLCAoY29udGV4dCksIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChjb2RlLCBjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoY29kZSkgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGhpcy0+U2V0RXJyb3IoKGNvZGUpLCAoY29udGV4dCksIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSB3cGlfc2V0RXJyb3IoY29kZSkgd3BpX3NldEVycm9yV2l0aENvbnRleHQoY29kZSwgIiIpCisjZGVmaW5lIHdwaV9zZXRTdGF0aWNFcnJvcldpdGhDb250ZXh0KG9iamVjdCwgY29kZSwgY29udGV4dCkgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoY29kZSkgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvYmplY3QtPlNldEVycm9yKChjb2RlKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgd3BpX3NldFN0YXRpY0Vycm9yKG9iamVjdCwgY29kZSkgXAorICB3cGlfc2V0U3RhdGljRXJyb3JXaXRoQ29udGV4dChvYmplY3QsIGNvZGUsICIiKQorI2RlZmluZSB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChjb2RlLCBjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoY29kZSkgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRXJyb3JCYXNlOjpTZXRHbG9iYWxFcnJvcigoY29kZSksIChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSB3cGlfc2V0R2xvYmFsRXJyb3IoY29kZSkgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoY29kZSwgIiIpCisjZGVmaW5lIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KGVycm9yLCBjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgXAorICB0aGlzLT5TZXRXUElFcnJvcigod3BpX2Vycm9yX3NfIyNlcnJvciksICh3cGlfZXJyb3JfdmFsdWVfIyNlcnJvciksIFwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgd3BpX3NldFdQSUVycm9yKGVycm9yKSAod3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoZXJyb3IsICIiKSkKKyNkZWZpbmUgd3BpX3NldFN0YXRpY1dQSUVycm9yV2l0aENvbnRleHQob2JqZWN0LCBlcnJvciwgY29udGV4dCkgIFwKKyAgb2JqZWN0LT5TZXRXUElFcnJvcigod3BpX2Vycm9yX3NfIyNlcnJvciksIChjb250ZXh0KSwgX19GSUxFX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2RlZmluZSB3cGlfc2V0U3RhdGljV1BJRXJyb3Iob2JqZWN0LCBlcnJvcikgXAorICB3cGlfc2V0U3RhdGljV1BJRXJyb3JXaXRoQ29udGV4dChvYmplY3QsIGVycm9yLCAiIikKKyNkZWZpbmUgd3BpX3NldEdsb2JhbFdQSUVycm9yV2l0aENvbnRleHQoZXJyb3IsIGNvbnRleHQpICAgICAgICAgICAgICAgICAgIFwKKyAgRXJyb3JCYXNlOjpTZXRHbG9iYWxXUElFcnJvcigod3BpX2Vycm9yX3NfIyNlcnJvciksIChjb250ZXh0KSwgX19GSUxFX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2RlZmluZSB3cGlfc2V0R2xvYmFsV1BJRXJyb3IoZXJyb3IpIFwKKyAgd3BpX3NldEdsb2JhbFdQSUVycm9yV2l0aENvbnRleHQoZXJyb3IsICIiKQorCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIG1vc3Qgb2JqZWN0cy4KKyAqIEVycm9yQmFzZSBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9zdCBvYmplY3RzIHNpbmNlIGl0IGhvbGRzIHRoZSBnZW5lcmF0ZWQKKyAqIGVycm9yCisgKiBmb3IgdGhhdCBvYmplY3QuIEluIGFkZGl0aW9uLCB0aGVyZSBpcyBhIHNpbmdsZSBpbnN0YW5jZSBvZiBhIGdsb2JhbCBlcnJvcgorICogb2JqZWN0CisgKi8KK2NsYXNzIEVycm9yQmFzZSB7CisgIC8vIFRPRE86IENvbnNpZGVyIGluaXRpYWxpemluZyBpbnN0YW5jZSB2YXJpYWJsZXMgYW5kIGNsZWFudXAgaW4gZGVzdHJ1Y3RvcgorIHB1YmxpYzoKKyAgRXJyb3JCYXNlKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5FcnJvckJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgRXJyb3JCYXNlKGNvbnN0IEVycm9yQmFzZSYpID0gZGVsZXRlOworICBFcnJvckJhc2UmIG9wZXJhdG9yPShjb25zdCBFcnJvckJhc2UmKSA9IGRlbGV0ZTsKKworICB2aXJ0dWFsIEVycm9yJiBHZXRFcnJvcigpOworICB2aXJ0dWFsIGNvbnN0IEVycm9yJiBHZXRFcnJvcigpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0RXJybm9FcnJvcihsbHZtOjpTdHJpbmdSZWYgY29udGV4dE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIFNldEltYXFFcnJvcihpbnQgc3VjY2VzcywgbGx2bTo6U3RyaW5nUmVmIGNvbnRleHRNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0RXJyb3IoRXJyb3I6OkNvZGUgY29kZSwgbGx2bTo6U3RyaW5nUmVmIGNvbnRleHRNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lLCBsbHZtOjpTdHJpbmdSZWYgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIFNldFdQSUVycm9yKGxsdm06OlN0cmluZ1JlZiBlcnJvck1lc3NhZ2UsIEVycm9yOjpDb2RlIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgY29udGV4dE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsIGxsdm06OlN0cmluZ1JlZiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgQ2xvbmVFcnJvcihjb25zdCBFcnJvckJhc2UmIHJocykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBDbGVhckVycm9yKCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBTdGF0dXNJc0ZhdGFsKCkgY29uc3Q7CisgIHN0YXRpYyB2b2lkIFNldEdsb2JhbEVycm9yKEVycm9yOjpDb2RlIGNvZGUsIGxsdm06OlN0cmluZ1JlZiBjb250ZXh0TWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lLCBsbHZtOjpTdHJpbmdSZWYgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRHbG9iYWxXUElFcnJvcihsbHZtOjpTdHJpbmdSZWYgZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgY29udGV4dE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLCB1aW50MzJfdCBsaW5lTnVtYmVyKTsKKyAgc3RhdGljIEVycm9yJiBHZXRHbG9iYWxFcnJvcigpOworCisgcHJvdGVjdGVkOgorICBtdXRhYmxlIEVycm9yIG1fZXJyb3I7CisgIC8vIFRPRE86IFJlcGxhY2UgZ2xvYmFsRXJyb3Igd2l0aCBhIGdsb2JhbCBsaXN0IG9mIGFsbCBlcnJvcnMuCisgIHN0YXRpYyBwcmlvcml0eV9tdXRleCBfZ2xvYmFsRXJyb3JNdXRleDsKKyAgc3RhdGljIEVycm9yIF9nbG9iYWxFcnJvcjsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0dlbmVyaWNISUQuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvR2VuZXJpY0hJRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMWZlOGUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0dlbmVyaWNISUQuaApAQCAtMCwwICsxLDMyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiogR2VuZXJpY0hJRCBJbnRlcmZhY2UKKyAqLworY2xhc3MgR2VuZXJpY0hJRCB7CisgcHVibGljOgorICBlbnVtIEpveXN0aWNrSGFuZCB7IGtMZWZ0SGFuZCA9IDAsIGtSaWdodEhhbmQgPSAxIH07CisKKyAgdmlydHVhbCB+R2VuZXJpY0hJRCgpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIGZsb2F0IEdldFgoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZmxvYXQgR2V0WShKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBmbG9hdCBHZXRaKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGZsb2F0IEdldFR3aXN0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGZsb2F0IEdldFRocm90dGxlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGZsb2F0IEdldFJhd0F4aXModWludDMyX3QgYXhpcykgY29uc3QgPSAwOworCisgIHZpcnR1YWwgYm9vbCBHZXRUcmlnZ2VyKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgR2V0VG9wKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgR2V0QnVtcGVyKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgR2V0UmF3QnV0dG9uKHVpbnQzMl90IGJ1dHRvbikgY29uc3QgPSAwOworCisgIHZpcnR1YWwgaW50IEdldFBPVih1aW50MzJfdCBwb3YgPSAwKSBjb25zdCA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9ITFVzYWdlUmVwb3J0aW5nLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0hMVXNhZ2VSZXBvcnRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDhkMzRmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9ITFVzYWdlUmVwb3J0aW5nLmgKQEAgLTAsMCArMSwyMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworY2xhc3MgSExVc2FnZVJlcG9ydGluZ0ludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5ITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIHZvaWQgUmVwb3J0U2NoZWR1bGVyKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVwb3J0U21hcnREYXNoYm9hcmQoKSA9IDA7Cit9OworCitjbGFzcyBITFVzYWdlUmVwb3J0aW5nIHsKKyBwcml2YXRlOgorICBzdGF0aWMgSExVc2FnZVJlcG9ydGluZ0ludGVyZmFjZSogaW1wbDsKKworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0SW1wbGVtZW50YXRpb24oSExVc2FnZVJlcG9ydGluZ0ludGVyZmFjZSogaSk7CisgIHN0YXRpYyB2b2lkIFJlcG9ydFNjaGVkdWxlcigpOworICBzdGF0aWMgdm9pZCBSZXBvcnRTbWFydERhc2hib2FyZCgpOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvTGl2ZVdpbmRvdy9MaXZlV2luZG93LmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0xpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDBmNjcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0xpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oCkBAIC0wLDAgKzEsNzggQEAKKyNpZm5kZWYgX0xJVkVfV0lORE9XX0gKKyNkZWZpbmUgX0xJVkVfV0lORE9XX0gKKworI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisjaW5jbHVkZSAidGFibGVzL0lUYWJsZS5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCitzdHJ1Y3QgTGl2ZVdpbmRvd0NvbXBvbmVudCB7CisgIHN0ZDo6c3RyaW5nIHN1YnN5c3RlbTsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgYm9vbCBpc1NlbnNvciA9IGZhbHNlOworCisgIExpdmVXaW5kb3dDb21wb25lbnQoKSA9IGRlZmF1bHQ7CisgIExpdmVXaW5kb3dDb21wb25lbnQoc3RkOjpzdHJpbmcgc3Vic3lzdGVtLCBzdGQ6OnN0cmluZyBuYW1lLCBib29sIGlzU2Vuc29yKSB7CisgICAgdGhpcy0+c3Vic3lzdGVtID0gc3Vic3lzdGVtOworICAgIHRoaXMtPm5hbWUgPSBuYW1lOworICAgIHRoaXMtPmlzU2Vuc29yID0gaXNTZW5zb3I7CisgIH0KK307CisKKy8qKgorICogVGhlIExpdmVXaW5kb3cgY2xhc3MgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIHB1dHRpbmcgc2Vuc29ycyBhbmQKKyAqIGFjdHVhdG9ycworICogb24gdGhlIExpdmVXaW5kb3cuCisgKgorICogQGF1dGhvciBCcmFkIE1pbGxlcgorICovCitjbGFzcyBMaXZlV2luZG93IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBMaXZlV2luZG93ICpHZXRJbnN0YW5jZSgpOworICB2b2lkIFJ1bigpOworICB2b2lkIEFkZFNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmc3Vic3lzdGVtLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgTGl2ZVdpbmRvd1NlbmRhYmxlICpjb21wb25lbnQpOworICB2b2lkIEFkZFNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmc3Vic3lzdGVtLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgTGl2ZVdpbmRvd1NlbmRhYmxlICZjb21wb25lbnQpOworICB2b2lkIEFkZFNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmc3Vic3lzdGVtLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpdmVXaW5kb3dTZW5kYWJsZT4gY29tcG9uZW50KTsKKyAgdm9pZCBBZGRBY3R1YXRvcihjb25zdCBzdGQ6OnN0cmluZyAmc3Vic3lzdGVtLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICBMaXZlV2luZG93U2VuZGFibGUgKmNvbXBvbmVudCk7CisgIHZvaWQgQWRkQWN0dWF0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJnN1YnN5c3RlbSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgTGl2ZVdpbmRvd1NlbmRhYmxlICZjb21wb25lbnQpOworICB2b2lkIEFkZEFjdHVhdG9yKGNvbnN0IHN0ZDo6c3RyaW5nICZzdWJzeXN0ZW0sIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXZlV2luZG93U2VuZGFibGU+IGNvbXBvbmVudCk7CisKKyAgdm9pZCBBZGRTZW5zb3Ioc3RkOjpzdHJpbmcgdHlwZSwgaW50IGNoYW5uZWwsIExpdmVXaW5kb3dTZW5kYWJsZSAqY29tcG9uZW50KTsKKyAgdm9pZCBBZGRBY3R1YXRvcihzdGQ6OnN0cmluZyB0eXBlLCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICBMaXZlV2luZG93U2VuZGFibGUgKmNvbXBvbmVudCk7CisgIHZvaWQgQWRkQWN0dWF0b3Ioc3RkOjpzdHJpbmcgdHlwZSwgaW50IG1vZHVsZSwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgTGl2ZVdpbmRvd1NlbmRhYmxlICpjb21wb25lbnQpOworCisgIGJvb2wgSXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbV9lbmFibGVkOyB9CisgIHZvaWQgU2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworCisgcHJvdGVjdGVkOgorICBMaXZlV2luZG93KCk7CisgIHZpcnR1YWwgfkxpdmVXaW5kb3coKSA9IGRlZmF1bHQ7CisKKyBwcml2YXRlOgorICB2b2lkIFVwZGF0ZVZhbHVlcygpOworICB2b2lkIEluaXRpYWxpemUoKTsKKyAgdm9pZCBJbml0aWFsaXplTGl2ZVdpbmRvd0NvbXBvbmVudHMoKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TGl2ZVdpbmRvd1NlbmRhYmxlPj4gbV9zZW5zb3JzOworICBzdGQ6Om1hcDxzdGQ6OnNoYXJlZF9wdHI8TGl2ZVdpbmRvd1NlbmRhYmxlPiwgTGl2ZVdpbmRvd0NvbXBvbmVudD4gbV9jb21wb25lbnRzOworCisgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fbGl2ZVdpbmRvd1RhYmxlOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3N0YXR1c1RhYmxlOworCisgIFNjaGVkdWxlciAqbV9zY2hlZHVsZXI7CisKKyAgYm9vbCBtX2VuYWJsZWQgPSBmYWxzZTsKKyAgYm9vbCBtX2ZpcnN0VGltZSA9IHRydWU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjIwMjNhCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9MaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIFBhdHJpY2sgUGxlbmVmaXNjaCAyMDEyLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIExJVkVXSU5ET1dTRU5EQUJMRV9IXworI2RlZmluZSBMSVZFV0lORE9XU0VOREFCTEVfSF8KKworI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlLmgiCisKKy8qKgorICogTGl2ZSBXaW5kb3cgU2VuZGFibGUgaXMgYSBzcGVjaWFsIHR5cGUgb2Ygb2JqZWN0IHNlbmRhYmxlIHRvIHRoZSBsaXZlIHdpbmRvdy4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgUGxlbmVmaXNjaAorICovCitjbGFzcyBMaXZlV2luZG93U2VuZGFibGUgOiBwdWJsaWMgU2VuZGFibGUgeworIHB1YmxpYzoKKyAgLyoqCisgICAqIFVwZGF0ZSB0aGUgdGFibGUgZm9yIHRoaXMgc2VuZGFibGUgb2JqZWN0IHdpdGggdGhlIGxhdGVzdAorICAgKiB2YWx1ZXMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgVXBkYXRlVGFibGUoKSA9IDA7CisKKyAgLyoqCisgICAqIFN0YXJ0IGhhdmluZyB0aGlzIHNlbmRhYmxlIG9iamVjdCBhdXRvbWF0aWNhbGx5IHJlc3BvbmQgdG8KKyAgICogdmFsdWUgY2hhbmdlcyByZWZsZWN0IHRoZSB2YWx1ZSBvbiB0aGUgdGFibGUuCisgICAqLworICB2aXJ0dWFsIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpID0gMDsKKworICAvKioKKyAgICogU3RvcCBoYXZpbmcgdGhpcyBzZW5kYWJsZSBvYmplY3QgYXV0b21hdGljYWxseSByZXNwb25kIHRvIHZhbHVlCisgICAqIGNoYW5nZXMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgPSAwOworfTsKKworI2VuZGlmIC8qIExJVkVXSU5ET1dTRU5EQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9MaXZlV2luZG93L0xpdmVXaW5kb3dTdGF0dXNMaXN0ZW5lci5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9MaXZlV2luZG93L0xpdmVXaW5kb3dTdGF0dXNMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTNlYjcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL0xpdmVXaW5kb3cvTGl2ZVdpbmRvd1N0YXR1c0xpc3RlbmVyLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfTElWRV9XSU5ET1dfU1RBVFVTX0xJU1RFTkVSX0gKKyNkZWZpbmUgX0xJVkVfV0lORE9XX1NUQVRVU19MSVNURU5FUl9ICisKKyNpbmNsdWRlICJ0YWJsZXMvSVRhYmxlLmgiCisjaW5jbHVkZSAidGFibGVzL0lUYWJsZUxpc3RlbmVyLmgiCisKK2NsYXNzIExpdmVXaW5kb3dTdGF0dXNMaXN0ZW5lciA6IHB1YmxpYyBJVGFibGVMaXN0ZW5lciB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgVmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Ob3RpZmllci5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Ob3RpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NmVkMGEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL05vdGlmaWVyLmgKQEAgLTAsMCArMSw1NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJIQUwvY3BwL3ByaW9yaXR5X211dGV4LmgiCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPGF0b21pYz4KKwordHlwZWRlZiB2b2lkICgqVGltZXJFdmVudEhhbmRsZXIpKHZvaWQgKnBhcmFtKTsKKworY2xhc3MgTm90aWZpZXIgOiBwdWJsaWMgRXJyb3JCYXNlIHsKKyBwdWJsaWM6CisgIE5vdGlmaWVyKFRpbWVyRXZlbnRIYW5kbGVyIGhhbmRsZXIsIHZvaWQgKnBhcmFtID0gbnVsbHB0cik7CisgIHZpcnR1YWwgfk5vdGlmaWVyKCk7CisKKyAgTm90aWZpZXIoY29uc3QgTm90aWZpZXImKSA9IGRlbGV0ZTsKKyAgTm90aWZpZXImIG9wZXJhdG9yPShjb25zdCBOb3RpZmllciYpID0gZGVsZXRlOworCisgIHZvaWQgU3RhcnRTaW5nbGUoZG91YmxlIGRlbGF5KTsKKyAgdm9pZCBTdGFydFBlcmlvZGljKGRvdWJsZSBwZXJpb2QpOworICB2b2lkIFN0b3AoKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBOb3RpZmllciAqdGltZXJRdWV1ZUhlYWQ7CisgIHN0YXRpYyBwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggcXVldWVNdXRleDsKKyAgc3RhdGljIHByaW9yaXR5X211dGV4IGhhbE11dGV4OworICBzdGF0aWMgdm9pZCAqbV9ub3RpZmllcjsKKyAgc3RhdGljIHN0ZDo6YXRvbWljPGludD4gcmVmY291bnQ7CisKKyAgc3RhdGljIHZvaWQgUHJvY2Vzc1F1ZXVlKAorICAgICAgdWludDMyX3QgbWFzaywgdm9pZCAqcGFyYW1zKTsgIC8vIHByb2Nlc3MgdGhlIHRpbWVyIHF1ZXVlIG9uIGEgdGltZXIgZXZlbnQKKyAgc3RhdGljIHZvaWQKKyAgVXBkYXRlQWxhcm0oKTsgIC8vIHVwZGF0ZSB0aGUgRlBHQSBhbGFybSBzaW5jZSB0aGUgcXVldWUgaGFzIGNoYW5nZWQKKyAgdm9pZCBJbnNlcnRJblF1ZXVlKAorICAgICAgYm9vbCByZXNjaGVkdWxlKTsgICAgICAgICAvLyBpbnNlcnQgdGhpcyBOb3RpZmllciBpbiB0aGUgdGltZXIgcXVldWUKKyAgdm9pZCBEZWxldGVGcm9tUXVldWUoKTsgICAgICAgLy8gZGVsZXRlIHRoaXMgTm90aWZpZXIgZnJvbSB0aGUgdGltZXIgcXVldWUKKyAgVGltZXJFdmVudEhhbmRsZXIgbV9oYW5kbGVyOyAgLy8gYWRkcmVzcyBvZiB0aGUgaGFuZGxlcgorICB2b2lkICptX3BhcmFtOyAgICAgICAgICAgICAgICAvLyBhIHBhcmFtZXRlciB0byBwYXNzIHRvIHRoZSBoYW5kbGVyCisgIGRvdWJsZSBtX3BlcmlvZCA9IDA7ICAgICAgICAgICAgICAvLyB0aGUgcmVsYXRpdmUgdGltZSAoZWl0aGVyIHBlcmlvZGljIG9yIHNpbmdsZSkKKyAgZG91YmxlIG1fZXhwaXJhdGlvblRpbWUgPSAwOyAgLy8gYWJzb2x1dGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgY3VycmVudCBldmVudAorICBOb3RpZmllciAqbV9uZXh0RXZlbnQgPSBudWxscHRyOyAgICAvLyBuZXh0IE5vZmlmaWVyIGV2ZW50CisgIGJvb2wgbV9wZXJpb2RpYyA9IGZhbHNlOyAgICAgICAgICAvLyB0cnVlIGlmIHRoaXMgaXMgYSBwZXJpb2RpYyBldmVudAorICBib29sIG1fcXVldWVkID0gZmFsc2U7ICAgICAgICAgICAgLy8gaW5kaWNhdGVzIGlmIHRoaXMgZW50cnkgaXMgcXVldWVkCisgIHByaW9yaXR5X211dGV4IG1faGFuZGxlck11dGV4OyAgLy8gaGVsZCBieSBpbnRlcnJ1cHQgbWFuYWdlciB0YXNrIHdoaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGNhbGwgaXMgaW4gcHJvZ3Jlc3MKKworI2lmZGVmIEZSQ19TSU1VTEFUT1IKKyAgc3RhdGljIHN0ZDo6dGhyZWFkIG1fdGFzazsKKyAgc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IG1fc3RvcHBlZDsKKyNlbmRpZgorICBzdGF0aWMgdm9pZCBSdW4oKTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1BJRENvbnRyb2xsZXIuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvUElEQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTM1NmMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1BJRENvbnRyb2xsZXIuaApAQCAtMCwwICsxLDEzMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJCYXNlLmgiCisjaW5jbHVkZSAiQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorI2luY2x1ZGUgIlBJREludGVyZmFjZS5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorI2luY2x1ZGUgIk5vdGlmaWVyLmgiCisjaW5jbHVkZSAiSEFML2NwcC9wcmlvcml0eV9tdXRleC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHF1ZXVlPgorCitjbGFzcyBQSURPdXRwdXQ7CisKKy8qKgorICogQ2xhc3MgaW1wbGVtZW50cyBhIFBJRCBDb250cm9sIExvb3AuCisgKgorICogQ3JlYXRlcyBhIHNlcGFyYXRlIHRocmVhZCB3aGljaCByZWFkcyB0aGUgZ2l2ZW4gUElEU291cmNlIGFuZCB0YWtlcworICogY2FyZSBvZiB0aGUgaW50ZWdyYWwgY2FsY3VsYXRpb25zLCBhcyB3ZWxsIGFzIHdyaXRpbmcgdGhlIGdpdmVuCisgKiBQSURPdXRwdXQKKyAqLworY2xhc3MgUElEQ29udHJvbGxlciA6IHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBJREludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVRhYmxlTGlzdGVuZXIgeworIHB1YmxpYzoKKyAgUElEQ29udHJvbGxlcihmbG9hdCBwLCBmbG9hdCBpLCBmbG9hdCBkLCBQSURTb3VyY2UgKnNvdXJjZSwgUElET3V0cHV0ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgZmxvYXQgcGVyaW9kID0gMC4wNSk7CisgIFBJRENvbnRyb2xsZXIoZmxvYXQgcCwgZmxvYXQgaSwgZmxvYXQgZCwgZmxvYXQgZiwgUElEU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgUElET3V0cHV0ICpvdXRwdXQsIGZsb2F0IHBlcmlvZCA9IDAuMDUpOworICB2aXJ0dWFsIH5QSURDb250cm9sbGVyKCk7CisKKyAgUElEQ29udHJvbGxlcihjb25zdCBQSURDb250cm9sbGVyJikgPSBkZWxldGU7CisgIFBJRENvbnRyb2xsZXImIG9wZXJhdG9yPShjb25zdCBQSURDb250cm9sbGVyKSA9IGRlbGV0ZTsKKworICB2aXJ0dWFsIGZsb2F0IEdldCgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0Q29udGludW91cyhib29sIGNvbnRpbnVvdXMgPSB0cnVlKTsKKyAgdmlydHVhbCB2b2lkIFNldElucHV0UmFuZ2UoZmxvYXQgbWluaW11bUlucHV0LCBmbG9hdCBtYXhpbXVtSW5wdXQpOworICB2aXJ0dWFsIHZvaWQgU2V0T3V0cHV0UmFuZ2UoZmxvYXQgbWluaW11bU91dHB1dCwgZmxvYXQgbWF4aW11bU91dHB1dCk7CisgIHZpcnR1YWwgdm9pZCBTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYpOworICB2aXJ0dWFsIGRvdWJsZSBHZXRQKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZG91YmxlIEdldEkoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0RCgpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGRvdWJsZSBHZXRGKCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIFNldFNldHBvaW50KGZsb2F0IHNldHBvaW50KSBvdmVycmlkZTsKKyAgdmlydHVhbCBkb3VibGUgR2V0U2V0cG9pbnQoKSBjb25zdCBvdmVycmlkZTsKKworICB2aXJ0dWFsIGZsb2F0IEdldEVycm9yKCkgY29uc3Q7CisgIHZpcnR1YWwgZmxvYXQgR2V0QXZnRXJyb3IoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgU2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSk7CisgIHZpcnR1YWwgUElEU291cmNlVHlwZSBHZXRQSURTb3VyY2VUeXBlKCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIFNldFRvbGVyYW5jZShmbG9hdCBwZXJjZW50KTsKKyAgdmlydHVhbCB2b2lkIFNldEFic29sdXRlVG9sZXJhbmNlKGZsb2F0IGFic1ZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIFNldFBlcmNlbnRUb2xlcmFuY2UoZmxvYXQgcGVyY2VudFZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIFNldFRvbGVyYW5jZUJ1ZmZlcih1bnNpZ25lZCBidWYgPSAxKTsKKyAgdmlydHVhbCBib29sIE9uVGFyZ2V0KCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIEVuYWJsZSgpIG92ZXJyaWRlOworICB2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpIG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgSXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiB0YWJsZSkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIFBJRFNvdXJjZSAqbV9waWRJbnB1dDsKKyAgUElET3V0cHV0ICptX3BpZE91dHB1dDsKKworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworICB2aXJ0dWFsIHZvaWQgQ2FsY3VsYXRlKCk7CisKKyBwcml2YXRlOgorICBmbG9hdCBtX1A7ICAgICAgICAgICAgICAvLyBmYWN0b3IgZm9yICJwcm9wb3J0aW9uYWwiIGNvbnRyb2wKKyAgZmxvYXQgbV9JOyAgICAgICAgICAgICAgLy8gZmFjdG9yIGZvciAiaW50ZWdyYWwiIGNvbnRyb2wKKyAgZmxvYXQgbV9EOyAgICAgICAgICAgICAgLy8gZmFjdG9yIGZvciAiZGVyaXZhdGl2ZSIgY29udHJvbAorICBmbG9hdCBtX0Y7ICAgICAgICAgICAgICAvLyBmYWN0b3IgZm9yICJmZWVkIGZvcndhcmQiIGNvbnRyb2wKKyAgZmxvYXQgbV9tYXhpbXVtT3V0cHV0ID0gMS4wOyAgLy8gfG1heGltdW0gb3V0cHV0fAorICBmbG9hdCBtX21pbmltdW1PdXRwdXQgPSAtMS4wOyAgLy8gfG1pbmltdW0gb3V0cHV0fAorICBmbG9hdCBtX21heGltdW1JbnB1dCA9IDA7ICAgLy8gbWF4aW11bSBpbnB1dCAtIGxpbWl0IHNldHBvaW50IHRvIHRoaXMKKyAgZmxvYXQgbV9taW5pbXVtSW5wdXQgPSAwOyAgIC8vIG1pbmltdW0gaW5wdXQgLSBsaW1pdCBzZXRwb2ludCB0byB0aGlzCisgIGJvb2wgbV9jb250aW51b3VzID0gZmFsc2U7ICAgICAgLy8gZG8gdGhlIGVuZHBvaW50cyB3cmFwIGFyb3VuZD8gZWcuIEFic29sdXRlIGVuY29kZXIKKyAgYm9vbCBtX2VuYWJsZWQgPSBmYWxzZTsgIC8vIGlzIHRoZSBwaWQgY29udHJvbGxlciBlbmFibGVkCisgIGZsb2F0IG1fcHJldklucHV0ID0gMDsgIC8vIHRoZSBwcmlvciBzZW5zb3IgaW5wdXQgKHVzZWQgdG8gY29tcHV0ZSB2ZWxvY2l0eSkKKyAgZG91YmxlIG1fdG90YWxFcnJvciA9IDA7ICAvLyB0aGUgc3VtIG9mIHRoZSBlcnJvcnMgZm9yIHVzZSBpbiB0aGUgaW50ZWdyYWwgY2FsYworICBlbnVtIHsKKyAgICBrQWJzb2x1dGVUb2xlcmFuY2UsCisgICAga1BlcmNlbnRUb2xlcmFuY2UsCisgICAga05vVG9sZXJhbmNlCisgIH0gbV90b2xlcmFuY2VUeXBlID0ga05vVG9sZXJhbmNlOworCisgIC8vIHRoZSBwZXJjZXRhZ2Ugb3IgYWJzb2x1dGUgZXJyb3IgdGhhdCBpcyBjb25zaWRlcmVkIG9uIHRhcmdldC4KKyAgZmxvYXQgbV90b2xlcmFuY2UgPSAwLjA1OworICBmbG9hdCBtX3NldHBvaW50ID0gMDsKKyAgZmxvYXQgbV9lcnJvciA9IDA7CisgIGZsb2F0IG1fcmVzdWx0ID0gMDsKKyAgZmxvYXQgbV9wZXJpb2Q7CisKKyAgLy8gTGVuZ3RoIG9mIGJ1ZmZlciBmb3IgYXZlcmFnaW5nIGZvciB0b2xlcmFuY2VzLgorICBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gbV9idWZMZW5ndGh7MX07CisgIHN0ZDo6cXVldWU8ZG91YmxlPiBtX2J1ZjsKKyAgZG91YmxlIG1fYnVmVG90YWwgPSAwOworCisgIG11dGFibGUgcHJpb3JpdHlfbXV0ZXggbV9tdXRleDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Tm90aWZpZXI+IG1fY29udHJvbExvb3A7CisKKyAgdm9pZCBJbml0aWFsaXplKGZsb2F0IHAsIGZsb2F0IGksIGZsb2F0IGQsIGZsb2F0IGYsIFBJRFNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgUElET3V0cHV0ICpvdXRwdXQsIGZsb2F0IHBlcmlvZCA9IDAuMDUpOworICBzdGF0aWMgdm9pZCBDYWxsQ2FsY3VsYXRlKHZvaWQgKmNvbnRyb2xsZXIpOworCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFZhbHVlQ2hhbmdlZChJVGFibGUgKnNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTmV3KSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBTdGFydExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1BJREludGVyZmFjZS5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9QSURJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDUwMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9QSURJbnRlcmZhY2UuaApAQCAtMCwwICsxLDIxIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkJhc2UuaCIKKyNpbmNsdWRlICJDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKK2NsYXNzIFBJREludGVyZmFjZSA6IHB1YmxpYyBDb250cm9sbGVyIHsKKyAgdmlydHVhbCB2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldFAoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldEkoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldEQoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB2b2lkIFNldFNldHBvaW50KGZsb2F0IHNldHBvaW50KSA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldFNldHBvaW50KCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBFbmFibGUoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEaXNhYmxlKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgSXNFbmFibGVkKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1BJRE91dHB1dC5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9QSURPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQyMWQwCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9QSURPdXRwdXQuaApAQCAtMCwwICsxLDIwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkJhc2UuaCIKKworLyoqCisgKiBQSURPdXRwdXQgaW50ZXJmYWNlIGlzIGEgZ2VuZXJpYyBvdXRwdXQgZm9yIHRoZSBQSUQgY2xhc3MuCisgKiBQV01zIHVzZSB0aGlzIGNsYXNzLgorICogVXNlcnMgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGFsbG93IGZvciBhIFBJRENvbnRyb2xsZXIgdG8KKyAqIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgaW5wdXRzCisgKi8KK2NsYXNzIFBJRE91dHB1dCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUElEV3JpdGUoZmxvYXQgb3V0cHV0KSA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9QSURTb3VyY2UuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvUElEU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0NmVhNAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvUElEU291cmNlLmgKQEAgLTAsMCArMSwyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKK2VudW0gY2xhc3MgUElEU291cmNlVHlwZSB7IGtEaXNwbGFjZW1lbnQsIGtSYXRlIH07CisKKy8qKgorICogUElEU291cmNlIGludGVyZmFjZSBpcyBhIGdlbmVyaWMgc2Vuc29yIHNvdXJjZSBmb3IgdGhlIFBJRCBjbGFzcy4KKyAqIEFsbCBzZW5zb3JzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgUElEIGNsYXNzIHdpbGwgaW1wbGVtZW50IHRoZSBQSURTb3VyY2UKKyAqIHRoYXQKKyAqIHJldHVybnMgYSBzdGFuZGFyZCB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgUElEIGNvZGUuCisgKi8KK2NsYXNzIFBJRFNvdXJjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSk7CisgIFBJRFNvdXJjZVR5cGUgR2V0UElEU291cmNlVHlwZSgpIGNvbnN0OworICB2aXJ0dWFsIGRvdWJsZSBQSURHZXQoKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIFBJRFNvdXJjZVR5cGUgbV9waWRTb3VyY2UgPSBQSURTb3VyY2VUeXBlOjprRGlzcGxhY2VtZW50OworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvUmVzb3VyY2UuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvUmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzA2MWM4Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9SZXNvdXJjZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkhBTC9jcHAvcHJpb3JpdHlfbXV0ZXguaCIKKworLyoqCisgKiBUaGUgUmVzb3VyY2UgY2xhc3MgaXMgYSBjb252ZW5pZW50IHdheSB0byB0cmFjayBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorICogSXQgdHJhY2tzIHRoZW0gYXMgaW5kaWNpZXMgaW4gdGhlIHJhbmdlIFswIC4uIGVsZW1lbnRzIC0gMV0uCisgKiBFLmcuIHRoZSBsaWJyYXJ5IHVzZXMgdGhpcyB0byB0cmFjayBoYXJkd2FyZSBjaGFubmVsIGFsbG9jYXRpb24uCisgKgorICogVGhlIFJlc291cmNlIGNsYXNzIGRvZXMgbm90IGFsbG9jYXRlIHRoZSBoYXJkd2FyZSBjaGFubmVscyBvciBvdGhlcgorICogcmVzb3VyY2VzOyBpdCBqdXN0IHRyYWNrcyB3aGljaCBpbmRpY2VzIHdlcmUgbWFya2VkIGluIHVzZSBieQorICogQWxsb2NhdGUgYW5kIG5vdCB5ZXQgZnJlZWQgYnkgRnJlZS4KKyAqLworY2xhc3MgUmVzb3VyY2UgOiBwdWJsaWMgRXJyb3JCYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflJlc291cmNlKCkgPSBkZWZhdWx0OworCisgIFJlc291cmNlKGNvbnN0IFJlc291cmNlJikgPSBkZWxldGU7CisgIFJlc291cmNlJiBvcGVyYXRvcj0oY29uc3QgUmVzb3VyY2UmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgdm9pZCBDcmVhdGVSZXNvdXJjZU9iamVjdChzdGQ6OnVuaXF1ZV9wdHI8UmVzb3VyY2U+JiByLCB1aW50MzJfdCBlbGVtZW50cyk7CisgIGV4cGxpY2l0IFJlc291cmNlKHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCBBbGxvY2F0ZShjb25zdCBzdGQ6OnN0cmluZyAmcmVzb3VyY2VEZXNjKTsKKyAgdWludDMyX3QgQWxsb2NhdGUodWludDMyX3QgaW5kZXgsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZXNvdXJjZURlc2MpOworICB2b2lkIEZyZWUodWludDMyX3QgaW5kZXgpOworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gbV9pc0FsbG9jYXRlZDsKKyAgcHJpb3JpdHlfcmVjdXJzaXZlX211dGV4IG1fYWxsb2NhdGVMb2NrOworCisgIHN0YXRpYyBwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggbV9jcmVhdGVMb2NrOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvUm9ib3RTdGF0ZS5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9Sb2JvdFN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiZjMyYQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvUm9ib3RTdGF0ZS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK2NsYXNzIFJvYm90U3RhdGVJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Um9ib3RTdGF0ZUludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgdmlydHVhbCBib29sIElzRGlzYWJsZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBJc0VuYWJsZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBJc09wZXJhdG9yQ29udHJvbCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIElzQXV0b25vbW91cygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIElzVGVzdCgpIGNvbnN0ID0gMDsKK307CisKK2NsYXNzIFJvYm90U3RhdGUgeworIHByaXZhdGU6CisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Um9ib3RTdGF0ZUludGVyZmFjZT4gaW1wbDsKKworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgU2V0SW1wbGVtZW50YXRpb24oUm9ib3RTdGF0ZUludGVyZmFjZSYgaSk7CisgIHN0YXRpYyB2b2lkIFNldEltcGxlbWVudGF0aW9uKHN0ZDo6c2hhcmVkX3B0cjxSb2JvdFN0YXRlSW50ZXJmYWNlPiBpKTsKKyAgc3RhdGljIGJvb2wgSXNEaXNhYmxlZCgpOworICBzdGF0aWMgYm9vbCBJc0VuYWJsZWQoKTsKKyAgc3RhdGljIGJvb2wgSXNPcGVyYXRvckNvbnRyb2woKTsKKyAgc3RhdGljIGJvb2wgSXNBdXRvbm9tb3VzKCk7CisgIHN0YXRpYyBib29sIElzVGVzdCgpOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvU2Vuc29yQmFzZS5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9TZW5zb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzOGI1ZQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvU2Vuc29yQmFzZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJCYXNlLmgiCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIHNlbnNvcnMuCisgKiBTdG9yZXMgbW9zdCByZWNlbnQgc3RhdHVzIGluZm9ybWF0aW9uIGFzIHdlbGwgYXMgY29udGFpbmluZyB1dGlsaXR5IGZ1bmN0aW9ucworICogZm9yIGNoZWNraW5nCisgKiBjaGFubmVscyBhbmQgZXJyb3IgcHJvY2Vzc2luZy4KKyAqLworY2xhc3MgU2Vuc29yQmFzZSA6IHB1YmxpYyBFcnJvckJhc2UgeworIHB1YmxpYzoKKyAgU2Vuc29yQmFzZSgpOworICB2aXJ0dWFsIH5TZW5zb3JCYXNlKCkgPSBkZWZhdWx0OworCisgIFNlbnNvckJhc2UoY29uc3QgU2Vuc29yQmFzZSYpID0gZGVsZXRlOworICBTZW5zb3JCYXNlJiBvcGVyYXRvcj0oY29uc3QgU2Vuc29yQmFzZSYpID0gZGVsZXRlOworCisgIHN0YXRpYyB2b2lkIERlbGV0ZVNpbmdsZXRvbnMoKTsKKworICBzdGF0aWMgdWludDMyX3QgR2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKCkgeyByZXR1cm4gMDsgfQorCisgIHN0YXRpYyBib29sIENoZWNrU29sZW5vaWRNb2R1bGUodWludDhfdCBtb2R1bGVOdW1iZXIpOworICBzdGF0aWMgYm9vbCBDaGVja0RpZ2l0YWxDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpOworICBzdGF0aWMgYm9vbCBDaGVja1JlbGF5Q2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKKyAgc3RhdGljIGJvb2wgQ2hlY2tQV01DaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpOworICBzdGF0aWMgYm9vbCBDaGVja0FuYWxvZ0lucHV0KHVpbnQzMl90IGNoYW5uZWwpOworICBzdGF0aWMgYm9vbCBDaGVja0FuYWxvZ091dHB1dCh1aW50MzJfdCBjaGFubmVsKTsKKyAgc3RhdGljIGJvb2wgQ2hlY2tTb2xlbm9pZENoYW5uZWwodWludDMyX3QgY2hhbm5lbCk7CisgIHN0YXRpYyBib29sIENoZWNrUERQQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0RpZ2l0YWxDaGFubmVscyA9IDI2OworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0FuYWxvZ0lucHV0cyA9IDg7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQW5hbG9nT3V0cHV0cyA9IDI7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU29sZW5vaWRDaGFubmVscyA9IDg7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU29sZW5vaWRNb2R1bGVzID0gMjsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtQd21DaGFubmVscyA9IDIwOworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1JlbGF5Q2hhbm5lbHMgPSA4OworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1BEUENoYW5uZWxzID0gMTY7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2hhc3Npc1Nsb3RzID0gODsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBBZGRUb1NpbmdsZXRvbkxpc3QoKTsKKworICBzdGF0aWMgdm9pZCogbV9kaWdpdGFsX3BvcnRzW2tEaWdpdGFsQ2hhbm5lbHNdOworICBzdGF0aWMgdm9pZCogbV9yZWxheV9wb3J0c1trUmVsYXlDaGFubmVsc107CisgIHN0YXRpYyB2b2lkKiBtX3B3bV9wb3J0c1trUHdtQ2hhbm5lbHNdOworCisgcHJpdmF0ZToKKyAgc3RhdGljIFNlbnNvckJhc2UqIG1fc2luZ2xldG9uTGlzdDsKKyAgU2Vuc29yQmFzZSogbV9uZXh0U2luZ2xldG9uID0gbnVsbHB0cjsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvTmFtZWRTZW5kYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDFiMjQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogTmFtZWRTZW5kYWJsZS5oCisgKgorICogIENyZWF0ZWQgb246IE9jdCAxOSwgMjAxMgorICogICAgICBBdXRob3I6IE1pdGNoZWxsIFdpbGxzCisgKi8KKworI2lmbmRlZiBOQU1FRFNFTkRBQkxFX0hfCisjZGVmaW5lIE5BTUVEU0VOREFCTEVfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZS5oIgorCisvKioKKyAqIFRoZSBpbnRlcmZhY2UgZm9yIHNlbmRhYmxlIG9iamVjdHMgdGhhdCBnaXZlcyB0aGUgc2VuZGFibGUgYSBkZWZhdWx0IG5hbWUgaW4KKyAqIHRoZSBTbWFydCBEYXNoYm9hcmQKKyAqCisgKi8KK2NsYXNzIE5hbWVkU2VuZGFibGUgOiBwdWJsaWMgU2VuZGFibGUgeworIHB1YmxpYzoKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN1YnRhYmxlIG9mIFNtYXJ0RGFzaGJvYXJkIHRoYXQgdGhlIFNlbmRhYmxlIG9iamVjdAorICAgKiB3aWxsIHVzZQorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXROYW1lKCkgY29uc3QgPSAwOworfTsKKworI2VuZGlmIC8qIE5BTUVEU0VOREFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGUuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNjN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1NNQVJUX0RBU0hCT0FSRF9EQVRBX18KKyNkZWZpbmUgX19TTUFSVF9EQVNIQk9BUkRfREFUQV9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgInRhYmxlcy9JVGFibGUuaCIKKworY2xhc3MgU2VuZGFibGUgeworIHB1YmxpYzoKKyAgLyoqCisgICAqIEluaXRpYWxpemVzIGEgdGFibGUgZm9yIHRoaXMgc2VuZGFibGUgb2JqZWN0LgorICAgKiBAcGFyYW0gc3VidGFibGUgVGhlIHRhYmxlIHRvIHB1dCB0aGUgdmFsdWVzIGluLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJ0YWJsZSkgPSAwOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB0YWJsZSB0aGF0IGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbmRhYmxlCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5hbWVkIGRhdGEgdHlwZSB0aGF0IHdpbGwgYmUgdXNlZAorICAgKiBieSB0aGUgc21hcnQgZGFzaGJvYXJkIGZvciB0aGlzIHNlbmRhYmxlCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0ID0gMDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGVDaG9vc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkZjg3NwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGVDaG9vc2VyLmgKQEAgLTAsMCArMSw1MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fU0VOREFCTEVfQ0hPT1NFUl9IX18KKyNkZWZpbmUgX19TRU5EQUJMRV9DSE9PU0VSX0hfXworCisjaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGUuaCIKKyNpbmNsdWRlICJ0YWJsZXMvSVRhYmxlLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8qKgorICogVGhlIHtAbGluayBTZW5kYWJsZUNob29zZXJ9IGNsYXNzIGlzIGEgdXNlZnVsIHRvb2wgZm9yIHByZXNlbnRpbmcgYSBzZWxlY3Rpb24KKyAqIG9mIG9wdGlvbnMKKyAqIHRvIHRoZSB7QGxpbmsgU21hcnREYXNoYm9hcmR9LgorICoKKyAqIDxwPkZvciBpbnN0YW5jZSwgeW91IG1heSB3aXNoIHRvIGJlIGFibGUgdG8gc2VsZWN0IGJldHdlZW4gbXVsdGlwbGUKKyAqIGF1dG9ub21vdXMgbW9kZXMuCisgKiBZb3UgY2FuIGRvIHRoaXMgYnkgcHV0dGluZyBldmVyeSBwb3NzaWJsZSB7QGxpbmsgQ29tbWFuZH0geW91IHdhbnQgdG8gcnVuIGFzCisgKiBhbiBhdXRvbm9tb3VzIGludG8KKyAqIGEge0BsaW5rIFNlbmRhYmxlQ2hvb3Nlcn0gYW5kIHRoZW4gcHV0IGl0IGludG8gdGhlIHtAbGluayBTbWFydERhc2hib2FyZH0gdG8KKyAqIGhhdmUgYSBsaXN0IG9mIG9wdGlvbnMKKyAqIGFwcGVhciBvbiB0aGUgbGFwdG9wLiAgT25jZSBhdXRvbm9tb3VzIHN0YXJ0cywgc2ltcGx5IGFzayB0aGUge0BsaW5rCisgKiBTZW5kYWJsZUNob29zZXJ9IHdoYXQgdGhlIHNlbGVjdGVkCisgKiB2YWx1ZSBpcy48L3A+CisgKgorICogQHNlZSBTbWFydERhc2hib2FyZAorICovCitjbGFzcyBTZW5kYWJsZUNob29zZXIgOiBwdWJsaWMgU2VuZGFibGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+U2VuZGFibGVDaG9vc2VyKCkgPSBkZWZhdWx0OworCisgIHZvaWQgQWRkT2JqZWN0KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCB2b2lkICpvYmplY3QpOworICB2b2lkIEFkZERlZmF1bHQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHZvaWQgKm9iamVjdCk7CisgIHZvaWQgKkdldFNlbGVjdGVkKCk7CisKKyAgdmlydHVhbCB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJ0YWJsZSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG1fZGVmYXVsdENob2ljZTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHZvaWQgKj4gbV9jaG9pY2VzOworICBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjZmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaApAQCAtMCwwICsxLDU0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19TTUFSVF9EQVNIQk9BUkRfSF9fCisjZGVmaW5lIF9fU01BUlRfREFTSEJPQVJEX0hfXworCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGUuaCIKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9OYW1lZFNlbmRhYmxlLmgiCisjaW5jbHVkZSAidGFibGVzL0lUYWJsZS5oIgorCitjbGFzcyBTbWFydERhc2hib2FyZCA6IHB1YmxpYyBTZW5zb3JCYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGluaXQoKTsKKworICBzdGF0aWMgdm9pZCBQdXREYXRhKGxsdm06OlN0cmluZ1JlZiBrZXksIFNlbmRhYmxlICpkYXRhKTsKKyAgc3RhdGljIHZvaWQgUHV0RGF0YShOYW1lZFNlbmRhYmxlICp2YWx1ZSk7CisgIHN0YXRpYyBTZW5kYWJsZSAqR2V0RGF0YShsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSk7CisKKyAgc3RhdGljIHZvaWQgUHV0Qm9vbGVhbihsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwgYm9vbCB2YWx1ZSk7CisgIHN0YXRpYyBib29sIEdldEJvb2xlYW4obGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGJvb2wgZGVmYXVsdFZhbHVlKTsKKworICBzdGF0aWMgdm9pZCBQdXROdW1iZXIobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGRvdWJsZSB2YWx1ZSk7CisgIHN0YXRpYyBkb3VibGUgR2V0TnVtYmVyKGxsdm06OlN0cmluZ1JlZiBrZXlOYW1lLCBkb3VibGUgZGVmYXVsdFZhbHVlKTsKKworICBzdGF0aWMgdm9pZCBQdXRTdHJpbmcobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGxsdm06OlN0cmluZ1JlZiB2YWx1ZSk7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRTdHJpbmcobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSk7CisKKyAgc3RhdGljIHZvaWQgUHV0VmFsdWUobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlKTsKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IEdldFZhbHVlKGxsdm06OlN0cmluZ1JlZiBrZXlOYW1lKTsKKworIHByaXZhdGU6CisgIHZpcnR1YWwgflNtYXJ0RGFzaGJvYXJkKCkgPSBkZWZhdWx0OworCisgIC8qKiBUaGUge0BsaW5rIE5ldHdvcmtUYWJsZX0gdXNlZCBieSB7QGxpbmsgU21hcnREYXNoYm9hcmR9ICovCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworCisgIC8qKgorICAgKiBBIG1hcCBsaW5raW5nIHRhYmxlcyBpbiB0aGUgU21hcnREYXNoYm9hcmQgdG8gdGhlIHtAbGluaworICAgKiBTbWFydERhc2hib2FyZERhdGF9IG9iamVjdHMKKyAgICogdGhleSBjYW1lIGZyb20uCisgICAqLworICBzdGF0aWMgc3RkOjptYXA8c3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gLCBTZW5kYWJsZSAqPiBtX3RhYmxlc1RvRGF0YTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9UYXNrLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzUyZDBkCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9UYXNrLmgKQEAgLTAsMCArMSw1MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlICJIQUwvVGFzay5ocHAiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKworLyoqCisgKiBXcmFwcGVyIGNsYXNzIGFyb3VuZCBzdGQ6OnRocmVhZCB0aGF0IGFsbG93cyBjaGFuZ2luZyB0aHJlYWQgcHJpb3JpdHkKKyAqLworY2xhc3MgVGFzayA6IHB1YmxpYyBFcnJvckJhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0UHJpb3JpdHkgPSA2MDsKKworICBUYXNrKCkgPSBkZWZhdWx0OworICBUYXNrKGNvbnN0IFRhc2smKSA9IGRlbGV0ZTsKKyAgVGFzayYgb3BlcmF0b3I9KGNvbnN0IFRhc2smKSA9IGRlbGV0ZTsKKyAgVGFzayYgb3BlcmF0b3I9KFRhc2smJiB0YXNrKTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgRnVuY3Rpb24sIGNsYXNzLi4uIEFyZ3M+CisgIFRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIEZ1bmN0aW9uJiYgZnVuY3Rpb24sIEFyZ3MmJi4uLiBhcmdzKTsKKworICB2aXJ0dWFsIH5UYXNrKCk7CisKKyAgYm9vbCBqb2luYWJsZSgpIGNvbnN0IG5vZXhjZXB0OworICB2b2lkIGpvaW4oKTsKKyAgdm9pZCBkZXRhY2goKTsKKyAgc3RkOjp0aHJlYWQ6OmlkIGdldF9pZCgpIGNvbnN0IG5vZXhjZXB0OworICBzdGQ6OnRocmVhZDo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoKTsKKworICBib29sIFZlcmlmeSgpOworCisgIGludDMyX3QgR2V0UHJpb3JpdHkoKTsKKworICBib29sIFNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpOworCisgIHN0ZDo6c3RyaW5nIEdldE5hbWUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0ZDo6dGhyZWFkIG1fdGhyZWFkOworICBzdGQ6OnN0cmluZyBtX3Rhc2tOYW1lOworICBib29sIEhhbmRsZUVycm9yKFNUQVRVUyByZXN1bHRzKTsKK307CisKKyNpbmNsdWRlICJUYXNrLmluYyIKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvVGFzay5pbmMgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1Rhc2suaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTRiOTIKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1Rhc2suaW5jCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlIDxhdG9taWM+CisKKy8qKgorICogQ3JlYXRlIGFuZCBsYXVuY2ggYSB0YXNrLgorICoKKyAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrLiAiRlJDXyIgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIHRhc2sgbmFtZS4KKyAqIEBwYXJhbSBmdW5jdGlvbiBUaGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdG8gcnVuIGFzIHRoZSBuZXcgdGFzay4KKyAqIEBwYXJhbSBhcmdzIEEgcGFyYW1ldGVyIHBhY2sgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgRnVuY3Rpb24sIGNsYXNzLi4uIEFyZ3M+CitUYXNrOjpUYXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBGdW5jdGlvbiYmIGZ1bmN0aW9uLCBBcmdzJiYuLi4gYXJncykgeworICBtX3Rhc2tOYW1lID0gIkZSQ18iOworICBtX3Rhc2tOYW1lICs9IG5hbWU7CisKKyAgc3RkOjpjb3V0IDw8ICJbSEFMXSBTdGFydGluZyB0YXNrICIgPDwgbV90YXNrTmFtZSA8PCAiLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgbV90aHJlYWQgPSBzdGQ6OnRocmVhZChzdGQ6OmZvcndhcmQ8c3RkOjpkZWNheV90PEZ1bmN0aW9uPj4oZnVuY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgIC8vVE9ETzogbHZ1c2VyIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIHBlcm1pc3Npb25zIHRvIHNldCB0aGUgcHJpb3JpdHkuCisgIC8vU2V0UHJpb3JpdHkoa0RlZmF1bHRQcmlvcml0eSk7CisKKyAgc3RhdGljIHN0ZDo6YXRvbWljPGludDMyX3Q+IGluc3RhbmNlc3swfTsKKyAgaW5zdGFuY2VzKys7CisgIEhBTFJlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9UYXNrLCBpbnN0YW5jZXMsIDAsIG1fdGFza05hbWUuY19zdHIoKSk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1RpbWVyLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiOTYwNAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvVGltZXIuaApAQCAtMCwwICsxLDU0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkJhc2UuaCIKKyNpbmNsdWRlICJIQUwvY3BwL3ByaW9yaXR5X211dGV4LmgiCisKK3R5cGVkZWYgdm9pZCAoKlRpbWVySW50ZXJydXB0SGFuZGxlcikodm9pZCAqcGFyYW0pOworCit2b2lkIFdhaXQoZG91YmxlIHNlY29uZHMpOworZG91YmxlIEdldENsb2NrKCk7Citkb3VibGUgR2V0VGltZSgpOworCisvKioKKyAqIFRpbWVyIG9iamVjdHMgbWVhc3VyZSBhY2N1bXVsYXRlZCB0aW1lIGluIHNlY29uZHMuCisgKiBUaGUgdGltZXIgb2JqZWN0IGZ1bmN0aW9ucyBsaWtlIGEgc3RvcHdhdGNoLiBJdCBjYW4gYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kCisgKiBjbGVhcmVkLiBXaGVuIHRoZQorICogdGltZXIgaXMgcnVubmluZyBpdHMgdmFsdWUgY291bnRzIHVwIGluIHNlY29uZHMuIFdoZW4gc3RvcHBlZCwgdGhlIHRpbWVyCisgKiBob2xkcyB0aGUgY3VycmVudAorICogdmFsdWUuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmVjb3JkcyB0aGUgdGltZSB3aGVuIHN0YXJ0ZWQgYW5kIHN1YnRyYWN0cworICogdGhlIGN1cnJlbnQgdGltZQorICogd2hlbmV2ZXIgdGhlIHZhbHVlIGlzIHJlcXVlc3RlZC4KKyAqLworY2xhc3MgVGltZXIgeworIHB1YmxpYzoKKyAgVGltZXIoKTsKKyAgdmlydHVhbCB+VGltZXIoKSA9IGRlZmF1bHQ7CisKKyAgVGltZXIoY29uc3QgVGltZXImKSA9IGRlbGV0ZTsKKyAgVGltZXImIG9wZXJhdG9yPShjb25zdCBUaW1lciYpID0gZGVsZXRlOworCisgIGRvdWJsZSBHZXQoKSBjb25zdDsKKyAgdm9pZCBSZXNldCgpOworICB2b2lkIFN0YXJ0KCk7CisgIHZvaWQgU3RvcCgpOworICBib29sIEhhc1BlcmlvZFBhc3NlZChkb3VibGUgcGVyaW9kKTsKKworICBzdGF0aWMgZG91YmxlIEdldEZQR0FUaW1lc3RhbXAoKTsKKyAgc3RhdGljIGRvdWJsZSBHZXRQUENUaW1lc3RhbXAoKTsKKyAgc3RhdGljIGRvdWJsZSBHZXRNYXRjaFRpbWUoKTsKKworICAvLyBUaGUgdGltZSwgaW4gc2Vjb25kcywgYXQgd2hpY2ggdGhlIDMyLWJpdCBGUEdBIHRpbWVzdGFtcCByb2xscyBvdmVyIHRvIDAKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBrUm9sbG92ZXJUaW1lOworCisgcHJpdmF0ZToKKyAgZG91YmxlIG1fc3RhcnRUaW1lID0gMC4wOworICBkb3VibGUgbV9hY2N1bXVsYXRlZFRpbWUgPSAwLjA7CisgIGJvb2wgbV9ydW5uaW5nID0gZmFsc2U7CisgIG11dGFibGUgcHJpb3JpdHlfbXV0ZXggbV9tdXRleDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1V0aWxpdHkuaCBiL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvVXRpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWRiNjMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1V0aWxpdHkuaApAQCAtMCwwICsxLDUxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisvKiogQGZpbGUKKyAqIENvbnRhaW5zIGdsb2JhbCB1dGlsaXR5IGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNkZWZpbmUgd3BpX2Fzc2VydChjb25kaXRpb24pIFwKKyAgd3BpX2Fzc2VydF9pbXBsKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgIiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKQorI2RlZmluZSB3cGlfYXNzZXJ0V2l0aE1lc3NhZ2UoY29uZGl0aW9uLCBtZXNzYWdlKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3BpX2Fzc2VydF9pbXBsKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBcCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pCisKKyNkZWZpbmUgd3BpX2Fzc2VydEVxdWFsKGEsIGIpIFwKKyAgd3BpX2Fzc2VydEVxdWFsX2ltcGwoYSwgYiwgI2EsICNiLCAiIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIHdwaV9hc3NlcnRFcXVhbFdpdGhNZXNzYWdlKGEsIGIsIG1lc3NhZ2UpIFwKKyAgd3BpX2Fzc2VydEVxdWFsX2ltcGwoYSwgYiwgI2EsICNiLCBtZXNzYWdlLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykKKworI2RlZmluZSB3cGlfYXNzZXJ0Tm90RXF1YWwoYSwgYikgXAorICB3cGlfYXNzZXJ0Tm90RXF1YWxfaW1wbChhLCBiLCAjYSwgI2IsICIiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgd3BpX2Fzc2VydE5vdEVxdWFsV2l0aE1lc3NhZ2UoYSwgYiwgbWVzc2FnZSkgICAgICAgICAgICAgICAgIFwKKyAgd3BpX2Fzc2VydE5vdEVxdWFsX2ltcGwoYSwgYiwgI2EsICNiLCBtZXNzYWdlLCBfX0ZJTEVfXywgX19MSU5FX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKQorCitib29sIHdwaV9hc3NlcnRfaW1wbChib29sIGNvbmRpdGlvblZhbHVlLCBjb25zdCBjaGFyICpjb25kaXRpb25UZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgY2hhciAqZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpmdW5jTmFtZSk7Citib29sIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsIGNvbnN0IGNoYXIgKnZhbHVlQVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWVCU3RyaW5nLCBjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwgdWludDMyX3QgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY05hbWUpOworYm9vbCB3cGlfYXNzZXJ0Tm90RXF1YWxfaW1wbChpbnQgdmFsdWVBLCBpbnQgdmFsdWVCLCBjb25zdCBjaGFyICp2YWx1ZUFTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlQlN0cmluZywgY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsIHVpbnQzMl90IGxpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lKTsKKwordm9pZCB3cGlfc3VzcGVuZE9uQXNzZXJ0RW5hYmxlZChib29sIGVuYWJsZWQpOworCit1aW50MTZfdCBHZXRGUEdBVmVyc2lvbigpOwordWludDMyX3QgR2V0RlBHQVJldmlzaW9uKCk7Cit1aW50MzJfdCBHZXRGUEdBVGltZSgpOworYm9vbCBHZXRVc2VyQnV0dG9uKCk7CitzdGQ6OnN0cmluZyBHZXRTdGFja1RyYWNlKHVpbnQzMl90IG9mZnNldCk7CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL1dQSUVycm9ycy5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9XUElFcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ2ZmRmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9XUElFcnJvcnMuaApAQCAtMCwwICsxLDEwMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzdGRpbnQuaCIKKworI2lmZGVmIFdQSV9FUlJPUlNfREVGSU5FX1NUUklOR1MKKyNkZWZpbmUgUyhsYWJlbCwgb2Zmc2V0LCBtZXNzYWdlKSAgICAgICAgICAgIFwKKyAgY29uc3QgY2hhciAqIHdwaV9lcnJvcl9zXyMjbGFiZWwgPSBtZXNzYWdlOyBcCisgIGNvbnN0IGludDMyX3Qgd3BpX2Vycm9yX3ZhbHVlXyMjbGFiZWwgPSBvZmZzZXQKKyNlbHNlCisjZGVmaW5lIFMobGFiZWwsIG9mZnNldCwgbWVzc2FnZSkgICAgICAgICBcCisgIGV4dGVybiBjb25zdCBjaGFyICogd3BpX2Vycm9yX3NfIyNsYWJlbDsgXAorICBjb25zdCBpbnQzMl90IHdwaV9lcnJvcl92YWx1ZV8jI2xhYmVsID0gb2Zmc2V0CisjZW5kaWYKKworLyoKKyAqIEZhdGFsIGVycm9ycworICovCitTKE1vZHVsZUluZGV4T3V0T2ZSYW5nZSwgLTEsCisgICJBbGxvY2F0aW5nIG1vZHVsZSB0aGF0IGlzIG91dCBvZiByYW5nZSBvciBub3QgZm91bmQiKTsKK1MoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgLTEsICJBbGxvY2F0aW5nIGNoYW5uZWwgdGhhdCBpcyBvdXQgb2YgcmFuZ2UiKTsKK1MoTm90QWxsb2NhdGVkLCAtMiwgIkF0dGVtcHRpbmcgdG8gZnJlZSB1bmFsbG9jYXRlZCByZXNvdXJjZSIpOworUyhSZXNvdXJjZUFscmVhZHlBbGxvY2F0ZWQsIC0zLCAiQXR0ZW1wdGVkIHRvIHJldXNlIGFuIGFsbG9jYXRlZCByZXNvdXJjZSIpOworUyhOb0F2YWlsYWJsZVJlc291cmNlcywgLTQsICJObyBhdmFpbGFibGUgcmVzb3VyY2VzIHRvIGFsbG9jYXRlIik7CitTKE51bGxQYXJhbWV0ZXIsIC01LCAiQSBwb2ludGVyIHBhcmFtZXRlciB0byBhIG1ldGhvZCBpcyBudWxscHRyIik7CitTKFRpbWVvdXQsIC02LCAiQSB0aW1lb3V0IGhhcyBiZWVuIGV4Y2VlZGVkIik7CitTKENvbXBhc3NNYW51ZmFjdHVyZXJFcnJvciwgLTcsICJDb21wYXNzIG1hbnVmYWN0dXJlciBkb2Vzbid0IG1hdGNoIEhpVGVjaG5pYyIpOworUyhDb21wYXNzVHlwZUVycm9yLCAtOCwKKyAgIkNvbXBhc3MgdHlwZSBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIHR5cGUgZm9yIEhpVGVjaG5pYyBjb21wYXNzIik7CitTKEluY29tcGF0aWJsZU1vZGUsIC05LCAiVGhlIG9iamVjdCBpcyBpbiBhbiBpbmNvbXBhdGlibGUgbW9kZSIpOworUyhBbmFsb2dUcmlnZ2VyTGltaXRPcmRlckVycm9yLCAtMTAsCisgICJBbmFsb2dUcmlnZ2VyIGxpbWl0cyBlcnJvci4gIExvd2VyIGxpbWl0ID4gVXBwZXIgTGltaXQiKTsKK1MoQW5hbG9nVHJpZ2dlclB1bHNlT3V0cHV0RXJyb3IsIC0xMSwKKyAgIkF0dGVtcHRlZCB0byByZWFkIEFuYWxvZ1RyaWdnZXIgcHVsc2Ugb3V0cHV0LiIpOworUyhUYXNrRXJyb3IsIC0xMiwgIlRhc2sgY2FuJ3QgYmUgc3RhcnRlZCIpOworUyhUYXNrSURFcnJvciwgLTEzLCAiVGFzayBlcnJvcjogSW52YWxpZCBJRC4iKTsKK1MoVGFza0RlbGV0ZWRFcnJvciwgLTE0LCAiVGFzayBlcnJvcjogVGFzayBhbHJlYWR5IGRlbGV0ZWQuIik7CitTKFRhc2tPcHRpb25zRXJyb3IsIC0xNSwgIlRhc2sgZXJyb3I6IEludmFsaWQgb3B0aW9ucy4iKTsKK1MoVGFza01lbW9yeUVycm9yLCAtMTYsICJUYXNrIGNhbid0IGJlIHN0YXJ0ZWQgZHVlIHRvIGluc3VmZmljaWVudCBtZW1vcnkuIik7CitTKFRhc2tQcmlvcml0eUVycm9yLCAtMTcsICJUYXNrIGVycm9yOiBJbnZhbGlkIHByaW9yaXR5IFsxLTI1NV0uIik7CitTKERyaXZlVW5pbml0aWFsaXplZCwgLTE4LCAiUm9ib3REcml2ZSBub3QgaW5pdGlhbGl6ZWQgZm9yIHRoZSBDIGludGVyZmFjZSIpOworUyhDb21wcmVzc29yTm9uTWF0Y2hpbmcsIC0xOSwKKyAgIkNvbXByZXNzb3Igc2xvdC9jaGFubmVsIGRvZXNuJ3QgbWF0Y2ggcHJldmlvdXMgaW5zdGFuY2UiKTsKK1MoQ29tcHJlc3NvckFscmVhZHlEZWZpbmVkLCAtMjAsICJDcmVhdGluZyBhIHNlY29uZCBjb21wcmVzc29yIGluc3RhbmNlIik7CitTKENvbXByZXNzb3JVbmRlZmluZWQsIC0yMSwKKyAgIlVzaW5nIGNvbXByZXNzb3IgZnVuY3Rpb25zIHdpdGhvdXQgZGVmaW5pbmcgY29tcHJlc3NvciIpOworUyhJbmNvbnNpc3RlbnRBcnJheVZhbHVlQWRkZWQsIC0yMiwKKyAgIldoZW4gcGFja2luZyBkYXRhIGludG8gYW4gYXJyYXkgdG8gdGhlIGRhc2hib2FyZCwgbm90IGFsbCB2YWx1ZXMgYWRkZWQgd2VyZSAiCisgICJvZiB0aGUgc2FtZSB0eXBlLiIpOworUyhNaXNtYXRjaGVkQ29tcGxleFR5cGVDbG9zZSwgLTIzLAorICAiV2hlbiBwYWNraW5nIGRhdGEgdG8gdGhlIGRhc2hib2FyZCwgYSBDbG9zZSBmb3IgYSBjb21wbGV4IHR5cGUgd2FzIGNhbGxlZCAiCisgICJ3aXRob3V0IGEgbWF0Y2hpbmcgT3Blbi4iKTsKK1MoRGFzaGJvYXJkRGF0YU92ZXJmbG93LCAtMjQsCisgICJXaGVuIHBhY2tpbmcgZGF0YSB0byB0aGUgZGFzaGJvYXJkLCB0b28gbXVjaCBkYXRhIHdhcyBwYWNrZWQgYW5kIHRoZSBidWZmZXIgIgorICAib3ZlcmZsb3dlZC4iKTsKK1MoRGFzaGJvYXJkRGF0YUNvbGxpc2lvbiwgLTI1LAorICAiVGhlIHNhbWUgYnVmZmVyIHdhcyB1c2VkIGZvciBwYWNraW5nIGRhdGEgYW5kIGZvciBwcmludGluZy4iKTsKK1MoRW5oYW5jZWRJT01pc3NpbmcsIC0yNiwgIklPIGlzIG5vdCBhdHRhY2hlZCBvciBFbmhhbmNlZCBJTyBpcyBub3QgZW5hYmxlZC4iKTsKK1MoTGluZU5vdE91dHB1dCwgLTI3LAorICAiQ2Fubm90IFNldERpZ2l0YWxPdXRwdXQgZm9yIGEgbGluZSBub3QgY29uZmlndXJlZCBmb3Igb3V0cHV0LiIpOworUyhQYXJhbWV0ZXJPdXRPZlJhbmdlLCAtMjgsICJBIHBhcmFtZXRlciBpcyBvdXQgb2YgcmFuZ2UuIik7CitTKFNQSUNsb2NrUmF0ZVRvb0xvdywgLTI5LCAiU1BJIGNsb2NrIHJhdGUgd2FzIGJlbG93IHRoZSBtaW5pbXVtIHN1cHBvcnRlZCIpOworUyhKYWd1YXJWZXJzaW9uRXJyb3IsIC0zMCwgIkphZ3VhciBmaXJtd2FyZSB2ZXJzaW9uIGVycm9yIik7CitTKEphZ3Vhck1lc3NhZ2VOb3RGb3VuZCwgLTMxLCAiSmFndWFyIG1lc3NhZ2Ugbm90IGZvdW5kIik7CitTKE5ldHdvcmtUYWJsZXNSZWFkRXJyb3IsIC00MCwgIkVycm9yIHJlYWRpbmcgTmV0d29ya1RhYmxlcyBzb2NrZXQiKTsKK1MoTmV0d29ya1RhYmxlc0J1ZmZlckZ1bGwsIC00MSwgIkJ1ZmZlciBmdWxsIHdyaXRpbmcgdG8gTmV0d29ya1RhYmxlcyBzb2NrZXQiKTsKK1MoTmV0d29ya1RhYmxlc1dyb25nVHlwZSwgLTQyLAorICAiVGhlIHdyb25nIHR5cGUgd2FzIHJlYWQgZnJvbSB0aGUgTmV0d29ya1RhYmxlcyBlbnRyeSIpOworUyhOZXR3b3JrVGFibGVzQ29ycnVwdCwgLTQzLCAiTmV0d29ya1RhYmxlcyBkYXRhIHN0cmVhbSBpcyBjb3JydXB0Iik7CitTKFNtYXJ0RGFzaGJvYXJkTWlzc2luZ0tleSwgLTQzLCAiU21hcnREYXNoYm9hcmQgZGF0YSBkb2VzIG5vdCBleGlzdCIpOworUyhDb21tYW5kSWxsZWdhbFVzZSwgLTUwLCAiSWxsZWdhbCB1c2Ugb2YgQ29tbWFuZCIpOworUyhVbnN1cHBvcnRlZEluU2ltdWxhdGlvbiwgLTgwLCAiVW5zdXBwb3J0ZWQgaW4gc2ltdWxhdGlvbiIpOworCisvKgorICogV2FybmluZ3MKKyAqLworUyhTYW1wbGVSYXRlVG9vSGlnaCwgMSwgIkFuYWxvZyBtb2R1bGUgc2FtcGxlIHJhdGUgaXMgdG9vIGhpZ2giKTsKK1MoVm9sdGFnZU91dE9mUmFuZ2UsIDIsCisgICJWb2x0YWdlIHRvIGNvbnZlcnQgdG8gcmF3IHZhbHVlIGlzIG91dCBvZiByYW5nZSBbLTEwOyAxMF0iKTsKK1MoQ29tcHJlc3NvclRhc2tFcnJvciwgMywgIkNvbXByZXNzb3IgdGFzayB3b24ndCBzdGFydCIpOworUyhMb29wVGltaW5nRXJyb3IsIDQsICJEaWdpdGFsIG1vZHVsZSBsb29wIHRpbWluZyBpcyBub3QgdGhlIGV4cGVjdGVkIHZhbHVlIik7CitTKE5vbkJpbmFyeURpZ2l0YWxWYWx1ZSwgNSwgIkRpZ2l0YWwgb3V0cHV0IHZhbHVlIGlzIG5vdCAwIG9yIDEiKTsKK1MoSW5jb3JyZWN0QmF0dGVyeUNoYW5uZWwsIDYsCisgICJCYXR0ZXJ5IG1lYXN1cmVtZW50IGNoYW5uZWwgaXMgbm90IGNvcnJlY3QgdmFsdWUiKTsKK1MoQmFkSm95c3RpY2tJbmRleCwgNywgIkpveXN0aWNrIGluZGV4IGlzIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtMyIpOworUyhCYWRKb3lzdGlja0F4aXMsIDgsICJKb3lzdGljayBheGlzIG9yIFBPViBpcyBvdXQgb2YgcmFuZ2UiKTsKK1MoSW52YWxpZE1vdG9ySW5kZXgsIDksICJNb3RvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTMiKTsKK1MoRHJpdmVyU3RhdGlvblRhc2tFcnJvciwgMTAsICJEcml2ZXIgU3RhdGlvbiB0YXNrIHdvbid0IHN0YXJ0Iik7CitTKEVuaGFuY2VkSU9QV01QZXJpb2RPdXRPZlJhbmdlLCAxMSwKKyAgIkRyaXZlciBTdGF0aW9uIEVuaGFuY2VkIElPIFBXTSBPdXRwdXQgcGVyaW9kIG91dCBvZiByYW5nZS4iKTsKK1MoU1BJV3JpdGVOb01PU0ksIDEyLCAiQ2Fubm90IHdyaXRlIHRvIFNQSSBwb3J0IHdpdGggbm8gTU9TSSBvdXRwdXQiKTsKK1MoU1BJUmVhZE5vTUlTTywgMTMsICJDYW5ub3QgcmVhZCBmcm9tIFNQSSBwb3J0IHdpdGggbm8gTUlTTyBpbnB1dCIpOworUyhTUElSZWFkTm9EYXRhLCAxNCwgIk5vIGRhdGEgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSBTUEkiKTsKK1MoSW5jb21wYXRpYmxlU3RhdGUsIDE1LAorICAiSW5jb21wYXRpYmxlIFN0YXRlOiBUaGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQiKTsKKworI3VuZGVmIFMKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGQxMjAKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKy8qKgorICogSW50ZXJmYWNlIGZvciAzLWF4aXMgYWNjZWxlcm9tZXRlcnMKKyAqLworY2xhc3MgQWNjZWxlcm9tZXRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5BY2NlbGVyb21ldGVyKCkgPSBkZWZhdWx0OworCisgIGVudW0gUmFuZ2UgeyBrUmFuZ2VfMkcgPSAwLCBrUmFuZ2VfNEcgPSAxLCBrUmFuZ2VfOEcgPSAyLCBrUmFuZ2VfMTZHID0gMyB9OworCisgIC8qKgorICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBzZXR0aW5nIHRoZSBtZWFzdXJpbmcgcmFuZ2Ugb2YgYW4gYWNjZWxlcm9tZXRlci4KKyAgICoKKyAgICogQHBhcmFtIHJhbmdlIFRoZSBtYXhpbXVtIGFjY2VsZXJhdGlvbiwgcG9zaXRpdmUgb3IgbmVnYXRpdmUsIHRoYXQgdGhlCisgICAqIGFjY2VsZXJvbWV0ZXIgd2lsbCBtZWFzdXJlLiAgTm90IGFsbCBhY2NlbGVyb21ldGVycyBzdXBwb3J0IGFsbCByYW5nZXMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpID0gMDsKKworICAvKioKKyAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgeCBheGlzIGFjY2VsZXJhdGlvbgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gYWxvbmcgdGhlIHggYXhpcyBpbiBnLWZvcmNlcworICAgKi8KKyAgdmlydHVhbCBkb3VibGUgR2V0WCgpID0gMDsKKworICAvKioKKyAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgeSBheGlzIGFjY2VsZXJhdGlvbgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gYWxvbmcgdGhlIHkgYXhpcyBpbiBnLWZvcmNlcworICAgKi8KKyAgdmlydHVhbCBkb3VibGUgR2V0WSgpID0gMDsKKworICAvKioKKyAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgeiBheGlzIGFjY2VsZXJhdGlvbgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gYWxvbmcgdGhlIHogYXhpcyBpbiBnLWZvcmNlcworICAgKi8KKyAgdmlydHVhbCBkb3VibGUgR2V0WigpID0gMDsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL2ludGVyZmFjZXMvR3lyby5oIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9pbnRlcmZhY2VzL0d5cm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzE3Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvaW5jbHVkZS9pbnRlcmZhY2VzL0d5cm8uaApAQCAtMCwwICsxLDU0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisvKioKKyAqIEludGVyZmFjZSBmb3IgeWF3IHJhdGUgZ3lyb3MKKyAqLworY2xhc3MgR3lybyB7CisgcHVibGljOgorICB2aXJ0dWFsIH5HeXJvKCkgPSBkZWZhdWx0OworCisgIC8qKgorICAgKiBDYWxpYnJhdGUgdGhlIGd5cm8gYnkgcnVubmluZyBmb3IgYSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgY29tcHV0aW5nIHRoZQorICAgKiBjZW50ZXIgdmFsdWUuIFRoZW4gdXNlIHRoZSBjZW50ZXIgdmFsdWUgYXMgdGhlIEFjY3VtdWxhdG9yIGNlbnRlciB2YWx1ZSBmb3IKKyAgICogc3Vic2VxdWVudCBtZWFzdXJlbWVudHMuIEl0J3MgaW1wb3J0YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByb2JvdCBpcyBub3QKKyAgICogbW92aW5nIHdoaWxlIHRoZSBjZW50ZXJpbmcgY2FsY3VsYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgdGhpcyBpcyB0eXBpY2FsbHkKKyAgICogZG9uZSB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCB0dXJuZWQgb24gd2hpbGUgaXQncyBzaXR0aW5nIGF0IHJlc3QgYmVmb3JlCisgICAqIHRoZSBjb21wZXRpdGlvbiBzdGFydHMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgQ2FsaWJyYXRlKCkgPSAwOworCisgIC8qKgorICAgKiBSZXNldCB0aGUgZ3lyby4gUmVzZXRzIHRoZSBneXJvIHRvIGEgaGVhZGluZyBvZiB6ZXJvLiBUaGlzIGNhbiBiZSB1c2VkIGlmCisgICAqIHRoZXJlIGlzIHNpZ25pZmljYW50IGRyaWZ0IGluIHRoZSBneXJvIGFuZCBpdCBuZWVkcyB0byBiZSByZWNhbGlicmF0ZWQKKyAgICogYWZ0ZXIgaXQgaGFzIGJlZW4gcnVubmluZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBhY3R1YWwgYW5nbGUgaW4gZGVncmVlcyB0aGF0IHRoZSByb2JvdCBpcyBjdXJyZW50bHkgZmFjaW5nLgorICAgKgorICAgKiBUaGUgYW5nbGUgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgYWNjdW11bGF0b3IgdmFsdWUgY29ycmVjdGVkIGJ5IHRoZQorICAgKiBvdmVyc2FtcGxpbmcgcmF0ZSwgdGhlIGd5cm8gdHlwZSBhbmQgdGhlIEEvRCBjYWxpYnJhdGlvbiB2YWx1ZXMuIFRoZSBhbmdsZQorICAgKiBpcyBjb250aW51b3VzLCB0aGF0IGlzIGl0IHdpbGwgY29udGludWUgZnJvbSAzNjAgdG8gMzYxIGRlZ3JlZXMuIFRoaXMKKyAgICogYWxsb3dzIGFsZ29yaXRobXMgdGhhdCB3b3VsZG4ndCB3YW50IHRvIHNlZSBhIGRpc2NvbnRpbnVpdHkgaW4gdGhlIGd5cm8KKyAgICogb3V0cHV0IGFzIGl0IHN3ZWVwcyBwYXN0IGZyb20gMzYwIHRvIDAgb24gdGhlIHNlY29uZCB0aW1lIGFyb3VuZC4KKyAgICoKKyAgICogQHJldHVybiB0aGUgY3VycmVudCBoZWFkaW5nIG9mIHRoZSByb2JvdCBpbiBkZWdyZWVzLiBUaGlzIGhlYWRpbmcgaXMgYmFzZWQKKyAgICogICAgICAgICBvbiBpbnRlZ3JhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcmF0ZSBmcm9tIHRoZSBneXJvLgorICAgKi8KKyAgdmlydHVhbCBmbG9hdCBHZXRBbmdsZSgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSByYXRlIG9mIHJvdGF0aW9uIG9mIHRoZSBneXJvCisgICAqCisgICAqIFRoZSByYXRlIGlzIGJhc2VkIG9uIHRoZSBtb3N0IHJlY2VudCByZWFkaW5nIG9mIHRoZSBneXJvIGFuYWxvZyB2YWx1ZQorICAgKgorICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgaW4gZGVncmVlcyBwZXIgc2Vjb25kCisgICAqLworICB2aXJ0dWFsIGRvdWJsZSBHZXRSYXRlKCkgY29uc3QgPSAwOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL2luY2x1ZGUvaW50ZXJmYWNlcy9Qb3RlbnRpb21ldGVyLmggYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL2ludGVyZmFjZXMvUG90ZW50aW9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Mjg5MmQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9pbmNsdWRlL2ludGVyZmFjZXMvUG90ZW50aW9tZXRlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBJTlRFUkZBQ0VTX1BPVEVOVElPTUVURVJfSAorI2RlZmluZSBJTlRFUkZBQ0VTX1BPVEVOVElPTUVURVJfSAorCisjaW5jbHVkZSAiUElEU291cmNlLmgiCisKKy8qKgorICogSW50ZXJmYWNlIGZvciBwb3RlbnRpb21ldGVycy4KKyAqLworY2xhc3MgUG90ZW50aW9tZXRlciA6IHB1YmxpYyBQSURTb3VyY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+UG90ZW50aW9tZXRlcigpID0gZGVmYXVsdDsKKworICAvKioKKyAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIHBvdGVudGlvbWV0ZXIuCisgICAqCisgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IHNwZWVkLiAgVmFsdWUgaXMgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisgICAqLworICB2aXJ0dWFsIGRvdWJsZSBHZXQoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB2b2lkIFNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpIG92ZXJyaWRlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9CdXR0b24uY3BwIGIvd3BpbGliYy9zaGFyZWQvc3JjL0J1dHRvbnMvQnV0dG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdmZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvc3JjL0J1dHRvbnMvQnV0dG9uLmNwcApAQCAtMCwwICsxLDQxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgorCisvKioKKyAqIFNwZWNpZmllcyB0aGUgY29tbWFuZCB0byBydW4gd2hlbiBhIGJ1dHRvbiBpcyBmaXJzdCBwcmVzc2VkCisgKiBAcGFyYW0gY29tbWFuZCBUaGUgcG9pbnRlciB0byB0aGUgY29tbWFuZCB0byBydW4KKyAqLwordm9pZCBCdXR0b246OldoZW5QcmVzc2VkKENvbW1hbmQgKmNvbW1hbmQpIHsgV2hlbkFjdGl2ZShjb21tYW5kKTsgfQorCisvKioKKyAqIFNwZWNpZmllcyB0aGUgY29tbWFuZCB0byBiZSBzY2hlZHVsZWQgd2hpbGUgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCisgKiBUaGUgY29tbWFuZCB3aWxsIGJlIHNjaGVkdWxlZCByZXBlYXRlZGx5IHdoaWxlIHRoZSBidXR0b24gaXMgcHJlc3NlZCBhbmQgd2lsbAorICogYmUgY2FuY2VsZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHJlbGVhc2VkLgorICogQHBhcmFtIGNvbW1hbmQgVGhlIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgdG8gcnVuCisgKi8KK3ZvaWQgQnV0dG9uOjpXaGlsZUhlbGQoQ29tbWFuZCAqY29tbWFuZCkgeyBXaGlsZUFjdGl2ZShjb21tYW5kKTsgfQorCisvKioKKyAqIFNwZWNpZmllcyB0aGUgY29tbWFuZCB0byBydW4gd2hlbiB0aGUgYnV0dG9uIGlzIHJlbGVhc2VkCisgKiBUaGUgY29tbWFuZCB3aWxsIGJlIHNjaGVkdWxlZCBhIHNpbmdsZSB0aW1lLgorICogQHBhcmFtIFRoZSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIHRvIHJ1bgorICovCit2b2lkIEJ1dHRvbjo6V2hlblJlbGVhc2VkKENvbW1hbmQgKmNvbW1hbmQpIHsgV2hlbkluYWN0aXZlKGNvbW1hbmQpOyB9CisKKy8qKgorICogQ2FuY2VscyB0aGUgc3BlY2lmaWNlZCBjb21tYW5kIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCisgKiBAcGFyYW0gVGhlIGNvbW1hbmQgdG8gYmUgY2FuY2VsZWQKKyAqLwordm9pZCBCdXR0b246OkNhbmNlbFdoZW5QcmVzc2VkKENvbW1hbmQgKmNvbW1hbmQpIHsgQ2FuY2VsV2hlbkFjdGl2ZShjb21tYW5kKTsgfQorCisvKioKKyAqIFRvZ2dsZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKKyAqIEBwYXJhbSBUaGUgY29tbWFuZCB0byBiZSB0b2dnbGVkCisgKi8KK3ZvaWQgQnV0dG9uOjpUb2dnbGVXaGVuUHJlc3NlZChDb21tYW5kICpjb21tYW5kKSB7IFRvZ2dsZVdoZW5BY3RpdmUoY29tbWFuZCk7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL0J1dHRvblNjaGVkdWxlci5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzkwMjUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uU2NoZWR1bGVyLmgiCisKKyNpbmNsdWRlICJDb21tYW5kcy9TY2hlZHVsZXIuaCIKKworQnV0dG9uU2NoZWR1bGVyOjpCdXR0b25TY2hlZHVsZXIoYm9vbCBsYXN0LCBUcmlnZ2VyICpidXR0b24sIENvbW1hbmQgKm9yZGVycykKKyAgICA6IG1fcHJlc3NlZExhc3QobGFzdCksIG1fYnV0dG9uKGJ1dHRvbiksIG1fY29tbWFuZChvcmRlcnMpIHt9CisKK3ZvaWQgQnV0dG9uU2NoZWR1bGVyOjpTdGFydCgpIHsgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5BZGRCdXR0b24odGhpcyk7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL0NhbmNlbEJ1dHRvblNjaGVkdWxlci5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9DYW5jZWxCdXR0b25TY2hlZHVsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmI2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9DYW5jZWxCdXR0b25TY2hlZHVsZXIuY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkJ1dHRvbnMvQ2FuY2VsQnV0dG9uU2NoZWR1bGVyLmgiCisKKyNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKworQ2FuY2VsQnV0dG9uU2NoZWR1bGVyOjpDYW5jZWxCdXR0b25TY2hlZHVsZXIoYm9vbCBsYXN0LCBUcmlnZ2VyICpidXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kICpvcmRlcnMpCisgICAgOiBCdXR0b25TY2hlZHVsZXIobGFzdCwgYnV0dG9uLCBvcmRlcnMpIHsKKyAgcHJlc3NlZExhc3QgPSBtX2J1dHRvbi0+R3JhYigpOworfQorCit2b2lkIENhbmNlbEJ1dHRvblNjaGVkdWxlcjo6RXhlY3V0ZSgpIHsKKyAgaWYgKG1fYnV0dG9uLT5HcmFiKCkpIHsKKyAgICBpZiAoIXByZXNzZWRMYXN0KSB7CisgICAgICBwcmVzc2VkTGFzdCA9IHRydWU7CisgICAgICBtX2NvbW1hbmQtPkNhbmNlbCgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmVzc2VkTGFzdCA9IGZhbHNlOworICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9IZWxkQnV0dG9uU2NoZWR1bGVyLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL0hlbGRCdXR0b25TY2hlZHVsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YzhlM2IKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9IZWxkQnV0dG9uU2NoZWR1bGVyLmNwcApAQCAtMCwwICsxLDI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJCdXR0b25zL0hlbGRCdXR0b25TY2hlZHVsZXIuaCIKKworI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgorCitIZWxkQnV0dG9uU2NoZWR1bGVyOjpIZWxkQnV0dG9uU2NoZWR1bGVyKGJvb2wgbGFzdCwgVHJpZ2dlciAqYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kICpvcmRlcnMpCisgICAgOiBCdXR0b25TY2hlZHVsZXIobGFzdCwgYnV0dG9uLCBvcmRlcnMpIHt9CisKK3ZvaWQgSGVsZEJ1dHRvblNjaGVkdWxlcjo6RXhlY3V0ZSgpIHsKKyAgaWYgKG1fYnV0dG9uLT5HcmFiKCkpIHsKKyAgICBtX3ByZXNzZWRMYXN0ID0gdHJ1ZTsKKyAgICBtX2NvbW1hbmQtPlN0YXJ0KCk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcHJlc3NlZExhc3QpIHsKKyAgICAgIG1fcHJlc3NlZExhc3QgPSBmYWxzZTsKKyAgICAgIG1fY29tbWFuZC0+Q2FuY2VsKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9JbnRlcm5hbEJ1dHRvbi5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9JbnRlcm5hbEJ1dHRvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5YjIyYQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL0ludGVybmFsQnV0dG9uLmNwcApAQCAtMCwwICsxLDE3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJCdXR0b25zL0ludGVybmFsQnV0dG9uLmgiCisKK0ludGVybmFsQnV0dG9uOjpJbnRlcm5hbEJ1dHRvbihib29sIGludmVydGVkKQorICAgIDogbV9wcmVzc2VkKGludmVydGVkKSwgbV9pbnZlcnRlZChpbnZlcnRlZCkge30KKwordm9pZCBJbnRlcm5hbEJ1dHRvbjo6U2V0SW52ZXJ0ZWQoYm9vbCBpbnZlcnRlZCkgeyBtX2ludmVydGVkID0gaW52ZXJ0ZWQ7IH0KKwordm9pZCBJbnRlcm5hbEJ1dHRvbjo6U2V0UHJlc3NlZChib29sIHByZXNzZWQpIHsgbV9wcmVzc2VkID0gcHJlc3NlZDsgfQorCitib29sIEludGVybmFsQnV0dG9uOjpHZXQoKSB7IHJldHVybiBtX3ByZXNzZWQgXiBtX2ludmVydGVkOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiZGY2MgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL0pveXN0aWNrQnV0dG9uLmNwcApAQCAtMCwwICsxLDEzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJCdXR0b25zL0pveXN0aWNrQnV0dG9uLmgiCisKK0pveXN0aWNrQnV0dG9uOjpKb3lzdGlja0J1dHRvbihHZW5lcmljSElEICpqb3lzdGljaywgaW50IGJ1dHRvbk51bWJlcikKKyAgICA6IG1fam95c3RpY2soam95c3RpY2spLCBtX2J1dHRvbk51bWJlcihidXR0b25OdW1iZXIpIHt9CisKK2Jvb2wgSm95c3RpY2tCdXR0b246OkdldCgpIHsgcmV0dXJuIG1fam95c3RpY2stPkdldFJhd0J1dHRvbihtX2J1dHRvbk51bWJlcik7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL05ldHdvcmtCdXR0b24uY3BwIGIvd3BpbGliYy9zaGFyZWQvc3JjL0J1dHRvbnMvTmV0d29ya0J1dHRvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4NzAzYwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL05ldHdvcmtCdXR0b24uY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkJ1dHRvbnMvTmV0d29ya0J1dHRvbi5oIgorI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmgiCisKK05ldHdvcmtCdXR0b246Ok5ldHdvcmtCdXR0b24oY29uc3Qgc3RkOjpzdHJpbmcgJnRhYmxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmZpZWxkKQorICAgIDogIC8vIFRPRE8gaG93IGlzIHRoaXMgc3VwcG9zZWQgdG8gd29yaz8/PworICAgICAgbV9uZXRUYWJsZShOZXR3b3JrVGFibGU6OkdldFRhYmxlKHRhYmxlTmFtZSkpLAorICAgICAgbV9maWVsZChmaWVsZCkge30KKworTmV0d29ya0J1dHRvbjo6TmV0d29ya0J1dHRvbihzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiB0YWJsZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmZpZWxkKQorICAgIDogbV9uZXRUYWJsZSh0YWJsZSksIG1fZmllbGQoZmllbGQpIHt9CisKK2Jvb2wgTmV0d29ya0J1dHRvbjo6R2V0KCkgeworICAvKmlmIChtX25ldFRhYmxlLT5pc0Nvbm5lY3RlZCgpKQorICAgICAgICAgIHJldHVybiBtX25ldFRhYmxlLT5HZXRCb29sZWFuKG1fZmllbGQuY19zdHIoKSk7CisgIGVsc2UKKyAgICAgICAgICByZXR1cm4gZmFsc2U7Ki8KKyAgcmV0dXJuIG1fbmV0VGFibGUtPkdldEJvb2xlYW4obV9maWVsZCwgZmFsc2UpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0J1dHRvbnMvUHJlc3NlZEJ1dHRvblNjaGVkdWxlci5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9QcmVzc2VkQnV0dG9uU2NoZWR1bGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTBjNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvc3JjL0J1dHRvbnMvUHJlc3NlZEJ1dHRvblNjaGVkdWxlci5jcHAKQEAgLTAsMCArMSwyNiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQnV0dG9ucy9QcmVzc2VkQnV0dG9uU2NoZWR1bGVyLmgiCisKKyNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKworUHJlc3NlZEJ1dHRvblNjaGVkdWxlcjo6UHJlc3NlZEJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIgKmJ1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCAqb3JkZXJzKQorICAgIDogQnV0dG9uU2NoZWR1bGVyKGxhc3QsIGJ1dHRvbiwgb3JkZXJzKSB7fQorCit2b2lkIFByZXNzZWRCdXR0b25TY2hlZHVsZXI6OkV4ZWN1dGUoKSB7CisgIGlmIChtX2J1dHRvbi0+R3JhYigpKSB7CisgICAgaWYgKCFtX3ByZXNzZWRMYXN0KSB7CisgICAgICBtX3ByZXNzZWRMYXN0ID0gdHJ1ZTsKKyAgICAgIG1fY29tbWFuZC0+U3RhcnQoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9wcmVzc2VkTGFzdCA9IGZhbHNlOworICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9SZWxlYXNlZEJ1dHRvblNjaGVkdWxlci5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQnV0dG9ucy9SZWxlYXNlZEJ1dHRvblNjaGVkdWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxMzFlNgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmNwcApAQCAtMCwwICsxLDI2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJCdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmgiCisKKyNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKKworUmVsZWFzZWRCdXR0b25TY2hlZHVsZXI6OlJlbGVhc2VkQnV0dG9uU2NoZWR1bGVyKGJvb2wgbGFzdCwgVHJpZ2dlciAqYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgKm9yZGVycykKKyAgICA6IEJ1dHRvblNjaGVkdWxlcihsYXN0LCBidXR0b24sIG9yZGVycykge30KKwordm9pZCBSZWxlYXNlZEJ1dHRvblNjaGVkdWxlcjo6RXhlY3V0ZSgpIHsKKyAgaWYgKG1fYnV0dG9uLT5HcmFiKCkpIHsKKyAgICBtX3ByZXNzZWRMYXN0ID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wcmVzc2VkTGFzdCkgeworICAgICAgbV9wcmVzc2VkTGFzdCA9IGZhbHNlOworICAgICAgbV9jb21tYW5kLT5TdGFydCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0J1dHRvbnMvVG9nZ2xlQnV0dG9uU2NoZWR1bGVyLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL1RvZ2dsZUJ1dHRvblNjaGVkdWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwNDhkMgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL1RvZ2dsZUJ1dHRvblNjaGVkdWxlci5jcHAKQEAgLTAsMCArMSwzMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQnV0dG9ucy9Ub2dnbGVCdXR0b25TY2hlZHVsZXIuaCIKKworI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgorCitUb2dnbGVCdXR0b25TY2hlZHVsZXI6OlRvZ2dsZUJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIgKmJ1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgKm9yZGVycykKKyAgICA6IEJ1dHRvblNjaGVkdWxlcihsYXN0LCBidXR0b24sIG9yZGVycykgeworICBwcmVzc2VkTGFzdCA9IG1fYnV0dG9uLT5HcmFiKCk7Cit9CisKK3ZvaWQgVG9nZ2xlQnV0dG9uU2NoZWR1bGVyOjpFeGVjdXRlKCkgeworICBpZiAobV9idXR0b24tPkdyYWIoKSkgeworICAgIGlmICghcHJlc3NlZExhc3QpIHsKKyAgICAgIHByZXNzZWRMYXN0ID0gdHJ1ZTsKKyAgICAgIGlmIChtX2NvbW1hbmQtPklzUnVubmluZygpKSB7CisgICAgICAgIG1fY29tbWFuZC0+Q2FuY2VsKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX2NvbW1hbmQtPlN0YXJ0KCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHByZXNzZWRMYXN0ID0gZmFsc2U7CisgIH0KK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL1RyaWdnZXIuY3BwIGIvd3BpbGliYy9zaGFyZWQvc3JjL0J1dHRvbnMvVHJpZ2dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhMWViYQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9CdXR0b25zL1RyaWdnZXIuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uLmgiCisKKyNpbmNsdWRlICJCdXR0b25zL0hlbGRCdXR0b25TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJCdXR0b25zL1ByZXNzZWRCdXR0b25TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJCdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmgiCisjaW5jbHVkZSAiQnV0dG9ucy9Ub2dnbGVCdXR0b25TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJCdXR0b25zL0NhbmNlbEJ1dHRvblNjaGVkdWxlci5oIgorCitib29sIFRyaWdnZXI6OkdyYWIoKSB7CisgIGlmIChHZXQoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZSBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgLy8gaWYgKG1fdGFibGUtPmlzQ29ubmVjdGVkKCkpLy9UT0RPIGlzIGNvbm5lY3RlZCBvbiBidXR0b24/CisgICAgcmV0dXJuIG1fdGFibGUtPkdldEJvb2xlYW4oInByZXNzZWQiLCBmYWxzZSk7CisgICAgLyplbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ki8KKyAgfSBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRyaWdnZXI6OldoZW5BY3RpdmUoQ29tbWFuZCAqY29tbWFuZCkgeworICBhdXRvIHBicyA9IG5ldyBQcmVzc2VkQnV0dG9uU2NoZWR1bGVyKEdyYWIoKSwgdGhpcywgY29tbWFuZCk7CisgIHBicy0+U3RhcnQoKTsKK30KKwordm9pZCBUcmlnZ2VyOjpXaGlsZUFjdGl2ZShDb21tYW5kICpjb21tYW5kKSB7CisgIGF1dG8gaGJzID0gbmV3IEhlbGRCdXR0b25TY2hlZHVsZXIoR3JhYigpLCB0aGlzLCBjb21tYW5kKTsKKyAgaGJzLT5TdGFydCgpOworfQorCit2b2lkIFRyaWdnZXI6OldoZW5JbmFjdGl2ZShDb21tYW5kICpjb21tYW5kKSB7CisgIGF1dG8gcmJzID0gbmV3IFJlbGVhc2VkQnV0dG9uU2NoZWR1bGVyKEdyYWIoKSwgdGhpcywgY29tbWFuZCk7CisgIHJicy0+U3RhcnQoKTsKK30KKwordm9pZCBUcmlnZ2VyOjpDYW5jZWxXaGVuQWN0aXZlKENvbW1hbmQgKmNvbW1hbmQpIHsKKyAgYXV0byBjYnMgPSBuZXcgQ2FuY2VsQnV0dG9uU2NoZWR1bGVyKEdyYWIoKSwgdGhpcywgY29tbWFuZCk7CisgIGNicy0+U3RhcnQoKTsKK30KKwordm9pZCBUcmlnZ2VyOjpUb2dnbGVXaGVuQWN0aXZlKENvbW1hbmQgKmNvbW1hbmQpIHsKKyAgYXV0byB0YnMgPSBuZXcgVG9nZ2xlQnV0dG9uU2NoZWR1bGVyKEdyYWIoKSwgdGhpcywgY29tbWFuZCk7CisgIHRicy0+U3RhcnQoKTsKK30KKworc3RkOjpzdHJpbmcgVHJpZ2dlcjo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeyByZXR1cm4gIkJ1dHRvbiI7IH0KKwordm9pZCBUcmlnZ2VyOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gdGFibGUpIHsKKyAgbV90YWJsZSA9IHRhYmxlOworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigicHJlc3NlZCIsIEdldCgpKTsKKyAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBUcmlnZ2VyOjpHZXRUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGU7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9Db21tYW5kLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9Db21tYW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2VmZmJlCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL0NvbW1hbmQuY3BwCkBAIC0wLDAgKzEsMzkyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvU2NoZWR1bGVyLmgiCisjaW5jbHVkZSAiUm9ib3RTdGF0ZS5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSA8dHlwZWluZm8+CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTmFtZSA9ICJuYW1lIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUnVubmluZyA9ICJydW5uaW5nIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrSXNQYXJlbnRlZCA9ICJpc1BhcmVudGVkIjsKKworaW50IENvbW1hbmQ6Om1fY29tbWFuZENvdW50ZXIgPSAwOworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY29tbWFuZC4KKyAqIFRoZSBuYW1lIG9mIHRoaXMgY29tbWFuZCB3aWxsIGJlIGRlZmF1bHQuCisgKi8KK0NvbW1hbmQ6OkNvbW1hbmQoKSA6IENvbW1hbmQoIiIsIC0xLjApIHt9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG5vIHRpbWVvdXQuCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBmb3IgdGhpcyBjb21tYW5kCisgKi8KK0NvbW1hbmQ6OkNvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIDogQ29tbWFuZChuYW1lLCAtMS4wKSB7fQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiB0aW1lb3V0IGFuZCBhIGRlZmF1bHQgbmFtZS4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgdGhpcyBjb21tYW5kICJ0aW1lcyBvdXQiCisgKiBAc2VlIENvbW1hbmQjaXNUaW1lZE91dCgpIGlzVGltZWRPdXQoKQorICovCitDb21tYW5kOjpDb21tYW5kKGRvdWJsZSB0aW1lb3V0KSA6IENvbW1hbmQoIiIsIHRpbWVvdXQpIHt9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHRpbWVvdXQuCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZAorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWUgKGluIHNlY29uZHMpIGJlZm9yZSB0aGlzIGNvbW1hbmQgInRpbWVzIG91dCIKKyAqIEBzZWUgQ29tbWFuZCNpc1RpbWVkT3V0KCkgaXNUaW1lZE91dCgpCisgKi8KK0NvbW1hbmQ6OkNvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGRvdWJsZSB0aW1lb3V0KSB7CisgIC8vIFdlIHVzZSAtMS4wIHRvIGluZGljYXRlIG5vIHRpbWVvdXQuCisgIGlmICh0aW1lb3V0IDwgMC4wICYmIHRpbWVvdXQgIT0gLTEuMCkKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAidGltZW91dCA8IDAuMCIpOworCisgIG1fdGltZW91dCA9IHRpbWVvdXQ7CisKKyAgLy8gSWYgbmFtZSBjb250YWlucyBhbiBlbXB0eSBzdHJpbmcKKyAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgIG1fbmFtZSA9IHN0ZDo6c3RyaW5nKCJDb21tYW5kXyIpICsgc3RkOjpzdHJpbmcodHlwZWlkKCp0aGlzKS5uYW1lKCkpOworICB9CisgIGVsc2UgeworICAgIG1fbmFtZSA9IG5hbWU7CisgIH0KK30KKworQ29tbWFuZDo6fkNvbW1hbmQoKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7Cit9CisKKy8qKgorICogR2V0IHRoZSBJRCAoc2VxdWVuY2UgbnVtYmVyKSBmb3IgdGhpcyBjb21tYW5kCisgKiBUaGUgSUQgaXMgYSB1bmlxdWUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggY29tbWFuZC4KKyAqIEByZXR1cm4gdGhlIElEIG9mIHRoaXMgY29tbWFuZAorICovCitpbnQgQ29tbWFuZDo6R2V0SUQoKSBjb25zdCB7IHJldHVybiBtX2NvbW1hbmRJRDsgfQorCisvKioKKyAqIFNldHMgdGhlIHRpbWVvdXQgb2YgdGhpcyBjb21tYW5kLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgKGluIHNlY29uZHMpCisgKiBAc2VlIENvbW1hbmQjaXNUaW1lZE91dCgpIGlzVGltZWRPdXQoKQorICovCit2b2lkIENvbW1hbmQ6OlNldFRpbWVvdXQoZG91YmxlIHRpbWVvdXQpIHsKKyAgaWYgKHRpbWVvdXQgPCAwLjApCisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInRpbWVvdXQgPCAwLjAiKTsKKyAgZWxzZQorICAgIG1fdGltZW91dCA9IHRpbWVvdXQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdGltZSBzaW5jZSB0aGlzIGNvbW1hbmQgd2FzIGluaXRpYWxpemVkIChpbiBzZWNvbmRzKS4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB3b3JrIGV2ZW4gaWYgdGhlcmUgaXMgbm8gc3BlY2lmaWVkIHRpbWVvdXQuCisgKiBAcmV0dXJuIHRoZSB0aW1lIHNpbmNlIHRoaXMgY29tbWFuZCB3YXMgaW5pdGlhbGl6ZWQgKGluIHNlY29uZHMpLgorICovCitkb3VibGUgQ29tbWFuZDo6VGltZVNpbmNlSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmIChtX3N0YXJ0VGltZSA8IDAuMCkKKyAgICByZXR1cm4gMC4wOworICBlbHNlCisgICAgcmV0dXJuIFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCkgLSBtX3N0YXJ0VGltZTsKK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCBzcGVjaWZpZXMgdGhhdCB0aGUgZ2l2ZW4ge0BsaW5rIFN1YnN5c3RlbX0gaXMgdXNlZCBieSB0aGlzCisgKiBjb21tYW5kLgorICogVGhpcyBtZXRob2QgaXMgY3J1Y2lhbCB0byB0aGUgZnVuY3Rpb25pbmcgb2YgdGhlIENvbW1hbmQgU3lzdGVtIGluIGdlbmVyYWwuCisgKgorICogPHA+Tm90ZSB0aGF0IHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBpcyBpbiB0aGUKKyAqIGNvbnN0cnVjdG9yLjwvcD4KKyAqCisgKiBAcGFyYW0gc3Vic3lzdGVtIHRoZSB7QGxpbmsgU3Vic3lzdGVtfSByZXF1aXJlZAorICogQHNlZSBTdWJzeXN0ZW0KKyAqLwordm9pZCBDb21tYW5kOjpSZXF1aXJlcyhTdWJzeXN0ZW0gKnN1YnN5c3RlbSkgeworICBpZiAoIUFzc2VydFVubG9ja2VkKCJDYW4gbm90IGFkZCBuZXcgcmVxdWlyZW1lbnQgdG8gY29tbWFuZCIpKSByZXR1cm47CisKKyAgaWYgKHN1YnN5c3RlbSAhPSBudWxscHRyKQorICAgIG1fcmVxdWlyZW1lbnRzLmluc2VydChzdWJzeXN0ZW0pOworICBlbHNlCisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgInN1YnN5c3RlbSIpOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGhhcyBiZWVuIHJlbW92ZWQuCisgKiBUaGlzIHdpbGwgY2FsbCB7QGxpbmsgQ29tbWFuZCNpbnRlcnJ1cHRlZCgpIGludGVycnVwdGVkKCl9IG9yIHtAbGluaworICogQ29tbWFuZCNlbmQoKSBlbmQoKX0uCisgKi8KK3ZvaWQgQ29tbWFuZDo6UmVtb3ZlZCgpIHsKKyAgaWYgKG1faW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAoSXNDYW5jZWxlZCgpKSB7CisgICAgICBJbnRlcnJ1cHRlZCgpOworICAgICAgX0ludGVycnVwdGVkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVuZCgpOworICAgICAgX0VuZCgpOworICAgIH0KKyAgfQorICBtX2luaXRpYWxpemVkID0gZmFsc2U7CisgIG1fY2FuY2VsZWQgPSBmYWxzZTsKKyAgbV9ydW5uaW5nID0gZmFsc2U7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlB1dEJvb2xlYW4oa1J1bm5pbmcsIGZhbHNlKTsKK30KKworLyoqCisgKiBTdGFydHMgdXAgdGhlIGNvbW1hbmQuICBHZXRzIHRoZSBjb21tYW5kIHJlYWR5IHRvIHN0YXJ0LgorICogPHA+Tm90ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgZXZlbnR1YWxseSBzdGFydCwgaG93ZXZlciBpdCB3aWxsIG5vdAorICogbmVjZXNzYXJpbHkKKyAqIGRvIHNvIGltbWVkaWF0ZWx5LCBhbmQgbWF5IGluIGZhY3QgYmUgY2FuY2VsZWQgYmVmb3JlIGluaXRpYWxpemUgaXMgZXZlbgorICogY2FsbGVkLjwvcD4KKyAqLwordm9pZCBDb21tYW5kOjpTdGFydCgpIHsKKyAgTG9ja0NoYW5nZXMoKTsKKyAgaWYgKG1fcGFyZW50ICE9IG51bGxwdHIpCisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCisgICAgICAgIENvbW1hbmRJbGxlZ2FsVXNlLAorICAgICAgICAiQ2FuIG5vdCBzdGFydCBhIGNvbW1hbmQgdGhhdCBpcyBwYXJ0IG9mIGEgY29tbWFuZCBncm91cCIpOworCisgIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+QWRkQ29tbWFuZCh0aGlzKTsKK30KKworLyoqCisgKiBUaGUgcnVuIG1ldGhvZCBpcyB1c2VkIGludGVybmFsbHkgdG8gYWN0dWFsbHkgcnVuIHRoZSBjb21tYW5kcy4KKyAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGNvbW1hbmQgc2hvdWxkIHN0YXkgd2l0aGluIHRoZSB7QGxpbmsgU2NoZWR1bGVyfS4KKyAqLworYm9vbCBDb21tYW5kOjpSdW4oKSB7CisgIGlmICghbV9ydW5XaGVuRGlzYWJsZWQgJiYgbV9wYXJlbnQgPT0gbnVsbHB0ciAmJiBSb2JvdFN0YXRlOjpJc0Rpc2FibGVkKCkpCisgICAgQ2FuY2VsKCk7CisKKyAgaWYgKElzQ2FuY2VsZWQoKSkgcmV0dXJuIGZhbHNlOworCisgIGlmICghbV9pbml0aWFsaXplZCkgeworICAgIG1faW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIFN0YXJ0VGltaW5nKCk7CisgICAgX0luaXRpYWxpemUoKTsKKyAgICBJbml0aWFsaXplKCk7CisgIH0KKyAgX0V4ZWN1dGUoKTsKKyAgRXhlY3V0ZSgpOworICByZXR1cm4gIUlzRmluaXNoZWQoKTsKK30KKwordm9pZCBDb21tYW5kOjpfSW5pdGlhbGl6ZSgpIHt9CisKK3ZvaWQgQ29tbWFuZDo6X0ludGVycnVwdGVkKCkge30KKwordm9pZCBDb21tYW5kOjpfRXhlY3V0ZSgpIHt9CisKK3ZvaWQgQ29tbWFuZDo6X0VuZCgpIHt9CisKKy8qKgorICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRpbWVyIHNob3VsZCBzdGFydC4KKyAqIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSB7QGxpbmsgQ29tbWFuZCNpbml0aWFsaXplKCkgaW5pdGlhbGl6ZSgpfSBpcywKKyAqIGluc2lkZSB0aGUKKyAqIHtAbGluayBDb21tYW5kI3J1bigpIHJ1bigpfSBtZXRob2QuCisgKi8KK3ZvaWQgQ29tbWFuZDo6U3RhcnRUaW1pbmcoKSB7IG1fc3RhcnRUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsgfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHtAbGluayBDb21tYW5kI3RpbWVTaW5jZUluaXRpYWxpemVkKCkKKyAqIHRpbWVTaW5jZUluaXRpYWxpemVkKCl9CisgKiBtZXRob2QgcmV0dXJucyBhIG51bWJlciB3aGljaCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHRpbWVvdXQgZm9yIHRoZQorICogY29tbWFuZC4KKyAqIElmIHRoZXJlIGlzIG5vIHRpbWVvdXQsIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLgorICogQHJldHVybiB3aGV0aGVyIHRoZSB0aW1lIGhhcyBleHBpcmVkCisgKi8KK2Jvb2wgQ29tbWFuZDo6SXNUaW1lZE91dCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fdGltZW91dCAhPSAtMSAmJiBUaW1lU2luY2VJbml0aWFsaXplZCgpID49IG1fdGltZW91dDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSByZXF1aXJlbWVudHMgKGFzIGFuIHN0ZDo6c2V0IG9mIHtAbGluayBTdWJzeXN0ZW0gU3Vic3lzdGVtc30KKyAqIHBvaW50ZXJzKSBvZiB0aGlzIGNvbW1hbmQKKyAqIEByZXR1cm4gdGhlIHJlcXVpcmVtZW50cyAoYXMgYW4gc3RkOjpzZXQgb2Yge0BsaW5rIFN1YnN5c3RlbSBTdWJzeXN0ZW1zfQorICogcG9pbnRlcnMpIG9mIHRoaXMgY29tbWFuZAorICovCitDb21tYW5kOjpTdWJzeXN0ZW1TZXQgQ29tbWFuZDo6R2V0UmVxdWlyZW1lbnRzKCkgY29uc3QgeworICByZXR1cm4gbV9yZXF1aXJlbWVudHM7Cit9CisKKy8qKgorICogUHJldmVudHMgZnVydGhlciBjaGFuZ2VzIGZyb20gYmVpbmcgbWFkZQorICovCit2b2lkIENvbW1hbmQ6OkxvY2tDaGFuZ2VzKCkgeyBtX2xvY2tlZCA9IHRydWU7IH0KKworLyoqCisgKiBJZiBjaGFuZ2VzIGFyZSBsb2NrZWQsIHRoZW4gdGhpcyB3aWxsIGdlbmVyYXRlIGEgQ29tbWFuZElsbGVnYWxVc2UgZXJyb3IuCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byByZXBvcnQgb24gZXJyb3IgKGl0IGlzIGFwcGVuZGVkIGJ5IGEgZGVmYXVsdAorICogbWVzc2FnZSkKKyAqIEByZXR1cm4gdHJ1ZSBpZiBhc3NlcnQgcGFzc2VkLCBmYWxzZSBpZiBhc3NlcnQgZmFpbGVkCisgKi8KK2Jvb2wgQ29tbWFuZDo6QXNzZXJ0VW5sb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJm1lc3NhZ2UpIHsKKyAgaWYgKG1fbG9ja2VkKSB7CisgICAgc3RkOjpzdHJpbmcgYnVmID0gbWVzc2FnZSArICIgYWZ0ZXIgYmVpbmcgc3RhcnRlZCBvciBiZWluZyBhZGRlZCB0byBhIGNvbW1hbmQgZ3JvdXAiOworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENvbW1hbmRJbGxlZ2FsVXNlLCBidWYpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyBjb21tYW5kLiAgTm8gYWN0dWFsIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBncm91cC4KKyAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudAorICovCit2b2lkIENvbW1hbmQ6OlNldFBhcmVudChDb21tYW5kR3JvdXAgKnBhcmVudCkgeworICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAicGFyZW50Iik7CisgIH0gZWxzZSBpZiAobV9wYXJlbnQgIT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENvbW1hbmRJbGxlZ2FsVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IGdpdmUgY29tbWFuZCB0byBhIGNvbW1hbmQgZ3JvdXAgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHJlYWR5IGJlaW5nIHB1dCBpbiBhIGNvbW1hbmQgZ3JvdXAiKTsKKyAgfSBlbHNlIHsKKyAgICBMb2NrQ2hhbmdlcygpOworICAgIG1fcGFyZW50ID0gcGFyZW50OworICAgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICAgIG1fdGFibGUtPlB1dEJvb2xlYW4oa0lzUGFyZW50ZWQsIHRydWUpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIG1hcmsgdGhhdCB0aGUgY29tbWFuZCBoYXMgYmVlbiBzdGFydGVkLgorICogVGhlIGxpZmVjeWNsZSBvZiBhIGNvbW1hbmQgaXM6CisgKgorICogc3RhcnRSdW5uaW5nKCkgaXMgY2FsbGVkLgorICogcnVuKCkgaXMgY2FsbGVkIChtdWx0aXBsZSB0aW1lcyBwb3RlbnRpYWxseSkKKyAqIHJlbW92ZWQoKSBpcyBjYWxsZWQKKyAqCisgKiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHN0YXJ0UnVubmluZyBhbmQgcmVtb3ZlZCBiZSBjYWxsZWQgaW4gb3JkZXIgb3Igc29tZQorICogYXNzdW1wdGlvbnMKKyAqIG9mIHRoZSBjb2RlIHdpbGwgYmUgYnJva2VuLgorICovCit2b2lkIENvbW1hbmQ6OlN0YXJ0UnVubmluZygpIHsKKyAgbV9ydW5uaW5nID0gdHJ1ZTsKKyAgbV9zdGFydFRpbWUgPSAtMTsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgbV90YWJsZS0+UHV0Qm9vbGVhbihrUnVubmluZywgdHJ1ZSk7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tbWFuZCBpcyBydW5uaW5nLgorICogVGhpcyBtYXkgcmV0dXJuIHRydWUgZXZlbiBpZiB0aGUgY29tbWFuZCBoYXMganVzdCBiZWVuIGNhbmNlbGVkLCBhcyBpdCBtYXkKKyAqIG5vdCBoYXZlIHlldCBjYWxsZWQge0BsaW5rIENvbW1hbmQjaW50ZXJydXB0ZWQoKX0uCisgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBjb21tYW5kIGlzIHJ1bm5pbmcKKyAqLworYm9vbCBDb21tYW5kOjpJc1J1bm5pbmcoKSBjb25zdCB7IHJldHVybiBtX3J1bm5pbmc7IH0KKworLyoqCisgKiBUaGlzIHdpbGwgY2FuY2VsIHRoZSBjdXJyZW50IGNvbW1hbmQuCisgKiA8cD5UaGlzIHdpbGwgY2FuY2VsIHRoZSBjdXJyZW50IGNvbW1hbmQgZXZlbnR1YWxseS4gIEl0IGNhbiBiZSBjYWxsZWQKKyAqIG11bHRpcGxlIHRpbWVzLgorICogQW5kIGl0IGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29tbWFuZCBpcyBub3QgcnVubmluZy4gIElmIHRoZSBjb21tYW5kIGlzCisgKiBydW5uaW5nIHRob3VnaCwKKyAqIHRoZW4gdGhlIGNvbW1hbmQgd2lsbCBiZSBtYXJrZWQgYXMgY2FuY2VsZWQgYW5kIGV2ZW50dWFsbHkgcmVtb3ZlZC48L3A+CisgKiA8cD5BIGNvbW1hbmQgY2FuIG5vdCBiZSBjYW5jZWxlZAorICogaWYgaXQgaXMgYSBwYXJ0IG9mIGEgY29tbWFuZCBncm91cCwgeW91IG11c3QgY2FuY2VsIHRoZSBjb21tYW5kIGdyb3VwCisgKiBpbnN0ZWFkLjwvcD4KKyAqLwordm9pZCBDb21tYW5kOjpDYW5jZWwoKSB7CisgIGlmIChtX3BhcmVudCAhPSBudWxscHRyKQorICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAorICAgICAgICBDb21tYW5kSWxsZWdhbFVzZSwKKyAgICAgICAgIkNhbiBub3QgY2FuY2VsIGEgY29tbWFuZCB0aGF0IGlzIHBhcnQgb2YgYSBjb21tYW5kIGdyb3VwIik7CisKKyAgX0NhbmNlbCgpOworfQorCisvKioKKyAqIFRoaXMgd29ya3MgbGlrZSBjYW5jZWwoKSwgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgaXMKKyAqIGEgcGFydAorICogb2YgYSBjb21tYW5kIGdyb3VwLiAgU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBwYXJlbnQgY29tbWFuZCBncm91cC4KKyAqLwordm9pZCBDb21tYW5kOjpfQ2FuY2VsKCkgeworICBpZiAoSXNSdW5uaW5nKCkpIG1fY2FuY2VsZWQgPSB0cnVlOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBoYXMgYmVlbiBjYW5jZWxlZC4KKyAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBoYXMgYmVlbiBjYW5jZWxlZAorICovCitib29sIENvbW1hbmQ6OklzQ2FuY2VsZWQoKSBjb25zdCB7IHJldHVybiBtX2NhbmNlbGVkOyB9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgY2FuIGJlIGludGVycnVwdGVkLgorICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgY2FuIGJlIGludGVycnVwdGVkCisgKi8KK2Jvb2wgQ29tbWFuZDo6SXNJbnRlcnJ1cHRpYmxlKCkgY29uc3QgeyByZXR1cm4gbV9pbnRlcnJ1cHRpYmxlOyB9CisKKy8qKgorICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgY2FuIGJlIGludGVycnVwdGVkLgorICogQHBhcmFtIGludGVycnVwdGlibGUgd2hldGhlciBvciBub3QgdGhpcyBjb21tYW5kIGNhbiBiZSBpbnRlcnJ1cHRlZAorICovCit2b2lkIENvbW1hbmQ6OlNldEludGVycnVwdGlibGUoYm9vbCBpbnRlcnJ1cHRpYmxlKSB7CisgIG1faW50ZXJydXB0aWJsZSA9IGludGVycnVwdGlibGU7Cit9CisKKy8qKgorICogQ2hlY2tzIGlmIHRoZSBjb21tYW5kIHJlcXVpcmVzIHRoZSBnaXZlbiB7QGxpbmsgU3Vic3lzdGVtfS4KKyAqIEBwYXJhbSBzeXN0ZW0gdGhlIHN5c3RlbQorICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3Vic3lzdGVtIGlzIHJlcXVpcmVkIChmYWxzZSBpZiBnaXZlbiBudWxscHRyKQorICovCitib29sIENvbW1hbmQ6OkRvZXNSZXF1aXJlKFN1YnN5c3RlbSAqc3lzdGVtKSBjb25zdCB7CisgIHJldHVybiBtX3JlcXVpcmVtZW50cy5jb3VudChzeXN0ZW0pID4gMDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29tbWFuZEdyb3VwfSB0aGF0IHRoaXMgY29tbWFuZCBpcyBhIHBhcnQgb2YuCisgKiBXaWxsIHJldHVybiBudWxsIGlmIHRoaXMge0BsaW5rIENvbW1hbmR9IGlzIG5vdCBpbiBhIGdyb3VwLgorICogQHJldHVybiB0aGUge0BsaW5rIENvbW1hbmRHcm91cH0gdGhhdCB0aGlzIGNvbW1hbmQgaXMgYSBwYXJ0IG9mIChvciBudWxsIGlmCisgKiBub3QgaW4gZ3JvdXApCisgKi8KK0NvbW1hbmRHcm91cCAqQ29tbWFuZDo6R2V0R3JvdXAoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudDsgfQorCisvKioKKyAqIFNldHMgd2hldGhlciBvciBub3QgdGhpcyB7QGxpbmsgQ29tbWFuZH0gc2hvdWxkIHJ1biB3aGVuIHRoZSByb2JvdCBpcworICogZGlzYWJsZWQuCisgKgorICogPHA+QnkgZGVmYXVsdCBhIGNvbW1hbmQgd2lsbCBub3QgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGRpc2FibGVkLCBhbmQgd2lsbCBpbgorICogZmFjdCBiZSBjYW5jZWxlZC48L3A+CisgKiBAcGFyYW0gcnVuIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tbWFuZCBzaG91bGQgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGRpc2FibGVkCisgKi8KK3ZvaWQgQ29tbWFuZDo6U2V0UnVuV2hlbkRpc2FibGVkKGJvb2wgcnVuKSB7IG1fcnVuV2hlbkRpc2FibGVkID0gcnVuOyB9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIHtAbGluayBDb21tYW5kfSB3aWxsIHJ1biB3aGVuIHRoZSByb2JvdCBpcworICogZGlzYWJsZWQsIG9yIGlmIGl0IHdpbGwgY2FuY2VsIGl0c2VsZi4KKyAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyB7QGxpbmsgQ29tbWFuZH0gd2lsbCBydW4gd2hlbiB0aGUgcm9ib3QgaXMKKyAqIGRpc2FibGVkLCBvciBpZiBpdCB3aWxsIGNhbmNlbCBpdHNlbGYKKyAqLworYm9vbCBDb21tYW5kOjpXaWxsUnVuV2hlbkRpc2FibGVkKCkgY29uc3QgeyByZXR1cm4gbV9ydW5XaGVuRGlzYWJsZWQ7IH0KKworc3RkOjpzdHJpbmcgQ29tbWFuZDo6R2V0TmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fbmFtZTsKK30KKworc3RkOjpzdHJpbmcgQ29tbWFuZDo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeyByZXR1cm4gIkNvbW1hbmQiOyB9CisKK3ZvaWQgQ29tbWFuZDo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHRhYmxlKSB7CisgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7CisgIG1fdGFibGUgPSB0YWJsZTsKKyAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgIG1fdGFibGUtPlB1dFN0cmluZyhrTmFtZSwgR2V0TmFtZSgpKTsKKyAgICBtX3RhYmxlLT5QdXRCb29sZWFuKGtSdW5uaW5nLCBJc1J1bm5pbmcoKSk7CisgICAgbV90YWJsZS0+UHV0Qm9vbGVhbihrSXNQYXJlbnRlZCwgbV9wYXJlbnQgIT0gbnVsbHB0cik7CisgICAgbV90YWJsZS0+QWRkVGFibGVMaXN0ZW5lcihrUnVubmluZywgdGhpcywgZmFsc2UpOworICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IENvbW1hbmQ6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQorCit2b2lkIENvbW1hbmQ6OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSB7CisgIGlmICghdmFsdWUtPklzQm9vbGVhbigpKSByZXR1cm47CisgIGlmICh2YWx1ZS0+R2V0Qm9vbGVhbigpKSB7CisgICAgaWYgKCFJc1J1bm5pbmcoKSkgU3RhcnQoKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoSXNSdW5uaW5nKCkpIENhbmNlbCgpOworICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9Db21tYW5kR3JvdXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjVlYzkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmNwcApAQCAtMCwwICsxLDMzOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29tbWFuZEdyb3VwIENvbW1hbmRHcm91cH0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIGZvciB0aGlzIGNvbW1hbmQgZ3JvdXAKKyAqLworQ29tbWFuZEdyb3VwOjpDb21tYW5kR3JvdXAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIDogQ29tbWFuZChuYW1lKSB7fQorCisvKioKKyAqIEFkZHMgYSBuZXcge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gdG8gdGhlIGdyb3VwLiAgVGhlIHtAbGluayBDb21tYW5kIENvbW1hbmR9CisgKiB3aWxsIGJlIHN0YXJ0ZWQgYWZ0ZXIKKyAqIGFsbCB0aGUgcHJldmlvdXNseSBhZGRlZCB7QGxpbmsgQ29tbWFuZCBDb21tYW5kc30uCisgKgorICogPHA+Tm90ZSB0aGF0IGFueSByZXF1aXJlbWVudHMgdGhlIGdpdmVuIHtAbGluayBDb21tYW5kIENvbW1hbmR9IGhhcyB3aWxsIGJlCisgKiBhZGRlZCB0byB0aGUKKyAqIGdyb3VwLiAgRm9yIHRoaXMgcmVhc29uLCBhIHtAbGluayBDb21tYW5kIENvbW1hbmQnc30gcmVxdWlyZW1lbnRzIGNhbiBub3QgYmUKKyAqIGNoYW5nZWQgYWZ0ZXIKKyAqIGJlaW5nIGFkZGVkIHRvIGEgZ3JvdXAuPC9wPgorICoKKyAqIDxwPkl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBtZXRob2QgYmUgY2FsbGVkIGluIHRoZSBjb25zdHJ1Y3Rvci48L3A+CisgKgorICogQHBhcmFtIGNvbW1hbmQgVGhlIHtAbGluayBDb21tYW5kIENvbW1hbmR9IHRvIGJlIGFkZGVkCisgKi8KK3ZvaWQgQ29tbWFuZEdyb3VwOjpBZGRTZXF1ZW50aWFsKENvbW1hbmQgKmNvbW1hbmQpIHsKKyAgaWYgKGNvbW1hbmQgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJjb21tYW5kIik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghQXNzZXJ0VW5sb2NrZWQoIkNhbm5vdCBhZGQgbmV3IGNvbW1hbmQgdG8gY29tbWFuZCBncm91cCIpKSByZXR1cm47CisKKyAgY29tbWFuZC0+U2V0UGFyZW50KHRoaXMpOworCisgIG1fY29tbWFuZHMucHVzaF9iYWNrKAorICAgICAgQ29tbWFuZEdyb3VwRW50cnkoY29tbWFuZCwgQ29tbWFuZEdyb3VwRW50cnk6OmtTZXF1ZW5jZV9JblNlcXVlbmNlKSk7CisgIC8vIEl0ZXJhdGUgdGhyb3VnaCBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKSBhbmQgY2FsbCBSZXF1aXJlcygpIG9uIGVhY2gKKyAgLy8gcmVxdWlyZWQgc3Vic3lzdGVtCisgIENvbW1hbmQ6OlN1YnN5c3RlbVNldCByZXF1aXJlbWVudHMgPSBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKTsKKyAgYXV0byBpdGVyID0gcmVxdWlyZW1lbnRzLmJlZ2luKCk7CisgIGZvciAoOyBpdGVyICE9IHJlcXVpcmVtZW50cy5lbmQoKTsgaXRlcisrKSBSZXF1aXJlcygqaXRlcik7Cit9CisKKy8qKgorICogQWRkcyBhIG5ldyB7QGxpbmsgQ29tbWFuZCBDb21tYW5kfSB0byB0aGUgZ3JvdXAgd2l0aCBhIGdpdmVuIHRpbWVvdXQuCisgKiBUaGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gd2lsbCBiZSBzdGFydGVkIGFmdGVyIGFsbCB0aGUgcHJldmlvdXNseSBhZGRlZAorICogY29tbWFuZHMuCisgKgorICogPHA+T25jZSB0aGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gaXMgc3RhcnRlZCwgaXQgd2lsbCBiZSBydW4gdW50aWwgaXQKKyAqIGZpbmlzaGVzIG9yIHRoZSB0aW1lCisgKiBleHBpcmVzLCB3aGljaGV2ZXIgaXMgc29vbmVyLiAgTm90ZSB0aGF0IHRoZSBnaXZlbiB7QGxpbmsgQ29tbWFuZCBDb21tYW5kfQorICogd2lsbCBoYXZlIG5vCisgKiBrbm93bGVkZ2UgdGhhdCBpdCBpcyBvbiBhIHRpbWVyLjwvcD4KKyAqCisgKiA8cD5Ob3RlIHRoYXQgYW55IHJlcXVpcmVtZW50cyB0aGUgZ2l2ZW4ge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gaGFzIHdpbGwgYmUKKyAqIGFkZGVkIHRvIHRoZQorICogZ3JvdXAuICBGb3IgdGhpcyByZWFzb24sIGEge0BsaW5rIENvbW1hbmQgQ29tbWFuZCdzfSByZXF1aXJlbWVudHMgY2FuIG5vdCBiZQorICogY2hhbmdlZCBhZnRlcgorICogYmVpbmcgYWRkZWQgdG8gYSBncm91cC48L3A+CisgKgorICogPHA+SXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIG1ldGhvZCBiZSBjYWxsZWQgaW4gdGhlIGNvbnN0cnVjdG9yLjwvcD4KKyAqCisgKiBAcGFyYW0gY29tbWFuZCBUaGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gdG8gYmUgYWRkZWQKKyAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKQorICovCit2b2lkIENvbW1hbmRHcm91cDo6QWRkU2VxdWVudGlhbChDb21tYW5kICpjb21tYW5kLCBkb3VibGUgdGltZW91dCkgeworICBpZiAoY29tbWFuZCA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgImNvbW1hbmQiKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFBc3NlcnRVbmxvY2tlZCgiQ2Fubm90IGFkZCBuZXcgY29tbWFuZCB0byBjb21tYW5kIGdyb3VwIikpIHJldHVybjsKKyAgaWYgKHRpbWVvdXQgPCAwLjApIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAidGltZW91dCA8IDAuMCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbW1hbmQtPlNldFBhcmVudCh0aGlzKTsKKworICBtX2NvbW1hbmRzLnB1c2hfYmFjayhDb21tYW5kR3JvdXBFbnRyeSgKKyAgICAgIGNvbW1hbmQsIENvbW1hbmRHcm91cEVudHJ5OjprU2VxdWVuY2VfSW5TZXF1ZW5jZSwgdGltZW91dCkpOworICAvLyBJdGVyYXRlIHRocm91Z2ggY29tbWFuZC0+R2V0UmVxdWlyZW1lbnRzKCkgYW5kIGNhbGwgUmVxdWlyZXMoKSBvbiBlYWNoCisgIC8vIHJlcXVpcmVkIHN1YnN5c3RlbQorICBDb21tYW5kOjpTdWJzeXN0ZW1TZXQgcmVxdWlyZW1lbnRzID0gY29tbWFuZC0+R2V0UmVxdWlyZW1lbnRzKCk7CisgIGF1dG8gaXRlciA9IHJlcXVpcmVtZW50cy5iZWdpbigpOworICBmb3IgKDsgaXRlciAhPSByZXF1aXJlbWVudHMuZW5kKCk7IGl0ZXIrKykgUmVxdWlyZXMoKml0ZXIpOworfQorCisvKioKKyAqIEFkZHMgYSBuZXcgY2hpbGQge0BsaW5rIENvbW1hbmR9IHRvIHRoZSBncm91cC4gIFRoZSB7QGxpbmsgQ29tbWFuZH0gd2lsbCBiZQorICogc3RhcnRlZCBhZnRlcgorICogYWxsIHRoZSBwcmV2aW91c2x5IGFkZGVkIHtAbGluayBDb21tYW5kIENvbW1hbmRzfS4KKyAqCisgKiA8cD5JbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBjaGlsZCB0byBmaW5pc2gsIGEge0BsaW5rIENvbW1hbmRHcm91cH0gd2lsbAorICogaGF2ZSBpdAorICogcnVuIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIHN1YnNlcXVlbnQge0BsaW5rIENvbW1hbmQgQ29tbWFuZHN9LiAgVGhlIGNoaWxkCisgKiB3aWxsIHJ1biB1bnRpbCBlaXRoZXIKKyAqIGl0IGZpbmlzaGVzLCBhIG5ldyBjaGlsZCB3aXRoIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBpcyBzdGFydGVkLCBvcgorICogdGhlIG1haW4gc2VxdWVuY2UgcnVucyBhIHtAbGluayBDb21tYW5kfSB3aXRoIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cy4gIEluCisgKiB0aGUgbGF0dGVyCisgKiB0d28gY2FzZXMsIHRoZSBjaGlsZCB3aWxsIGJlIGNhbmNlbGVkIGV2ZW4gaWYgaXQgc2F5cyBpdCBjYW4ndCBiZQorICogaW50ZXJydXB0ZWQuPC9wPgorICoKKyAqIDxwPk5vdGUgdGhhdCBhbnkgcmVxdWlyZW1lbnRzIHRoZSBnaXZlbiB7QGxpbmsgQ29tbWFuZCBDb21tYW5kfSBoYXMgd2lsbCBiZQorICogYWRkZWQgdG8gdGhlCisgKiBncm91cC4gIEZvciB0aGlzIHJlYXNvbiwgYSB7QGxpbmsgQ29tbWFuZCBDb21tYW5kJ3N9IHJlcXVpcmVtZW50cyBjYW4gbm90IGJlCisgKiBjaGFuZ2VkIGFmdGVyCisgKiBiZWluZyBhZGRlZCB0byBhIGdyb3VwLjwvcD4KKyAqCisgKiA8cD5JdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoaXMgbWV0aG9kIGJlIGNhbGxlZCBpbiB0aGUgY29uc3RydWN0b3IuPC9wPgorICoKKyAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIGJlIGFkZGVkCisgKi8KK3ZvaWQgQ29tbWFuZEdyb3VwOjpBZGRQYXJhbGxlbChDb21tYW5kICpjb21tYW5kKSB7CisgIGlmIChjb21tYW5kID09IG51bGxwdHIpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiY29tbWFuZCIpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIUFzc2VydFVubG9ja2VkKCJDYW5ub3QgYWRkIG5ldyBjb21tYW5kIHRvIGNvbW1hbmQgZ3JvdXAiKSkgcmV0dXJuOworCisgIGNvbW1hbmQtPlNldFBhcmVudCh0aGlzKTsKKworICBtX2NvbW1hbmRzLnB1c2hfYmFjaygKKyAgICAgIENvbW1hbmRHcm91cEVudHJ5KGNvbW1hbmQsIENvbW1hbmRHcm91cEVudHJ5OjprU2VxdWVuY2VfQnJhbmNoQ2hpbGQpKTsKKyAgLy8gSXRlcmF0ZSB0aHJvdWdoIGNvbW1hbmQtPkdldFJlcXVpcmVtZW50cygpIGFuZCBjYWxsIFJlcXVpcmVzKCkgb24gZWFjaAorICAvLyByZXF1aXJlZCBzdWJzeXN0ZW0KKyAgQ29tbWFuZDo6U3Vic3lzdGVtU2V0IHJlcXVpcmVtZW50cyA9IGNvbW1hbmQtPkdldFJlcXVpcmVtZW50cygpOworICBhdXRvIGl0ZXIgPSByZXF1aXJlbWVudHMuYmVnaW4oKTsKKyAgZm9yICg7IGl0ZXIgIT0gcmVxdWlyZW1lbnRzLmVuZCgpOyBpdGVyKyspIFJlcXVpcmVzKCppdGVyKTsKK30KKworLyoqCisgKiBBZGRzIGEgbmV3IGNoaWxkIHtAbGluayBDb21tYW5kfSB0byB0aGUgZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gdGltZW91dC4gIFRoZQorICoge0BsaW5rIENvbW1hbmR9IHdpbGwgYmUgc3RhcnRlZCBhZnRlcgorICogYWxsIHRoZSBwcmV2aW91c2x5IGFkZGVkIHtAbGluayBDb21tYW5kIENvbW1hbmRzfS4KKyAqCisgKiA8cD5PbmNlIHRoZSB7QGxpbmsgQ29tbWFuZCBDb21tYW5kfSBpcyBzdGFydGVkLCBpdCB3aWxsIHJ1biB1bnRpbCBpdAorICogZmluaXNoZXMsIGlzIGludGVycnVwdGVkLAorICogb3IgdGhlIHRpbWUgZXhwaXJlcywgd2hpY2hldmVyIGlzIHNvb25lci4gIE5vdGUgdGhhdCB0aGUgZ2l2ZW4ge0BsaW5rIENvbW1hbmQKKyAqIENvbW1hbmR9IHdpbGwgaGF2ZSBubworICoga25vd2xlZGdlIHRoYXQgaXQgaXMgb24gYSB0aW1lci48L3A+CisgKgorICogPHA+SW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgY2hpbGQgdG8gZmluaXNoLCBhIHtAbGluayBDb21tYW5kR3JvdXB9IHdpbGwKKyAqIGhhdmUgaXQKKyAqIHJ1biBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBzdWJzZXF1ZW50IHtAbGluayBDb21tYW5kIENvbW1hbmRzfS4gIFRoZSBjaGlsZAorICogd2lsbCBydW4gdW50aWwgZWl0aGVyCisgKiBpdCBmaW5pc2hlcywgdGhlIHRpbWVvdXQgZXhwaXJlcywgYSBuZXcgY2hpbGQgd2l0aCBjb25mbGljdGluZyByZXF1aXJlbWVudHMKKyAqIGlzIHN0YXJ0ZWQsIG9yCisgKiB0aGUgbWFpbiBzZXF1ZW5jZSBydW5zIGEge0BsaW5rIENvbW1hbmR9IHdpdGggY29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzLiAgSW4KKyAqIHRoZSBsYXR0ZXIKKyAqIHR3byBjYXNlcywgdGhlIGNoaWxkIHdpbGwgYmUgY2FuY2VsZWQgZXZlbiBpZiBpdCBzYXlzIGl0IGNhbid0IGJlCisgKiBpbnRlcnJ1cHRlZC48L3A+CisgKgorICogPHA+Tm90ZSB0aGF0IGFueSByZXF1aXJlbWVudHMgdGhlIGdpdmVuIHtAbGluayBDb21tYW5kIENvbW1hbmR9IGhhcyB3aWxsIGJlCisgKiBhZGRlZCB0byB0aGUKKyAqIGdyb3VwLiAgRm9yIHRoaXMgcmVhc29uLCBhIHtAbGluayBDb21tYW5kIENvbW1hbmQnc30gcmVxdWlyZW1lbnRzIGNhbiBub3QgYmUKKyAqIGNoYW5nZWQgYWZ0ZXIKKyAqIGJlaW5nIGFkZGVkIHRvIGEgZ3JvdXAuPC9wPgorICoKKyAqIDxwPkl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBtZXRob2QgYmUgY2FsbGVkIGluIHRoZSBjb25zdHJ1Y3Rvci48L3A+CisgKgorICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gYmUgYWRkZWQKKyAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKQorICovCit2b2lkIENvbW1hbmRHcm91cDo6QWRkUGFyYWxsZWwoQ29tbWFuZCAqY29tbWFuZCwgZG91YmxlIHRpbWVvdXQpIHsKKyAgaWYgKGNvbW1hbmQgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJjb21tYW5kIik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghQXNzZXJ0VW5sb2NrZWQoIkNhbm5vdCBhZGQgbmV3IGNvbW1hbmQgdG8gY29tbWFuZCBncm91cCIpKSByZXR1cm47CisgIGlmICh0aW1lb3V0IDwgMC4wKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgInRpbWVvdXQgPCAwLjAiKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb21tYW5kLT5TZXRQYXJlbnQodGhpcyk7CisKKyAgbV9jb21tYW5kcy5wdXNoX2JhY2soQ29tbWFuZEdyb3VwRW50cnkoCisgICAgICBjb21tYW5kLCBDb21tYW5kR3JvdXBFbnRyeTo6a1NlcXVlbmNlX0JyYW5jaENoaWxkLCB0aW1lb3V0KSk7CisgIC8vIEl0ZXJhdGUgdGhyb3VnaCBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKSBhbmQgY2FsbCBSZXF1aXJlcygpIG9uIGVhY2gKKyAgLy8gcmVxdWlyZWQgc3Vic3lzdGVtCisgIENvbW1hbmQ6OlN1YnN5c3RlbVNldCByZXF1aXJlbWVudHMgPSBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKTsKKyAgYXV0byBpdGVyID0gcmVxdWlyZW1lbnRzLmJlZ2luKCk7CisgIGZvciAoOyBpdGVyICE9IHJlcXVpcmVtZW50cy5lbmQoKTsgaXRlcisrKSBSZXF1aXJlcygqaXRlcik7Cit9CisKK3ZvaWQgQ29tbWFuZEdyb3VwOjpfSW5pdGlhbGl6ZSgpIHsgbV9jdXJyZW50Q29tbWFuZEluZGV4ID0gLTE7IH0KKwordm9pZCBDb21tYW5kR3JvdXA6Ol9FeGVjdXRlKCkgeworICBDb21tYW5kR3JvdXBFbnRyeSBlbnRyeTsKKyAgQ29tbWFuZCAqY21kID0gbnVsbHB0cjsKKyAgYm9vbCBmaXJzdFJ1biA9IGZhbHNlOworCisgIGlmIChtX2N1cnJlbnRDb21tYW5kSW5kZXggPT0gLTEpIHsKKyAgICBmaXJzdFJ1biA9IHRydWU7CisgICAgbV9jdXJyZW50Q29tbWFuZEluZGV4ID0gMDsKKyAgfQorCisgIHdoaWxlICgodW5zaWduZWQpbV9jdXJyZW50Q29tbWFuZEluZGV4IDwgbV9jb21tYW5kcy5zaXplKCkpIHsKKyAgICBpZiAoY21kICE9IG51bGxwdHIpIHsKKyAgICAgIGlmIChlbnRyeS5Jc1RpbWVkT3V0KCkpIGNtZC0+X0NhbmNlbCgpOworCisgICAgICBpZiAoY21kLT5SdW4oKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNtZC0+UmVtb3ZlZCgpOworICAgICAgICBtX2N1cnJlbnRDb21tYW5kSW5kZXgrKzsKKyAgICAgICAgZmlyc3RSdW4gPSB0cnVlOworICAgICAgICBjbWQgPSBudWxscHRyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBlbnRyeSA9IG1fY29tbWFuZHNbbV9jdXJyZW50Q29tbWFuZEluZGV4XTsKKyAgICBjbWQgPSBudWxscHRyOworCisgICAgc3dpdGNoIChlbnRyeS5tX3N0YXRlKSB7CisgICAgICBjYXNlIENvbW1hbmRHcm91cEVudHJ5OjprU2VxdWVuY2VfSW5TZXF1ZW5jZToKKyAgICAgICAgY21kID0gZW50cnkubV9jb21tYW5kOworICAgICAgICBpZiAoZmlyc3RSdW4pIHsKKyAgICAgICAgICBjbWQtPlN0YXJ0UnVubmluZygpOworICAgICAgICAgIENhbmNlbENvbmZsaWN0cyhjbWQpOworICAgICAgICAgIGZpcnN0UnVuID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ29tbWFuZEdyb3VwRW50cnk6OmtTZXF1ZW5jZV9CcmFuY2hQZWVyOgorICAgICAgICBtX2N1cnJlbnRDb21tYW5kSW5kZXgrKzsKKyAgICAgICAgZW50cnkubV9jb21tYW5kLT5TdGFydCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDb21tYW5kR3JvdXBFbnRyeTo6a1NlcXVlbmNlX0JyYW5jaENoaWxkOgorICAgICAgICBtX2N1cnJlbnRDb21tYW5kSW5kZXgrKzsKKyAgICAgICAgQ2FuY2VsQ29uZmxpY3RzKGVudHJ5Lm1fY29tbWFuZCk7CisgICAgICAgIGVudHJ5Lm1fY29tbWFuZC0+U3RhcnRSdW5uaW5nKCk7CisgICAgICAgIG1fY2hpbGRyZW4ucHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gUnVuIENoaWxkcmVuCisgIGF1dG8gaXRlciA9IG1fY2hpbGRyZW4uYmVnaW4oKTsKKyAgZm9yICg7IGl0ZXIgIT0gbV9jaGlsZHJlbi5lbmQoKTspIHsKKyAgICBlbnRyeSA9ICppdGVyOworICAgIENvbW1hbmQgKmNoaWxkID0gZW50cnkubV9jb21tYW5kOworICAgIGlmIChlbnRyeS5Jc1RpbWVkT3V0KCkpIGNoaWxkLT5fQ2FuY2VsKCk7CisKKyAgICBpZiAoIWNoaWxkLT5SdW4oKSkgeworICAgICAgY2hpbGQtPlJlbW92ZWQoKTsKKyAgICAgIGl0ZXIgPSBtX2NoaWxkcmVuLmVyYXNlKGl0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBpdGVyKys7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ29tbWFuZEdyb3VwOjpfRW5kKCkgeworICAvLyBUaGVvcmV0aWNhbGx5LCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoaXMsIGJ1dCB3ZSBkbyBpZiB0ZWFtcyBvdmVycmlkZSB0aGUKKyAgLy8gSXNGaW5pc2hlZCBtZXRob2QKKyAgaWYgKG1fY3VycmVudENvbW1hbmRJbmRleCAhPSAtMSAmJgorICAgICAgKHVuc2lnbmVkKW1fY3VycmVudENvbW1hbmRJbmRleCA8IG1fY29tbWFuZHMuc2l6ZSgpKSB7CisgICAgQ29tbWFuZCAqY21kID0gbV9jb21tYW5kc1ttX2N1cnJlbnRDb21tYW5kSW5kZXhdLm1fY29tbWFuZDsKKyAgICBjbWQtPl9DYW5jZWwoKTsKKyAgICBjbWQtPlJlbW92ZWQoKTsKKyAgfQorCisgIGF1dG8gaXRlciA9IG1fY2hpbGRyZW4uYmVnaW4oKTsKKyAgZm9yICg7IGl0ZXIgIT0gbV9jaGlsZHJlbi5lbmQoKTsgaXRlcisrKSB7CisgICAgQ29tbWFuZCAqY21kID0gaXRlci0+bV9jb21tYW5kOworICAgIGNtZC0+X0NhbmNlbCgpOworICAgIGNtZC0+UmVtb3ZlZCgpOworICB9CisgIG1fY2hpbGRyZW4uY2xlYXIoKTsKK30KKwordm9pZCBDb21tYW5kR3JvdXA6Ol9JbnRlcnJ1cHRlZCgpIHsgX0VuZCgpOyB9CisKKy8vIENhbiBiZSBvdmVyd3JpdHRlbiBieSB0ZWFtcwordm9pZCBDb21tYW5kR3JvdXA6OkluaXRpYWxpemUoKSB7fQorCisvLyBDYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGVhbXMKK3ZvaWQgQ29tbWFuZEdyb3VwOjpFeGVjdXRlKCkge30KKworLy8gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRlYW1zCit2b2lkIENvbW1hbmRHcm91cDo6RW5kKCkge30KKworLy8gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRlYW1zCit2b2lkIENvbW1hbmRHcm91cDo6SW50ZXJydXB0ZWQoKSB7fQorCitib29sIENvbW1hbmRHcm91cDo6SXNGaW5pc2hlZCgpIHsKKyAgcmV0dXJuICh1bnNpZ25lZCltX2N1cnJlbnRDb21tYW5kSW5kZXggPj0gbV9jb21tYW5kcy5zaXplKCkgJiYKKyAgICAgICAgIG1fY2hpbGRyZW4uZW1wdHkoKTsKK30KKworYm9vbCBDb21tYW5kR3JvdXA6OklzSW50ZXJydXB0aWJsZSgpIGNvbnN0IHsKKyAgaWYgKCFDb21tYW5kOjpJc0ludGVycnVwdGlibGUoKSkgcmV0dXJuIGZhbHNlOworCisgIGlmIChtX2N1cnJlbnRDb21tYW5kSW5kZXggIT0gLTEgJiYKKyAgICAgICh1bnNpZ25lZCltX2N1cnJlbnRDb21tYW5kSW5kZXggPCBtX2NvbW1hbmRzLnNpemUoKSkgeworICAgIENvbW1hbmQgKmNtZCA9IG1fY29tbWFuZHNbbV9jdXJyZW50Q29tbWFuZEluZGV4XS5tX2NvbW1hbmQ7CisgICAgaWYgKCFjbWQtPklzSW50ZXJydXB0aWJsZSgpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICBhdXRvIGl0ZXIgPSBtX2NoaWxkcmVuLmNiZWdpbigpOworICBmb3IgKDsgaXRlciAhPSBtX2NoaWxkcmVuLmNlbmQoKTsgaXRlcisrKSB7CisgICAgaWYgKCFpdGVyLT5tX2NvbW1hbmQtPklzSW50ZXJydXB0aWJsZSgpKSByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb21tYW5kR3JvdXA6OkNhbmNlbENvbmZsaWN0cyhDb21tYW5kICpjb21tYW5kKSB7CisgIGF1dG8gY2hpbGRJdGVyID0gbV9jaGlsZHJlbi5iZWdpbigpOworICBmb3IgKDsgY2hpbGRJdGVyICE9IG1fY2hpbGRyZW4uZW5kKCk7KSB7CisgICAgQ29tbWFuZCAqY2hpbGQgPSBjaGlsZEl0ZXItPm1fY29tbWFuZDsKKyAgICBib29sIGVyYXNlZCA9IGZhbHNlOworCisgICAgQ29tbWFuZDo6U3Vic3lzdGVtU2V0IHJlcXVpcmVtZW50cyA9IGNvbW1hbmQtPkdldFJlcXVpcmVtZW50cygpOworICAgIGF1dG8gcmVxdWlyZW1lbnRJdGVyID0gcmVxdWlyZW1lbnRzLmJlZ2luKCk7CisgICAgZm9yICg7IHJlcXVpcmVtZW50SXRlciAhPSByZXF1aXJlbWVudHMuZW5kKCk7IHJlcXVpcmVtZW50SXRlcisrKSB7CisgICAgICBpZiAoY2hpbGQtPkRvZXNSZXF1aXJlKCpyZXF1aXJlbWVudEl0ZXIpKSB7CisgICAgICAgIGNoaWxkLT5fQ2FuY2VsKCk7CisgICAgICAgIGNoaWxkLT5SZW1vdmVkKCk7CisgICAgICAgIGNoaWxkSXRlciA9IG1fY2hpbGRyZW4uZXJhc2UoY2hpbGRJdGVyKTsKKyAgICAgICAgZXJhc2VkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghZXJhc2VkKSBjaGlsZEl0ZXIrKzsKKyAgfQorfQorCitpbnQgQ29tbWFuZEdyb3VwOjpHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbi5zaXplKCk7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9Db21tYW5kR3JvdXBFbnRyeS5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvQ29tbWFuZEdyb3VwRW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjNmYTQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvQ29tbWFuZEdyb3VwRW50cnkuY3BwCkBAIC0wLDAgKzEsMjEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmRHcm91cEVudHJ5LmgiCisKKyNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCisKK0NvbW1hbmRHcm91cEVudHJ5OjpDb21tYW5kR3JvdXBFbnRyeShDb21tYW5kICpjb21tYW5kLCBTZXF1ZW5jZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZW91dCkKKyAgICA6IG1fdGltZW91dCh0aW1lb3V0KSwgbV9jb21tYW5kKGNvbW1hbmQpLCBtX3N0YXRlKHN0YXRlKSB7fQorCitib29sIENvbW1hbmRHcm91cEVudHJ5OjpJc1RpbWVkT3V0KCkgY29uc3QgeworICBpZiAobV90aW1lb3V0IDwgMC4wKSByZXR1cm4gZmFsc2U7CisgIGRvdWJsZSB0aW1lID0gbV9jb21tYW5kLT5UaW1lU2luY2VJbml0aWFsaXplZCgpOworICBpZiAodGltZSA9PSAwLjApIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRpbWUgPj0gbV90aW1lb3V0OworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL1BJRENvbW1hbmQuY3BwIGIvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL1BJRENvbW1hbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWM5MTkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvUElEQ29tbWFuZC5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ29tbWFuZHMvUElEQ29tbWFuZC5oIgorCisjaW5jbHVkZSAiZmxvYXQuaCIKKworUElEQ29tbWFuZDo6UElEQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYsCisgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwZXJpb2QpCisgICAgOiBDb21tYW5kKG5hbWUpIHsKKyAgbV9jb250cm9sbGVyID0gc3RkOjptYWtlX3NoYXJlZDxQSURDb250cm9sbGVyPihwLCBpLCBkLCB0aGlzLCB0aGlzLCBwZXJpb2QpOworfQorCitQSURDb21tYW5kOjpQSURDb21tYW5kKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIGRvdWJsZSBmLCBkb3VibGUgcGVyaW9kKSB7CisgIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgZiwgdGhpcywgdGhpcywgcGVyaW9kKTsKK30KKworUElEQ29tbWFuZDo6UElEQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKKyAgICA6IENvbW1hbmQobmFtZSkgeworICBtX2NvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBJRENvbnRyb2xsZXI+KHAsIGksIGQsIHRoaXMsIHRoaXMpOworfQorCitQSURDb21tYW5kOjpQSURDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKQorICAgIDogQ29tbWFuZChuYW1lKSB7CisgIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgdGhpcywgdGhpcywgcGVyaW9kKTsKK30KKworUElEQ29tbWFuZDo6UElEQ29tbWFuZChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSB7CisgIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgdGhpcywgdGhpcyk7Cit9CisKK1BJRENvbW1hbmQ6OlBJRENvbW1hbmQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIHBlcmlvZCkgeworICBtX2NvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBJRENvbnRyb2xsZXI+KHAsIGksIGQsIHRoaXMsIHRoaXMsIHBlcmlvZCk7Cit9CisKK3ZvaWQgUElEQ29tbWFuZDo6X0luaXRpYWxpemUoKSB7IG1fY29udHJvbGxlci0+RW5hYmxlKCk7IH0KKwordm9pZCBQSURDb21tYW5kOjpfRW5kKCkgeyBtX2NvbnRyb2xsZXItPkRpc2FibGUoKTsgfQorCit2b2lkIFBJRENvbW1hbmQ6Ol9JbnRlcnJ1cHRlZCgpIHsgX0VuZCgpOyB9CisKK3ZvaWQgUElEQ29tbWFuZDo6U2V0U2V0cG9pbnRSZWxhdGl2ZShkb3VibGUgZGVsdGFTZXRwb2ludCkgeworICBTZXRTZXRwb2ludChHZXRTZXRwb2ludCgpICsgZGVsdGFTZXRwb2ludCk7Cit9CisKK3ZvaWQgUElEQ29tbWFuZDo6UElEV3JpdGUoZmxvYXQgb3V0cHV0KSB7IFVzZVBJRE91dHB1dChvdXRwdXQpOyB9CisKK2RvdWJsZSBQSURDb21tYW5kOjpQSURHZXQoKSB7IHJldHVybiBSZXR1cm5QSURJbnB1dCgpOyB9CisKK3N0ZDo6c2hhcmVkX3B0cjxQSURDb250cm9sbGVyPiBQSURDb21tYW5kOjpHZXRQSURDb250cm9sbGVyKCkgY29uc3QgeworICByZXR1cm4gbV9jb250cm9sbGVyOworfQorCit2b2lkIFBJRENvbW1hbmQ6OlNldFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkgeworICBtX2NvbnRyb2xsZXItPlNldFNldHBvaW50KHNldHBvaW50KTsKK30KKworZG91YmxlIFBJRENvbW1hbmQ6OkdldFNldHBvaW50KCkgY29uc3QgeyByZXR1cm4gbV9jb250cm9sbGVyLT5HZXRTZXRwb2ludCgpOyB9CisKK2RvdWJsZSBQSURDb21tYW5kOjpHZXRQb3NpdGlvbigpIHsgcmV0dXJuIFJldHVyblBJRElucHV0KCk7IH0KKworc3RkOjpzdHJpbmcgUElEQ29tbWFuZDo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeyByZXR1cm4gIlBJRENvbW1hbmQiOyB9Cit2b2lkIFBJRENvbW1hbmQ6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiB0YWJsZSkgeworICBtX2NvbnRyb2xsZXItPkluaXRUYWJsZSh0YWJsZSk7CisgIENvbW1hbmQ6OkluaXRUYWJsZSh0YWJsZSk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvUElEU3Vic3lzdGVtLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9QSURTdWJzeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDMyN2YKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvUElEU3Vic3lzdGVtLmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ29tbWFuZHMvUElEU3Vic3lzdGVtLmgiCisjaW5jbHVkZSAiUElEQ29udHJvbGxlci5oIgorI2luY2x1ZGUgImZsb2F0LmgiCisKKy8qKgorICogSW5zdGFudGlhdGVzIGEge0BsaW5rIFBJRFN1YnN5c3RlbX0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gcCwgaSBhbmQgZAorICogdmFsdWVzLgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEBwYXJhbSBwIHRoZSBwcm9wb3J0aW9uYWwgdmFsdWUKKyAqIEBwYXJhbSBpIHRoZSBpbnRlZ3JhbCB2YWx1ZQorICogQHBhcmFtIGQgdGhlIGRlcml2YXRpdmUgdmFsdWUKKyAqLworUElEU3Vic3lzdGVtOjpQSURTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpCisgICAgOiBTdWJzeXN0ZW0obmFtZSkgeworICBtX2NvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBJRENvbnRyb2xsZXI+KHAsIGksIGQsIHRoaXMsIHRoaXMpOworfQorCisvKioKKyAqIEluc3RhbnRpYXRlcyBhIHtAbGluayBQSURTdWJzeXN0ZW19IHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIHAsIGkgYW5kIGQKKyAqIHZhbHVlcy4KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCisgKiBAcGFyYW0gcCB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCisgKiBAcGFyYW0gaSB0aGUgaW50ZWdyYWwgdmFsdWUKKyAqIEBwYXJhbSBkIHRoZSBkZXJpdmF0aXZlIHZhbHVlCisgKiBAcGFyYW0gZiB0aGUgZmVlZGZvcndhcmQgdmFsdWUKKyAqLworUElEU3Vic3lzdGVtOjpQSURTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZikKKyAgICA6IFN1YnN5c3RlbShuYW1lKSB7CisgIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgZiwgdGhpcywgdGhpcyk7Cit9CisKKy8qKgorICogSW5zdGFudGlhdGVzIGEge0BsaW5rIFBJRFN1YnN5c3RlbX0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gcCwgaSBhbmQgZAorICogdmFsdWVzLiAgSXQgd2lsbCBhbHNvIHNwYWNlIHRoZSB0aW1lCisgKiBiZXR3ZWVuIFBJRCBsb29wIGNhbGN1bGF0aW9ucyB0byBiZSBlcXVhbCB0byB0aGUgZ2l2ZW4gcGVyaW9kLgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEBwYXJhbSBwIHRoZSBwcm9wb3J0aW9uYWwgdmFsdWUKKyAqIEBwYXJhbSBpIHRoZSBpbnRlZ3JhbCB2YWx1ZQorICogQHBhcmFtIGQgdGhlIGRlcml2YXRpdmUgdmFsdWUKKyAqIEBwYXJhbSBmIHRoZSBmZWVkZm93YXJkIHZhbHVlCisgKiBAcGFyYW0gcGVyaW9kIHRoZSB0aW1lIChpbiBzZWNvbmRzKSBiZXR3ZWVuIGNhbGN1bGF0aW9ucworICovCitQSURTdWJzeXN0ZW06OlBJRFN1YnN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmLCBkb3VibGUgcGVyaW9kKQorICAgIDogU3Vic3lzdGVtKG5hbWUpIHsKKyAgbV9jb250cm9sbGVyID0gc3RkOjptYWtlX3NoYXJlZDxQSURDb250cm9sbGVyPihwLCBpLCBkLCBmLCB0aGlzLCB0aGlzLCBwZXJpb2QpOworfQorCisvKioKKyAqIEluc3RhbnRpYXRlcyBhIHtAbGluayBQSURTdWJzeXN0ZW19IHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIHAsIGkgYW5kIGQKKyAqIHZhbHVlcy4KKyAqIEl0IHdpbGwgdXNlIHRoZSBjbGFzcyBuYW1lIGFzIGl0cyBuYW1lLgorICogQHBhcmFtIHAgdGhlIHByb3BvcnRpb25hbCB2YWx1ZQorICogQHBhcmFtIGkgdGhlIGludGVncmFsIHZhbHVlCisgKiBAcGFyYW0gZCB0aGUgZGVyaXZhdGl2ZSB2YWx1ZQorICovCitQSURTdWJzeXN0ZW06OlBJRFN1YnN5c3RlbShkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQorICAgIDogU3Vic3lzdGVtKCJQSURTdWJzeXN0ZW0iKSB7CisgIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgdGhpcywgdGhpcyk7Cit9CisKKy8qKgorICogSW5zdGFudGlhdGVzIGEge0BsaW5rIFBJRFN1YnN5c3RlbX0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gcCwgaSBhbmQgZAorICogdmFsdWVzLgorICogSXQgd2lsbCB1c2UgdGhlIGNsYXNzIG5hbWUgYXMgaXRzIG5hbWUuCisgKiBAcGFyYW0gcCB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCisgKiBAcGFyYW0gaSB0aGUgaW50ZWdyYWwgdmFsdWUKKyAqIEBwYXJhbSBkIHRoZSBkZXJpdmF0aXZlIHZhbHVlCisgKiBAcGFyYW0gZiB0aGUgZmVlZGZvcndhcmQgdmFsdWUKKyAqLworUElEU3Vic3lzdGVtOjpQSURTdWJzeXN0ZW0oZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYpCisgICAgOiBTdWJzeXN0ZW0oIlBJRFN1YnN5c3RlbSIpIHsKKyAgbV9jb250cm9sbGVyID0gc3RkOjptYWtlX3NoYXJlZDxQSURDb250cm9sbGVyPihwLCBpLCBkLCBmLCB0aGlzLCB0aGlzKTsKK30KKworLyoqCisgKiBJbnN0YW50aWF0ZXMgYSB7QGxpbmsgUElEU3Vic3lzdGVtfSB0aGF0IHdpbGwgdXNlIHRoZSBnaXZlbiBwLCBpIGFuZCBkCisgKiB2YWx1ZXMuCisgKiBJdCB3aWxsIHVzZSB0aGUgY2xhc3MgbmFtZSBhcyBpdHMgbmFtZS4KKyAqIEl0IHdpbGwgYWxzbyBzcGFjZSB0aGUgdGltZQorICogYmV0d2VlbiBQSUQgbG9vcCBjYWxjdWxhdGlvbnMgdG8gYmUgZXF1YWwgdG8gdGhlIGdpdmVuIHBlcmlvZC4KKyAqIEBwYXJhbSBwIHRoZSBwcm9wb3J0aW9uYWwgdmFsdWUKKyAqIEBwYXJhbSBpIHRoZSBpbnRlZ3JhbCB2YWx1ZQorICogQHBhcmFtIGQgdGhlIGRlcml2YXRpdmUgdmFsdWUKKyAqIEBwYXJhbSBmIHRoZSBmZWVkZm9yd2FyZCB2YWx1ZQorICogQHBhcmFtIHBlcmlvZCB0aGUgdGltZSAoaW4gc2Vjb25kcykgYmV0d2VlbiBjYWxjdWxhdGlvbnMKKyAqLworUElEU3Vic3lzdGVtOjpQSURTdWJzeXN0ZW0oZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKQorICAgIDogU3Vic3lzdGVtKCJQSURTdWJzeXN0ZW0iKSB7CisgIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgZiwgdGhpcywgdGhpcywgcGVyaW9kKTsKK30KKworLyoqCisgKiBFbmFibGVzIHRoZSBpbnRlcm5hbCB7QGxpbmsgUElEQ29udHJvbGxlcn0KKyAqLwordm9pZCBQSURTdWJzeXN0ZW06OkVuYWJsZSgpIHsgbV9jb250cm9sbGVyLT5FbmFibGUoKTsgfQorCisvKioKKyAgKiBEaXNhYmxlcyB0aGUgaW50ZXJuYWwge0BsaW5rIFBJRENvbnRyb2xsZXJ9CisgICovCit2b2lkIFBJRFN1YnN5c3RlbTo6RGlzYWJsZSgpIHsgbV9jb250cm9sbGVyLT5EaXNhYmxlKCk7IH0KKworLyoqCisgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUElEQ29udHJvbGxlcn0gdXNlZCBieSB0aGlzIHtAbGluayBQSURTdWJzeXN0ZW19LgorICogVXNlIHRoaXMgaWYgeW91IHdvdWxkIGxpa2UgdG8gZmluZSB0dW5lIHRoZSBwaWQgbG9vcC4KKyAqCisgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUElEQ29udHJvbGxlcn0gdXNlZCBieSB0aGlzIHtAbGluayBQSURTdWJzeXN0ZW19CisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxQSURDb250cm9sbGVyPiBQSURTdWJzeXN0ZW06OkdldFBJRENvbnRyb2xsZXIoKSB7CisgIHJldHVybiBtX2NvbnRyb2xsZXI7Cit9CisKKy8qKgorICogU2V0cyB0aGUgc2V0cG9pbnQgdG8gdGhlIGdpdmVuIHZhbHVlLiAgSWYge0BsaW5rIFBJRENvbW1hbmQjU2V0UmFuZ2UoZG91YmxlLAorICogZG91YmxlKSBTZXRSYW5nZSguLi4pfQorICogd2FzIGNhbGxlZCwKKyAqIHRoZW4gdGhlIGdpdmVuIHNldHBvaW50CisgKiB3aWxsIGJlIHRyaW1tZWQgdG8gZml0IHdpdGhpbiB0aGUgcmFuZ2UuCisgKiBAcGFyYW0gc2V0cG9pbnQgdGhlIG5ldyBzZXRwb2ludAorICovCit2b2lkIFBJRFN1YnN5c3RlbTo6U2V0U2V0cG9pbnQoZG91YmxlIHNldHBvaW50KSB7CisgIG1fY29udHJvbGxlci0+U2V0U2V0cG9pbnQoc2V0cG9pbnQpOworfQorCisvKioKKyAqIEFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBzZXRwb2ludC4KKyAqIElmIHtAbGluayBQSURDb21tYW5kI1NldFJhbmdlKGRvdWJsZSwgZG91YmxlKSBTZXRSYW5nZSguLi4pfSB3YXMgdXNlZCwKKyAqIHRoZW4gdGhlIGJvdW5kcyB3aWxsIHN0aWxsIGJlIGhvbm9yZWQgYnkgdGhpcyBtZXRob2QuCisgKiBAcGFyYW0gZGVsdGFTZXRwb2ludCB0aGUgY2hhbmdlIGluIHRoZSBzZXRwb2ludAorICovCit2b2lkIFBJRFN1YnN5c3RlbTo6U2V0U2V0cG9pbnRSZWxhdGl2ZShkb3VibGUgZGVsdGFTZXRwb2ludCkgeworICBTZXRTZXRwb2ludChHZXRTZXRwb2ludCgpICsgZGVsdGFTZXRwb2ludCk7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBjdXJyZW50IHNldHBvaW50CisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldHBvaW50CisgKi8KK2RvdWJsZSBQSURTdWJzeXN0ZW06OkdldFNldHBvaW50KCkgeyByZXR1cm4gbV9jb250cm9sbGVyLT5HZXRTZXRwb2ludCgpOyB9CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMgZXhwZWN0ZWQgZnJvbSB0aGUgaW5wdXQuCisgKgorICogQHBhcmFtIG1pbmltdW1JbnB1dCB0aGUgbWluaW11bSB2YWx1ZSBleHBlY3RlZCBmcm9tIHRoZSBpbnB1dAorICogQHBhcmFtIG1heGltdW1JbnB1dCB0aGUgbWF4aW11bSB2YWx1ZSBleHBlY3RlZCBmcm9tIHRoZSBvdXRwdXQKKyAqLwordm9pZCBQSURTdWJzeXN0ZW06OlNldElucHV0UmFuZ2UoZmxvYXQgbWluaW11bUlucHV0LCBmbG9hdCBtYXhpbXVtSW5wdXQpIHsKKyAgbV9jb250cm9sbGVyLT5TZXRJbnB1dFJhbmdlKG1pbmltdW1JbnB1dCwgbWF4aW11bUlucHV0KTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlcyB0byB3cml0ZS4KKyAqCisgKiBAcGFyYW0gbWluaW11bU91dHB1dCB0aGUgbWluaW11bSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0CisgKiBAcGFyYW0gbWF4aW11bU91dHB1dCB0aGUgbWF4aW11bSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0CisgKi8KK3ZvaWQgUElEU3Vic3lzdGVtOjpTZXRPdXRwdXRSYW5nZShmbG9hdCBtaW5pbXVtT3V0cHV0LCBmbG9hdCBtYXhpbXVtT3V0cHV0KSB7CisgIG1fY29udHJvbGxlci0+U2V0T3V0cHV0UmFuZ2UobWluaW11bU91dHB1dCwgbWF4aW11bU91dHB1dCk7Cit9CisKKy8qCisgKiBTZXQgdGhlIGFic29sdXRlIGVycm9yIHdoaWNoIGlzIGNvbnNpZGVyZWQgdG9sZXJhYmxlIGZvciB1c2Ugd2l0aAorICogT25UYXJnZXQuCisgKiBAcGFyYW0gcGVyY2VudGFnZSBlcnJvciB3aGljaCBpcyB0b2xlcmFibGUKKyAqLwordm9pZCBQSURTdWJzeXN0ZW06OlNldEFic29sdXRlVG9sZXJhbmNlKGZsb2F0IGFic1ZhbHVlKSB7CisgIG1fY29udHJvbGxlci0+U2V0QWJzb2x1dGVUb2xlcmFuY2UoYWJzVmFsdWUpOworfQorCisvKgorICogU2V0IHRoZSBwZXJjZW50YWdlIGVycm9yIHdoaWNoIGlzIGNvbnNpZGVyZWQgdG9sZXJhYmxlIGZvciB1c2Ugd2l0aAorICogT25UYXJnZXQuCisgKiBAcGFyYW0gcGVyY2VudGFnZSBlcnJvciB3aGljaCBpcyB0b2xlcmFibGUKKyAqLwordm9pZCBQSURTdWJzeXN0ZW06OlNldFBlcmNlbnRUb2xlcmFuY2UoZmxvYXQgcGVyY2VudCkgeworICBtX2NvbnRyb2xsZXItPlNldFBlcmNlbnRUb2xlcmFuY2UocGVyY2VudCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXJyb3IgaXMgd2l0aGluIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBpbnB1dCByYW5nZSwKKyAqIGRldGVybWluZWQgYnkgU2V0VG9sZXJhbmNlLiBUaGlzIGFzc3N1bWVzIHRoYXQgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gaW5wdXQKKyAqIHdlcmUgc2V0IHVzaW5nIFNldElucHV0LiBVc2UgT25UYXJnZXQoKSBpbiB0aGUgSXNGaW5pc2hlZCgpIG1ldGhvZCBvZgorICogY29tbWFuZHMKKyAqIHRoYXQgdXNlIHRoaXMgc3Vic3lzdGVtLgorICoKKyAqIEN1cnJlbnRseSB0aGlzIGp1c3QgcmVwb3J0cyBvbiB0YXJnZXQgYXMgdGhlIGFjdHVhbCB2YWx1ZSBwYXNzZXMgdGhyb3VnaCB0aGUKKyAqIHNldHBvaW50LgorICogSWRlYWxseSBpdCBzaG91bGQgYmUgYmFzZWQgb24gYmVpbmcgd2l0aGluIHRoZSB0b2xlcmFuY2UgZm9yIHNvbWUgcGVyaW9kIG9mCisgKiB0aW1lLgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXJyb3IgaXMgd2l0aGluIHRoZSBwZXJjZW50YWdlIHRvbGVyYW5jZSBvZiB0aGUgaW5wdXQKKyAqIHJhbmdlCisgKi8KK2Jvb2wgUElEU3Vic3lzdGVtOjpPblRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udHJvbGxlci0+T25UYXJnZXQoKTsgfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAqLworZG91YmxlIFBJRFN1YnN5c3RlbTo6R2V0UG9zaXRpb24oKSB7IHJldHVybiBSZXR1cm5QSURJbnB1dCgpOyB9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCByYXRlCisgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUKKyAqLworZG91YmxlIFBJRFN1YnN5c3RlbTo6R2V0UmF0ZSgpIHsgcmV0dXJuIFJldHVyblBJRElucHV0KCk7IH0KKwordm9pZCBQSURTdWJzeXN0ZW06OlBJRFdyaXRlKGZsb2F0IG91dHB1dCkgeyBVc2VQSURPdXRwdXQob3V0cHV0KTsgfQorCitkb3VibGUgUElEU3Vic3lzdGVtOjpQSURHZXQoKSB7IHJldHVybiBSZXR1cm5QSURJbnB1dCgpOyB9CisKK3N0ZDo6c3RyaW5nIFBJRFN1YnN5c3RlbTo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeyByZXR1cm4gIlBJRENvbW1hbmQiOyB9Cit2b2lkIFBJRFN1YnN5c3RlbTo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHRhYmxlKSB7CisgIG1fY29udHJvbGxlci0+SW5pdFRhYmxlKHRhYmxlKTsKKyAgU3Vic3lzdGVtOjpJbml0VGFibGUodGFibGUpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL1ByaW50Q29tbWFuZC5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvUHJpbnRDb21tYW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU4ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL1ByaW50Q29tbWFuZC5jcHAKQEAgLTAsMCArMSwyOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ29tbWFuZHMvUHJpbnRDb21tYW5kLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlIDxzc3RyZWFtPgorCitQcmludENvbW1hbmQ6OlByaW50Q29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmbWVzc2FnZSkKKyAgICA6IENvbW1hbmQoKChzdGQ6OnN0cmluZ3N0cmVhbSAmKShzdGQ6OnN0cmluZ3N0cmVhbSgiUHJpbnQgXCIiKSA8PCBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiIikpCisgICAgICAgICAgICAgICAgICAuc3RyKCkKKyAgICAgICAgICAgICAgICAgIC5jX3N0cigpKSB7CisgIG1fbWVzc2FnZSA9IG1lc3NhZ2U7Cit9CisKK3ZvaWQgUHJpbnRDb21tYW5kOjpJbml0aWFsaXplKCkgeyBwcmludGYoIiVzIiwgbV9tZXNzYWdlLmNfc3RyKCkpOyB9CisKK3ZvaWQgUHJpbnRDb21tYW5kOjpFeGVjdXRlKCkge30KKworYm9vbCBQcmludENvbW1hbmQ6OklzRmluaXNoZWQoKSB7IHJldHVybiB0cnVlOyB9CisKK3ZvaWQgUHJpbnRDb21tYW5kOjpFbmQoKSB7fQorCit2b2lkIFByaW50Q29tbWFuZDo6SW50ZXJydXB0ZWQoKSB7fQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL1NjaGVkdWxlci5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvU2NoZWR1bGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc5NmUzCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL1NjaGVkdWxlci5jcHAKQEAgLTAsMCArMSwyNzMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgorCisjaW5jbHVkZSAiQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9TdWJzeXN0ZW0uaCIKKyNpbmNsdWRlICJITFVzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworU2NoZWR1bGVyOjpTY2hlZHVsZXIoKSB7CisgIEhMVXNhZ2VSZXBvcnRpbmc6OlJlcG9ydFNjaGVkdWxlcigpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHtAbGluayBTY2hlZHVsZXJ9LCBjcmVhdGluZyBpdCBpZiBvbmUgZG9lcyBub3QgZXhpc3QuCisgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NoZWR1bGVyfQorICovCitTY2hlZHVsZXIgKlNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKSB7CisgIHN0YXRpYyBTY2hlZHVsZXIgaW5zdGFuY2U7CisgIHJldHVybiAmaW5zdGFuY2U7Cit9CisKK3ZvaWQgU2NoZWR1bGVyOjpTZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkgeyBtX2VuYWJsZWQgPSBlbmFibGVkOyB9CisKKy8qKgorICogQWRkIGEgY29tbWFuZCB0byBiZSBzY2hlZHVsZWQgbGF0ZXIuCisgKiBJbiBhbnkgcGFzcyB0aHJvdWdoIHRoZSBzY2hlZHVsZXIsIGFsbCBjb21tYW5kcyBhcmUgYWRkZWQgdG8gdGhlIGFkZGl0aW9ucworICogbGlzdCwgdGhlbgorICogYXQgdGhlIGVuZCBvZiB0aGUgcGFzcywgdGhleSBhcmUgYWxsIHNjaGVkdWxlZC4KKyAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIGJlIHNjaGVkdWxlZAorICovCit2b2lkIFNjaGVkdWxlcjo6QWRkQ29tbWFuZChDb21tYW5kICpjb21tYW5kKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX2FkZGl0aW9uc0xvY2spOworICBpZiAoc3RkOjpmaW5kKG1fYWRkaXRpb25zLmJlZ2luKCksIG1fYWRkaXRpb25zLmVuZCgpLCBjb21tYW5kKSAhPQorICAgICAgbV9hZGRpdGlvbnMuZW5kKCkpCisgICAgcmV0dXJuOworICBtX2FkZGl0aW9ucy5wdXNoX2JhY2soY29tbWFuZCk7Cit9CisKK3ZvaWQgU2NoZWR1bGVyOjpBZGRCdXR0b24oQnV0dG9uU2NoZWR1bGVyICpidXR0b24pIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fYnV0dG9uc0xvY2spOworICBtX2J1dHRvbnMucHVzaF9iYWNrKGJ1dHRvbik7Cit9CisKK3ZvaWQgU2NoZWR1bGVyOjpQcm9jZXNzQ29tbWFuZEFkZGl0aW9uKENvbW1hbmQgKmNvbW1hbmQpIHsKKyAgaWYgKGNvbW1hbmQgPT0gbnVsbHB0cikgcmV0dXJuOworCisgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSBubyBhZGRpbmcgZHVyaW5nIGFkZGluZworICBpZiAobV9hZGRpbmcpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBzdGFydCBjb21tYW5kIGZyb20gY2FuY2VsIG1ldGhvZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIE9ubHkgYWRkIGlmIG5vdCBhbHJlYWR5IGluCisgIGF1dG8gZm91bmQgPSBtX2NvbW1hbmRzLmZpbmQoY29tbWFuZCk7CisgIGlmIChmb3VuZCA9PSBtX2NvbW1hbmRzLmVuZCgpKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcmVxdWlyZW1lbnRzIGNhbiBiZSBoYWQKKyAgICBDb21tYW5kOjpTdWJzeXN0ZW1TZXQgcmVxdWlyZW1lbnRzID0gY29tbWFuZC0+R2V0UmVxdWlyZW1lbnRzKCk7CisgICAgQ29tbWFuZDo6U3Vic3lzdGVtU2V0OjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IHJlcXVpcmVtZW50cy5iZWdpbigpOyBpdGVyICE9IHJlcXVpcmVtZW50cy5lbmQoKTsgaXRlcisrKSB7CisgICAgICBTdWJzeXN0ZW0gKmxvY2sgPSAqaXRlcjsKKyAgICAgIGlmIChsb2NrLT5HZXRDdXJyZW50Q29tbWFuZCgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAhbG9jay0+R2V0Q3VycmVudENvbW1hbmQoKS0+SXNJbnRlcnJ1cHRpYmxlKCkpCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBHaXZlIGl0IHRoZSByZXF1aXJlbWVudHMKKyAgICBtX2FkZGluZyA9IHRydWU7CisgICAgZm9yIChpdGVyID0gcmVxdWlyZW1lbnRzLmJlZ2luKCk7IGl0ZXIgIT0gcmVxdWlyZW1lbnRzLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgIFN1YnN5c3RlbSAqbG9jayA9ICppdGVyOworICAgICAgaWYgKGxvY2stPkdldEN1cnJlbnRDb21tYW5kKCkgIT0gbnVsbHB0cikgeworICAgICAgICBsb2NrLT5HZXRDdXJyZW50Q29tbWFuZCgpLT5DYW5jZWwoKTsKKyAgICAgICAgUmVtb3ZlKGxvY2stPkdldEN1cnJlbnRDb21tYW5kKCkpOworICAgICAgfQorICAgICAgbG9jay0+U2V0Q3VycmVudENvbW1hbmQoY29tbWFuZCk7CisgICAgfQorICAgIG1fYWRkaW5nID0gZmFsc2U7CisKKyAgICBtX2NvbW1hbmRzLmluc2VydChjb21tYW5kKTsKKworICAgIGNvbW1hbmQtPlN0YXJ0UnVubmluZygpOworICAgIG1fcnVubmluZ0NvbW1hbmRzQ2hhbmdlZCA9IHRydWU7CisgIH0KK30KKworLyoqCisgKiBSdW5zIGEgc2luZ2xlIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb2Z0ZW4gaW4KKyAqIG9yZGVyIHRvIGhhdmUgYSBmdW5jdGlvbmluZworICoge0BsaW5rIENvbW1hbmR9IHN5c3RlbS4gIFRoZSBsb29wIGhhcyBmaXZlIHN0YWdlczoKKyAqCisgKiA8b2w+CisgKiA8bGk+IFBvbGwgdGhlIEJ1dHRvbnMgPC9saT4KKyAqIDxsaT4gRXhlY3V0ZS9SZW1vdmUgdGhlIENvbW1hbmRzIDwvbGk+CisgKiA8bGk+IFNlbmQgdmFsdWVzIHRvIFNtYXJ0RGFzaGJvYXJkIDwvbGk+CisgKiA8bGk+IEFkZCBDb21tYW5kcyA8L2xpPgorICogPGxpPiBBZGQgRGVmYXVsdHMgPC9saT4KKyAqIDwvb2w+CisgKi8KK3ZvaWQgU2NoZWR1bGVyOjpSdW4oKSB7CisgIC8vIEdldCBidXR0b24gaW5wdXQgKGdvaW5nIGJhY2t3YXJkcyBwcmVzZXJ2ZXMgYnV0dG9uIHByaW9yaXR5KQorICB7CisgICAgaWYgKCFtX2VuYWJsZWQpIHJldHVybjsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX2J1dHRvbnNMb2NrKTsKKyAgICBhdXRvIHJCdXR0b25JdGVyID0gbV9idXR0b25zLnJiZWdpbigpOworICAgIGZvciAoOyByQnV0dG9uSXRlciAhPSBtX2J1dHRvbnMucmVuZCgpOyByQnV0dG9uSXRlcisrKSB7CisgICAgICAoKnJCdXR0b25JdGVyKS0+RXhlY3V0ZSgpOworICAgIH0KKyAgfQorCisgIG1fcnVubmluZ0NvbW1hbmRzQ2hhbmdlZCA9IGZhbHNlOworCisgIC8vIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMKKyAgYXV0byBjb21tYW5kSXRlciA9IG1fY29tbWFuZHMuYmVnaW4oKTsKKyAgZm9yICg7IGNvbW1hbmRJdGVyICE9IG1fY29tbWFuZHMuZW5kKCk7KSB7CisgICAgQ29tbWFuZCAqY29tbWFuZCA9ICpjb21tYW5kSXRlcjsKKyAgICAvLyBJbmNyZW1lbnQgYmVmb3JlIHBvdGVudGlhbGx5IHJlbW92aW5nIHRvIGtlZXAgdGhlIGl0ZXJhdG9yIHZhbGlkCisgICAgY29tbWFuZEl0ZXIrKzsKKyAgICBpZiAoIWNvbW1hbmQtPlJ1bigpKSB7CisgICAgICBSZW1vdmUoY29tbWFuZCk7CisgICAgICBtX3J1bm5pbmdDb21tYW5kc0NoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIEFkZCB0aGUgbmV3IHRoaW5ncworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fYWRkaXRpb25zTG9jayk7CisgICAgYXV0byBhZGRpdGlvbnNJdGVyID0gbV9hZGRpdGlvbnMuYmVnaW4oKTsKKyAgICBmb3IgKDsgYWRkaXRpb25zSXRlciAhPSBtX2FkZGl0aW9ucy5lbmQoKTsgYWRkaXRpb25zSXRlcisrKSB7CisgICAgICBQcm9jZXNzQ29tbWFuZEFkZGl0aW9uKCphZGRpdGlvbnNJdGVyKTsKKyAgICB9CisgICAgbV9hZGRpdGlvbnMuY2xlYXIoKTsKKyAgfQorCisgIC8vIEFkZCBpbiB0aGUgZGVmYXVsdHMKKyAgYXV0byBzdWJzeXN0ZW1JdGVyID0gbV9zdWJzeXN0ZW1zLmJlZ2luKCk7CisgIGZvciAoOyBzdWJzeXN0ZW1JdGVyICE9IG1fc3Vic3lzdGVtcy5lbmQoKTsgc3Vic3lzdGVtSXRlcisrKSB7CisgICAgU3Vic3lzdGVtICpsb2NrID0gKnN1YnN5c3RlbUl0ZXI7CisgICAgaWYgKGxvY2stPkdldEN1cnJlbnRDb21tYW5kKCkgPT0gbnVsbHB0cikgeworICAgICAgUHJvY2Vzc0NvbW1hbmRBZGRpdGlvbihsb2NrLT5HZXREZWZhdWx0Q29tbWFuZCgpKTsKKyAgICB9CisgICAgbG9jay0+Q29uZmlybUNvbW1hbmQoKTsKKyAgfQorCisgIFVwZGF0ZVRhYmxlKCk7Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIGEge0BsaW5rIFN1YnN5c3RlbX0gdG8gdGhpcyB7QGxpbmsgU2NoZWR1bGVyfSwgc28gdGhhdCB0aGUge0BsaW5rCisgKiBTY2hlZHVsZXJ9IG1pZ2h0IGtub3cKKyAqIGlmIGEgZGVmYXVsdCB7QGxpbmsgQ29tbWFuZH0gbmVlZHMgdG8gYmUgcnVuLiAgQWxsIHtAbGluayBTdWJzeXN0ZW0KKyAqIFN1YnN5c3RlbXN9IHNob3VsZCBjYWxsIHRoaXMuCisgKiBAcGFyYW0gc3lzdGVtIHRoZSBzeXN0ZW0KKyAqLwordm9pZCBTY2hlZHVsZXI6OlJlZ2lzdGVyU3Vic3lzdGVtKFN1YnN5c3RlbSAqc3Vic3lzdGVtKSB7CisgIGlmIChzdWJzeXN0ZW0gPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJzdWJzeXN0ZW0iKTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9zdWJzeXN0ZW1zLmluc2VydChzdWJzeXN0ZW0pOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIHtAbGluayBDb21tYW5kfSBmcm9tIHRoZSB7QGxpbmsgU2NoZWR1bGVyfS4KKyAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZQorICovCit2b2lkIFNjaGVkdWxlcjo6UmVtb3ZlKENvbW1hbmQgKmNvbW1hbmQpIHsKKyAgaWYgKGNvbW1hbmQgPT0gbnVsbHB0cikgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJjb21tYW5kIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCFtX2NvbW1hbmRzLmVyYXNlKGNvbW1hbmQpKSByZXR1cm47CisKKyAgQ29tbWFuZDo6U3Vic3lzdGVtU2V0IHJlcXVpcmVtZW50cyA9IGNvbW1hbmQtPkdldFJlcXVpcmVtZW50cygpOworICBhdXRvIGl0ZXIgPSByZXF1aXJlbWVudHMuYmVnaW4oKTsKKyAgZm9yICg7IGl0ZXIgIT0gcmVxdWlyZW1lbnRzLmVuZCgpOyBpdGVyKyspIHsKKyAgICBTdWJzeXN0ZW0gKmxvY2sgPSAqaXRlcjsKKyAgICBsb2NrLT5TZXRDdXJyZW50Q29tbWFuZChudWxscHRyKTsKKyAgfQorCisgIGNvbW1hbmQtPlJlbW92ZWQoKTsKK30KKwordm9pZCBTY2hlZHVsZXI6OlJlbW92ZUFsbCgpIHsKKyAgd2hpbGUgKG1fY29tbWFuZHMuc2l6ZSgpID4gMCkgeworICAgIFJlbW92ZSgqbV9jb21tYW5kcy5iZWdpbigpKTsKKyAgfQorfQorCisvKioKKyAqIENvbXBsZXRlbHkgcmVzZXRzIHRoZSBzY2hlZHVsZXIuIFVuZGVmaW5lZCBiZWhhdmlvciBpZiBydW5uaW5nLgorICovCit2b2lkIFNjaGVkdWxlcjo6UmVzZXRBbGwoKSB7CisgIFJlbW92ZUFsbCgpOworICBtX3N1YnN5c3RlbXMuY2xlYXIoKTsKKyAgbV9idXR0b25zLmNsZWFyKCk7CisgIG1fYWRkaXRpb25zLmNsZWFyKCk7CisgIG1fY29tbWFuZHMuY2xlYXIoKTsKKyAgbV90YWJsZSA9IG51bGxwdHI7Cit9CisKKy8qKgorICogVXBkYXRlIHRoZSBuZXR3b3JrIHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFNjaGVkdWxlciBvYmplY3Qgb24gdGhlCisgKiBTbWFydERhc2hib2FyZAorICovCit2b2lkIFNjaGVkdWxlcjo6VXBkYXRlVGFibGUoKSB7CisgIENvbW1hbmRTZXQ6Oml0ZXJhdG9yIGNvbW1hbmRJdGVyOworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbW1hbmRzIHRvIGNhbmNlbAorICAgIGF1dG8gbmV3X3RvQ2FuY2VsID0gbV90YWJsZS0+R2V0VmFsdWUoIkNhbmNlbCIpOworICAgIGlmIChuZXdfdG9DYW5jZWwpCisgICAgICB0b0NhbmNlbCA9IG5ld190b0NhbmNlbC0+R2V0RG91YmxlQXJyYXkoKTsKKyAgICBlbHNlCisgICAgICB0b0NhbmNlbC5yZXNpemUoMCk7CisgICAgLy8JCW1fdGFibGUtPlJldHJpZXZlVmFsdWUoIklkcyIsICppZHMpOworCisgICAgLy8gY2FuY2VsIGNvbW1hbmRzIHRoYXQgaGF2ZSBoYWQgdGhlIGNhbmNlbCBidXR0b25zIHByZXNzZWQKKyAgICAvLyBvbiB0aGUgU21hcnREYXNoYm9hZAorICAgIGlmICghdG9DYW5jZWwuZW1wdHkoKSkgeworICAgICAgZm9yIChjb21tYW5kSXRlciA9IG1fY29tbWFuZHMuYmVnaW4oKTsgY29tbWFuZEl0ZXIgIT0gbV9jb21tYW5kcy5lbmQoKTsKKyAgICAgICAgICAgKytjb21tYW5kSXRlcikgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdG9DYW5jZWwuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICBDb21tYW5kICpjID0gKmNvbW1hbmRJdGVyOworICAgICAgICAgIGlmIChjLT5HZXRJRCgpID09IHRvQ2FuY2VsW2ldKSB7CisgICAgICAgICAgICBjLT5DYW5jZWwoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRvQ2FuY2VsLnJlc2l6ZSgwKTsKKyAgICAgIG1fdGFibGUtPlB1dFZhbHVlKCJDYW5jZWwiLCBudDo6VmFsdWU6Ok1ha2VEb3VibGVBcnJheSh0b0NhbmNlbCkpOworICAgIH0KKworICAgIC8vIFNldCB0aGUgcnVubmluZyBjb21tYW5kcworICAgIGlmIChtX3J1bm5pbmdDb21tYW5kc0NoYW5nZWQpIHsKKyAgICAgIGNvbW1hbmRzLnJlc2l6ZSgwKTsKKyAgICAgIGlkcy5yZXNpemUoMCk7CisgICAgICBmb3IgKGNvbW1hbmRJdGVyID0gbV9jb21tYW5kcy5iZWdpbigpOyBjb21tYW5kSXRlciAhPSBtX2NvbW1hbmRzLmVuZCgpOworICAgICAgICAgICArK2NvbW1hbmRJdGVyKSB7CisgICAgICAgIENvbW1hbmQgKmMgPSAqY29tbWFuZEl0ZXI7CisgICAgICAgIGNvbW1hbmRzLnB1c2hfYmFjayhjLT5HZXROYW1lKCkpOworICAgICAgICBpZHMucHVzaF9iYWNrKGMtPkdldElEKCkpOworICAgICAgfQorICAgICAgbV90YWJsZS0+UHV0VmFsdWUoIk5hbWVzIiwgbnQ6OlZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoY29tbWFuZHMpKTsKKyAgICAgIG1fdGFibGUtPlB1dFZhbHVlKCJJZHMiLCBudDo6VmFsdWU6Ok1ha2VEb3VibGVBcnJheShpZHMpKTsKKyAgICB9CisgIH0KK30KKworc3RkOjpzdHJpbmcgU2NoZWR1bGVyOjpHZXROYW1lKCkgY29uc3QgeyByZXR1cm4gIlNjaGVkdWxlciI7IH0KKworc3RkOjpzdHJpbmcgU2NoZWR1bGVyOjpHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gIlNjaGVkdWxlciI7IH0KKworc3RkOjpzdHJpbmcgU2NoZWR1bGVyOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7IHJldHVybiAiU2NoZWR1bGVyIjsgfQorCit2b2lkIFNjaGVkdWxlcjo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSB7CisgIG1fdGFibGUgPSBzdWJUYWJsZTsKKworICBtX3RhYmxlLT5QdXRWYWx1ZSgiTmFtZXMiLCBudDo6VmFsdWU6Ok1ha2VTdHJpbmdBcnJheShjb21tYW5kcykpOworICBtX3RhYmxlLT5QdXRWYWx1ZSgiSWRzIiwgbnQ6OlZhbHVlOjpNYWtlRG91YmxlQXJyYXkoaWRzKSk7CisgIG1fdGFibGUtPlB1dFZhbHVlKCJDYW5jZWwiLCBudDo6VmFsdWU6Ok1ha2VEb3VibGVBcnJheSh0b0NhbmNlbCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBTY2hlZHVsZXI6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL1N0YXJ0Q29tbWFuZC5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvU3RhcnRDb21tYW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGRiMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvc3JjL0NvbW1hbmRzL1N0YXJ0Q29tbWFuZC5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ29tbWFuZHMvU3RhcnRDb21tYW5kLmgiCisKK1N0YXJ0Q29tbWFuZDo6U3RhcnRDb21tYW5kKENvbW1hbmQgKmNvbW1hbmRUb1N0YXJ0KSA6IENvbW1hbmQoIlN0YXJ0Q29tbWFuZCIpIHsKKyAgbV9jb21tYW5kVG9Gb3JrID0gY29tbWFuZFRvU3RhcnQ7Cit9CisKK3ZvaWQgU3RhcnRDb21tYW5kOjpJbml0aWFsaXplKCkgeyBtX2NvbW1hbmRUb0ZvcmstPlN0YXJ0KCk7IH0KKwordm9pZCBTdGFydENvbW1hbmQ6OkV4ZWN1dGUoKSB7fQorCit2b2lkIFN0YXJ0Q29tbWFuZDo6RW5kKCkge30KKwordm9pZCBTdGFydENvbW1hbmQ6OkludGVycnVwdGVkKCkge30KKworYm9vbCBTdGFydENvbW1hbmQ6OklzRmluaXNoZWQoKSB7IHJldHVybiB0cnVlOyB9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvU3Vic3lzdGVtLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9TdWJzeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNGI5MmYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvU3Vic3lzdGVtLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiQ29tbWFuZHMvU3Vic3lzdGVtLmgiCisKKyNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvU2NoZWR1bGVyLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ3JlYXRlcyBhIHN1YnN5c3RlbSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3Vic3lzdGVtCisgKi8KK1N1YnN5c3RlbTo6U3Vic3lzdGVtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CisgIG1fbmFtZSA9IG5hbWU7CisgIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UmVnaXN0ZXJTdWJzeXN0ZW0odGhpcyk7Cit9CisvKioKKyAqIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgY29tbWFuZCBmb3IgdGhpcyBzdWJzeXN0ZW0KKyAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgdGhlIHBsYWNlIHRvIGNhbGwgU2V0RGVmYXVsdENvbW1hbmQgaW4gYSBzdWJzeXN0ZW0gYW5kCisgKiB3aWxsIGJlIGNhbGxlZAorICogb24gYWxsIHRoZSBzdWJzeXN0ZW1zIGJ5IHRoZSBDb21tYW5kQmFzZSBtZXRob2QgYmVmb3JlIHRoZSBwcm9ncmFtIHN0YXJ0cworICogcnVubmluZyBieSB1c2luZworICogdGhlIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgU3Vic3lzdGVtcyBpbnNpZGUgdGhlIFNjaGVkdWxlci4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IGEgU3Vic3lzdGVtIHRoYXQgaGFzIGEgZGVmYXVsdCBDb21tYW5kCisgKi8KK3ZvaWQgU3Vic3lzdGVtOjpJbml0RGVmYXVsdENvbW1hbmQoKSB7fQorCisvKioKKyAqIFNldHMgdGhlIGRlZmF1bHQgY29tbWFuZC4gIElmIHRoaXMgaXMgbm90IGNhbGxlZCBvciBpcyBjYWxsZWQgd2l0aCBudWxsLAorICogdGhlbiB0aGVyZSB3aWxsIGJlIG5vIGRlZmF1bHQgY29tbWFuZCBmb3IgdGhlIHN1YnN5c3RlbS4KKyAqCisgKiA8cD48Yj5XQVJOSU5HOjwvYj4gVGhpcyBzaG91bGQgPGI+Tk9UPC9iPiBiZSBjYWxsZWQgaW4gYSBjb25zdHJ1Y3RvciBpZiB0aGUKKyAqIHN1YnN5c3RlbSBpcyBhCisgKiBzaW5nbGV0b24uPC9wPgorICoKKyAqIEBwYXJhbSBjb21tYW5kIHRoZSBkZWZhdWx0IGNvbW1hbmQgKG9yIG51bGwgaWYgdGhlcmUgc2hvdWxkIGJlIG5vbmUpCisgKi8KK3ZvaWQgU3Vic3lzdGVtOjpTZXREZWZhdWx0Q29tbWFuZChDb21tYW5kICpjb21tYW5kKSB7CisgIGlmIChjb21tYW5kID09IG51bGxwdHIpIHsKKyAgICBtX2RlZmF1bHRDb21tYW5kID0gbnVsbHB0cjsKKyAgfSBlbHNlIHsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgQ29tbWFuZDo6U3Vic3lzdGVtU2V0IHJlcXVpcmVtZW50cyA9IGNvbW1hbmQtPkdldFJlcXVpcmVtZW50cygpOworICAgIGF1dG8gaXRlciA9IHJlcXVpcmVtZW50cy5iZWdpbigpOworICAgIGZvciAoOyBpdGVyICE9IHJlcXVpcmVtZW50cy5lbmQoKTsgaXRlcisrKSB7CisgICAgICBpZiAoKml0ZXIgPT0gdGhpcykgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmICghZm91bmQpIHsKKyAgICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAorICAgICAgICAgIENvbW1hbmRJbGxlZ2FsVXNlLCAiQSBkZWZhdWx0IGNvbW1hbmQgbXVzdCByZXF1aXJlIHRoZSBzdWJzeXN0ZW0iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2RlZmF1bHRDb21tYW5kID0gY29tbWFuZDsKKyAgfQorICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgaWYgKG1fZGVmYXVsdENvbW1hbmQgIT0gbnVsbHB0cikgeworICAgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiaGFzRGVmYXVsdCIsIHRydWUpOworICAgICAgbV90YWJsZS0+UHV0U3RyaW5nKCJkZWZhdWx0IiwgbV9kZWZhdWx0Q29tbWFuZC0+R2V0TmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiaGFzRGVmYXVsdCIsIGZhbHNlKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGNvbW1hbmQgKG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZSkuCisgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGNvbW1hbmQKKyAqLworQ29tbWFuZCAqU3Vic3lzdGVtOjpHZXREZWZhdWx0Q29tbWFuZCgpIHsKKyAgaWYgKCFtX2luaXRpYWxpemVkRGVmYXVsdENvbW1hbmQpIHsKKyAgICBtX2luaXRpYWxpemVkRGVmYXVsdENvbW1hbmQgPSB0cnVlOworICAgIEluaXREZWZhdWx0Q29tbWFuZCgpOworICB9CisgIHJldHVybiBtX2RlZmF1bHRDb21tYW5kOworfQorCisvKioKKyAqIFNldHMgdGhlIGN1cnJlbnQgY29tbWFuZAorICogQHBhcmFtIGNvbW1hbmQgdGhlIG5ldyBjdXJyZW50IGNvbW1hbmQKKyAqLwordm9pZCBTdWJzeXN0ZW06OlNldEN1cnJlbnRDb21tYW5kKENvbW1hbmQgKmNvbW1hbmQpIHsKKyAgbV9jdXJyZW50Q29tbWFuZCA9IGNvbW1hbmQ7CisgIG1fY3VycmVudENvbW1hbmRDaGFuZ2VkID0gdHJ1ZTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHdoaWNoIGN1cnJlbnRseSBjbGFpbXMgdGhpcyBzdWJzeXN0ZW0uCisgKiBAcmV0dXJuIHRoZSBjb21tYW5kIHdoaWNoIGN1cnJlbnRseSBjbGFpbXMgdGhpcyBzdWJzeXN0ZW0KKyAqLworQ29tbWFuZCAqU3Vic3lzdGVtOjpHZXRDdXJyZW50Q29tbWFuZCgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudENvbW1hbmQ7IH0KKworLyoqCisgKiBDYWxsIHRoaXMgdG8gYWxlcnQgU3Vic3lzdGVtIHRoYXQgdGhlIGN1cnJlbnQgY29tbWFuZCBpcyBhY3R1YWxseSB0aGUKKyAqIGNvbW1hbmQuCisgKiBTb21ldGltZXMsIHRoZSB7QGxpbmsgU3Vic3lzdGVtfSBpcyB0b2xkIHRoYXQgaXQgaGFzIG5vIGNvbW1hbmQgd2hpbGUgdGhlCisgKiB7QGxpbmsgU2NoZWR1bGVyfQorICogaXMgZ29pbmcgdGhyb3VnaCB0aGUgbG9vcCwgb25seSB0byBiZSBzb29uIGFmdGVyIGdpdmVuIGEgbmV3IG9uZS4gIFRoaXMgd2lsbAorICogYXZvaWQgdGhhdCBzaXR1YXRpb24uCisgKi8KK3ZvaWQgU3Vic3lzdGVtOjpDb25maXJtQ29tbWFuZCgpIHsKKyAgaWYgKG1fY3VycmVudENvbW1hbmRDaGFuZ2VkKSB7CisgICAgaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworICAgICAgaWYgKG1fY3VycmVudENvbW1hbmQgIT0gbnVsbHB0cikgeworICAgICAgICBtX3RhYmxlLT5QdXRCb29sZWFuKCJoYXNDb21tYW5kIiwgdHJ1ZSk7CisgICAgICAgIG1fdGFibGUtPlB1dFN0cmluZygiY29tbWFuZCIsIG1fY3VycmVudENvbW1hbmQtPkdldE5hbWUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX3RhYmxlLT5QdXRCb29sZWFuKCJoYXNDb21tYW5kIiwgZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgICBtX2N1cnJlbnRDb21tYW5kQ2hhbmdlZCA9IGZhbHNlOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFN1YnN5c3RlbTo6R2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorCitzdGQ6OnN0cmluZyBTdWJzeXN0ZW06OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsgcmV0dXJuICJTdWJzeXN0ZW0iOyB9CisKK3ZvaWQgU3Vic3lzdGVtOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gdGFibGUpIHsKKyAgbV90YWJsZSA9IHRhYmxlOworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgaWYgKG1fZGVmYXVsdENvbW1hbmQgIT0gbnVsbHB0cikgeworICAgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiaGFzRGVmYXVsdCIsIHRydWUpOworICAgICAgbV90YWJsZS0+UHV0U3RyaW5nKCJkZWZhdWx0IiwgbV9kZWZhdWx0Q29tbWFuZC0+R2V0TmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiaGFzRGVmYXVsdCIsIGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG1fY3VycmVudENvbW1hbmQgIT0gbnVsbHB0cikgeworICAgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiaGFzQ29tbWFuZCIsIHRydWUpOworICAgICAgbV90YWJsZS0+UHV0U3RyaW5nKCJjb21tYW5kIiwgbV9jdXJyZW50Q29tbWFuZC0+R2V0TmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgbV90YWJsZS0+UHV0Qm9vbGVhbigiaGFzQ29tbWFuZCIsIGZhbHNlKTsKKyAgICB9CisgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gU3Vic3lzdGVtOjpHZXRUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGU7IH0KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9XYWl0Q29tbWFuZC5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvV2FpdENvbW1hbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTRjMDAKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvV2FpdENvbW1hbmQuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkNvbW1hbmRzL1dhaXRDb21tYW5kLmgiCisjaW5jbHVkZSA8c3N0cmVhbT4KKworV2FpdENvbW1hbmQ6OldhaXRDb21tYW5kKGRvdWJsZSB0aW1lb3V0KQorICAgIDogQ29tbWFuZCgKKyAgICAgICAgICAoKHN0ZDo6c3RyaW5nc3RyZWFtICYpKHN0ZDo6c3RyaW5nc3RyZWFtKCJXYWl0KCIpIDw8IHRpbWVvdXQgPDwgIikiKSkKKyAgICAgICAgICAgICAgLnN0cigpCisgICAgICAgICAgICAgIC5jX3N0cigpLAorICAgICAgICAgIHRpbWVvdXQpIHt9CisKK1dhaXRDb21tYW5kOjpXYWl0Q29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgZG91YmxlIHRpbWVvdXQpCisgICAgOiBDb21tYW5kKG5hbWUsIHRpbWVvdXQpIHt9CisKK3ZvaWQgV2FpdENvbW1hbmQ6OkluaXRpYWxpemUoKSB7fQorCit2b2lkIFdhaXRDb21tYW5kOjpFeGVjdXRlKCkge30KKworYm9vbCBXYWl0Q29tbWFuZDo6SXNGaW5pc2hlZCgpIHsgcmV0dXJuIElzVGltZWRPdXQoKTsgfQorCit2b2lkIFdhaXRDb21tYW5kOjpFbmQoKSB7fQorCit2b2lkIFdhaXRDb21tYW5kOjpJbnRlcnJ1cHRlZCgpIHt9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvV2FpdEZvckNoaWxkcmVuLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9XYWl0Rm9yQ2hpbGRyZW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTEyOWQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvV2FpdEZvckNoaWxkcmVuLmNwcApAQCAtMCwwICsxLDI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJDb21tYW5kcy9XYWl0Rm9yQ2hpbGRyZW4uaCIKKyNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kR3JvdXAuaCIKKworV2FpdEZvckNoaWxkcmVuOjpXYWl0Rm9yQ2hpbGRyZW4oZG91YmxlIHRpbWVvdXQpCisgICAgOiBDb21tYW5kKCJXYWl0Rm9yQ2hpbGRyZW4iLCB0aW1lb3V0KSB7fQorCitXYWl0Rm9yQ2hpbGRyZW46OldhaXRGb3JDaGlsZHJlbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgZG91YmxlIHRpbWVvdXQpCisgICAgOiBDb21tYW5kKG5hbWUsIHRpbWVvdXQpIHt9CisKK3ZvaWQgV2FpdEZvckNoaWxkcmVuOjpJbml0aWFsaXplKCkge30KKwordm9pZCBXYWl0Rm9yQ2hpbGRyZW46OkV4ZWN1dGUoKSB7fQorCit2b2lkIFdhaXRGb3JDaGlsZHJlbjo6RW5kKCkge30KKwordm9pZCBXYWl0Rm9yQ2hpbGRyZW46OkludGVycnVwdGVkKCkge30KKworYm9vbCBXYWl0Rm9yQ2hpbGRyZW46OklzRmluaXNoZWQoKSB7CisgIHJldHVybiBHZXRHcm91cCgpID09IG51bGxwdHIgfHwgR2V0R3JvdXAoKS0+R2V0U2l6ZSgpID09IDA7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvV2FpdFVudGlsQ29tbWFuZC5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvQ29tbWFuZHMvV2FpdFVudGlsQ29tbWFuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwZTY2NAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9Db21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmNwcApAQCAtMCwwICsxLDM4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDExLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJDb21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKworLyoqCisgKiBBIHtAbGluayBXYWl0Q29tbWFuZH0gd2lsbCB3YWl0IHVudGlsIGEgY2VydGFpbiBtYXRjaCB0aW1lIGJlZm9yZSBmaW5pc2hpbmcuCisgKiBUaGlzIHdpbGwgd2FpdCB1bnRpbCB0aGUgZ2FtZSBjbG9jayByZWFjaGVzIHNvbWUgdmFsdWUsIHRoZW4gY29udGludWUgdG8gdGhlCisgKiBuZXh0IGNvbW1hbmQuCisgKiBAc2VlIENvbW1hbmRHcm91cAorICovCitXYWl0VW50aWxDb21tYW5kOjpXYWl0VW50aWxDb21tYW5kKGRvdWJsZSB0aW1lKQorICAgIDogQ29tbWFuZCgiV2FpdFVudGlsQ29tbWFuZCIsIHRpbWUpIHsKKyAgbV90aW1lID0gdGltZTsKK30KKworV2FpdFVudGlsQ29tbWFuZDo6V2FpdFVudGlsQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgZG91YmxlIHRpbWUpCisgICAgOiBDb21tYW5kKG5hbWUsIHRpbWUpIHsKKyAgbV90aW1lID0gdGltZTsKK30KKwordm9pZCBXYWl0VW50aWxDb21tYW5kOjpJbml0aWFsaXplKCkge30KKwordm9pZCBXYWl0VW50aWxDb21tYW5kOjpFeGVjdXRlKCkge30KKworLyoqCisgKiBDaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBhY3R1YWwgZmluaXNoIHRpbWUuCisgKi8KK2Jvb2wgV2FpdFVudGlsQ29tbWFuZDo6SXNGaW5pc2hlZCgpIHsgcmV0dXJuIFRpbWVyOjpHZXRNYXRjaFRpbWUoKSA+PSBtX3RpbWU7IH0KKwordm9pZCBXYWl0VW50aWxDb21tYW5kOjpFbmQoKSB7fQorCit2b2lkIFdhaXRVbnRpbENvbW1hbmQ6OkludGVycnVwdGVkKCkge30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9FcnJvci5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvRXJyb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDYzNjEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvRXJyb3IuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkVycm9yLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKwordm9pZCBFcnJvcjo6Q2xvbmUoY29uc3QgRXJyb3ImIGVycm9yKSB7CisgIG1fY29kZSA9IGVycm9yLm1fY29kZTsKKyAgbV9tZXNzYWdlID0gZXJyb3IubV9tZXNzYWdlOworICBtX2ZpbGVuYW1lID0gZXJyb3IubV9maWxlbmFtZTsKKyAgbV9mdW5jdGlvbiA9IGVycm9yLm1fZnVuY3Rpb247CisgIG1fbGluZU51bWJlciA9IGVycm9yLm1fbGluZU51bWJlcjsKKyAgbV9vcmlnaW5hdGluZ09iamVjdCA9IGVycm9yLm1fb3JpZ2luYXRpbmdPYmplY3Q7CisgIG1fdGltZXN0YW1wID0gZXJyb3IubV90aW1lc3RhbXA7Cit9CisKK0Vycm9yOjpDb2RlIEVycm9yOjpHZXRDb2RlKCkgY29uc3QgeyByZXR1cm4gbV9jb2RlOyB9CisKK3N0ZDo6c3RyaW5nIEVycm9yOjpHZXRNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gbV9tZXNzYWdlOyB9CisKK3N0ZDo6c3RyaW5nIEVycm9yOjpHZXRGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmlsZW5hbWU7IH0KKworc3RkOjpzdHJpbmcgRXJyb3I6OkdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdGlvbjsgfQorCit1aW50MzJfdCBFcnJvcjo6R2V0TGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fbGluZU51bWJlcjsgfQorCitjb25zdCBFcnJvckJhc2UqIEVycm9yOjpHZXRPcmlnaW5hdGluZ09iamVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fb3JpZ2luYXRpbmdPYmplY3Q7Cit9CisKK2RvdWJsZSBFcnJvcjo6R2V0VGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gbV90aW1lc3RhbXA7IH0KKwordm9pZCBFcnJvcjo6U2V0KENvZGUgY29kZSwgbGx2bTo6U3RyaW5nUmVmIGNvbnRleHRNZXNzYWdlLAorICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIsIGNvbnN0IEVycm9yQmFzZSogb3JpZ2luYXRpbmdPYmplY3QpIHsKKyAgYm9vbCByZXBvcnQgPSB0cnVlOworCisgIGlmIChjb2RlID09IG1fY29kZSAmJiBHZXRUaW1lKCkgLSBtX3RpbWVzdGFtcCA8IDEpIHsKKyAgICByZXBvcnQgPSBmYWxzZTsKKyAgfQorCisgIG1fY29kZSA9IGNvZGU7CisgIG1fbWVzc2FnZSA9IGNvbnRleHRNZXNzYWdlOworICBtX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisgIG1fZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgbV9saW5lTnVtYmVyID0gbGluZU51bWJlcjsKKyAgbV9vcmlnaW5hdGluZ09iamVjdCA9IG9yaWdpbmF0aW5nT2JqZWN0OworCisgIGlmIChyZXBvcnQpIHsKKyAgICBtX3RpbWVzdGFtcCA9IEdldFRpbWUoKTsKKyAgICBSZXBvcnQoKTsKKyAgfQorfQorCit2b2lkIEVycm9yOjpSZXBvcnQoKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yU3RyZWFtOworCisgIGVycm9yU3RyZWFtIDw8ICJFcnJvciBvbiBsaW5lICIgPDwgbV9saW5lTnVtYmVyIDw8ICIgIjsKKyNpZiBkZWZpbmVkKF9VTklYKQorCWVycm9yU3RyZWFtIDw8ICJvZiAiIDw8IGJhc2VuYW1lKG1fZmlsZW5hbWUuY19zdHIoKSkgPDwgIjogIjsKKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorCWNvbnN0IGludCBNQVhfRElSID0gMTAwOworCWNoYXIgYmFzZW5hbWVbTUFYX0RJUl07CisJX3NwbGl0cGF0aF9zKG1fZmlsZW5hbWUuY19zdHIoKSwgTlVMTCwgMCwgYmFzZW5hbWUsIE1BWF9ESVIsIE5VTEwsIDAsIE5VTEwsIDApOworCWVycm9yU3RyZWFtIDw8ICJvZiAiIDw8IGJhc2VuYW1lIDw8ICI6ICI7CisjZW5kaWYKKworCWVycm9yU3RyZWFtIDw8IG1fbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisJZXJyb3JTdHJlYW0gPDwgR2V0U3RhY2tUcmFjZSg0KTsKKworICBzdGQ6OnN0cmluZyBlcnJvciA9IGVycm9yU3RyZWFtLnN0cigpOworCisgIERyaXZlclN0YXRpb246OlJlcG9ydEVycm9yKGVycm9yKTsKK30KKwordm9pZCBFcnJvcjo6Q2xlYXIoKSB7CisgIG1fY29kZSA9IDA7CisgIG1fbWVzc2FnZSA9ICIiOworICBtX2ZpbGVuYW1lID0gIiI7CisgIG1fZnVuY3Rpb24gPSAiIjsKKyAgbV9saW5lTnVtYmVyID0gMDsKKyAgbV9vcmlnaW5hdGluZ09iamVjdCA9IG51bGxwdHI7CisgIG1fdGltZXN0YW1wID0gMC4wOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0Vycm9yQmFzZS5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvRXJyb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjljOTgzCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvc3JjL0Vycm9yQmFzZS5jcHAKQEAgLTAsMCArMSwxOTEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorI2RlZmluZSBXUElfRVJST1JTX0RFRklORV9TVFJJTkdTCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK3ByaW9yaXR5X211dGV4IEVycm9yQmFzZTo6X2dsb2JhbEVycm9yTXV0ZXg7CitFcnJvciBFcnJvckJhc2U6Ol9nbG9iYWxFcnJvcjsKKworLyoqCisgKiBAYnJpZWYgUmV0cmlldmUgdGhlIGN1cnJlbnQgZXJyb3IuCisgKiBHZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vuc29yLgorICovCitFcnJvciYgRXJyb3JCYXNlOjpHZXRFcnJvcigpIHsgcmV0dXJuIG1fZXJyb3I7IH0KKworY29uc3QgRXJyb3ImIEVycm9yQmFzZTo6R2V0RXJyb3IoKSBjb25zdCB7IHJldHVybiBtX2Vycm9yOyB9CisKKy8qKgorICogQGJyaWVmIENsZWFyIHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlbnNvci4KKyAqLwordm9pZCBFcnJvckJhc2U6OkNsZWFyRXJyb3IoKSBjb25zdCB7IG1fZXJyb3IuQ2xlYXIoKTsgfQorCisvKioKKyAqIEBicmllZiBTZXQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgQyBsaWJyYXJ5IGNhbGwgdGhhdCBzZXQgYW4KKyAqIGVycm9yIHRvIHRoZSAiZXJybm8iIGdsb2JhbCB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KKyAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQorICovCit2b2lkIEVycm9yQmFzZTo6U2V0RXJybm9FcnJvcihsbHZtOjpTdHJpbmdSZWYgY29udGV4dE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGVycjsKKyAgaW50IGVyck5vID0gZXJybm87CisgIGlmIChlcnJObyA9PSAwKSB7CisgICAgZXJyID0gIk9LOiAiOworICAgIGVyciArPSBjb250ZXh0TWVzc2FnZTsKKyAgfSBlbHNlIHsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIHNucHJpbnRmKGJ1ZiwgMjU2LCAiJXMgKDB4JTA4WCk6ICUuKnMiLCBzdHJlcnJvcihlcnJObyksIGVyck5vLAorICAgICAgICAgICAgIGNvbnRleHRNZXNzYWdlLnNpemUoKSwgY29udGV4dE1lc3NhZ2UuZGF0YSgpKTsKKyAgICBlcnIgPSBidWY7CisgIH0KKworICAvLyAgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGZvciB0aGlzIG9iamVjdC4KKyAgbV9lcnJvci5TZXQoLTEsIGVyciwgZmlsZW5hbWUsIGZ1bmN0aW9uLCBsaW5lTnVtYmVyLCB0aGlzKTsKKworICAvLyBVcGRhdGUgdGhlIGdsb2JhbCBlcnJvciBpZiB0aGVyZSBpcyBub3Qgb25lIGFscmVhZHkgc2V0LgorICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IG11dGV4KF9nbG9iYWxFcnJvck11dGV4KTsKKyAgaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgPT0gMCkgeworICAgIF9nbG9iYWxFcnJvci5DbG9uZShtX2Vycm9yKTsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCBmcm9tIHRoZSBuaXZpc2lvbiBJbWFxCisgKiBBUEkuCisgKgorICogQHBhcmFtIHN1Y2Nlc3MgVGhlIHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbgorICogQHBhcmFtIGNvbnRleHRNZXNzYWdlIEEgY3VzdG9tIG1lc3NhZ2UgZnJvbSB0aGUgY29kZSB0aGF0IHNldCB0aGUgZXJyb3IuCisgKiBAcGFyYW0gZmlsZW5hbWUgRmlsZW5hbWUgb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGZ1bmN0aW9uIEZ1bmN0aW9uIG9mIHRoZSBlcnJvciBzb3VyY2UKKyAqIEBwYXJhbSBsaW5lTnVtYmVyIExpbmUgbnVtYmVyIG9mIHRoZSBlcnJvciBzb3VyY2UKKyAqLwordm9pZCBFcnJvckJhc2U6OlNldEltYXFFcnJvcihpbnQgc3VjY2VzcywgbGx2bTo6U3RyaW5nUmVmIGNvbnRleHRNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsIGxsdm06OlN0cmluZ1JlZiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZU51bWJlcikgY29uc3QgeworICAvLyAgSWYgdGhlcmUgd2FzIGFuIGVycm9yCisgIGlmIChzdWNjZXNzIDw9IDApIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnI7CisgICAgZXJyIDw8IHN1Y2Nlc3MgPDwgIjogIiA8PCBjb250ZXh0TWVzc2FnZTsKKworICAgIC8vICBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0LgorICAgIG1fZXJyb3IuU2V0KHN1Y2Nlc3MsIGVyci5zdHIoKSwgZmlsZW5hbWUsIGZ1bmN0aW9uLCBsaW5lTnVtYmVyLCB0aGlzKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgZ2xvYmFsIGVycm9yIGlmIHRoZXJlIGlzIG5vdCBvbmUgYWxyZWFkeSBzZXQuCisgICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7CisgICAgaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgPT0gMCkgeworICAgICAgX2dsb2JhbEVycm9yLkNsb25lKG1fZXJyb3IpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vuc29yLgorICoKKyAqIEBwYXJhbSBjb2RlIFRoZSBlcnJvciBjb2RlCisgKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KKyAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQorICovCit2b2lkIEVycm9yQmFzZTo6U2V0RXJyb3IoRXJyb3I6OkNvZGUgY29kZSwgbGx2bTo6U3RyaW5nUmVmIGNvbnRleHRNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIpIGNvbnN0IHsKKyAgLy8gIElmIHRoZXJlIHdhcyBhbiBlcnJvcgorICBpZiAoY29kZSAhPSAwKSB7CisgICAgLy8gIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmplY3QuCisgICAgbV9lcnJvci5TZXQoY29kZSwgY29udGV4dE1lc3NhZ2UsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwgdGhpcyk7CisKKyAgICAvLyBVcGRhdGUgdGhlIGdsb2JhbCBlcnJvciBpZiB0aGVyZSBpcyBub3Qgb25lIGFscmVhZHkgc2V0LgorICAgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworICAgIGlmIChfZ2xvYmFsRXJyb3IuR2V0Q29kZSgpID09IDApIHsKKyAgICAgIF9nbG9iYWxFcnJvci5DbG9uZShtX2Vycm9yKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlbnNvci4KKyAqCisgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIGZyb20gV1BJRXJyb3JzLmgKKyAqIEBwYXJhbSBjb250ZXh0TWVzc2FnZSBBIGN1c3RvbSBtZXNzYWdlIGZyb20gdGhlIGNvZGUgdGhhdCBzZXQgdGhlIGVycm9yLgorICogQHBhcmFtIGZpbGVuYW1lIEZpbGVuYW1lIG9mIHRoZSBlcnJvciBzb3VyY2UKKyAqIEBwYXJhbSBmdW5jdGlvbiBGdW5jdGlvbiBvZiB0aGUgZXJyb3Igc291cmNlCisgKiBAcGFyYW0gbGluZU51bWJlciBMaW5lIG51bWJlciBvZiB0aGUgZXJyb3Igc291cmNlCisgKi8KK3ZvaWQgRXJyb3JCYXNlOjpTZXRXUElFcnJvcihsbHZtOjpTdHJpbmdSZWYgZXJyb3JNZXNzYWdlLCBFcnJvcjo6Q29kZSBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBjb250ZXh0TWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsIGxsdm06OlN0cmluZ1JlZiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5lTnVtYmVyKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGVyciA9IGVycm9yTWVzc2FnZS5zdHIoKSArICI6ICIgKyBjb250ZXh0TWVzc2FnZS5zdHIoKTsKKworICAvLyAgU2V0IHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIGZvciB0aGlzIG9iamVjdC4KKyAgbV9lcnJvci5TZXQoY29kZSwgZXJyLCBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVOdW1iZXIsIHRoaXMpOworCisgIC8vIFVwZGF0ZSB0aGUgZ2xvYmFsIGVycm9yIGlmIHRoZXJlIGlzIG5vdCBvbmUgYWxyZWFkeSBzZXQuCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworICBpZiAoX2dsb2JhbEVycm9yLkdldENvZGUoKSA9PSAwKSB7CisgICAgX2dsb2JhbEVycm9yLkNsb25lKG1fZXJyb3IpOworICB9Cit9CisKK3ZvaWQgRXJyb3JCYXNlOjpDbG9uZUVycm9yKGNvbnN0IEVycm9yQmFzZSYgcmhzKSBjb25zdCB7CisgIG1fZXJyb3IuQ2xvbmUocmhzLkdldEVycm9yKCkpOworfQorCisvKioKK0BicmllZiBDaGVjayBpZiB0aGUgY3VycmVudCBlcnJvciBjb2RlIHJlcHJlc2VudHMgYSBmYXRhbCBlcnJvci4KKworQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGVycm9yIGlzIGZhdGFsLgorKi8KK2Jvb2wgRXJyb3JCYXNlOjpTdGF0dXNJc0ZhdGFsKCkgY29uc3QgeyByZXR1cm4gbV9lcnJvci5HZXRDb2RlKCkgPCAwOyB9CisKK3ZvaWQgRXJyb3JCYXNlOjpTZXRHbG9iYWxFcnJvcihFcnJvcjo6Q29kZSBjb2RlLCBsbHZtOjpTdHJpbmdSZWYgY29udGV4dE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmdW5jdGlvbiwgdWludDMyX3QgbGluZU51bWJlcikgeworICAvLyAgSWYgdGhlcmUgd2FzIGFuIGVycm9yCisgIGlmIChjb2RlICE9IDApIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IG11dGV4KF9nbG9iYWxFcnJvck11dGV4KTsKKworICAgIC8vICBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0LgorICAgIF9nbG9iYWxFcnJvci5TZXQoY29kZSwgY29udGV4dE1lc3NhZ2UsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICB9Cit9CisKK3ZvaWQgRXJyb3JCYXNlOjpTZXRHbG9iYWxXUElFcnJvcihsbHZtOjpTdHJpbmdSZWYgZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBjb250ZXh0TWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIpIHsKKyAgc3RkOjpzdHJpbmcgZXJyID0gZXJyb3JNZXNzYWdlLnN0cigpICsgIjogIiArIGNvbnRleHRNZXNzYWdlLnN0cigpOworCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworICBpZiAoX2dsb2JhbEVycm9yLkdldENvZGUoKSAhPSAwKSB7CisgICAgX2dsb2JhbEVycm9yLkNsZWFyKCk7CisgIH0KKyAgX2dsb2JhbEVycm9yLlNldCgtMSwgZXJyLCBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVOdW1iZXIsIG51bGxwdHIpOworfQorCisvKioKKyAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBnbG9iYWwgZXJyb3IuCisqLworRXJyb3ImIEVycm9yQmFzZTo6R2V0R2xvYmFsRXJyb3IoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOworICByZXR1cm4gX2dsb2JhbEVycm9yOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0hMVXNhZ2VSZXBvcnRpbmcuY3BwIGIvd3BpbGliYy9zaGFyZWQvc3JjL0hMVXNhZ2VSZXBvcnRpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmM2YjYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvSExVc2FnZVJlcG9ydGluZy5jcHAKQEAgLTAsMCArMSwyMCBAQAorCisjaW5jbHVkZSAiSExVc2FnZVJlcG9ydGluZy5oIgorCitITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKiBITFVzYWdlUmVwb3J0aW5nOjppbXBsID0gbnVsbHB0cjsKKwordm9pZCBITFVzYWdlUmVwb3J0aW5nOjpTZXRJbXBsZW1lbnRhdGlvbihITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKiBpKSB7CisgIGltcGwgPSBpOworfQorCit2b2lkIEhMVXNhZ2VSZXBvcnRpbmc6OlJlcG9ydFNjaGVkdWxlcigpIHsKKyAgaWYgKGltcGwgIT0gbnVsbHB0cikgeworICAgIGltcGwtPlJlcG9ydFNjaGVkdWxlcigpOworICB9Cit9CisKK3ZvaWQgSExVc2FnZVJlcG9ydGluZzo6UmVwb3J0U21hcnREYXNoYm9hcmQoKSB7CisgIGlmIChpbXBsICE9IG51bGxwdHIpIHsKKyAgICBpbXBsLT5SZXBvcnRTbWFydERhc2hib2FyZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvTGl2ZVdpbmRvdy9MaXZlV2luZG93LmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9MaXZlV2luZG93L0xpdmVXaW5kb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5M2RkY2MKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvTGl2ZVdpbmRvdy9MaXZlV2luZG93LmNwcApAQCAtMCwwICsxLDIxNSBAQAorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8qKgorICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSBMaXZlV2luZG93IG1haW4gY2xhc3MKKyAqIFRoaXMgaXMgYSBzaW5nbGV0b24gdG8gZ3VhcmFudGVlIHRoYXQgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBpbnN0YW5jZQorICogcmVnYXJkbGVzcyBvZgorICogaG93IG1hbnkgdGltZXMgR2V0SW5zdGFuY2UgaXMgY2FsbGVkLgorICovCitMaXZlV2luZG93ICpMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpIHsKKyAgc3RhdGljIExpdmVXaW5kb3cgaW5zdGFuY2U7CisgIHJldHVybiAmaW5zdGFuY2U7Cit9CisKKy8qKgorICogTGl2ZVdpbmRvdyBjb25zdHJ1Y3Rvci4KKyAqIEFsbG9jYXRlIHRoZSBuZWNlc3NhcnkgdGFibGVzLgorICovCitMaXZlV2luZG93OjpMaXZlV2luZG93KCkgOiBtX3NjaGVkdWxlcihTY2hlZHVsZXI6OkdldEluc3RhbmNlKCkpIHsKKyAgbV9saXZlV2luZG93VGFibGUgPSBOZXR3b3JrVGFibGU6OkdldFRhYmxlKCJMaXZlV2luZG93Iik7CisgIG1fc3RhdHVzVGFibGUgPSBtX2xpdmVXaW5kb3dUYWJsZS0+R2V0U3ViVGFibGUoIn5TVEFUVVN+Iik7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBlbmFibGVkIHN0YXR1cyBvZiBMaXZlV2luZG93CisgKiBJZiBpdCBjaGFuZ2VzIHRvIGVuYWJsZWQsIHN0YXJ0IGxpdmV3aW5kb3cgcnVubmluZyBvdGhlcndpc2Ugc3RvcCBpdAorICovCit2b2lkIExpdmVXaW5kb3c6OlNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSB7CisgIGlmIChtX2VuYWJsZWQgPT0gZW5hYmxlZCkgcmV0dXJuOworICBpZiAoZW5hYmxlZCkgeworICAgIGlmIChtX2ZpcnN0VGltZSkgeworICAgICAgSW5pdGlhbGl6ZUxpdmVXaW5kb3dDb21wb25lbnRzKCk7CisgICAgICBtX2ZpcnN0VGltZSA9IGZhbHNlOworICAgIH0KKyAgICBtX3NjaGVkdWxlci0+U2V0RW5hYmxlZChmYWxzZSk7CisgICAgbV9zY2hlZHVsZXItPlJlbW92ZUFsbCgpOworICAgIGZvciAoYXV0byYgZWxlbSA6IG1fY29tcG9uZW50cykgeworICAgICAgZWxlbS5maXJzdC0+U3RhcnRMaXZlV2luZG93TW9kZSgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGF1dG8mIGVsZW0gOiBtX2NvbXBvbmVudHMpIHsKKyAgICAgIGVsZW0uZmlyc3QtPlN0b3BMaXZlV2luZG93TW9kZSgpOworICAgIH0KKyAgICBtX3NjaGVkdWxlci0+U2V0RW5hYmxlZCh0cnVlKTsKKyAgfQorICBtX2VuYWJsZWQgPSBlbmFibGVkOworICBtX3N0YXR1c1RhYmxlLT5QdXRCb29sZWFuKCJMVyBFbmFibGVkIiwgbV9lbmFibGVkKTsKK30KKworLyoqCisgKiBAbmFtZSBBZGRTZW5zb3Ioc3Vic3lzdGVtLCBuYW1lLCBjb21wb25lbnQpCisgKiBBZGQgYSBTZW5zb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzeXN0ZW0gYW5kIGNhbGwgaXQgYnkgdGhlIGdpdmVuIG5hbWUuCisgKiBAcGFyYW0gc3Vic3lzdGVtIFRoZSBzdWJzeXN0ZW0gdGhpcyBjb21wb25lbnQgaXMgcGFydCBvZi4KKyAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50LgorICogQHBhcmFtIGNvbXBvbmVudCBBIExpdmVXaW5kb3dTZW5kYWJsZSBjb21wb25lbnQgdGhhdCByZXByZXNlbnRzIGEgc2Vuc29yLgorICovCisvL0B7CisvKioKKyAqIEBicmllZiBVc2UgYSBTVEwgc21hcnQgcG9pbnRlciB0byBzaGFyZSBvd25lcnNoaXAgb2YgY29tcG9uZW50LgorICovCit2b2lkIExpdmVXaW5kb3c6OkFkZFNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmc3Vic3lzdGVtLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXZlV2luZG93U2VuZGFibGU+IGNvbXBvbmVudCkgeworICBtX2NvbXBvbmVudHNbY29tcG9uZW50XS5zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07CisgIG1fY29tcG9uZW50c1tjb21wb25lbnRdLm5hbWUgPSBuYW1lOworICBtX2NvbXBvbmVudHNbY29tcG9uZW50XS5pc1NlbnNvciA9IHRydWU7Cit9CisKKy8qKgorICogQGJyaWVmIFBhc3MgYSByZWZlcmVuY2UgdG8gTGl2ZVdpbmRvdyBhbmQgcmV0YWluIG93bmVyc2hpcCBvZiB0aGUgY29tcG9uZW50LgorICovCit2b2lkIExpdmVXaW5kb3c6OkFkZFNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmc3Vic3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXZlV2luZG93U2VuZGFibGUgJmNvbXBvbmVudCkgeworICBBZGRTZW5zb3Ioc3Vic3lzdGVtLCBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8TGl2ZVdpbmRvd1NlbmRhYmxlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb25lbnQsIFtdKExpdmVXaW5kb3dTZW5kYWJsZSope30pKTsKK30KKworLyoqCisgKiBAYnJpZWYgVXNlIGEgcmF3IHBvaW50ZXIgdG8gdGhlIExpdmVXaW5kb3cuCisgKiBAZGVwcmVjYXRlZCBQcmVmZXIgc21hcnQgcG9pbnRlcnMgb3IgcmVmZXJlbmNlcy4KKyAqLwordm9pZCBMaXZlV2luZG93OjpBZGRTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJnN1YnN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVdpbmRvd1NlbmRhYmxlICpjb21wb25lbnQpIHsKKyAgQWRkU2Vuc29yKHN1YnN5c3RlbSwgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPExpdmVXaW5kb3dTZW5kYWJsZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsIE51bGxEZWxldGVyPExpdmVXaW5kb3dTZW5kYWJsZT4oKSkpOworfQorLy9AfQorCisvKioKKyAqIEBuYW1lIEFkZEFjdHVhdG9yKHN1YnN5c3RlbSwgbmFtZSwgY29tcG9uZW50KQorICogQWRkIGFuIEFjdHVhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic3lzdGVtIGFuZCBjYWxsIGl0IGJ5IHRoZSBnaXZlbiBuYW1lLgorICogQHBhcmFtIHN1YnN5c3RlbSBUaGUgc3Vic3lzdGVtIHRoaXMgY29tcG9uZW50IGlzIHBhcnQgb2YuCisgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAqIEBwYXJhbSBjb21wb25lbnQgQSBMaXZlV2luZG93U2VuZGFibGUgY29tcG9uZW50IHRoYXQgcmVwcmVzZW50cyBhIGFjdHVhdG9yLgorICovCisvL0B7CisvKioKKyAqIEBicmllZiBVc2UgYSBTVEwgc21hcnQgcG9pbnRlciB0byBzaGFyZSBvd25lcnNoaXAgb2YgY29tcG9uZW50LgorICovCit2b2lkIExpdmVXaW5kb3c6OkFkZEFjdHVhdG9yKGNvbnN0IHN0ZDo6c3RyaW5nICZzdWJzeXN0ZW0sIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGl2ZVdpbmRvd1NlbmRhYmxlPiBjb21wb25lbnQpIHsKKyAgbV9jb21wb25lbnRzW2NvbXBvbmVudF0uc3Vic3lzdGVtID0gc3Vic3lzdGVtOworICBtX2NvbXBvbmVudHNbY29tcG9uZW50XS5uYW1lID0gbmFtZTsKKyAgbV9jb21wb25lbnRzW2NvbXBvbmVudF0uaXNTZW5zb3IgPSBmYWxzZTsKK30KKworLyoqCisgKiBAYnJpZWYgUGFzcyBhIHJlZmVyZW5jZSB0byBMaXZlV2luZG93IGFuZCByZXRhaW4gb3duZXJzaGlwIG9mIHRoZSBjb21wb25lbnQuCisgKi8KK3ZvaWQgTGl2ZVdpbmRvdzo6QWRkQWN0dWF0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJnN1YnN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVXaW5kb3dTZW5kYWJsZSAmY29tcG9uZW50KSB7CisgIEFkZEFjdHVhdG9yKHN1YnN5c3RlbSwgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPExpdmVXaW5kb3dTZW5kYWJsZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9uZW50LCBbXShMaXZlV2luZG93U2VuZGFibGUqKXt9KSk7Cit9CisKKy8qKgorICogQGJyaWVmIFVzZSBhIHJhdyBwb2ludGVyIHRvIHRoZSBMaXZlV2luZG93LgorICogQGRlcHJlY2F0ZWQgUHJlZmVyIHNtYXJ0IHBvaW50ZXJzIG9yIHJlZmVyZW5jZXMuCisgKi8KK3ZvaWQgTGl2ZVdpbmRvdzo6QWRkQWN0dWF0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJnN1YnN5c3RlbSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVXaW5kb3dTZW5kYWJsZSAqY29tcG9uZW50KSB7CisgIEFkZEFjdHVhdG9yKHN1YnN5c3RlbSwgbmFtZSwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpdmVXaW5kb3dTZW5kYWJsZT4oCisgICAgICAgICAgICAgICAgICBjb21wb25lbnQsIE51bGxEZWxldGVyPExpdmVXaW5kb3dTZW5kYWJsZT4oKSkpOworfQorLy9AfQorCisvKioKKyAqIE1lYW50IGZvciBpbnRlcm5hbCB1c2UgaW4gb3RoZXIgV1BJTGliIGNsYXNzZXMuCisgKi8KK3ZvaWQgTGl2ZVdpbmRvdzo6QWRkU2Vuc29yKHN0ZDo6c3RyaW5nIHR5cGUsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVdpbmRvd1NlbmRhYmxlICpjb21wb25lbnQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgb3NzIDw8IHR5cGUgPDwgIlsiIDw8IGNoYW5uZWwgPDwgIl0iOworICBBZGRTZW5zb3IoIlVuZ3JvdXBlZCIsIG9zcy5zdHIoKSwgY29tcG9uZW50KTsKKyAgc3RkOjpzaGFyZWRfcHRyPExpdmVXaW5kb3dTZW5kYWJsZT4gY29tcG9uZW50X3N0bCgKKyAgICAgIGNvbXBvbmVudCwgTnVsbERlbGV0ZXI8TGl2ZVdpbmRvd1NlbmRhYmxlPigpKTsKKyAgaWYgKHN0ZDo6ZmluZChtX3NlbnNvcnMuYmVnaW4oKSwgbV9zZW5zb3JzLmVuZCgpLCBjb21wb25lbnRfc3RsKSA9PQorICAgICAgbV9zZW5zb3JzLmVuZCgpKQorICAgIG1fc2Vuc29ycy5wdXNoX2JhY2soY29tcG9uZW50X3N0bCk7Cit9CisKKy8qKgorICogTWVhbnQgZm9yIGludGVybmFsIHVzZSBpbiBvdGhlciBXUElMaWIgY2xhc3Nlcy4KKyAqLwordm9pZCBMaXZlV2luZG93OjpBZGRBY3R1YXRvcihzdGQ6OnN0cmluZyB0eXBlLCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVdpbmRvd1NlbmRhYmxlICpjb21wb25lbnQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgb3NzIDw8IHR5cGUgPDwgIlsiIDw8IGNoYW5uZWwgPDwgIl0iOworICBBZGRBY3R1YXRvcigiVW5ncm91cGVkIiwgb3NzLnN0cigpLCBzdGQ6OnNoYXJlZF9wdHI8TGl2ZVdpbmRvd1NlbmRhYmxlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LCBbXShMaXZlV2luZG93U2VuZGFibGUgKikge30pKTsKK30KKworLyoqCisgKiBNZWFudCBmb3IgaW50ZXJuYWwgdXNlIGluIG90aGVyIFdQSUxpYiBjbGFzc2VzLgorICovCit2b2lkIExpdmVXaW5kb3c6OkFkZEFjdHVhdG9yKHN0ZDo6c3RyaW5nIHR5cGUsIGludCBtb2R1bGUsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXZlV2luZG93U2VuZGFibGUgKmNvbXBvbmVudCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICBvc3MgPDwgdHlwZSA8PCAiWyIgPDwgbW9kdWxlIDw8ICIsIiA8PCBjaGFubmVsIDw8ICJdIjsKKyAgQWRkQWN0dWF0b3IoIlVuZ3JvdXBlZCIsIG9zcy5zdHIoKSwgc3RkOjpzaGFyZWRfcHRyPExpdmVXaW5kb3dTZW5kYWJsZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwgW10oTGl2ZVdpbmRvd1NlbmRhYmxlICopIHt9KSk7Cit9CisKKy8qKgorICogVGVsbCBhbGwgdGhlIHNlbnNvcnMgdG8gdXBkYXRlIChzZW5kKSB0aGVpciB2YWx1ZXMKKyAqIEFjdHVhdG9ycyBhcmUgaGFuZGxlZCB0aHJvdWdoIGNhbGxiYWNrcyBvbiB0aGVpciB2YWx1ZSBjaGFuZ2luZyBmcm9tIHRoZQorICogU21hcnREYXNoYm9hcmQgd2lkZ2V0cy4KKyAqLwordm9pZCBMaXZlV2luZG93OjpVcGRhdGVWYWx1ZXMoKSB7CisgIGZvciAoYXV0byYgZWxlbSA6IG1fc2Vuc29ycykgeworICAgIGVsZW0tPlVwZGF0ZVRhYmxlKCk7CisgIH0KK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGNhdXNlIHRoZSBzZW5zb3JzIHRvIHNlbmQgbmV3IHZhbHVlcworICogdG8gdGhlIFNtYXJ0RGFzaGJvYXJkLgorICovCit2b2lkIExpdmVXaW5kb3c6OlJ1bigpIHsKKyAgaWYgKG1fZW5hYmxlZCkgeworICAgIFVwZGF0ZVZhbHVlcygpOworICB9Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhbGwgdGhlIExpdmVXaW5kb3cgZWxlbWVudHMgdGhlIGZpcnN0IHRpbWUgd2UgZW50ZXIgTGl2ZVdpbmRvdworICogbW9kZS4gQnkgaG9sZGluZyBvZmYgY3JlYXRpbmcgdGhlIE5ldHdvcmtUYWJsZSBlbnRyaWVzLCBpdCBhbGxvd3MgdGhlbSB0byBiZQorICogcmVkZWZpbmVkIGJlZm9yZSB0aGUgZmlyc3QgdGltZSBpbiBMaXZlV2luZG93IG1vZGUuIFRoaXMgYWxsb3dzIGRlZmF1bHQKKyAqIHNlbnNvciBhbmQgYWN0dWF0b3IgdmFsdWVzIHRvIGJlIGNyZWF0ZWQgdGhhdCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgY3VzdG9tCisgKiBuYW1lcyBmcm9tIHVzZXJzIGNhbGxpbmcgYWRkQWN0dWF0b3IgYW5kIGFkZFNlbnNvci4KKyAqLwordm9pZCBMaXZlV2luZG93OjpJbml0aWFsaXplTGl2ZVdpbmRvd0NvbXBvbmVudHMoKSB7CisgIGZvciAoYXV0byYgZWxlbSA6IG1fY29tcG9uZW50cykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXZlV2luZG93U2VuZGFibGU+IGNvbXBvbmVudCA9IGVsZW0uZmlyc3Q7CisgICAgTGl2ZVdpbmRvd0NvbXBvbmVudCBjID0gZWxlbS5zZWNvbmQ7CisgICAgc3RkOjpzdHJpbmcgc3Vic3lzdGVtID0gYy5zdWJzeXN0ZW07CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGMubmFtZTsKKyAgICBtX2xpdmVXaW5kb3dUYWJsZS0+R2V0U3ViVGFibGUoc3Vic3lzdGVtKQorICAgICAgICAtPlB1dFN0cmluZygiflRZUEV+IiwgIkxXIFN1YnN5c3RlbSIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHRhYmxlKAorICAgICAgICBtX2xpdmVXaW5kb3dUYWJsZS0+R2V0U3ViVGFibGUoc3Vic3lzdGVtKS0+R2V0U3ViVGFibGUobmFtZSkpOworICAgIHRhYmxlLT5QdXRTdHJpbmcoIn5UWVBFfiIsIGNvbXBvbmVudC0+R2V0U21hcnREYXNoYm9hcmRUeXBlKCkpOworICAgIHRhYmxlLT5QdXRTdHJpbmcoIk5hbWUiLCBuYW1lKTsKKyAgICB0YWJsZS0+UHV0U3RyaW5nKCJTdWJzeXN0ZW0iLCBzdWJzeXN0ZW0pOworICAgIGNvbXBvbmVudC0+SW5pdFRhYmxlKHRhYmxlKTsKKyAgICBpZiAoYy5pc1NlbnNvcikgeworICAgICAgbV9zZW5zb3JzLnB1c2hfYmFjayhjb21wb25lbnQpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaGFyZWQvc3JjL0xpdmVXaW5kb3cvTGl2ZVdpbmRvd1N0YXR1c0xpc3RlbmVyLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9MaXZlV2luZG93L0xpdmVXaW5kb3dTdGF0dXNMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxNzk4ZAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9MaXZlV2luZG93L0xpdmVXaW5kb3dTdGF0dXNMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93U3RhdHVzTGlzdGVuZXIuaCIKKyNpbmNsdWRlICJDb21tYW5kcy9TY2hlZHVsZXIuaCIKKwordm9pZCBMaXZlV2luZG93U3RhdHVzTGlzdGVuZXI6OlZhbHVlQ2hhbmdlZChJVGFibGUgKnNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOZXcpIHt9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvUElEU291cmNlLmNwcCBiL3dwaWxpYmMvc2hhcmVkL3NyYy9QSURTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjUyMDAKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvUElEU291cmNlLmNwcApAQCAtMCwwICsxLDIxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJQSURTb3VyY2UuaCIKKworLyoqCisgKiBTZXQgd2hpY2ggcGFyYW1ldGVyIHlvdSBhcmUgdXNpbmcgYXMgYSBwcm9jZXNzIGNvbnRyb2wgdmFyaWFibGUuCisgKgorICogQHBhcmFtIHBpZFNvdXJjZSBBbiBlbnVtIHRvIHNlbGVjdCB0aGUgcGFyYW1ldGVyLgorICovCit2b2lkIFBJRFNvdXJjZTo6U2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgeworICBtX3BpZFNvdXJjZSA9IHBpZFNvdXJjZTsKK30KKworUElEU291cmNlVHlwZSBQSURTb3VyY2U6OkdldFBJRFNvdXJjZVR5cGUoKSBjb25zdCB7CisgIHJldHVybiBtX3BpZFNvdXJjZTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9SZXNvdXJjZS5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvUmVzb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOWU0NzYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NoYXJlZC9zcmMvUmVzb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSZXNvdXJjZS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkVycm9yQmFzZS5oIgorCitwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggUmVzb3VyY2U6Om1fY3JlYXRlTG9jazsKKworLyoqCisgKiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBhIG5ldyBpbnN0YW5jZSBvZiBSZXNvdXJjZS4KKyAqIEFsbG9jYXRlIGEgYm9vbCBhcnJheSBvZiB2YWx1ZXMgdGhhdCB3aWxsIGdldCBpbml0aWFsaXplZCB0byBpbmRpY2F0ZSB0aGF0IG5vCisgKiByZXNvdXJjZXMKKyAqIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LiBUaGUgaW5kaWNpZXMgb2YgdGhlIHJlc291cmNlcyBhcmUgWzAgLi4gZWxlbWVudHMgLQorICogMV0uCisgKi8KK1Jlc291cmNlOjpSZXNvdXJjZSh1aW50MzJfdCBlbGVtZW50cykgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBzeW5jKG1fY3JlYXRlTG9jayk7CisgIG1faXNBbGxvY2F0ZWQgPSBzdGQ6OnZlY3Rvcjxib29sPihlbGVtZW50cywgZmFsc2UpOworfQorCisvKioKKyAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIFJlc291cmNlIGFsbG9jYXRpb24tdHJhY2tlciAqaWYqIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gciAtLSBhZGRyZXNzIG9mIHRoZSBjYWxsZXIncyBSZXNvdXJjZSBwb2ludGVyLiBJZiAqciA9PSBudWxscHRyLCB0aGlzCisgKiAgICB3aWxsIGNvbnN0cnVjdCBhIFJlc291cmNlIGFuZCBtYWtlICpyIHBvaW50IHRvIGl0LiBJZiAqciAhPSBudWxscHRyLCBpLmUuCisgKiAgICB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIGEgUmVzb3VyY2UgaW5zdGFuY2UsIHRoaXMgd29uJ3QgZG8gYW55dGhpbmcuCisgKiBAcGFyYW0gZWxlbWVudHMgLS0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3IgdGhpcyBSZXNvdXJjZSBhbGxvY2F0b3IgdG8KKyAqICAgIHRyYWNrLCB0aGF0IGlzLCBpdCB3aWxsIGFsbG9jYXRlIHJlc291cmNlIG51bWJlcnMgaW4gdGhlIHJhbmdlCisgKiAgICBbMCAuLiBlbGVtZW50cyAtIDFdLgorICovCisvKnN0YXRpYyovIHZvaWQgUmVzb3VyY2U6OkNyZWF0ZVJlc291cmNlT2JqZWN0KHN0ZDo6dW5pcXVlX3B0cjxSZXNvdXJjZT4mIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVsZW1lbnRzKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9jcmVhdGVMb2NrKTsKKyAgaWYgKCFyKSB7CisgICAgciA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzb3VyY2U+KGVsZW1lbnRzKTsKKyAgfQorfQorCisvKioKKyAqIEFsbG9jYXRlIGEgcmVzb3VyY2UuCisgKiBXaGVuIGEgcmVzb3VyY2UgaXMgcmVxdWVzdGVkLCBtYXJrIGl0IGFsbG9jYXRlZC4gSW4gdGhpcyBjYXNlLCBhIGZyZWUKKyAqIHJlc291cmNlIHZhbHVlCisgKiB3aXRoaW4gdGhlIHJhbmdlIGlzIGxvY2F0ZWQgYW5kIHJldHVybmVkIGFmdGVyIGl0IGlzIG1hcmtlZCBhbGxvY2F0ZWQuCisgKi8KK3VpbnQzMl90IFJlc291cmNlOjpBbGxvY2F0ZShjb25zdCBzdGQ6OnN0cmluZyAmcmVzb3VyY2VEZXNjKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9hbGxvY2F0ZUxvY2spOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9pc0FsbG9jYXRlZC5zaXplKCk7IGkrKykgeworICAgIGlmICghbV9pc0FsbG9jYXRlZFtpXSkgeworICAgICAgbV9pc0FsbG9jYXRlZFtpXSA9IHRydWU7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoTm9BdmFpbGFibGVSZXNvdXJjZXMsIHJlc291cmNlRGVzYyk7CisgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBzcGVjaWZpYyByZXNvdXJjZSB2YWx1ZS4KKyAqIFRoZSB1c2VyIHJlcXVlc3RzIGEgc3BlY2lmaWMgcmVzb3VyY2UgdmFsdWUsIGkuZS4gY2hhbm5lbCBudW1iZXIgYW5kIGl0IGlzCisgKiB2ZXJpZmllZAorICogdW5hbGxvY2F0ZWQsIHRoZW4gcmV0dXJuZWQuCisgKi8KK3VpbnQzMl90IFJlc291cmNlOjpBbGxvY2F0ZSh1aW50MzJfdCBpbmRleCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlc291cmNlRGVzYykgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBzeW5jKG1fYWxsb2NhdGVMb2NrKTsKKyAgaWYgKGluZGV4ID49IG1faXNBbGxvY2F0ZWQuc2l6ZSgpKSB7CisgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgcmVzb3VyY2VEZXNjKTsKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOworICB9CisgIGlmIChtX2lzQWxsb2NhdGVkW2luZGV4XSkgeworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFJlc291cmNlQWxyZWFkeUFsbG9jYXRlZCwgcmVzb3VyY2VEZXNjKTsKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOworICB9CisgIG1faXNBbGxvY2F0ZWRbaW5kZXhdID0gdHJ1ZTsKKyAgcmV0dXJuIGluZGV4OworfQorCisvKioKKyAqIEZyZWUgYW4gYWxsb2NhdGVkIHJlc291cmNlLgorICogQWZ0ZXIgYSByZXNvdXJjZSBpcyBubyBsb25nZXIgbmVlZGVkLCBmb3IgZXhhbXBsZSBhIGRlc3RydWN0b3IgaXMgY2FsbGVkIGZvcgorICogYSBjaGFubmVsIGFzc2lnbm1lbnQKKyAqIGNsYXNzLCBGcmVlIHdpbGwgcmVsZWFzZSB0aGUgcmVzb3VyY2UgdmFsdWUgc28gaXQgY2FuIGJlIHJldXNlZCBzb21ld2hlcmUKKyAqIGVsc2UgaW4gdGhlIHByb2dyYW0uCisgKi8KK3ZvaWQgUmVzb3VyY2U6OkZyZWUodWludDMyX3QgaW5kZXgpIHsKKyAgc3RkOjp1bmlxdWVfbG9jazxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9hbGxvY2F0ZUxvY2spOworICBpZiAoaW5kZXggPT0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSByZXR1cm47CisgIGlmIChpbmRleCA+PSBtX2lzQWxsb2NhdGVkLnNpemUoKSkgeworICAgIHdwaV9zZXRXUElFcnJvcihOb3RBbGxvY2F0ZWQpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIW1faXNBbGxvY2F0ZWRbaW5kZXhdKSB7CisgICAgd3BpX3NldFdQSUVycm9yKE5vdEFsbG9jYXRlZCk7CisgICAgcmV0dXJuOworICB9CisgIG1faXNBbGxvY2F0ZWRbaW5kZXhdID0gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvUm9ib3RTdGF0ZS5jcHAgYi93cGlsaWJjL3NoYXJlZC9zcmMvUm9ib3RTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyODIwOAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9Sb2JvdFN0YXRlLmNwcApAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSAiUm9ib3RTdGF0ZS5oIgorCisjaW5jbHVkZSAiQmFzZS5oIgorCitzdGQ6OnNoYXJlZF9wdHI8Um9ib3RTdGF0ZUludGVyZmFjZT4gUm9ib3RTdGF0ZTo6aW1wbDsKKwordm9pZCBSb2JvdFN0YXRlOjpTZXRJbXBsZW1lbnRhdGlvbihSb2JvdFN0YXRlSW50ZXJmYWNlJiBpKSB7CisgIGltcGwgPSBzdGQ6OnNoYXJlZF9wdHI8Um9ib3RTdGF0ZUludGVyZmFjZT4oCisgICAgICAmaSwgTnVsbERlbGV0ZXI8Um9ib3RTdGF0ZUludGVyZmFjZT4oKSk7Cit9CisKK3ZvaWQgUm9ib3RTdGF0ZTo6U2V0SW1wbGVtZW50YXRpb24oCisgICAgc3RkOjpzaGFyZWRfcHRyPFJvYm90U3RhdGVJbnRlcmZhY2U+IGkpIHsKKyAgaW1wbCA9IGk7Cit9CisKK2Jvb2wgUm9ib3RTdGF0ZTo6SXNEaXNhYmxlZCgpIHsKKyAgaWYgKGltcGwgIT0gbnVsbHB0cikgeworICAgIHJldHVybiBpbXBsLT5Jc0Rpc2FibGVkKCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUm9ib3RTdGF0ZTo6SXNFbmFibGVkKCkgeworICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGltcGwtPklzRW5hYmxlZCgpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSb2JvdFN0YXRlOjpJc09wZXJhdG9yQ29udHJvbCgpIHsKKyAgaWYgKGltcGwgIT0gbnVsbHB0cikgeworICAgIHJldHVybiBpbXBsLT5Jc09wZXJhdG9yQ29udHJvbCgpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFJvYm90U3RhdGU6OklzQXV0b25vbW91cygpIHsKKyAgaWYgKGltcGwgIT0gbnVsbHB0cikgeworICAgIHJldHVybiBpbXBsLT5Jc0F1dG9ub21vdXMoKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUm9ib3RTdGF0ZTo6SXNUZXN0KCkgeworICBpZiAoaW1wbCAhPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGltcGwtPklzVGVzdCgpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9TbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuY3BwIGIvd3BpbGliYy9zaGFyZWQvc3JjL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3Nlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1Y2MzYQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9TbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3Nlci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEZWZhdWx0ID0gImRlZmF1bHQiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtPcHRpb25zID0gIm9wdGlvbnMiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtTZWxlY3RlZCA9ICJzZWxlY3RlZCI7CisKKy8qKgorICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMuICBPbiB0aGUge0BsaW5rIFNtYXJ0RGFzaGJvYXJkfQorICogb24gdGhlIGRlc2t0b3AsCisgKiB0aGUgb2JqZWN0IHdpbGwgYXBwZWFyIGFzIHRoZSBnaXZlbiBuYW1lLgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9wdGlvbgorICogQHBhcmFtIG9iamVjdCB0aGUgb3B0aW9uCisgKi8KK3ZvaWQgU2VuZGFibGVDaG9vc2VyOjpBZGRPYmplY3QoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHZvaWQgKm9iamVjdCkgeworICBtX2Nob2ljZXNbbmFtZV0gPSBvYmplY3Q7Cit9CisKKy8qKgorICogQWRkIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgbWFya3MgaXQgYXMgdGhlIGRlZmF1bHQuCisgKiBGdW5jdGlvbmFsbHksIHRoaXMgaXMgdmVyeSBjbG9zZSB0byB7QGxpbmsgU2VuZGFibGVDaG9vc2VyI0FkZE9iamVjdChjb25zdAorICogY2hhciAqbmFtZSwgdm9pZCAqb2JqZWN0KSBBZGRPYmplY3QoLi4uKX0KKyAqIGV4Y2VwdCB0aGF0IGl0IHdpbGwgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQgb3B0aW9uIGlmIG5vbmUgb3RoZXIgaXMKKyAqIGV4cGxpY2l0bHkgc2VsZWN0ZWQuCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uCisgKiBAcGFyYW0gb2JqZWN0IHRoZSBvcHRpb24KKyAqLwordm9pZCBTZW5kYWJsZUNob29zZXI6OkFkZERlZmF1bHQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHZvaWQgKm9iamVjdCkgeworICBtX2RlZmF1bHRDaG9pY2UgPSBuYW1lOworICBBZGRPYmplY3QobmFtZSwgb2JqZWN0KTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBvcHRpb24uICBJZiB0aGVyZSBpcyBub25lIHNlbGVjdGVkLCBpdCB3aWxsIHJldHVybiB0aGUKKyAqIGRlZmF1bHQuICBJZiB0aGVyZSBpcyBub25lIHNlbGVjdGVkCisgKiBhbmQgbm8gZGVmYXVsdCwgdGhlbiBpdCB3aWxsIHJldHVybiB7QGNvZGUgbnVsbHB0cn0uCisgKiBAcmV0dXJuIHRoZSBvcHRpb24gc2VsZWN0ZWQKKyAqLwordm9pZCAqU2VuZGFibGVDaG9vc2VyOjpHZXRTZWxlY3RlZCgpIHsKKyAgc3RkOjpzdHJpbmcgc2VsZWN0ZWQgPSBtX3RhYmxlLT5HZXRTdHJpbmcoa1NlbGVjdGVkLCBtX2RlZmF1bHRDaG9pY2UpOworICBpZiAoc2VsZWN0ZWQgPT0gIiIpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGVsc2UKKyAgICByZXR1cm4gbV9jaG9pY2VzW3NlbGVjdGVkXTsKK30KKwordm9pZCBTZW5kYWJsZUNob29zZXI6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJ0YWJsZSkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ga2V5czsKKyAgbV90YWJsZSA9IHN1YnRhYmxlOworICBpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHZvaWQgKj46Oml0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gbV9jaG9pY2VzLmJlZ2luKCk7IGl0ZXIgIT0gbV9jaG9pY2VzLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgIGtleXMucHVzaF9iYWNrKGl0ZXItPmZpcnN0KTsKKyAgICB9CisgICAgbV90YWJsZS0+UHV0VmFsdWUoa09wdGlvbnMsIG50OjpWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6bW92ZShrZXlzKSkpOworICAgIG1fdGFibGUtPlB1dFN0cmluZyhrRGVmYXVsdCwgbV9kZWZhdWx0Q2hvaWNlKTsKKyAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBTZW5kYWJsZUNob29zZXI6OkdldFRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV90YWJsZTsgfQorCitzdGQ6OnN0cmluZyBTZW5kYWJsZUNob29zZXI6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJTdHJpbmcgQ2hvb3NlciI7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NoYXJlZC9zcmMvU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuY3BwIGIvd3BpbGliYy9zaGFyZWQvc3JjL1NtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWUwYzAzCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaGFyZWQvc3JjL1NtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxMS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaCIKKworLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9OYW1lZFNlbmRhYmxlLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGUuaCIKKyNpbmNsdWRlICJITFVzYWdlUmVwb3J0aW5nLmgiCisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IFNtYXJ0RGFzaGJvYXJkOjptX3RhYmxlOworc3RkOjptYXA8c3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gLCBTZW5kYWJsZSAqPiBTbWFydERhc2hib2FyZDo6bV90YWJsZXNUb0RhdGE7CisKK3ZvaWQgU21hcnREYXNoYm9hcmQ6OmluaXQoKSB7CisgIG1fdGFibGUgPSBOZXR3b3JrVGFibGU6OkdldFRhYmxlKCJTbWFydERhc2hib2FyZCIpOworCisgIEhMVXNhZ2VSZXBvcnRpbmc6OlJlcG9ydFNtYXJ0RGFzaGJvYXJkKCk7Cit9CisKKy8qKgorICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoaXMgdGFibGUuCisgKiBUaGUga2V5IGNhbiBub3QgYmUgbnVsbHB0ci4KKyAqIFRoZSB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgdGhlIGdldCBtZXRob2Qgd2l0aCBhIGtleSB0aGF0IGlzIGVxdWFsCisgKiB0byB0aGUgb3JpZ2luYWwga2V5LgorICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICovCit2b2lkIFNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKGxsdm06OlN0cmluZ1JlZiBrZXksIFNlbmRhYmxlICpkYXRhKSB7CisgIGlmIChkYXRhID09IG51bGxwdHIpIHsKKyAgICB3cGlfc2V0R2xvYmFsV1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAidmFsdWUiKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gZGF0YVRhYmxlKG1fdGFibGUtPkdldFN1YlRhYmxlKGtleSkpOworICBkYXRhVGFibGUtPlB1dFN0cmluZygiflRZUEV+IiwgZGF0YS0+R2V0U21hcnREYXNoYm9hcmRUeXBlKCkpOworICBkYXRhLT5Jbml0VGFibGUoZGF0YVRhYmxlKTsKKyAgbV90YWJsZXNUb0RhdGFbZGF0YVRhYmxlXSA9IGRhdGE7Cit9CisKKy8qKgorICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSAod2hlcmUgdGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUge0BsaW5rCisgKiBTbWFydERhc2hib2FyZE5hbWVkRGF0YX0KKyAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhpcyB0YWJsZS4KKyAqIFRoZSB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgdGhlIGdldCBtZXRob2Qgd2l0aCBhIGtleSB0aGF0IGlzIGVxdWFsCisgKiB0byB0aGUgb3JpZ2luYWwga2V5LgorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICovCit2b2lkIFNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKE5hbWVkU2VuZGFibGUgKnZhbHVlKSB7CisgIGlmICh2YWx1ZSA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldEdsb2JhbFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgInZhbHVlIik7CisgICAgcmV0dXJuOworICB9CisgIFB1dERhdGEodmFsdWUtPkdldE5hbWUoKSwgdmFsdWUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQga2V5LgorICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQorICogQHJldHVybiB0aGUgdmFsdWUKKyAqLworU2VuZGFibGUgKlNtYXJ0RGFzaGJvYXJkOjpHZXREYXRhKGxsdm06OlN0cmluZ1JlZiBrZXkpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3VidGFibGUobV90YWJsZS0+R2V0U3ViVGFibGUoa2V5KSk7CisgIFNlbmRhYmxlICpkYXRhID0gbV90YWJsZXNUb0RhdGFbc3VidGFibGVdOworICBpZiAoZGF0YSA9PSBudWxscHRyKSB7CisgICAgd3BpX3NldEdsb2JhbFdQSUVycm9yV2l0aENvbnRleHQoU21hcnREYXNoYm9hcmRNaXNzaW5nS2V5LCBrZXkpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBkYXRhOworfQorCisvKioKKyAqIE1hcHMgdGhlIHNwZWNpZmllZCBrZXkgdG8gdGhlIHNwZWNpZmllZCBjb21wbGV4IHZhbHVlIChzdWNoIGFzIGFuIGFycmF5KSBpbgorICogdGhpcyB0YWJsZS4KKyAqIFRoZSBrZXkgY2FuIG5vdCBiZSBudWxscHRyLgorICogVGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUgUmV0cmlldmVWYWx1ZSBtZXRob2Qgd2l0aCBhIGtleQorICogdGhhdCBpcyBlcXVhbCB0byB0aGUgb3JpZ2luYWwga2V5LgorICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICovCit2b2lkIFNtYXJ0RGFzaGJvYXJkOjpQdXRWYWx1ZShsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlKSB7CisgIG1fdGFibGUtPlB1dFZhbHVlKGtleU5hbWUsIHZhbHVlKTsKK30KKworLyoqCisgKiBSZXRyaWV2ZXMgdGhlIGNvbXBsZXggdmFsdWUgKHN1Y2ggYXMgYW4gYXJyYXkpIGluIHRoaXMgdGFibGUgaW50byB0aGUgY29tcGxleAorICogZGF0YSBvYmplY3QKKyAqIFRoZSBrZXkgY2FuIG5vdCBiZSBudWxscHRyLgorICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGludG8KKyAqLworc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gU21hcnREYXNoYm9hcmQ6OkdldFZhbHVlKGxsdm06OlN0cmluZ1JlZiBrZXlOYW1lKSB7CisgIHJldHVybiBtX3RhYmxlLT5HZXRWYWx1ZShrZXlOYW1lKTsKK30KKworLyoqCisgKiBNYXBzIHRoZSBzcGVjaWZpZWQga2V5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhpcyB0YWJsZS4KKyAqIFRoZSBrZXkgY2FuIG5vdCBiZSBudWxscHRyLgorICogVGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUgZ2V0IG1ldGhvZCB3aXRoIGEga2V5IHRoYXQgaXMgZXF1YWwKKyAqIHRvIHRoZSBvcmlnaW5hbCBrZXkuCisgKiBAcGFyYW0ga2V5TmFtZSB0aGUga2V5CisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKi8KK3ZvaWQgU21hcnREYXNoYm9hcmQ6OlB1dEJvb2xlYW4obGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGJvb2wgdmFsdWUpIHsKKyAgbV90YWJsZS0+UHV0Qm9vbGVhbihrZXlOYW1lLCB2YWx1ZSk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBrZXkuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCByZXR1cm5zIHRoZQorICogZGVmYXVsdCB2YWx1ZS4KKyAqIEBwYXJhbSBrZXlOYW1lIHRoZSBrZXkKKyAqIEByZXR1cm4gdGhlIHZhbHVlCisgKi8KK2Jvb2wgU21hcnREYXNoYm9hcmQ6OkdldEJvb2xlYW4obGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGJvb2wgZGVmYXVsdFZhbHVlKSB7CisgIHJldHVybiBtX3RhYmxlLT5HZXRCb29sZWFuKGtleU5hbWUsIGRlZmF1bHRWYWx1ZSk7Cit9CisKKy8qKgorICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoaXMgdGFibGUuCisgKiBUaGUga2V5IGNhbiBub3QgYmUgbnVsbHB0ci4KKyAqIFRoZSB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgdGhlIGdldCBtZXRob2Qgd2l0aCBhIGtleSB0aGF0IGlzIGVxdWFsCisgKiB0byB0aGUgb3JpZ2luYWwga2V5LgorICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICovCit2b2lkIFNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGRvdWJsZSB2YWx1ZSkgeworICBtX3RhYmxlLT5QdXROdW1iZXIoa2V5TmFtZSwgdmFsdWUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQga2V5LiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyB0aGUKKyAqIGRlZmF1bHQgdmFsdWUuCisgKiBAcGFyYW0ga2V5TmFtZSB0aGUga2V5CisgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICovCitkb3VibGUgU21hcnREYXNoYm9hcmQ6OkdldE51bWJlcihsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgeworICByZXR1cm4gbV90YWJsZS0+R2V0TnVtYmVyKGtleU5hbWUsIGRlZmF1bHRWYWx1ZSk7Cit9CisKKy8qKgorICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoaXMgdGFibGUuCisgKiBOZWl0aGVyIHRoZSBrZXkgbm9yIHRoZSB2YWx1ZSBjYW4gYmUgbnVsbHB0ci4KKyAqIFRoZSB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgdGhlIGdldCBtZXRob2Qgd2l0aCBhIGtleSB0aGF0IGlzIGVxdWFsCisgKiB0byB0aGUgb3JpZ2luYWwga2V5LgorICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICovCit2b2lkIFNtYXJ0RGFzaGJvYXJkOjpQdXRTdHJpbmcobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGxsdm06OlN0cmluZ1JlZiB2YWx1ZSkgeworICBtX3RhYmxlLT5QdXRTdHJpbmcoa2V5TmFtZSwgdmFsdWUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQga2V5LiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyB0aGUKKyAqIGRlZmF1bHQgdmFsdWUuCisgKiBAcGFyYW0ga2V5TmFtZSB0aGUga2V5CisgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICovCitzdGQ6OnN0cmluZyBTbWFydERhc2hib2FyZDo6R2V0U3RyaW5nKGxsdm06OlN0cmluZ1JlZiBrZXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSB7CisgIHJldHVybiBtX3RhYmxlLT5HZXRTdHJpbmcoa2V5TmFtZSwgZGVmYXVsdFZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2hhcmVkL3NyYy9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuY3BwIGIvd3BpbGliYy9zaGFyZWQvc3JjL2ludGVyZmFjZXMvUG90ZW50aW9tZXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1NjA5MAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2hhcmVkL3NyYy9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGludGVyZmFjZXMvUG90ZW50aW9tZXRlci5oPgorI2luY2x1ZGUgPFV0aWxpdHkuaD4KKwordm9pZCBQb3RlbnRpb21ldGVyOjpTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7CisgIGlmICh3cGlfYXNzZXJ0KHBpZFNvdXJjZSA9PSBQSURTb3VyY2VUeXBlOjprRGlzcGxhY2VtZW50KSkgeworICAgIG1fcGlkU291cmNlID0gcGlkU291cmNlOworICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24uZ3JhZGxlIGIvd3BpbGliYy9zaW11bGF0aW9uLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDEwYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uLmdyYWRsZQpAQCAtMCwwICsxLDIzIEBACitwdWJsaXNoaW5nIHsKKyAgICBwdWJsaWNhdGlvbnMgeworICAgICAgICB3cGlsaWJjU2ltKE1hdmVuUHVibGljYXRpb24pIHsKKyAgICAgICAgICAgIGFydGlmYWN0IHdwaWxpYmNTaW1aaXAKKyAgICAgICAgICAgIGdyb3VwSWQgJ2VkdS53cGkuZmlyc3Qud3BpbGliYy5zaW11bGF0aW9uJworICAgICAgICAgICAgYXJ0aWZhY3RJZCAnV1BJTGliQ1NpbScKKyAgICAgICAgICAgIHZlcnNpb24gJzAuMS4wJworICAgICAgICB9CisgICAgfQorfQorCit0YXNrIHdwaWxpYmNTaW1aaXAodHlwZTogWmlwKSB7CisgICAgZGVzY3JpcHRpb24gJ0NyZWF0ZXMgdGhlIGluY2x1ZGUgemlwIGZpbGUgZm9yIHdwaWxpYmMnCisgICAgZ3JvdXAgJ1dQSUxpYicKKyAgICBiYXNlTmFtZSAnV1BJTGliQ1NpbScKKyAgICBkZXN0aW5hdGlvbkRpciA9IHByb2plY3QuYnVpbGREaXIKKyAgICBpbnRvICdzaW0vaW5jbHVkZScKKyAgICBmcm9tICIke3NpbXVsYXRpb259L2luY2x1ZGUiCisgICAgZnJvbSAiJHtzaGFyZWR9L2luY2x1ZGUiCisgICAgZnJvbSAnLi4vYnVpbGQvc2ltdWxhdGlvbi9nel9tc2dzL2dlbmVyYXRlZCcKKyAgICBmcm9tIG5ldFRhYmxlc0luY2x1ZGUKKyAgICBmcm9tICcuLi9oYWwvaW5jbHVkZScKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi8uZ2l0aWdub3JlIGIvd3BpbGliYy9zaW11bGF0aW9uLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzMDg5YgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorI2Rvbid0IHRyYWNrIHRoZSBnZW5lcmF0ZSBwcm90b2J1ZiBmaWxlcworaW5jbHVkZS9zaW11bGF0aW9uL21zZ3MvCitzcmMvc2ltdWxhdGlvbi9tc2dzCmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vQ01ha2VMaXN0cy50eHQgYi93cGlsaWJjL3NpbXVsYXRpb24vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0MWZkMwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYwIEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorcHJvamVjdChXUElMaWJTaW0pCisKK2lmIChXSU4zMikKKyAgI3RlbXBvcmFyeSB1bnRpbCB3ZSBidWlsZCBkbGxzCisgIGFkZF9kZWZpbml0aW9ucygtREJVSUxESU5HX1NUQVRJQ19MSUJTKQorCisgICMgWFhYOiBzaG91bGQgYmUgc2V0IHZpYSBDTWFrZSB2YXJpYWJsZXMgaW4gY29uZmlndXJlLmJhdAorICBzZXQoUFRIUkVBRF9JTkNMVURFX0RJUiAiQzovVXNlcnMvcGV0ZXIvZ3otd3MvcHRocmVhZC13MzIvaW5jbHVkZSIpCisgIHNldChQVEhSRUFEX0xJQlJBUlkgIkM6L1VzZXJzL3BldGVyL2d6LXdzL3B0aHJlYWQtdzMyL2xpYnMveDY0L3B0aHJlYWRWQzIubGliIikKK2VuZGlmKCkKKworZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChIQUxfQVBJX0lOQ0xVREVTIC4uLy4uL2hhbC9pbmNsdWRlIFJFQUxQQVRIKQorZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChOV1RfQVBJX0lOQ0xVREVTIC4uLy4uL25ldHdvcmt0YWJsZXMvY3BwL2luY2x1ZGUgUkVBTFBBVEgpCisKKworIyBhbHNvIG9uIHdpbmRvd3MgdXNlIHNwcmludGZfcyBpbnN0ZWFkIG9mIHNucHJpbnRmCisjIFRPRE86IGZpbmQgYSBtb3JlIHBlcm1lbmVuYW50IHNvbHV0aW9uCitpZiAoV0lOMzIpCisgIGFkZF9kZWZpbml0aW9ucygtRHNucHJpbnRmPXNwcmludGZfcykKK2VuZGlmKCkKKworZmlsZShHTE9CX1JFQ1VSU0UgQ09NX1NSQ19GSUxFUyAuLi93cGlsaWJDKysvc3JjLyouY3BwKQorCisKK3NldCAoSU5DTFVERV9GT0xERVJTIGluY2x1ZGUKKyAgLi4vd3BpbGliQysrL2luY2x1ZGUKKyAgLi4vLi4vbmV0d29ya3RhYmxlcy9udGNvcmUvaW5jbHVkZQorICAuLi8uLi9oYWwvaW5jbHVkZQorICAke0daX01TR1NfSU5DTFVERV9ESVJ9CisgICR7Qm9vc3RfSU5DTFVERV9ESVJ9CisgICR7R0FaRUJPX0lOQ0xVREVfRElSU30pCisKK2lmIChXSU4zMikKKyAgI3RoZXNlIHBhdGhzIHdpbGwgYmUgZml4ZWQgd2hlbiBhIG1vcmUgcGVybWVuYW50IHdpbmRvd3MgZGV2ZWxvcG1lbnQgc29sdXRpb24gaXMgZm91bmQKKyAgc2V0KElOQ0xVREVfRk9MREVSUyAke0lOQ0xVREVfRk9MREVSU30KKyAgICBDOi9Vc2Vycy9wZXRlci9nei13cy9wcm90b2J1Zi0yLjYuMC13aW42NC12YzEyL3NyYworICAgIEM6L1VzZXJzL3BldGVyL2d6LXdzL3NkZm9ybWF0L3NyYy93aW4vdGlueXhtbAorICAgIEM6L1VzZXJzL3BldGVyL2d6LXdzL0ZyZWVJbWFnZS12YzEyLXg2NC1yZWxlYXNlLWRlYnVnL1NvdXJjZQorICAgIEM6L1VzZXJzL3BldGVyL2d6LXdzL3RiYjQzXzIwMTQxMDIzb3NzL2luY2x1ZGUKKyAgICAke1BUSFJFQURfSU5DTFVERV9ESVJ9KQorZW5kaWYoKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7SU5DTFVERV9GT0xERVJTfSkKKworbGlua19kaXJlY3Rvcmllcygke0dBWkVCT19MSUJSQVJZX0RJUlN9KQorCitpZiAoV0lOMzIpCisgIGFkZF9saWJyYXJ5KFdQSUxpYlNpbSAke1NSQ19GSUxFU30gJHtDT01fU1JDX0ZJTEVTfSkKK2Vsc2UoKQorICBhZGRfbGlicmFyeShXUElMaWJTaW0gU0hBUkVEICR7U1JDX0ZJTEVTfSAke0NPTV9TUkNfRklMRVN9KQorZW5kaWYoKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoV1BJTGliU2ltIGd6X21zZ3MgbnRjb3JlICR7UFRIUkVBRF9MSUJSQVJZfSAke0Jvb3N0X0xJQlJBUklFU30gJHtHQVpFQk9fTElCUkFSSUVTfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9ICAtZlBJQykgIyBOZXR3b3JrVGFibGVzCisKK2lmIChXSU4zMikKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7cHJvamVjdH0gIFBST1BFUlRJRVMgTElOS19GTEFHUyAiL0RFQlVHIikKK2VuZGlmKCkKKworI2NvcHkgdG8gZWNsaXBzZSBwbHVnaW4KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9SRUFETUUubWQgYi93cGlsaWJjL3NpbXVsYXRpb24vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmZlZGEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMiBAQAorIyBCdWlsZGluZyBXUElMaWIgQysrIFNpbQorc2VlIHRvcCBsZXZlbCBidWlsZGluZy5tZCBmb3IgZGV0YWlscwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvQW5hbG9nSW5wdXQuaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0FuYWxvZ0lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhM2E4NQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0FuYWxvZ0lucHV0LmgKQEAgLTAsMCArMSw1NSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInNpbXVsYXRpb24vU2ltRmxvYXRJbnB1dC5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJQSURTb3VyY2UuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIEFuYWxvZyBpbnB1dCBjbGFzcy4KKyAqCisgKiBDb25uZWN0ZWQgdG8gZWFjaCBhbmFsb2cgY2hhbm5lbCBpcyBhbiBhdmVyYWdpbmcgYW5kIG92ZXJzYW1wbGluZyBlbmdpbmUuICBUaGlzIGVuZ2luZSBhY2N1bXVsYXRlcworICogdGhlIHNwZWNpZmllZCAoIGJ5IFNldEF2ZXJhZ2VCaXRzKCkgYW5kIFNldE92ZXJzYW1wbGVCaXRzKCkgKSBudW1iZXIgb2Ygc2FtcGxlcyBiZWZvcmUgcmV0dXJuaW5nIGEgbmV3CisgKiB2YWx1ZS4gIFRoaXMgaXMgbm90IGEgc2xpZGluZyB3aW5kb3cgYXZlcmFnZS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgb3ZlcnNhbXBsZWQgc2FtcGxlcyBhbmQKKyAqIHRoZSBhdmVyYWdlZCBzYW1wbGVzIGlzIHRoYXQgdGhlIG92ZXJzYW1wbGVkIHNhbXBsZXMgYXJlIHNpbXBseSBhY2N1bXVsYXRlZCBlZmZlY3RpdmVseSBpbmNyZWFzaW5nIHRoZQorICogcmVzb2x1dGlvbiwgd2hpbGUgdGhlIGF2ZXJhZ2VkIHNhbXBsZXMgYXJlIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHJldGFpbiB0aGUgcmVzb2x1dGlvbiwKKyAqIGJ1dCBnZXQgbW9yZSBzdGFibGUgdmFsdWVzLgorICovCitjbGFzcyBBbmFsb2dJbnB1dCA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUElEU291cmNlLCBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlCit7CitwdWJsaWM6CisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0FjY3VtdWxhdG9yTW9kdWxlTnVtYmVyID0gMTsKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHMgPSAyOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQWNjdW11bGF0b3JDaGFubmVsc1trQWNjdW11bGF0b3JOdW1DaGFubmVsc107CisKKwlleHBsaWNpdCBBbmFsb2dJbnB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5BbmFsb2dJbnB1dCgpID0gZGVmYXVsdDsKKworCWZsb2F0IEdldFZvbHRhZ2UoKSBjb25zdDsKKwlmbG9hdCBHZXRBdmVyYWdlVm9sdGFnZSgpIGNvbnN0OworCisJdWludDMyX3QgR2V0Q2hhbm5lbCgpIGNvbnN0OworCisJZG91YmxlIFBJREdldCgpIG92ZXJyaWRlOworCisJdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworCXZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworCXZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisJc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisJdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworCXN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisJdWludDMyX3QgbV9jaGFubmVsOworCVNpbUZsb2F0SW5wdXQqIG1faW1wbDsKKwlpbnQ2NF90IG1fYWNjdW11bGF0b3JPZmZzZXQ7CisKKwlzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0FuYWxvZ1BvdGVudGlvbWV0ZXIuaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0FuYWxvZ1BvdGVudGlvbWV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZmMzZmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvQW5hbG9nUG90ZW50aW9tZXRlci5oCkBAIC0wLDAgKzEsODUgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENsYXNzIGZvciByZWFkaW5nIGFuYWxvZyBwb3RlbnRpb21ldGVycy4gQW5hbG9nIHBvdGVudGlvbWV0ZXJzIHJlYWQKKyAqIGluIGFuIGFuYWxvZyB2b2x0YWdlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwb3NpdGlvbi4gVXN1YWxseSB0aGUKKyAqIHBvc2l0aW9uIGlzIGVpdGhlciBkZWdyZWVzIG9yIG1ldGVycy4gSG93ZXZlciwgaWYgbm8gY29udmVyc2lvbiBpcworICogZ2l2ZW4gaXQgcmVtYWlucyB2b2x0cy4KKyAqCisgKiBAYXV0aG9yIEFsZXggSGVubmluZworICovCitjbGFzcyBBbmFsb2dQb3RlbnRpb21ldGVyIDogcHVibGljIFBvdGVudGlvbWV0ZXIsIHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFuYWxvZ1BvdGVudGlvbWV0ZXIgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBVc2UgdGhlIHNjYWxpbmcgYW5kIG9mZnNldCB2YWx1ZXMgc28gdGhhdCB0aGUgb3V0cHV0IHByb2R1Y2VzCisgICAgICogbWVhbmluZ2Z1bCB2YWx1ZXMuIEkuRTogeW91IGhhdmUgYSAyNzAgZGVncmVlIHBvdGVudGlvbWV0ZXIgYW5kCisgICAgICogeW91IHdhbnQgdGhlIG91dHB1dCB0byBiZSBkZWdyZWVzIHdpdGggdGhlIGhhbGZ3YXkgcG9pbnQgYXMgMAorICAgICAqIGRlZ3JlZXMuIFRoZSBzY2FsZSB2YWx1ZSBpcyAyNzAuMChkZWdyZWVzKS81LjAodm9sdHMpIGFuZCB0aGUKKyAgICAgKiBvZmZzZXQgaXMgLTEzNS4wIHNpbmNlIHRoZSBoYWxmd2F5IHBvaW50IGFmdGVyIHNjYWxpbmcgaXMgMTM1CisgICAgICogZGVncmVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSBhbmFsb2cgY2hhbm5lbCB0aGlzIHBvdGVudGlvbWV0ZXIgaXMgcGx1Z2dlZCBpbnRvLgorICAgICAqIEBwYXJhbSBzY2FsZSBUaGUgc2NhbGluZyB0byBtdWx0aXBseSB0aGUgdm9sdGFnZSBieSB0byBnZXQgYSBtZWFuaW5nZnVsIHVuaXQuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHRvIGFkZCB0byB0aGUgc2NhbGVkIHZhbHVlIGZvciBjb250cm9sbGluZyB0aGUgemVybyB2YWx1ZQorICAgICAqLworICAgIEFuYWxvZ1BvdGVudGlvbWV0ZXIoaW50IGNoYW5uZWwsIGRvdWJsZSBzY2FsZSA9IDEuMCwgZG91YmxlIG9mZnNldCA9IDAuMCk7CisKKyAgICBBbmFsb2dQb3RlbnRpb21ldGVyKEFuYWxvZ0lucHV0ICppbnB1dCwgZG91YmxlIHNjYWxlID0gMS4wLCBkb3VibGUgb2Zmc2V0ID0gMC4wKTsKKworICAgIEFuYWxvZ1BvdGVudGlvbWV0ZXIoQW5hbG9nSW5wdXQgJmlucHV0LCBkb3VibGUgc2NhbGUgPSAxLjAsIGRvdWJsZSBvZmZzZXQgPSAwLjApOworCisgICAgdmlydHVhbCB+QW5hbG9nUG90ZW50aW9tZXRlcigpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHJlYWRpbmcgb2YgdGhlIHBvdGVudGlvbWVyZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHBvdGVudGlvbWV0ZXIuCisgICAgICovCisgICAgdmlydHVhbCBkb3VibGUgR2V0KCkgY29uc3Q7CisKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUElEU291cmNlIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcmVhZGluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKKworCisgICAgLyoKKyAgICAgKiBMaXZlIFdpbmRvdyBjb2RlLCBvbmx5IGRvZXMgYW55dGhpbmcgaWYgbGl2ZSB3aW5kb3cgaXMgYWN0aXZhdGVkLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJ0YWJsZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQW5hbG9nUG90ZW50aW9tZXRlcnMgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHdoZW4gZW50ZXJpbmcgdGhlIExpdmVXaW5kb3cuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZSB7fQorCisgICAgLyoqCisgICAgICogQW5hbG9nUG90ZW50aW9tZXRlcnMgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHdoZW4gZXhpdGluZyB0aGUgTGl2ZVdpbmRvdy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGUge30KKworcHJpdmF0ZToKKyAgICBkb3VibGUgbV9zY2FsZSwgbV9vZmZzZXQ7CisgICAgQW5hbG9nSW5wdXQqIG1fYW5hbG9nX2lucHV0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IG1fdGFibGU7CisgICAgYm9vbCBtX2luaXRfYW5hbG9nX2lucHV0OworCisgICAgLyoqCisgICAgICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCisgICAgICovCisgICAgdm9pZCBpbml0UG90KEFuYWxvZ0lucHV0ICppbnB1dCwgZG91YmxlIHNjYWxlLCBkb3VibGUgb2Zmc2V0KTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Db3VudGVyLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Db3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4ZWZjMAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0NvdW50ZXIuaApAQCAtMCwwICsxLDkzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkhBTC9IQUwuaHBwIgorI2luY2x1ZGUgIkNvdW50ZXJCYXNlLmgiCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQ2xhc3MgZm9yIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgdGlja3Mgb24gYSBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCisgKiBUaGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGNsYXNzIGZvciBjb3VudGluZyByZXBldGl0aXZlIGV2ZW50cy4gSXQgY2FuIHJldHVybiB0aGUgbnVtYmVyCisgKiBvZiBjb3VudHMsIHRoZSBwZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IGN5Y2xlLCBhbmQgZGV0ZWN0IHdoZW4gdGhlIHNpZ25hbCBiZWluZyBjb3VudGVkCisgKiBoYXMgc3RvcHBlZCBieSBzdXBwbHlpbmcgYSBtYXhpbXVtIGN5Y2xlIHRpbWUuCisgKgorICogQWxsIGNvdW50ZXJzIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgY291bnRpbmcgLSBSZXNldCgpIHRoZW0gaWYgeW91IG5lZWQgdGhlbQorICogdG8gYmUgemVyb2VkIGJlZm9yZSB1c2UuCisgKi8KK2NsYXNzIENvdW50ZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIENvdW50ZXJCYXNlLCBwdWJsaWMgTGl2ZVdpbmRvd1NlbmRhYmxlCit7CitwdWJsaWM6CisKKwlleHBsaWNpdCBDb3VudGVyKE1vZGUgbW9kZSA9IGtUd29QdWxzZSk7CisJZXhwbGljaXQgQ291bnRlcih1aW50MzJfdCBjaGFubmVsKTsKKwkvLyBUT0RPOiBbTm90IFN1cHBvcnRlZF0gZXhwbGljaXQgQ291bnRlcihEaWdpdGFsU291cmNlICpzb3VyY2UpOworCS8vIFRPRE86IFtOb3QgU3VwcG9ydGVkXSBleHBsaWNpdCBDb3VudGVyKERpZ2l0YWxTb3VyY2UgJnNvdXJjZSk7CisJLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIGV4cGxpY2l0IENvdW50ZXIoQW5hbG9nVHJpZ2dlciAqc291cmNlKTsKKwkvLyBUT0RPOiBbTm90IFN1cHBvcnRlZF0gZXhwbGljaXQgQ291bnRlcihBbmFsb2dUcmlnZ2VyICZzb3VyY2UpOworCS8vIFRPRE86IFtOb3QgU3VwcG9ydGVkXSBDb3VudGVyKEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUsIERpZ2l0YWxTb3VyY2UgKnVwU291cmNlLCBEaWdpdGFsU291cmNlICpkb3duU291cmNlLCBib29sIGludmVydGVkKTsKKwl2aXJ0dWFsIH5Db3VudGVyKCk7CisKKwl2b2lkIFNldFVwU291cmNlKHVpbnQzMl90IGNoYW5uZWwpOworCS8vIFRPRE86IFtOb3QgU3VwcG9ydGVkXSB2b2lkIFNldFVwU291cmNlKEFuYWxvZ1RyaWdnZXIgKmFuYWxvZ1RyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKTsKKwkvLyBUT0RPOiBbTm90IFN1cHBvcnRlZF0gdm9pZCBTZXRVcFNvdXJjZShBbmFsb2dUcmlnZ2VyICZhbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSk7CisJLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIHZvaWQgU2V0VXBTb3VyY2UoRGlnaXRhbFNvdXJjZSAqc291cmNlKTsKKwkvLyBUT0RPOiBbTm90IFN1cHBvcnRlZF0gdm9pZCBTZXRVcFNvdXJjZShEaWdpdGFsU291cmNlICZzb3VyY2UpOworCXZvaWQgU2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSk7CisJdm9pZCBDbGVhclVwU291cmNlKCk7CisKKwl2b2lkIFNldERvd25Tb3VyY2UodWludDMyX3QgY2hhbm5lbCk7CisJLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIHZvaWQgU2V0RG93blNvdXJjZShBbmFsb2dUcmlnZ2VyICphbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSk7CisJLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIHZvaWQgU2V0RG93blNvdXJjZShBbmFsb2dUcmlnZ2VyICZhbmFsb2dUcmlnZ2VyLCBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSk7CisJLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIHZvaWQgU2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlICpzb3VyY2UpOworCS8vIFRPRE86IFtOb3QgU3VwcG9ydGVkXSB2b2lkIFNldERvd25Tb3VyY2UoRGlnaXRhbFNvdXJjZSAmc291cmNlKTsKKwl2b2lkIFNldERvd25Tb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSk7CisJdm9pZCBDbGVhckRvd25Tb3VyY2UoKTsKKworCXZvaWQgU2V0VXBEb3duQ291bnRlck1vZGUoKTsKKwl2b2lkIFNldEV4dGVybmFsRGlyZWN0aW9uTW9kZSgpOworCXZvaWQgU2V0U2VtaVBlcmlvZE1vZGUoYm9vbCBoaWdoU2VtaVBlcmlvZCk7CisJdm9pZCBTZXRQdWxzZUxlbmd0aE1vZGUoZmxvYXQgdGhyZXNob2xkKTsKKworCXZvaWQgU2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pOworCisJLy8gQ291bnRlckJhc2UgaW50ZXJmYWNlCisJaW50MzJfdCBHZXQoKSBjb25zdCBvdmVycmlkZTsKKwl2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7CisJZG91YmxlIEdldFBlcmlvZCgpIGNvbnN0IG92ZXJyaWRlOworCXZvaWQgU2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpIG92ZXJyaWRlOworCXZvaWQgU2V0VXBkYXRlV2hlbkVtcHR5KGJvb2wgZW5hYmxlZCk7CisJYm9vbCBHZXRTdG9wcGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisJYm9vbCBHZXREaXJlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKworCXZvaWQgU2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSk7CisJaW50IEdldFNhbXBsZXNUb0F2ZXJhZ2UoKSBjb25zdDsKKwl1aW50MzJfdCBHZXRGUEdBSW5kZXgoKSBjb25zdAorCXsKKwkJcmV0dXJuIG1faW5kZXg7CisJfQorCisJdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworCXZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworCXZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisJdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKwl2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgb3ZlcnJpZGU7CisJc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKK3Byb3RlY3RlZDoKKwkvLyBUT0RPOiBbTm90IFN1cHBvcnRlZF0gRGlnaXRhbFNvdXJjZSAqbV91cFNvdXJjZTsJCS8vLzwgV2hhdCBtYWtlcyB0aGUgY291bnRlciBjb3VudCB1cC4KKwkvLyBUT0RPOiBbTm90IFN1cHBvcnRlZF0gRGlnaXRhbFNvdXJjZSAqbV9kb3duU291cmNlOwkvLy88IFdoYXQgbWFrZXMgdGhlIGNvdW50ZXIgY291bnQgZG93bi4KKwl2b2lkKiBtX2NvdW50ZXI7CQkJCS8vLzwgVGhlIEZQR0EgY291bnRlciBvYmplY3QuCitwcml2YXRlOgorCisJYm9vbCBtX2FsbG9jYXRlZFVwU291cmNlOwkJLy8vPCBXYXMgdGhlIHVwU291cmNlIGFsbG9jYXRlZCBsb2NhbGx5PworCWJvb2wgbV9hbGxvY2F0ZWREb3duU291cmNlOwkvLy88IFdhcyB0aGUgZG93blNvdXJjZSBhbGxvY2F0ZWQgbG9jYWxseT8KKwl1aW50MzJfdCBtX2luZGV4OwkJCQkJLy8vPCBUaGUgaW5kZXggb2YgdGhpcyBjb3VudGVyLgorCisJc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Db3VudGVyQmFzZS5oIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvQ291bnRlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzUyYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvQ291bnRlckJhc2UuaApAQCAtMCwwICsxLDMzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgdGlja3Mgb24gYSBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCisgKiBFbmNvZGVycywgR2VhciB0b290aCBzZW5zb3JzLCBhbmQgY291bnRlcnMgc2hvdWxkIGFsbCBzdWJjbGFzcyB0aGlzIHNvIGl0IGNhbiBiZSB1c2VkIHRvCisgKiBidWlsZCBtb3JlIGFkdmFuY2VkIGNsYXNzZXMgZm9yIGNvbnRyb2wgYW5kIGRyaXZpbmcuCisgKgorICogQWxsIGNvdW50ZXJzIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgY291bnRpbmcgLSBSZXNldCgpIHRoZW0gaWYgeW91IG5lZWQgdGhlbQorICogdG8gYmUgemVyb2VkIGJlZm9yZSB1c2UuCisgKi8KK2NsYXNzIENvdW50ZXJCYXNlCit7CitwdWJsaWM6CisJZW51bSBFbmNvZGluZ1R5cGUKKwl7CisJCWsxWCwKKwkJazJYLAorCQlrNFgKKwl9OworCisJdmlydHVhbCB+Q291bnRlckJhc2UoKSA9IGRlZmF1bHQ7CisJdmlydHVhbCBpbnQzMl90IEdldCgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7CisJdmlydHVhbCBkb3VibGUgR2V0UGVyaW9kKCkgY29uc3QgPSAwOworCXZpcnR1YWwgdm9pZCBTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgPSAwOworCXZpcnR1YWwgYm9vbCBHZXRTdG9wcGVkKCkgY29uc3QgPSAwOworCXZpcnR1YWwgYm9vbCBHZXREaXJlY3Rpb24oKSBjb25zdCA9IDA7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvRGlnaXRhbElucHV0LmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9EaWdpdGFsSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDgyZTljCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvRGlnaXRhbElucHV0LmgKQEAgLTAsMCArMSw0MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzaW11bGF0aW9uL1NpbURpZ2l0YWxJbnB1dC5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQ2xhc3MgdG8gcmVhZCBhIGRpZ2l0YWwgaW5wdXQuCisgKiBUaGlzIGNsYXNzIHdpbGwgcmVhZCBkaWdpdGFsIGlucHV0cyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9uIHRoZSBjaGFubmVsLiBPdGhlciBkZXZpY2VzCisgKiBzdWNoIGFzIGVuY29kZXJzLCBnZWFyIHRvb3RoIHNlbnNvcnMsIGV0Yy4gdGhhdCBhcmUgaW1wbGVtZW50ZWQgZWxzZXdoZXJlIHdpbGwgYXV0b21hdGljYWxseQorICogYWxsb2NhdGUgZGlnaXRhbCBpbnB1dHMgYW5kIG91dHB1dHMgYXMgcmVxdWlyZWQuIFRoaXMgY2xhc3MgaXMgb25seSBmb3IgZGV2aWNlcyBsaWtlIHN3aXRjaGVzCisgKiBldGMuIHRoYXQgYXJlbid0IGltcGxlbWVudGVkIGFueXdoZXJlIGVsc2UuCisgKi8KK2NsYXNzIERpZ2l0YWxJbnB1dCA6IHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUgeworcHVibGljOgorCWV4cGxpY2l0IERpZ2l0YWxJbnB1dCh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5EaWdpdGFsSW5wdXQoKSA9IGRlZmF1bHQ7CisJdWludDMyX3QgR2V0KCkgY29uc3Q7CisJdWludDMyX3QgR2V0Q2hhbm5lbCgpIGNvbnN0OworCisJdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworCXZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworCXZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisJc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisJdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworCXN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisJdWludDMyX3QgbV9jaGFubmVsOworCWJvb2wgbV9sYXN0VmFsdWU7CisJU2ltRGlnaXRhbElucHV0ICptX2ltcGw7CisKKwlzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0RvdWJsZVNvbGVub2lkLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Eb3VibGVTb2xlbm9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMmE0MzkKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Eb3VibGVTb2xlbm9pZC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2ltdWxhdGlvbi9TaW1Db250aW51b3VzT3V0cHV0LmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaCIKKyNpbmNsdWRlICJ0YWJsZXMvSVRhYmxlTGlzdGVuZXIuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworLyoqCisgKiBEb3VibGVTb2xlbm9pZCBjbGFzcyBmb3IgcnVubmluZyAyIGNoYW5uZWxzIG9mIGhpZ2ggdm9sdGFnZSBEaWdpdGFsIE91dHB1dAorICogKFBDTSkuCisgKgorICogVGhlIERvdWJsZVNvbGVub2lkIGNsYXNzIGlzIHR5cGljYWxseSB1c2VkIGZvciBwbmV1bWF0aWNzIHNvbGVub2lkcyB0aGF0CisgKiBoYXZlIHR3byBwb3NpdGlvbnMgY29udHJvbGxlZCBieSB0d28gc2VwYXJhdGUgY2hhbm5lbHMuCisgKi8KK2NsYXNzIERvdWJsZVNvbGVub2lkIDogcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSwgcHVibGljIElUYWJsZUxpc3RlbmVyCit7CitwdWJsaWM6CisJZW51bSBWYWx1ZQorCXsKKwkJa09mZiwKKwkJa0ZvcndhcmQsCisJCWtSZXZlcnNlCisJfTsKKworCWV4cGxpY2l0IERvdWJsZVNvbGVub2lkKHVpbnQzMl90IGZvcndhcmRDaGFubmVsLCB1aW50MzJfdCByZXZlcnNlQ2hhbm5lbCk7CisJRG91YmxlU29sZW5vaWQodWludDhfdCBtb2R1bGVOdW1iZXIsIHVpbnQzMl90IGZvcndhcmRDaGFubmVsLCB1aW50MzJfdCByZXZlcnNlQ2hhbm5lbCk7CisJdmlydHVhbCB+RG91YmxlU29sZW5vaWQoKTsKKwl2aXJ0dWFsIHZvaWQgU2V0KFZhbHVlIHZhbHVlKTsKKwl2aXJ0dWFsIFZhbHVlIEdldCgpIGNvbnN0OworCisJdm9pZCBWYWx1ZUNoYW5nZWQoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSBvdmVycmlkZTsKKwl2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisJdm9pZCBTdGFydExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisJdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKwlzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKwl2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgb3ZlcnJpZGU7CisJc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBTaW1Db250aW51b3VzT3V0cHV0KiBtX2ltcGw7CisgICAgVmFsdWUgbV92YWx1ZTsKKyAgICBib29sIG1fcmV2ZXJzZWQ7CisKKwlzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0RyaXZlclN0YXRpb24uaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0RyaXZlclN0YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU5ODVjCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvRHJpdmVyU3RhdGlvbi5oCkBAIC0wLDAgKzEsMTEyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlJvYm90U3RhdGUuaCIKKyNpbmNsdWRlICJIQUwvSEFMLmhwcCIKKyNpbmNsdWRlICJIQUwvY3BwL1NlbWFwaG9yZS5ocHAiCisjaW5jbHVkZSAiSEFML2NwcC9wcmlvcml0eV9tdXRleC5oIgorI2luY2x1ZGUgIkhBTC9jcHAvcHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlLmgiCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorCitzdHJ1Y3QgSEFMQ29udHJvbFdvcmQ7CitjbGFzcyBBbmFsb2dJbnB1dDsKKworLyoqCisgKiBQcm92aWRlIGFjY2VzcyB0byB0aGUgbmV0d29yayBjb21tdW5pY2F0aW9uIGRhdGEgdG8gLyBmcm9tIHRoZSBEcml2ZXIKKyAqIFN0YXRpb24uCisgKi8KK2NsYXNzIERyaXZlclN0YXRpb24gOiBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIFJvYm90U3RhdGVJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgZW51bSBBbGxpYW5jZSB7IGtSZWQsIGtCbHVlLCBrSW52YWxpZCB9OworCisgIHZpcnR1YWwgfkRyaXZlclN0YXRpb24oKTsKKyAgc3RhdGljIERyaXZlclN0YXRpb24gJkdldEluc3RhbmNlKCk7CisgIHN0YXRpYyB2b2lkIFJlcG9ydEVycm9yKHN0ZDo6c3RyaW5nIGVycm9yKTsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0pveXN0aWNrUG9ydHMgPSA2OworCisgIGZsb2F0IEdldFN0aWNrQXhpcyh1aW50MzJfdCBzdGljaywgdWludDMyX3QgYXhpcyk7CisgIGludCBHZXRTdGlja1BPVih1aW50MzJfdCBzdGljaywgdWludDMyX3QgcG92KTsKKyAgdWludDMyX3QgR2V0U3RpY2tCdXR0b25zKHVpbnQzMl90IHN0aWNrKSBjb25zdDsKKyAgYm9vbCBHZXRTdGlja0J1dHRvbih1aW50MzJfdCBzdGljaywgdWludDhfdCBidXR0b24pOworCisgIGludCBHZXRTdGlja0F4aXNDb3VudCh1aW50MzJfdCBzdGljaykgY29uc3Q7CisgIGludCBHZXRTdGlja1BPVkNvdW50KHVpbnQzMl90IHN0aWNrKSBjb25zdDsKKyAgaW50IEdldFN0aWNrQnV0dG9uQ291bnQodWludDMyX3Qgc3RpY2spIGNvbnN0OworCisgIGJvb2wgR2V0Sm95c3RpY2tJc1hib3godWludDMyX3Qgc3RpY2spIGNvbnN0OworICBpbnQgR2V0Sm95c3RpY2tUeXBlKHVpbnQzMl90IHN0aWNrKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgR2V0Sm95c3RpY2tOYW1lKHVpbnQzMl90IHN0aWNrKSBjb25zdDsKKyAgaW50IEdldEpveXN0aWNrQXhpc1R5cGUodWludDMyX3Qgc3RpY2ssIHVpbnQ4X3QgYXhpcykgY29uc3Q7CisKKyAgYm9vbCBJc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBJc0Rpc2FibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgSXNBdXRvbm9tb3VzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgSXNPcGVyYXRvckNvbnRyb2woKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBJc1Rlc3QoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBJc0RTQXR0YWNoZWQoKSBjb25zdDsKKyAgYm9vbCBJc05ld0NvbnRyb2xEYXRhKCkgY29uc3Q7CisgIGJvb2wgSXNGTVNBdHRhY2hlZCgpIGNvbnN0OworICBib29sIElzU3lzQWN0aXZlKCkgY29uc3Q7CisgIGJvb2wgSXNTeXNCcm93bmVkT3V0KCkgY29uc3Q7CisKKyAgQWxsaWFuY2UgR2V0QWxsaWFuY2UoKSBjb25zdDsKKyAgdWludDMyX3QgR2V0TG9jYXRpb24oKSBjb25zdDsKKyAgdm9pZCBXYWl0Rm9yRGF0YSgpOworICBkb3VibGUgR2V0TWF0Y2hUaW1lKCkgY29uc3Q7CisgIGZsb2F0IEdldEJhdHRlcnlWb2x0YWdlKCkgY29uc3Q7CisKKyAgLyoqIE9ubHkgdG8gYmUgdXNlZCB0byB0ZWxsIHRoZSBEcml2ZXIgU3RhdGlvbiB3aGF0IGNvZGUgeW91IGNsYWltIHRvIGJlCisgICAqIGV4ZWN1dGluZworICAgKiAgIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkKKyAgICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIGRpc2FibGVkIGNvZGU7IGlmIGZhbHNlLCBsZWF2aW5nIGRpc2FibGVkCisgICAqIGNvZGUgKi8KKyAgdm9pZCBJbkRpc2FibGVkKGJvb2wgZW50ZXJpbmcpIHsgbV91c2VySW5EaXNhYmxlZCA9IGVudGVyaW5nOyB9CisgIC8qKiBPbmx5IHRvIGJlIHVzZWQgdG8gdGVsbCB0aGUgRHJpdmVyIFN0YXRpb24gd2hhdCBjb2RlIHlvdSBjbGFpbSB0byBiZQorICAgKiBleGVjdXRpbmcKKyAgICogICBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5CisgICAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyBhdXRvbm9tb3VzIGNvZGU7IGlmIGZhbHNlLCBsZWF2aW5nCisgICAqIGF1dG9ub21vdXMgY29kZSAqLworICB2b2lkIEluQXV0b25vbW91cyhib29sIGVudGVyaW5nKSB7IG1fdXNlckluQXV0b25vbW91cyA9IGVudGVyaW5nOyB9CisgIC8qKiBPbmx5IHRvIGJlIHVzZWQgdG8gdGVsbCB0aGUgRHJpdmVyIFN0YXRpb24gd2hhdCBjb2RlIHlvdSBjbGFpbSB0byBiZQorICAgKiBleGVjdXRpbmcKKyAgICogICBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5CisgICAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyB0ZWxlb3AgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgdGVsZW9wCisgICAqIGNvZGUgKi8KKyAgdm9pZCBJbk9wZXJhdG9yQ29udHJvbChib29sIGVudGVyaW5nKSB7IG1fdXNlckluVGVsZW9wID0gZW50ZXJpbmc7IH0KKyAgLyoqIE9ubHkgdG8gYmUgdXNlZCB0byB0ZWxsIHRoZSBEcml2ZXIgU3RhdGlvbiB3aGF0IGNvZGUgeW91IGNsYWltIHRvIGJlCisgICAqIGV4ZWN1dGluZworICAgKiAgIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkKKyAgICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIHRlc3QgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgdGVzdCBjb2RlICovCisgIHZvaWQgSW5UZXN0KGJvb2wgZW50ZXJpbmcpIHsgbV91c2VySW5UZXN0ID0gZW50ZXJpbmc7IH0KKworIHByb3RlY3RlZDoKKyAgRHJpdmVyU3RhdGlvbigpOworCisgIHZvaWQgR2V0RGF0YSgpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIERyaXZlclN0YXRpb24gKm1faW5zdGFuY2U7CisgIHZvaWQgUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcihzdGQ6OnN0cmluZyBtZXNzYWdlKTsKKyAgdm9pZCBSdW4oKTsKKworICBIQUxKb3lzdGlja0F4ZXMgbV9qb3lzdGlja0F4ZXNba0pveXN0aWNrUG9ydHNdOworICBIQUxKb3lzdGlja1BPVnMgbV9qb3lzdGlja1BPVnNba0pveXN0aWNrUG9ydHNdOworICBIQUxKb3lzdGlja0J1dHRvbnMgbV9qb3lzdGlja0J1dHRvbnNba0pveXN0aWNrUG9ydHNdOworICBIQUxKb3lzdGlja0Rlc2NyaXB0b3IgbV9qb3lzdGlja0Rlc2NyaXB0b3Jba0pveXN0aWNrUG9ydHNdOworICBtdXRhYmxlIFNlbWFwaG9yZSBtX25ld0NvbnRyb2xEYXRhe1NlbWFwaG9yZTo6a0VtcHR5fTsKKyAgbXV0YWJsZSBwcmlvcml0eV9jb25kaXRpb25fdmFyaWFibGUgbV9wYWNrZXREYXRhQXZhaWxhYmxlQ29uZDsKKyAgcHJpb3JpdHlfbXV0ZXggbV9wYWNrZXREYXRhQXZhaWxhYmxlTXV0ZXg7CisgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSBtX3dhaXRGb3JEYXRhQ29uZDsKKyAgcHJpb3JpdHlfbXV0ZXggbV93YWl0Rm9yRGF0YU11dGV4OworICBib29sIG1fdXNlckluRGlzYWJsZWQgPSBmYWxzZTsKKyAgYm9vbCBtX3VzZXJJbkF1dG9ub21vdXMgPSBmYWxzZTsKKyAgYm9vbCBtX3VzZXJJblRlbGVvcCA9IGZhbHNlOworICBib29sIG1fdXNlckluVGVzdCA9IGZhbHNlOworICBkb3VibGUgbV9uZXh0TWVzc2FnZVRpbWUgPSAwOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0VuY29kZXIuaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWIxYjNhCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvRW5jb2Rlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAic2ltdWxhdGlvbi9TaW1FbmNvZGVyLmgiCisjaW5jbHVkZSAiQ291bnRlckJhc2UuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAiQ291bnRlci5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQ2xhc3MgdG8gcmVhZCBxdWFkIGVuY29kZXJzLgorICogUXVhZHJhdHVyZSBlbmNvZGVycyBhcmUgZGV2aWNlcyB0aGF0IGNvdW50IHNoYWZ0IHJvdGF0aW9uIGFuZCBjYW4gc2Vuc2UgZGlyZWN0aW9uLiBUaGUgb3V0cHV0IG9mCisgKiB0aGUgUXVhZEVuY29kZXIgY2xhc3MgaXMgYW4gaW50ZWdlciB0aGF0IGNhbiBjb3VudCBlaXRoZXIgdXAgb3IgZG93biwgYW5kIGNhbiBnbyBuZWdhdGl2ZSBmb3IKKyAqIHJldmVyc2UgZGlyZWN0aW9uIGNvdW50aW5nLiBXaGVuIGNyZWF0aW5nIFF1YWRFbmNvZGVycywgYSBkaXJlY3Rpb24gaXMgc3VwcGxpZWQgdGhhdCBjaGFuZ2VzIHRoZQorICogc2Vuc2Ugb2YgdGhlIG91dHB1dCB0byBtYWtlIGNvZGUgbW9yZSByZWFkYWJsZSBpZiB0aGUgZW5jb2RlciBpcyBtb3VudGVkIHN1Y2ggdGhhdCBmb3J3YXJkIG1vdmVtZW50CisgKiBnZW5lcmF0ZXMgbmVnYXRpdmUgdmFsdWVzLiBRdWFkcmF0dXJlIGVuY29kZXJzIGhhdmUgdHdvIGRpZ2l0YWwgb3V0cHV0cywgYW4gQSBDaGFubmVsIGFuZCBhIEIgQ2hhbm5lbAorICogdGhhdCBhcmUgb3V0IG9mIHBoYXNlIHdpdGggZWFjaCBvdGhlciB0byBhbGxvdyB0aGUgRlBHQSB0byBkbyBkaXJlY3Rpb24gc2Vuc2luZy4KKyAqCisgKiBBbGwgZW5jb2RlcnMgd2lsbCBpbW1lZGlhdGVseSBzdGFydCBjb3VudGluZyAtIFJlc2V0KCkgdGhlbSBpZiB5b3UgbmVlZCB0aGVtCisgKiB0byBiZSB6ZXJvZWQgYmVmb3JlIHVzZS4KKyAqLworY2xhc3MgRW5jb2RlciA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgQ291bnRlckJhc2UsIHB1YmxpYyBQSURTb3VyY2UsIHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUKK3sKK3B1YmxpYzoKKworCUVuY29kZXIodWludDMyX3QgYUNoYW5uZWwsIHVpbnQzMl90IGJDaGFubmVsLCBib29sIHJldmVyc2VEaXJlY3Rpb24gPSBmYWxzZSwKKwkJCUVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUgPSBrNFgpOworCS8vIFRPRE86IFtOb3QgU3VwcG9ydGVkXSBFbmNvZGVyKERpZ2l0YWxTb3VyY2UgKmFTb3VyY2UsIERpZ2l0YWxTb3VyY2UgKmJTb3VyY2UsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbj1mYWxzZSwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSA9IGs0WCk7CisJLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIEVuY29kZXIoRGlnaXRhbFNvdXJjZSAmYVNvdXJjZSwgRGlnaXRhbFNvdXJjZSAmYlNvdXJjZSwgYm9vbCByZXZlcnNlRGlyZWN0aW9uPWZhbHNlLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlID0gazRYKTsKKwl2aXJ0dWFsIH5FbmNvZGVyKCkgPSBkZWZhdWx0OworCisJLy8gQ291bnRlckJhc2UgaW50ZXJmYWNlCisJaW50MzJfdCBHZXQoKSBjb25zdCBvdmVycmlkZTsKKwlpbnQzMl90IEdldFJhdygpIGNvbnN0OworCWludDMyX3QgR2V0RW5jb2RpbmdTY2FsZSgpIGNvbnN0OworCXZvaWQgUmVzZXQoKSBvdmVycmlkZTsKKwlkb3VibGUgR2V0UGVyaW9kKCkgY29uc3Qgb3ZlcnJpZGU7CisJdm9pZCBTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgb3ZlcnJpZGU7CisJYm9vbCBHZXRTdG9wcGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisJYm9vbCBHZXREaXJlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKworCWRvdWJsZSBHZXREaXN0YW5jZSgpIGNvbnN0OworCWRvdWJsZSBHZXRSYXRlKCkgY29uc3Q7CisJdm9pZCBTZXRNaW5SYXRlKGRvdWJsZSBtaW5SYXRlKTsKKwl2b2lkIFNldERpc3RhbmNlUGVyUHVsc2UoZG91YmxlIGRpc3RhbmNlUGVyUHVsc2UpOworCXZvaWQgU2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pOworCXZvaWQgU2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSk7CisJaW50IEdldFNhbXBsZXNUb0F2ZXJhZ2UoKSBjb25zdDsKKwl2b2lkIFNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpOworCWRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKKworCXZvaWQgVXBkYXRlVGFibGUoKSBvdmVycmlkZTsKKwl2b2lkIFN0YXJ0TGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKwl2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworCXN0ZDo6c3RyaW5nIEdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworCXZvaWQgSW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSBvdmVycmlkZTsKKwlzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHZXRUYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworCisJaW50MzJfdCBGUEdBRW5jb2RlckluZGV4KCkgY29uc3QKKwl7CisJCXJldHVybiAwOworCX0KKworcHJpdmF0ZToKKwl2b2lkIEluaXRFbmNvZGVyKGludCBjaGFubmVsQSwgaW50IGNoYW5uZWxCLCBib29sIF9yZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKTsKKwlkb3VibGUgRGVjb2RpbmdTY2FsZUZhY3RvcigpIGNvbnN0OworCisJLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIERpZ2l0YWxTb3VyY2UgKm1fYVNvdXJjZTsJCS8vIHRoZSBBIHBoYXNlIG9mIHRoZSBxdWFkIGVuY29kZXIKKwkvLyBUT0RPOiBbTm90IFN1cHBvcnRlZF0gRGlnaXRhbFNvdXJjZSAqbV9iU291cmNlOwkJLy8gdGhlIEIgcGhhc2Ugb2YgdGhlIHF1YWQgZW5jb2RlcgorICAgIC8vIFRPRE86IFtOb3QgU3VwcG9ydGVkXSBib29sIG1fYWxsb2NhdGVkQVNvdXJjZTsJCS8vIHdhcyB0aGUgQSBzb3VyY2UgYWxsb2NhdGVkIGxvY2FsbHk/CisgICAgLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIGJvb2wgbV9hbGxvY2F0ZWRCU291cmNlOwkJLy8gd2FzIHRoZSBCIHNvdXJjZSBhbGxvY2F0ZWQgbG9jYWxseT8KKwlpbnQgY2hhbm5lbEEsIGNoYW5uZWxCOworCWRvdWJsZSBtX2Rpc3RhbmNlUGVyUHVsc2U7CQkvLyBkaXN0YW5jZSBvZiB0cmF2ZWwgZm9yIGVhY2ggZW5jb2RlciB0aWNrCisJRW5jb2RpbmdUeXBlIG1fZW5jb2RpbmdUeXBlOwkvLyBFbmNvZGluZyB0eXBlCisJaW50MzJfdCBtX2VuY29kaW5nU2NhbGU7CQkvLyAxeCwgMngsIG9yIDR4LCBwZXIgdGhlIGVuY29kaW5nVHlwZQorCWJvb2wgbV9yZXZlcnNlRGlyZWN0aW9uOworCVNpbUVuY29kZXIqIGltcGw7CisKKwlzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0d5cm8uaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0d5cm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTRlNDBhCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvR3lyby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisjaW5jbHVkZSAic2ltdWxhdGlvbi9TaW1HeXJvLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK2NsYXNzIEFuYWxvZ0lucHV0OworY2xhc3MgQW5hbG9nTW9kdWxlOworCisvKioKKyAqIFVzZSBhIHJhdGUgZ3lybyB0byByZXR1cm4gdGhlIHJvYm90cyBoZWFkaW5nIHJlbGF0aXZlIHRvIGEgc3RhcnRpbmcgcG9zaXRpb24uCisgKiBUaGUgR3lybyBjbGFzcyB0cmFja3MgdGhlIHJvYm90cyBoZWFkaW5nIGJhc2VkIG9uIHRoZSBzdGFydGluZyBwb3NpdGlvbi4gQXMgdGhlIHJvYm90CisgKiByb3RhdGVzIHRoZSBuZXcgaGVhZGluZyBpcyBjb21wdXRlZCBieSBpbnRlZ3JhdGluZyB0aGUgcmF0ZSBvZiByb3RhdGlvbiByZXR1cm5lZAorICogYnkgdGhlIHNlbnNvci4gV2hlbiB0aGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkLCBpdCBkb2VzIGEgc2hvcnQgY2FsaWJyYXRpb24gcm91dGluZQorICogd2hlcmUgaXQgc2FtcGxlcyB0aGUgZ3lybyB3aGlsZSBhdCByZXN0IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBvZmZzZXQuIFRoaXMgaXMKKyAqIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIHNhbXBsZSB0byBkZXRlcm1pbmUgdGhlIGhlYWRpbmcuIFRoaXMgZ3lybyBjbGFzcyBtdXN0IGJlIHVzZWQKKyAqIHdpdGggYSBjaGFubmVsIHRoYXQgaXMgYXNzaWduZWQgb25lIG9mIHRoZSBBbmFsb2cgYWNjdW11bGF0b3JzIGZyb20gdGhlIEZQR0EuIFNlZQorICogQW5hbG9nSW5wdXQgZm9yIHRoZSBjdXJyZW50IGFjY3VtdWxhdG9yIGFzc2lnbm1lbnRzLgorICovCitjbGFzcyBHeXJvIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBQSURTb3VyY2UsIHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUKK3sKK3B1YmxpYzoKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qga092ZXJzYW1wbGVCaXRzOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBrQXZlcmFnZUJpdHM7CisJc3RhdGljIGNvbnN0IGZsb2F0IGtTYW1wbGVzUGVyU2Vjb25kOworCXN0YXRpYyBjb25zdCBmbG9hdCBrQ2FsaWJyYXRpb25TYW1wbGVUaW1lOworCXN0YXRpYyBjb25zdCBmbG9hdCBrRGVmYXVsdFZvbHRzUGVyRGVncmVlUGVyU2Vjb25kOworCisJZXhwbGljaXQgR3lybyh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5HeXJvKCkgPSBkZWZhdWx0OworCXZpcnR1YWwgZmxvYXQgR2V0QW5nbGUoKSBjb25zdDsKKwl2aXJ0dWFsIGRvdWJsZSBHZXRSYXRlKCkgY29uc3Q7CisJdmlydHVhbCB2b2lkIFJlc2V0KCk7CisKKwkvLyBQSURTb3VyY2UgaW50ZXJmYWNlCisJdm9pZCBTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSBvdmVycmlkZTsKKwlkb3VibGUgUElER2V0KCkgb3ZlcnJpZGU7CisKKwl2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisJdm9pZCBTdGFydExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisJdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKwlzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKwl2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgb3ZlcnJpZGU7CisJc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKwl2b2lkIEluaXRHeXJvKGludCBjaGFubmVsKTsKKworCVNpbUd5cm8qIGltcGw7CisKKwlzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0l0ZXJhdGl2ZVJvYm90LmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9JdGVyYXRpdmVSb2JvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTEwNGQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9JdGVyYXRpdmVSb2JvdC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJSb2JvdEJhc2UuaCIKKworLyoqCisgKiBJdGVyYXRpdmVSb2JvdCBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgdHlwZSBvZiBSb2JvdCBQcm9ncmFtIGZyYW1ld29yaywgZXh0ZW5kaW5nIHRoZSBSb2JvdEJhc2UgY2xhc3MuCisgKgorICogVGhlIEl0ZXJhdGl2ZVJvYm90IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgYSB1c2VyIGNyZWF0aW5nIGEgcm9ib3QgcHJvZ3JhbS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGltcGxlbWVudCB0aGUgIm9sZCBzdHlsZSIgZGVmYXVsdCBjb2RlLCBieSBwcm92aWRpbmcKKyAqIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgYnkgdGhlIG1haW4gbG9vcCwgU3RhcnRDb21wZXRpdGlvbigpLCBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZXM6CisgKgorICogUm9ib3RJbml0KCkgLS0gcHJvdmlkZSBmb3IgaW5pdGlhbGl6YXRpb24gYXQgcm9ib3QgcG93ZXItb24KKyAqCisgKiBJbml0KCkgZnVuY3Rpb25zIC0tIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaXMgY2FsbGVkIG9uY2Ugd2hlbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgbW9kZSBpcyBlbnRlcmVkOgorICogIC0gRGlzYWJsZWRJbml0KCkgICAtLSBjYWxsZWQgb25seSB3aGVuIGZpcnN0IGRpc2FibGVkCisgKiAgLSBBdXRvbm9tb3VzSW5pdCgpIC0tIGNhbGxlZCBlYWNoIGFuZCBldmVyeSB0aW1lIGF1dG9ub21vdXMgaXMgZW50ZXJlZCBmcm9tIGFub3RoZXIgbW9kZQorICogIC0gVGVsZW9wSW5pdCgpICAgICAtLSBjYWxsZWQgZWFjaCBhbmQgZXZlcnkgdGltZSB0ZWxlb3AgaXMgZW50ZXJlZCBmcm9tIGFub3RoZXIgbW9kZQorICogIC0gVGVzdEluaXQoKSAgICAgICAtLSBjYWxsZWQgZWFjaCBhbmQgZXZlcnkgdGltZSB0ZXN0IGlzIGVudGVyZWQgZnJvbSBhbm90aGVyIG1vZGUKKyAqCisgKiBQZXJpb2RpYygpIGZ1bmN0aW9ucyAtLSBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBjYWxsZWQgaXRlcmF0aXZlbHkgYXQgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBwZXJpb2RpYyByYXRlIChha2EgdGhlICJzbG93IGxvb3AiKS4gIFRoZSBkZWZhdWx0IHBlcmlvZCBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGl0ZXJhdGl2ZSByb2JvdCBpcyBzeW5jZWQgdG8gdGhlIGRyaXZlciBzdGF0aW9uIGNvbnRyb2wgcGFja2V0cywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmluZyBhIHBlcmlvZGljIGZyZXF1ZW5jeSBvZiBhYm91dCA1MEh6ICg1MCB0aW1lcyBwZXIgc2Vjb25kKS4KKyAqICAgLSBEaXNhYmxlZFBlcmlvZGljKCkKKyAqICAgLSBBdXRvbm9tb3VzUGVyaW9kaWMoKQorICogICAtIFRlbGVvcFBlcmlvZGljKCkKKyAqICAgLSBUZXN0UGVyaW9kaWMoKQorICoKKyAqLworCitjbGFzcyBJdGVyYXRpdmVSb2JvdCA6IHB1YmxpYyBSb2JvdEJhc2UKK3sKK3B1YmxpYzoKKwkvKgorCSAqIFRoZSBkZWZhdWx0IHBlcmlvZCBmb3IgdGhlIHBlcmlvZGljIGZ1bmN0aW9uIGNhbGxzIChzZWNvbmRzKQorCSAqIFNldHRpbmcgdGhlIHBlcmlvZCB0byAwLjAgd2lsbCBjYXVzZSB0aGUgcGVyaW9kaWMgZnVuY3Rpb25zIHRvIGZvbGxvdworCSAqIHRoZSBEcml2ZXIgU3RhdGlvbiBwYWNrZXQgcmF0ZSBvZiBhYm91dCA1MEh6LgorCSAqLworCXN0YXRpYyBjb25zdCBkb3VibGUga0RlZmF1bHRQZXJpb2Q7CisKKwl2aXJ0dWFsIHZvaWQgU3RhcnRDb21wZXRpdGlvbigpOworCisJdmlydHVhbCB2b2lkIFJvYm90SW5pdCgpOworCXZpcnR1YWwgdm9pZCBEaXNhYmxlZEluaXQoKTsKKwl2aXJ0dWFsIHZvaWQgQXV0b25vbW91c0luaXQoKTsKKwl2aXJ0dWFsIHZvaWQgVGVsZW9wSW5pdCgpOworCXZpcnR1YWwgdm9pZCBUZXN0SW5pdCgpOworCisJdmlydHVhbCB2b2lkIERpc2FibGVkUGVyaW9kaWMoKTsKKwl2aXJ0dWFsIHZvaWQgQXV0b25vbW91c1BlcmlvZGljKCk7CisJdmlydHVhbCB2b2lkIFRlbGVvcFBlcmlvZGljKCk7CisJdmlydHVhbCB2b2lkIFRlc3RQZXJpb2RpYygpOworCisJdm9pZCBTZXRQZXJpb2QoZG91YmxlIHBlcmlvZCk7CisJZG91YmxlIEdldFBlcmlvZCgpOworCWRvdWJsZSBHZXRMb29wc1BlclNlYygpOworCitwcm90ZWN0ZWQ6CisJdmlydHVhbCB+SXRlcmF0aXZlUm9ib3QoKSA9IGRlZmF1bHQ7CisJSXRlcmF0aXZlUm9ib3QoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisJYm9vbCBOZXh0UGVyaW9kUmVhZHkoKTsKKworCWJvb2wgbV9kaXNhYmxlZEluaXRpYWxpemVkID0gZmFsc2U7CisJYm9vbCBtX2F1dG9ub21vdXNJbml0aWFsaXplZCA9IGZhbHNlOworCWJvb2wgbV90ZWxlb3BJbml0aWFsaXplZCA9IGZhbHNlOworCWJvb2wgbV90ZXN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwlkb3VibGUgbV9wZXJpb2QgPSBrRGVmYXVsdFBlcmlvZDsKKwlUaW1lciBtX21haW5Mb29wVGltZXI7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvSmFndWFyLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9KYWd1YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjUyMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvSmFndWFyLmgKQEAgLTAsMCArMSwyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTYWZlUFdNLmgiCisjaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUElET3V0cHV0LmgiCisKKy8qKgorICogTHVtaW5hcnkgTWljcm8gSmFndWFyIFNwZWVkIENvbnRyb2wKKyAqLworY2xhc3MgSmFndWFyIDogcHVibGljIFNhZmVQV00sIHB1YmxpYyBTcGVlZENvbnRyb2xsZXIKK3sKK3B1YmxpYzoKKwlleHBsaWNpdCBKYWd1YXIodWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+SmFndWFyKCkgPSBkZWZhdWx0OworCXZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCk7CisJdmlydHVhbCBmbG9hdCBHZXQoKSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpOworCisJdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCkgb3ZlcnJpZGU7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvSm95c3RpY2suaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0pveXN0aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyMjM1OQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL0pveXN0aWNrLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBKT1lTVElDS19IXworI2RlZmluZSBKT1lTVElDS19IXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgIkdlbmVyaWNISUQuaCIKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKworY2xhc3MgRHJpdmVyU3RhdGlvbjsKKworLyoqCisgKiBIYW5kbGUgaW5wdXQgZnJvbSBzdGFuZGFyZCBKb3lzdGlja3MgY29ubmVjdGVkIHRvIHRoZSBEcml2ZXIgU3RhdGlvbi4KKyAqIFRoaXMgY2xhc3MgaGFuZGxlcyBzdGFuZGFyZCBpbnB1dCB0aGF0IGNvbWVzIGZyb20gdGhlIERyaXZlciBTdGF0aW9uLiBFYWNoCisgKiB0aW1lIGEgdmFsdWUgaXMgcmVxdWVzdGVkCisgKiB0aGUgbW9zdCByZWNlbnQgdmFsdWUgaXMgcmV0dXJuZWQuIFRoZXJlIGlzIGEgc2luZ2xlIGNsYXNzIGluc3RhbmNlIGZvciBlYWNoCisgKiBqb3lzdGljayBhbmQgdGhlIG1hcHBpbmcKKyAqIG9mIHBvcnRzIHRvIGhhcmR3YXJlIGJ1dHRvbnMgZGVwZW5kcyBvbiB0aGUgY29kZSBpbiB0aGUgZHJpdmVyIHN0YXRpb24uCisgKi8KK2NsYXNzIEpveXN0aWNrIDogcHVibGljIEdlbmVyaWNISUQsIHB1YmxpYyBFcnJvckJhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0WEF4aXMgPSAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0RlZmF1bHRZQXhpcyA9IDE7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFpBeGlzID0gMjsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0VHdpc3RBeGlzID0gMjsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0VGhyb3R0bGVBeGlzID0gMzsKKyAgdHlwZWRlZiBlbnVtIHsKKyAgICBrWEF4aXMsCisgICAga1lBeGlzLAorICAgIGtaQXhpcywKKyAgICBrVHdpc3RBeGlzLAorICAgIGtUaHJvdHRsZUF4aXMsCisgICAga051bUF4aXNUeXBlcworICB9IEF4aXNUeXBlOworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0RlZmF1bHRUcmlnZ2VyQnV0dG9uID0gMTsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0VG9wQnV0dG9uID0gMjsKKyAgdHlwZWRlZiBlbnVtIHsga1RyaWdnZXJCdXR0b24sIGtUb3BCdXR0b24sIGtOdW1CdXR0b25UeXBlcyB9IEJ1dHRvblR5cGU7CisgIHR5cGVkZWYgZW51bSB7IGtMZWZ0UnVtYmxlLCBrUmlnaHRSdW1ibGUgfSBSdW1ibGVUeXBlOworICB0eXBlZGVmIGVudW0geworICAgIGtVbmtub3duID0gLTEsCisgICAga1hJbnB1dFVua25vd24gPSAwLAorICAgIGtYSW5wdXRHYW1lcGFkID0gMSwKKyAgICBrWElucHV0V2hlZWwgPSAyLAorICAgIGtYSW5wdXRBcmNhZGVTdGljayA9IDMsCisgICAga1hJbnB1dEZsaWdodFN0aWNrID0gNCwKKyAgICBrWElucHV0RGFuY2VQYWQgPSA1LAorICAgIGtYSW5wdXRHdWl0YXIgPSA2LAorICAgIGtYSW5wdXRHdWl0YXIyID0gNywKKyAgICBrWElucHV0RHJ1bUtpdCA9IDgsCisgICAga1hJbnB1dEd1aXRhcjMgPSAxMSwKKyAgICBrWElucHV0QXJjYWRlUGFkID0gMTksCisgICAga0hJREpveXN0aWNrID0gMjAsCisgICAga0hJREdhbWVwYWQgPSAyMSwKKyAgICBrSElERHJpdmluZyA9IDIyLAorICAgIGtISURGbGlnaHQgPSAyMywKKyAgICBrSElEMXN0UGVyc29uID0gMjQKKyAgfSBISURUeXBlOworICBleHBsaWNpdCBKb3lzdGljayh1aW50MzJfdCBwb3J0KTsKKyAgSm95c3RpY2sodWludDMyX3QgcG9ydCwgdWludDMyX3QgbnVtQXhpc1R5cGVzLCB1aW50MzJfdCBudW1CdXR0b25UeXBlcyk7CisgIHZpcnR1YWwgfkpveXN0aWNrKCkgPSBkZWZhdWx0OworCisgIEpveXN0aWNrKGNvbnN0IEpveXN0aWNrJikgPSBkZWxldGU7CisgIEpveXN0aWNrJiBvcGVyYXRvcj0oY29uc3QgSm95c3RpY2smKSA9IGRlbGV0ZTsKKworICB1aW50MzJfdCBHZXRBeGlzQ2hhbm5lbChBeGlzVHlwZSBheGlzKSBjb25zdDsKKyAgdm9pZCBTZXRBeGlzQ2hhbm5lbChBeGlzVHlwZSBheGlzLCB1aW50MzJfdCBjaGFubmVsKTsKKworICB2aXJ0dWFsIGZsb2F0IEdldFgoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBmbG9hdCBHZXRZKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0WigpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGZsb2F0IEdldFR3aXN0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgZmxvYXQgR2V0VGhyb3R0bGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBmbG9hdCBHZXRBeGlzKEF4aXNUeXBlIGF4aXMpIGNvbnN0OworICBmbG9hdCBHZXRSYXdBeGlzKHVpbnQzMl90IGF4aXMpIGNvbnN0IG92ZXJyaWRlOworCisgIHZpcnR1YWwgYm9vbCBHZXRUcmlnZ2VyKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgYm9vbCBHZXRUb3AoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBib29sIEdldEJ1bXBlcihKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpIGNvbnN0IG92ZXJyaWRlOworICB2aXJ0dWFsIGJvb2wgR2V0UmF3QnV0dG9uKHVpbnQzMl90IGJ1dHRvbikgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgaW50IEdldFBPVih1aW50MzJfdCBwb3YgPSAwKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBHZXRCdXR0b24oQnV0dG9uVHlwZSBidXR0b24pIGNvbnN0OworICBzdGF0aWMgSm95c3RpY2sgKkdldFN0aWNrRm9yUG9ydCh1aW50MzJfdCBwb3J0KTsKKworICB2aXJ0dWFsIGZsb2F0IEdldE1hZ25pdHVkZSgpIGNvbnN0OworICB2aXJ0dWFsIGZsb2F0IEdldERpcmVjdGlvblJhZGlhbnMoKSBjb25zdDsKKyAgdmlydHVhbCBmbG9hdCBHZXREaXJlY3Rpb25EZWdyZWVzKCkgY29uc3Q7CisKKyAgYm9vbCBHZXRJc1hib3goKSBjb25zdDsKKyAgSm95c3RpY2s6OkhJRFR5cGUgR2V0VHlwZSgpIGNvbnN0OworICBzdGQ6OnN0cmluZyBHZXROYW1lKCkgY29uc3Q7CisgIGludCBHZXRBeGlzVHlwZSh1aW50OF90IGF4aXMpIGNvbnN0OworCisgIGludCBHZXRBeGlzQ291bnQoKSBjb25zdDsKKyAgaW50IEdldEJ1dHRvbkNvdW50KCkgY29uc3Q7CisgIGludCBHZXRQT1ZDb3VudCgpIGNvbnN0OworCisgIHZvaWQgU2V0UnVtYmxlKFJ1bWJsZVR5cGUgdHlwZSwgZmxvYXQgdmFsdWUpOworICB2b2lkIFNldE91dHB1dCh1aW50OF90IG91dHB1dE51bWJlciwgYm9vbCB2YWx1ZSk7CisgIHZvaWQgU2V0T3V0cHV0cyh1aW50MzJfdCB2YWx1ZSk7CisKKyBwcml2YXRlOgorICBEcml2ZXJTdGF0aW9uICZtX2RzOworICB1aW50MzJfdCBtX3BvcnQ7CisgIDo6c3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1fYXhlczsKKyAgOjpzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbV9idXR0b25zOworICB1aW50MzJfdCBtX291dHB1dHMgPSAwOworICB1aW50MTZfdCBtX2xlZnRSdW1ibGUgPSAwOworICB1aW50MTZfdCBtX3JpZ2h0UnVtYmxlID0gMDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvTW90b3JTYWZldHkuaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL01vdG9yU2FmZXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxODgwNgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL01vdG9yU2FmZXR5LmgKQEAgLTAsMCArMSwyMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNkZWZpbmUgREVGQVVMVF9TQUZFVFlfRVhQSVJBVElPTiAwLjEKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKK2NsYXNzIE1vdG9yU2FmZXR5Cit7CitwdWJsaWM6CisJdmlydHVhbCB2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCkgPSAwOworCXZpcnR1YWwgZmxvYXQgR2V0RXhwaXJhdGlvbigpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGJvb2wgSXNBbGl2ZSgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIHZvaWQgU3RvcE1vdG9yKCkgPSAwOworCXZpcnR1YWwgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOworCXZpcnR1YWwgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCA9IDA7CisJdmlydHVhbCB2b2lkIEdldERlc2NyaXB0aW9uKHN0ZDo6b3N0cmluZ3N0cmVhbSYgZGVzYykgY29uc3QgPSAwOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL01vdG9yU2FmZXR5SGVscGVyLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Nb3RvclNhZmV0eUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTc2NTgKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Nb3RvclNhZmV0eUhlbHBlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRXJyb3JCYXNlLmgiCisjaW5jbHVkZSAiSEFML2NwcC9wcmlvcml0eV9tdXRleC5oIgorCisjaW5jbHVkZSA8c2V0PgorCitjbGFzcyBNb3RvclNhZmV0eTsKKworY2xhc3MgTW90b3JTYWZldHlIZWxwZXIgOiBwdWJsaWMgRXJyb3JCYXNlIHsKKyBwdWJsaWM6CisgIE1vdG9yU2FmZXR5SGVscGVyKE1vdG9yU2FmZXR5ICpzYWZlT2JqZWN0KTsKKyAgfk1vdG9yU2FmZXR5SGVscGVyKCk7CisgIHZvaWQgRmVlZCgpOworICB2b2lkIFNldEV4cGlyYXRpb24oZmxvYXQgZXhwaXJhdGlvblRpbWUpOworICBmbG9hdCBHZXRFeHBpcmF0aW9uKCkgY29uc3Q7CisgIGJvb2wgSXNBbGl2ZSgpIGNvbnN0OworICB2b2lkIENoZWNrKCk7CisgIHZvaWQgU2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpOworICBib29sIElzU2FmZXR5RW5hYmxlZCgpIGNvbnN0OworICBzdGF0aWMgdm9pZCBDaGVja01vdG9ycygpOworCisgcHJpdmF0ZToKKyAgZG91YmxlIG1fZXhwaXJhdGlvbjsgIC8vIHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoaXMgb2JqZWN0CisgIGJvb2wgbV9lbmFibGVkOyAgICAgICAvLyB0cnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkIGZvciB0aGlzIG1vdG9yCisgIGRvdWJsZSBtX3N0b3BUaW1lOyAgICAvLyB0aGUgRlBHQSBjbG9jayB2YWx1ZSB3aGVuIHRoaXMgbW90b3IgaGFzIGV4cGlyZWQKKyAgbXV0YWJsZSBwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXgKKyAgICAgIG1fc3luY011dGV4OyAgICAgICAgICAgIC8vIHByb3RlY3QgYWNjZXNzZXMgdG8gdGhlIHN0YXRlIGZvciB0aGlzIG9iamVjdAorICBNb3RvclNhZmV0eSAqbV9zYWZlT2JqZWN0OyAgLy8gdGhlIG9iamVjdCB0aGF0IGlzIHVzaW5nIHRoZSBoZWxwZXIKKyAgLy8gTGlzdCBvZiBhbGwgZXhpc3RpbmcgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0cy4KKyAgc3RhdGljIHN0ZDo6c2V0PE1vdG9yU2FmZXR5SGVscGVyKj4gbV9oZWxwZXJMaXN0OworICBzdGF0aWMgcHJpb3JpdHlfcmVjdXJzaXZlX211dGV4CisgICAgICBtX2xpc3RNdXRleDsgIC8vIHByb3RlY3QgYWNjZXNzZXMgdG8gdGhlIGxpc3Qgb2YgaGVscGVycworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODhjOGNhCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCQlOT1RJQ0UKKyAqCisgKiAJVGhlc2UgYXJlIHRoZSBvbmx5IGV4dGVybmFsbHkgZXhwb3NlZCBmdW5jdGlvbnMgdG8gdGhlCisgKiAgIE5ldHdvcmtDb21tdW5pY2F0aW9uIGxpYnJhcnkKKyAqCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEZSQyBTcGVjIGZvciBDb21tIFByb3RvY29sCisgKiBSZXZpc2lvbiA0LjUsIEp1bmUgMzAsIDIwMDgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fRlJDX0NPTU1fSF9fCisjZGVmaW5lIF9fRlJDX0NPTU1fSF9fCisKKyNpZmRlZiBTSU1VTEFUSU9OCisjaW5jbHVkZSA8dnhXb3Jrc19jb21wYXQuaD4KKyNpZmRlZiBVU0VfVEhSSUZUCisjZGVmaW5lIEVYUE9SVF9GVU5DCisjZWxzZQorI2RlZmluZSBFWFBPUlRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19jZGVjbAorI2VuZGlmCisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNkZWZpbmUgRVhQT1JUX0ZVTkMKKyNlbmRpZgorCisjZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTmV0Q29tbU5vdFJlc3BvbmRpbmcgLTQ0MDQ5CisjZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTm9EU0Nvbm5lY3Rpb24gLTQ0MDE4CisKK2VudW0gQWxsaWFuY2VTdGF0aW9uSURfdCB7CisgIGtBbGxpYW5jZVN0YXRpb25JRF9yZWQxLAorICBrQWxsaWFuY2VTdGF0aW9uSURfcmVkMiwKKyAga0FsbGlhbmNlU3RhdGlvbklEX3JlZDMsCisgIGtBbGxpYW5jZVN0YXRpb25JRF9ibHVlMSwKKyAga0FsbGlhbmNlU3RhdGlvbklEX2JsdWUyLAorICBrQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTMsCit9OworCitlbnVtIE1hdGNoVHlwZV90IHsKKyAga01hdGNoVHlwZV9ub25lLAorICBrTWF0Y2hUeXBlX3ByYWN0aWNlLAorICBrTWF0Y2hUeXBlX3F1YWxpZmljYXRpb24sCisgIGtNYXRjaFR5cGVfZWxpbWluYXRpb24sCit9OworCitzdHJ1Y3QgQ29udHJvbFdvcmRfdCB7CisgIHVpbnQzMl90IGVuYWJsZWQgOiAxOworICB1aW50MzJfdCBhdXRvbm9tb3VzIDogMTsKKyAgdWludDMyX3QgdGVzdCA6IDE7CisgIHVpbnQzMl90IGVTdG9wIDogMTsKKyAgdWludDMyX3QgZm1zQXR0YWNoZWQgOiAxOworICB1aW50MzJfdCBkc0F0dGFjaGVkIDogMTsKKyAgdWludDMyX3QgY29udHJvbF9yZXNlcnZlZCA6IDI2OworfTsKKworc3RydWN0IEpveXN0aWNrQXhlc190IHsKKyAgdWludDE2X3QgY291bnQ7CisgIGludDE2X3QgYXhlc1sxXTsKK307CisKK3N0cnVjdCBKb3lzdGlja1BPVl90IHsKKyAgdWludDE2X3QgY291bnQ7CisgIGludDE2X3QgcG92c1sxXTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2ludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fUmVzZXJ2ZSh2b2lkICppbnN0YW5jZSk7CisjaWZuZGVmIFNJTVVMQVRJT04KK3ZvaWQgRVhQT1JUX0ZVTkMKK2dldEZQR0FIYXJkd2FyZVZlcnNpb24odWludDE2X3QgKmZwZ2FWZXJzaW9uLCB1aW50MzJfdCAqZnBnYVJldmlzaW9uKTsKKyNlbmRpZgoraW50IEVYUE9SVF9GVU5DIHNldFN0YXR1c0RhdGEoZmxvYXQgYmF0dGVyeSwgdWludDhfdCBkc0RpZ2l0YWxPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVwZGF0ZU51bWJlciwgY29uc3QgY2hhciAqdXNlckRhdGFIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZXJEYXRhSGlnaExlbmd0aCwgY29uc3QgY2hhciAqdXNlckRhdGFMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlckRhdGFMb3dMZW5ndGgsIGludCB3YWl0X21zKTsKK2ludCBFWFBPUlRfRlVOQyBzZXRFcnJvckRhdGEoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgZXJyb3JzTGVuZ3RoLCBpbnQgd2FpdF9tcyk7CisKKyNpZmRlZiBTSU1VTEFUSU9OCit2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0oSEFORExFKTsKKyNlbHNlCit2b2lkIEVYUE9SVF9GVU5DIHNldE5ld0RhdGFTZW0ocHRocmVhZF9jb25kX3QgKik7CisjZW5kaWYKKworLy8gdGhpcyB1aW50MzJfdCBpcyByZWFsbHkgYSBMVlJlZk51bQoraW50IEVYUE9SVF9GVU5DIHNldE5ld0RhdGFPY2N1clJlZih1aW50MzJfdCByZWZudW0pOworCitpbnQgRVhQT1JUX0ZVTkMKK0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRDb250cm9sV29yZChzdHJ1Y3QgQ29udHJvbFdvcmRfdCAqY29udHJvbFdvcmQpOworaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRBbGxpYW5jZVN0YXRpb24oCisgICAgZW51bSBBbGxpYW5jZVN0YXRpb25JRF90ICphbGxpYW5jZVN0YXRpb24pOworaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRNYXRjaFRpbWUoZmxvYXQgKm1hdGNoVGltZSk7CitpbnQgRVhQT1JUX0ZVTkMKK0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRKb3lzdGlja0F4ZXModWludDhfdCBqb3lzdGlja051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEpveXN0aWNrQXhlc190ICpheGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heEF4ZXMpOworaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRKb3lzdGlja0J1dHRvbnModWludDhfdCBqb3lzdGlja051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpidXR0b25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqY291bnQpOworaW50IEVYUE9SVF9GVU5DCitGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tQT1ZzKHVpbnQ4X3Qgam95c3RpY2tOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBKb3lzdGlja1BPVl90ICpwb3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heFBPVnMpOworaW50IEVYUE9SVF9GVU5DCitGUkNfTmV0d29ya0NvbW11bmljYXRpb25fc2V0Sm95c3RpY2tPdXRwdXRzKHVpbnQ4X3Qgam95c3RpY2tOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhpZE91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlZnRSdW1ibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJpZ2h0UnVtYmxlKTsKK2ludCBFWFBPUlRfRlVOQworRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrRGVzYyh1aW50OF90IGpveXN0aWNrTnVtLCB1aW50OF90ICppc1hCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnR5cGUsIGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmF4aXNDb3VudCwgdWludDhfdCAqYXhpc1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidXR0b25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcG92Q291bnQpOworCit2b2lkIEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRWZXJzaW9uU3RyaW5nKGNoYXIgKnZlcnNpb24pOworaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1TdGFydGluZyh2b2lkKTsKK3ZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKHZvaWQpOwordm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cyh2b2lkKTsKK3ZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCh2b2lkKTsKK3ZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVRlc3Qodm9pZCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL1BXTS5oIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvUFdNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwMDdmYgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL1BXTS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJzaW11bGF0aW9uL1NpbUNvbnRpbnVvdXNPdXRwdXQuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIgorI2luY2x1ZGUgInRhYmxlcy9JVGFibGVMaXN0ZW5lci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENsYXNzIGltcGxlbWVudHMgdGhlIFBXTSBnZW5lcmF0aW9uIGluIHRoZSBGUEdBLgorICoKKyAqIFRoZSB2YWx1ZXMgc3VwcGxpZWQgYXMgYXJndW1lbnRzIGZvciBQV00gb3V0cHV0cyByYW5nZSBmcm9tIC0xLjAgdG8gMS4wLiBUaGV5IGFyZSBtYXBwZWQKKyAqIHRvIHRoZSBoYXJkd2FyZSBkZXBlbmRlbnQgdmFsdWVzLCBpbiB0aGlzIGNhc2UgMC0yNTUgZm9yIHRoZSBGUEdBLgorICogQ2hhbmdlcyBhcmUgaW1tZWRpYXRlbHkgc2VudCB0byB0aGUgRlBHQSwgYW5kIHRoZSB1cGRhdGUgb2NjdXJzIGF0IHRoZSBuZXh0CisgKiBGUEdBIGN5Y2xlLiBUaGVyZSBpcyBubyBkZWxheS4KKyAqCisgKiBBcyBvZiByZXZpc2lvbiAwLjEuMTAgb2YgdGhlIEZQR0EsIHRoZSBGUEdBIGludGVycHJldHMgdGhlIDAtMjU1IHZhbHVlcyBhcyBmb2xsb3dzOgorICogICAtIDI1NSA9IGZ1bGwgImZvcndhcmQiCisgKiAgIC0gMjU0IHRvIDEyOSA9IGxpbmVhciBzY2FsaW5nIGZyb20gImZ1bGwgZm9yd2FyZCIgdG8gImNlbnRlciIKKyAqICAgLSAxMjggPSBjZW50ZXIgdmFsdWUKKyAqICAgLSAxMjcgdG8gMiA9IGxpbmVhciBzY2FsaW5nIGZyb20gImNlbnRlciIgdG8gImZ1bGwgcmV2ZXJzZSIKKyAqICAgLSAxID0gZnVsbCAicmV2ZXJzZSIKKyAqICAgLSAwID0gZGlzYWJsZWQgKGkuZS4gUFdNIG91dHB1dCBpcyBoZWxkIGxvdykKKyAqLworY2xhc3MgUFdNIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBJVGFibGVMaXN0ZW5lciwgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZQoreworcHVibGljOgorCWVudW0gUGVyaW9kTXVsdGlwbGllcgorCXsKKwkJa1BlcmlvZE11bHRpcGxpZXJfMVggPSAxLAorCQlrUGVyaW9kTXVsdGlwbGllcl8yWCA9IDIsCisJCWtQZXJpb2RNdWx0aXBsaWVyXzRYID0gNAorCX07CisKKwlleHBsaWNpdCBQV00odWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+UFdNKCk7CisJdmlydHVhbCB2b2lkIFNldFJhdyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CisJdm9pZCBTZXRQZXJpb2RNdWx0aXBsaWVyKFBlcmlvZE11bHRpcGxpZXIgbXVsdCk7CisJdm9pZCBFbmFibGVEZWFkYmFuZEVsaW1pbmF0aW9uKGJvb2wgZWxpbWluYXRlRGVhZGJhbmQpOworCXZvaWQgU2V0Qm91bmRzKGludDMyX3QgbWF4LCBpbnQzMl90IGRlYWRiYW5kTWF4LCBpbnQzMl90IGNlbnRlciwgaW50MzJfdCBkZWFkYmFuZE1pbiwKKwkJCWludDMyX3QgbWluKTsKKwl2b2lkIFNldEJvdW5kcyhkb3VibGUgbWF4LCBkb3VibGUgZGVhZGJhbmRNYXgsIGRvdWJsZSBjZW50ZXIsIGRvdWJsZSBkZWFkYmFuZE1pbiwgZG91YmxlIG1pbik7CisJdWludDMyX3QgR2V0Q2hhbm5lbCgpIGNvbnN0CisJeworCQlyZXR1cm4gbV9jaGFubmVsOworCX0KKworcHJvdGVjdGVkOgorCS8qKgorCSAqIGtEZWZhdWx0UHdtUGVyaW9kIGlzIGluIG1zCisJICoKKwkgKiAtIDIwbXMgcGVyaW9kcyAoNTAgSHopIGFyZSB0aGUgInNhZmVzdCIgc2V0dGluZyBpbiB0aGF0IHRoaXMgd29ya3MgZm9yIGFsbCBkZXZpY2VzCisJICogLSAyMG1zIHBlcmlvZHMgc2VlbSB0byBiZSBkZXNpcmFibGUgZm9yIFZleCBNb3RvcnMKKwkgKiAtIDIwbXMgcGVyaW9kcyBhcmUgdGhlIHNwZWNpZmllZCBwZXJpb2QgZm9yIEhTLTMyMkhEIHNlcnZvcywgYnV0IHdvcmsgcmVsaWFibHkgZG93bgorCSAqICAgICAgdG8gMTAuMCBtczsgc3RhcnRpbmcgYXQgYWJvdXQgOC41bXMsIHRoZSBzZXJ2byBzb21ldGltZXMgaHVtcyBhbmQgZ2V0IGhvdDsKKwkgKiAgICAgIGJ5IDUuMG1zIHRoZSBodW0gaXMgbmVhcmx5IGNvbnRpbnVvdXMKKwkgKiAtIDEwbXMgcGVyaW9kcyB3b3JrIHdlbGwgZm9yIFZpY3RvciA4ODQKKwkgKiAtIDVtcyBwZXJpb2RzIGFsbG93cyBoaWdoZXIgdXBkYXRlIHJhdGVzIGZvciBMdW1pbmFyeSBNaWNybyBKYWd1YXIgc3BlZWQgY29udHJvbGxlcnMuCisJICogICAgICBEdWUgdG8gdGhlIHNoaXBwaW5nIGZpcm13YXJlIG9uIHRoZSBKYWd1YXIsIHdlIGNhbid0IHJ1biB0aGUgdXBkYXRlIHBlcmlvZCBsZXNzCisJICogICAgICB0aGFuIDUuMDUgbXMuCisJICoKKwkgKiBrRGVmYXVsdFB3bVBlcmlvZCBpcyB0aGUgMXggcGVyaW9kICg1LjA1IG1zKS4gIEluIGhhcmR3YXJlLCB0aGUgcGVyaW9kIHNjYWxpbmcgaXMgaW1wbGVtZW50ZWQgYXMgYW4KKwkgKiBvdXRwdXQgc3F1ZWxjaCB0byBnZXQgbG9uZ2VyIHBlcmlvZHMgZm9yIG9sZCBkZXZpY2VzLgorCSAqLworCXN0YXRpYyBjb25zdCBmbG9hdCBrRGVmYXVsdFB3bVBlcmlvZDsKKwkvKioKKwkgKiBrRGVmYXVsdFB3bUNlbnRlciBpcyB0aGUgUFdNIHJhbmdlIGNlbnRlciBpbiBtcworCSAqLworCXN0YXRpYyBjb25zdCBmbG9hdCBrRGVmYXVsdFB3bUNlbnRlcjsKKwkvKioKKwkgKiBrRGVmYXVsdFBXTVN0ZXBzRG93biBpcyB0aGUgbnVtYmVyIG9mIFBXTSBzdGVwcyBiZWxvdyB0aGUgY2VudGVycG9pbnQKKwkgKi8KKwlzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVmYXVsdFB3bVN0ZXBzRG93bjsKKwlzdGF0aWMgY29uc3QgaW50MzJfdCBrUHdtRGlzYWJsZWQ7CisKKwl2aXJ0dWFsIHZvaWQgU2V0UG9zaXRpb24oZmxvYXQgcG9zKTsKKwl2aXJ0dWFsIGZsb2F0IEdldFBvc2l0aW9uKCkgY29uc3Q7CisJdmlydHVhbCB2b2lkIFNldFNwZWVkKGZsb2F0IHNwZWVkKTsKKwl2aXJ0dWFsIGZsb2F0IEdldFNwZWVkKCkgY29uc3Q7CisKKwlib29sIG1fZWxpbWluYXRlRGVhZGJhbmQ7CisJaW50MzJfdCBtX2NlbnRlclB3bTsKKworCXZvaWQgVmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwgYm9vbCBpc05ldykgb3ZlcnJpZGU7CisJdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworCXZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworCXZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisJc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisJdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworCXN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKwlzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworCitwcml2YXRlOgorCXVpbnQzMl90IG1fY2hhbm5lbDsKKwlTaW1Db250aW51b3VzT3V0cHV0KiBpbXBsOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL1JlbGF5LmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9SZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzlhZDUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9SZWxheS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKKyNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCisjaW5jbHVkZSAic2ltdWxhdGlvbi9TaW1Db250aW51b3VzT3V0cHV0LmgiCisjaW5jbHVkZSAidGFibGVzL0lUYWJsZUxpc3RlbmVyLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaCIKKyNpbmNsdWRlICJ0YWJsZXMvSVRhYmxlLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK2NsYXNzIE1vdG9yU2FmZXR5SGVscGVyOworY2xhc3MgRGlnaXRhbE1vZHVsZTsKKworLyoqCisgKiBDbGFzcyBmb3IgU3Bpa2Ugc3R5bGUgcmVsYXkgb3V0cHV0cy4KKyAqIFJlbGF5cyBhcmUgaW50ZW5kZWQgdG8gYmUgY29ubmVjdGVkIHRvIHNwaWtlcyBvciBzaW1pbGFyIHJlbGF5cy4gVGhlIHJlbGF5IGNoYW5uZWxzIGNvbnRyb2xzCisgKiBhIHBhaXIgb2YgcGlucyB0aGF0IGFyZSBlaXRoZXIgYm90aCBvZmYsIG9uZSBvbiwgdGhlIG90aGVyIG9uLCBvciBib3RoIG9uLiBUaGlzIHRyYW5zbGF0ZXMgaW50bworICogdHdvIHNwaWtlIG91dHB1dHMgYXQgMHYsIG9uZSBhdCAxMnYgYW5kIG9uZSBhdCAwdiwgb25lIGF0IDB2IGFuZCB0aGUgb3RoZXIgYXQgMTJ2LCBvciB0d28KKyAqIHNwaWtlIG91dHB1dHMgYXQgMTJWLiBUaGlzIGFsbG93cyBvZmYsIGZ1bGwgZm9yd2FyZCwgb3IgZnVsbCByZXZlcnNlIGNvbnRyb2wgb2YgbW90b3JzIHdpdGhvdXQKKyAqIHZhcmlhYmxlIHNwZWVkLiAgSXQgYWxzbyBhbGxvd3MgdGhlIHR3byBjaGFubmVscyAoZm9yd2FyZCBhbmQgcmV2ZXJzZSkgdG8gYmUgdXNlZCBpbmRlcGVuZGVudGx5CisgKiBmb3Igc29tZXRoaW5nIHRoYXQgZG9lcyBub3QgY2FyZSBhYm91dCB2b2x0YWdlIHBvbGF0aXJ5IChsaWtlIGEgc29sZW5vaWQpLgorICovCitjbGFzcyBSZWxheSA6IHB1YmxpYyBNb3RvclNhZmV0eSwKKyAgICAgICAgICAgICAgcHVibGljIFNlbnNvckJhc2UsCisgICAgICAgICAgICAgIHB1YmxpYyBJVGFibGVMaXN0ZW5lciwKKyAgICAgICAgICAgICAgcHVibGljIExpdmVXaW5kb3dTZW5kYWJsZSB7CitwdWJsaWM6CisJZW51bSBWYWx1ZQorCXsKKwkJa09mZiwKKwkJa09uLAorCQlrRm9yd2FyZCwKKwkJa1JldmVyc2UKKwl9OworCWVudW0gRGlyZWN0aW9uCisJeworCQlrQm90aERpcmVjdGlvbnMsCisJCWtGb3J3YXJkT25seSwKKwkJa1JldmVyc2VPbmx5CisJfTsKKworCVJlbGF5KHVpbnQzMl90IGNoYW5uZWwsIERpcmVjdGlvbiBkaXJlY3Rpb24gPSBrQm90aERpcmVjdGlvbnMpOworCXZpcnR1YWwgflJlbGF5KCk7CisKKwl2b2lkIFNldChWYWx1ZSB2YWx1ZSk7CisJVmFsdWUgR2V0KCkgY29uc3Q7CisgICAgdWludDMyX3QgR2V0Q2hhbm5lbCgpIGNvbnN0OworCisgIHZvaWQgU2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSBvdmVycmlkZTsKKyAgZmxvYXQgR2V0RXhwaXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzQWxpdmUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTdG9wTW90b3IoKSBvdmVycmlkZTsKKyAgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0RGVzY3JpcHRpb24oc3RkOjpvc3RyaW5nc3RyZWFtJiBkZXNjKSBjb25zdCBvdmVycmlkZTsKKworCXZvaWQgVmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwgYm9vbCBpc05ldykgb3ZlcnJpZGU7CisJdm9pZCBVcGRhdGVUYWJsZSgpIG92ZXJyaWRlOworCXZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpIG92ZXJyaWRlOworCXZvaWQgU3RvcExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisJc3RkOjpzdHJpbmcgR2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisJdm9pZCBJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIG92ZXJyaWRlOworCXN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEdldFRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKwlzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBtX3RhYmxlOworCitwcml2YXRlOgorCXVpbnQzMl90IG1fY2hhbm5lbDsKKwlEaXJlY3Rpb24gbV9kaXJlY3Rpb247CisgICAgc3RkOjp1bmlxdWVfcHRyPE1vdG9yU2FmZXR5SGVscGVyPiBtX3NhZmV0eUhlbHBlcjsKKwlTaW1Db250aW51b3VzT3V0cHV0KiBpbXBsOworCWJvb2wgZ29fcG9zLCBnb19uZWc7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvUm9ib3RCYXNlLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Sb2JvdEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODhkYmIyCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvUm9ib3RCYXNlLmgKQEAgLTAsMCArMSw1MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJCYXNlLmgiCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorI2luY2x1ZGUgInNpbXVsYXRpb24vc2ltVGltZS5oIgorI2luY2x1ZGUgInNpbXVsYXRpb24vTWFpbk5vZGUuaCIKKworI2RlZmluZSBTVEFSVF9ST0JPVF9DTEFTUyhfQ2xhc3NOYW1lXykgXAorCWludCBtYWluKCkgXAorCXsgXAorCQkobmV3IF9DbGFzc05hbWVfKCkpLT5TdGFydENvbXBldGl0aW9uKCk7IFwKKwkJcmV0dXJuIDA7IFwKKwl9CisKKy8qKgorICogSW1wbGVtZW50IGEgUm9ib3QgUHJvZ3JhbSBmcmFtZXdvcmsuCisgKiBUaGUgUm9ib3RCYXNlIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgYSB1c2VyIGNyZWF0aW5nIGEgcm9ib3QgcHJvZ3JhbS4KKyAqIE92ZXJyaWRkZW4gQXV0b25vbW91cygpIGFuZCBPcGVyYXRvckNvbnRyb2woKSBtZXRob2RzIGFyZSBjYWxsZWQgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUKKyAqIGFzIHRoZSBtYXRjaCBwcm9jZWVkcy4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBBdXRvbm9tb3VzIGNvZGUgd2lsbCBydW4gdG8KKyAqIGNvbXBsZXRpb24gYmVmb3JlIHRoZSBPcGVyYXRvckNvbnRyb2wgY29kZSBjb3VsZCBzdGFydC4gSW4gdGhlIGZ1dHVyZSB0aGUgQXV0b25vbW91cyBjb2RlCisgKiBtaWdodCBiZSBzcGF3bmVkIGFzIGEgdGFzaywgdGhlbiBraWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgQXV0b25vbW91cyBwZXJpb2QuCisgKi8KK2NsYXNzIFJvYm90QmFzZQoreworCWZyaWVuZCBjbGFzcyBSb2JvdERlbGV0ZXI7CitwdWJsaWM6CisJc3RhdGljIFJvYm90QmFzZSAmZ2V0SW5zdGFuY2UoKTsKKwlzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShSb2JvdEJhc2UqIHJvYm90KTsKKworCWJvb2wgSXNFbmFibGVkKCkgY29uc3Q7CisJYm9vbCBJc0Rpc2FibGVkKCkgY29uc3Q7CisJYm9vbCBJc0F1dG9ub21vdXMoKSBjb25zdDsKKwlib29sIElzT3BlcmF0b3JDb250cm9sKCkgY29uc3Q7CisJYm9vbCBJc1Rlc3QoKSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQgU3RhcnRDb21wZXRpdGlvbigpID0gMDsKKworcHJvdGVjdGVkOgorCVJvYm90QmFzZSgpOworCXZpcnR1YWwgflJvYm90QmFzZSgpID0gZGVmYXVsdDsKKworICAgIFJvYm90QmFzZShjb25zdCBSb2JvdEJhc2UmKSA9IGRlbGV0ZTsKKyAgICBSb2JvdEJhc2UmIG9wZXJhdG9yPShjb25zdCBSb2JvdEJhc2UmKSA9IGRlbGV0ZTsKKworCURyaXZlclN0YXRpb24gJm1fZHM7CisKK3ByaXZhdGU6CisJc3RhdGljIFJvYm90QmFzZSAqbV9pbnN0YW5jZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Sb2JvdERyaXZlLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Sb2JvdERyaXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4MWU0NgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL1JvYm90RHJpdmUuaApAQCAtMCwwICsxLDExMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFcnJvckJhc2UuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisKK2NsYXNzIFNwZWVkQ29udHJvbGxlcjsKK2NsYXNzIEdlbmVyaWNISUQ7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgaGFuZGxpbmcgUm9ib3QgZHJpdmUgYmFzZWQgb24gYSBkZWZpbml0aW9uIG9mIHRoZSBtb3RvciBjb25maWd1cmF0aW9uLgorICogVGhlIHJvYm90IGRyaXZlIGNsYXNzIGhhbmRsZXMgYmFzaWMgZHJpdmluZyBmb3IgYSByb2JvdC4gQ3VycmVudGx5LCAyIGFuZCA0IG1vdG9yIHN0YW5kYXJkCisgKiBkcml2ZSB0cmFpbnMgYXJlIHN1cHBvcnRlZC4gSW4gdGhlIGZ1dHVyZSBvdGhlciBkcml2ZSB0eXBlcyBsaWtlIHN3ZXJ2ZSBhbmQgbWVjY2FudW0gbWlnaHQKKyAqIGJlIGltcGxlbWVudGVkLiBNb3RvciBjaGFubmVsIG51bWJlcnMgYXJlIHBhc3NlZCBzdXBwbGllZCBvbiBjcmVhdGlvbiBvZiB0aGUgY2xhc3MuIFRob3NlIGFyZQorICogdXNlZCBmb3IgZWl0aGVyIHRoZSBEcml2ZSBmdW5jdGlvbiAoaW50ZW5kZWQgZm9yIGhhbmQgY3JlYXRlZCBkcml2ZSBjb2RlLCBzdWNoIGFzIGF1dG9ub21vdXMpCisgKiBvciB3aXRoIHRoZSBUYW5rL0FyY2FkZSBmdW5jdGlvbnMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgT3BlcmF0b3IgQ29udHJvbCBkcml2aW5nLgorICovCitjbGFzcyBSb2JvdERyaXZlIDogcHVibGljIE1vdG9yU2FmZXR5LCBwdWJsaWMgRXJyb3JCYXNlCit7CitwdWJsaWM6CisJZW51bSBNb3RvclR5cGUKKwl7CisJCWtGcm9udExlZnRNb3RvciA9IDAsCisJCWtGcm9udFJpZ2h0TW90b3IgPSAxLAorCQlrUmVhckxlZnRNb3RvciA9IDIsCisJCWtSZWFyUmlnaHRNb3RvciA9IDMKKwl9OworCisJUm9ib3REcml2ZSh1aW50MzJfdCBsZWZ0TW90b3JDaGFubmVsLCB1aW50MzJfdCByaWdodE1vdG9yQ2hhbm5lbCk7CisJUm9ib3REcml2ZSh1aW50MzJfdCBmcm9udExlZnRNb3RvckNoYW5uZWwsIHVpbnQzMl90IHJlYXJMZWZ0TW90b3JDaGFubmVsLAorCQkJdWludDMyX3QgZnJvbnRSaWdodE1vdG9yQ2hhbm5lbCwgdWludDMyX3QgcmVhclJpZ2h0TW90b3JDaGFubmVsKTsKKwlSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAqbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJpZ2h0TW90b3IpOworCVJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICZsZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAmcmlnaHRNb3Rvcik7CisJUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgKmZyb250TGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJlYXJMZWZ0TW90b3IsCisJCQlTcGVlZENvbnRyb2xsZXIgKmZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyICpyZWFyUmlnaHRNb3Rvcik7CisJUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgJmZyb250TGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgJnJlYXJMZWZ0TW90b3IsCisJCQlTcGVlZENvbnRyb2xsZXIgJmZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyICZyZWFyUmlnaHRNb3Rvcik7CisJdmlydHVhbCB+Um9ib3REcml2ZSgpOworCisgICAgUm9ib3REcml2ZShjb25zdCBSb2JvdERyaXZlJikgPSBkZWxldGU7CisgICAgUm9ib3REcml2ZSYgb3BlcmF0b3I9KGNvbnN0IFJvYm90RHJpdmUmKSA9IGRlbGV0ZTsKKworCXZvaWQgRHJpdmUoZmxvYXQgb3V0cHV0TWFnbml0dWRlLCBmbG9hdCBjdXJ2ZSk7CisJdm9pZCBUYW5rRHJpdmUoR2VuZXJpY0hJRCAqbGVmdFN0aWNrLCBHZW5lcmljSElEICpyaWdodFN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIFRhbmtEcml2ZShHZW5lcmljSElEICZsZWZ0U3RpY2ssIEdlbmVyaWNISUQgJnJpZ2h0U3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgVGFua0RyaXZlKEdlbmVyaWNISUQgKmxlZnRTdGljaywgdWludDMyX3QgbGVmdEF4aXMsIEdlbmVyaWNISUQgKnJpZ2h0U3RpY2ssCisJCQl1aW50MzJfdCByaWdodEF4aXMsIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgVGFua0RyaXZlKEdlbmVyaWNISUQgJmxlZnRTdGljaywgdWludDMyX3QgbGVmdEF4aXMsIEdlbmVyaWNISUQgJnJpZ2h0U3RpY2ssCisJCQl1aW50MzJfdCByaWdodEF4aXMsIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgVGFua0RyaXZlKGZsb2F0IGxlZnRWYWx1ZSwgZmxvYXQgcmlnaHRWYWx1ZSwgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBBcmNhZGVEcml2ZShHZW5lcmljSElEICpzdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBBcmNhZGVEcml2ZShHZW5lcmljSElEICZzdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7CisJdm9pZCBBcmNhZGVEcml2ZShHZW5lcmljSElEICptb3ZlU3RpY2ssIHVpbnQzMl90IG1vdmVDaGFubmVsLCBHZW5lcmljSElEICpyb3RhdGVTdGljaywKKwkJCXVpbnQzMl90IHJvdGF0ZUNoYW5uZWwsIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgQXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAmbW92ZVN0aWNrLCB1aW50MzJfdCBtb3ZlQ2hhbm5lbCwgR2VuZXJpY0hJRCAmcm90YXRlU3RpY2ssCisJCQl1aW50MzJfdCByb3RhdGVDaGFubmVsLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKKwl2b2lkIEFyY2FkZURyaXZlKGZsb2F0IG1vdmVWYWx1ZSwgZmxvYXQgcm90YXRlVmFsdWUsIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOworCXZvaWQgTWVjYW51bURyaXZlX0NhcnRlc2lhbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByb3RhdGlvbiwgZmxvYXQgZ3lyb0FuZ2xlID0gMC4wKTsKKwl2b2lkIE1lY2FudW1Ecml2ZV9Qb2xhcihmbG9hdCBtYWduaXR1ZGUsIGZsb2F0IGRpcmVjdGlvbiwgZmxvYXQgcm90YXRpb24pOworCXZvaWQgSG9sb25vbWljRHJpdmUoZmxvYXQgbWFnbml0dWRlLCBmbG9hdCBkaXJlY3Rpb24sIGZsb2F0IHJvdGF0aW9uKTsKKwl2aXJ0dWFsIHZvaWQgU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGZsb2F0IGxlZnRPdXRwdXQsIGZsb2F0IHJpZ2h0T3V0cHV0KTsKKwl2b2lkIFNldEludmVydGVkTW90b3IoTW90b3JUeXBlIG1vdG9yLCBib29sIGlzSW52ZXJ0ZWQpOworCXZvaWQgU2V0U2Vuc2l0aXZpdHkoZmxvYXQgc2Vuc2l0aXZpdHkpOworCXZvaWQgU2V0TWF4T3V0cHV0KGRvdWJsZSBtYXhPdXRwdXQpOworCisJdm9pZCBTZXRFeHBpcmF0aW9uKGZsb2F0IHRpbWVvdXQpIG92ZXJyaWRlOworCWZsb2F0IEdldEV4cGlyYXRpb24oKSBjb25zdCBvdmVycmlkZTsKKwlib29sIElzQWxpdmUoKSBjb25zdCBvdmVycmlkZTsKKwl2b2lkIFN0b3BNb3RvcigpIG92ZXJyaWRlOworCWJvb2wgSXNTYWZldHlFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisJdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisJdm9pZCBHZXREZXNjcmlwdGlvbihzdGQ6Om9zdHJpbmdzdHJlYW0mIGRlc2MpIGNvbnN0IG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisJdm9pZCBJbml0Um9ib3REcml2ZSgpOworCWZsb2F0IExpbWl0KGZsb2F0IG51bSk7CisJdm9pZCBOb3JtYWxpemUoZG91YmxlICp3aGVlbFNwZWVkcyk7CisJdm9pZCBSb3RhdGVWZWN0b3IoZG91YmxlICZ4LCBkb3VibGUgJnksIGRvdWJsZSBhbmdsZSk7CisKKwlzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4TnVtYmVyT2ZNb3RvcnMgPSA0OworCisJaW50MzJfdCBtX2ludmVydGVkTW90b3JzW2tNYXhOdW1iZXJPZk1vdG9yc107CisJZmxvYXQgbV9zZW5zaXRpdml0eSA9IDAuNTsKKwlkb3VibGUgbV9tYXhPdXRwdXQgPSAxLjA7CisJYm9vbCBtX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnM7CisJU3BlZWRDb250cm9sbGVyICptX2Zyb250TGVmdE1vdG9yID0gbnVsbHB0cjsKKwlTcGVlZENvbnRyb2xsZXIgKm1fZnJvbnRSaWdodE1vdG9yID0gbnVsbHB0cjsKKwlTcGVlZENvbnRyb2xsZXIgKm1fcmVhckxlZnRNb3RvciA9IG51bGxwdHI7CisJU3BlZWRDb250cm9sbGVyICptX3JlYXJSaWdodE1vdG9yID0gbnVsbHB0cjsKKwkvLyBGSVhNRTogTW90b3JTYWZldHlIZWxwZXIgKm1fc2FmZXR5SGVscGVyOworCitwcml2YXRlOgorCWludDMyX3QgR2V0TnVtTW90b3JzKCkKKwl7CisJCWludCBtb3RvcnMgPSAwOworCQlpZiAobV9mcm9udExlZnRNb3RvcikKKwkJCW1vdG9ycysrOworCQlpZiAobV9mcm9udFJpZ2h0TW90b3IpCisJCQltb3RvcnMrKzsKKwkJaWYgKG1fcmVhckxlZnRNb3RvcikKKwkJCW1vdG9ycysrOworCQlpZiAobV9yZWFyUmlnaHRNb3RvcikKKwkJCW1vdG9ycysrOworCQlyZXR1cm4gbW90b3JzOworCX0KK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9TYWZlUFdNLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9TYWZlUFdNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZDg1MwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL1NhZmVQV00uaApAQCAtMCwwICsxLDM3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIk1vdG9yU2FmZXR5LmgiCisjaW5jbHVkZSAiUFdNLmgiCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQSBzYWZlIHZlcnNpb24gb2YgdGhlIFBXTSBjbGFzcy4KKyAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpdCBpbXBsZW1lbnRzIHRoZSBNb3RvclNhZmV0eSBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcyB0aW1lb3V0cworICogaW4gdGhlIGV2ZW50IHRoYXQgdGhlIG1vdG9yIHZhbHVlIGlzIG5vdCB1cGRhdGVkIGJlZm9yZSB0aGUgZXhwaXJhdGlvbiB0aW1lLgorICogVGhpcyBkZWxlZ2F0ZXMgdGhlIGFjdHVhbCB3b3JrIHRvIGEgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgYWxsCisgKiBvYmplY3RzIHRoYXQgaW1wbGVtZW50IE1vdG9yU2FmZXR5LgorICovCitjbGFzcyBTYWZlUFdNIDogcHVibGljIFBXTSwgcHVibGljIE1vdG9yU2FmZXR5Cit7CitwdWJsaWM6CisJZXhwbGljaXQgU2FmZVBXTSh1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5TYWZlUFdNKCkgPSBkZWZhdWx0OworCisJdm9pZCBTZXRFeHBpcmF0aW9uKGZsb2F0IHRpbWVvdXQpOworCWZsb2F0IEdldEV4cGlyYXRpb24oKSBjb25zdDsKKwlib29sIElzQWxpdmUoKSBjb25zdDsKKwl2b2lkIFN0b3BNb3RvcigpOworCWJvb2wgSXNTYWZldHlFbmFibGVkKCkgY29uc3Q7CisJdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisJdm9pZCBHZXREZXNjcmlwdGlvbihzdGQ6Om9zdHJpbmdzdHJlYW0mIGRlc2MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIFNldFNwZWVkKGZsb2F0IHNwZWVkKTsKK3ByaXZhdGU6CisJc3RkOjp1bmlxdWVfcHRyPE1vdG9yU2FmZXR5SGVscGVyPiBtX3NhZmV0eUhlbHBlcjsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9TYW1wbGVSb2JvdC5oIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvU2FtcGxlUm9ib3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGNiMzdkCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvU2FtcGxlUm9ib3QuaApAQCAtMCwwICsxLDI1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlJvYm90QmFzZS5oIgorCitjbGFzcyBTYW1wbGVSb2JvdCA6IHB1YmxpYyBSb2JvdEJhc2UKK3sKK3B1YmxpYzoKKwlTYW1wbGVSb2JvdCgpOworCXZpcnR1YWwgflNhbXBsZVJvYm90KCkgPSBkZWZhdWx0OworCXZpcnR1YWwgdm9pZCBSb2JvdEluaXQoKTsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZWQoKTsKKwl2aXJ0dWFsIHZvaWQgQXV0b25vbW91cygpOworCXZpcnR1YWwgdm9pZCBPcGVyYXRvckNvbnRyb2woKTsKKwl2aXJ0dWFsIHZvaWQgVGVzdCgpOworCXZpcnR1YWwgdm9pZCBSb2JvdE1haW4oKTsKKwl2b2lkIFN0YXJ0Q29tcGV0aXRpb24oKTsKKworcHJpdmF0ZToKKwlib29sIG1fcm9ib3RNYWluT3ZlcnJpZGRlbjsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9Tb2xlbm9pZC5oIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvU29sZW5vaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFkYTZlCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvU29sZW5vaWQuaApAQCAtMCwwICsxLDQzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInNpbXVsYXRpb24vU2ltQ29udGludW91c091dHB1dC5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCisjaW5jbHVkZSAidGFibGVzL0lUYWJsZUxpc3RlbmVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogU29sZW5vaWQgY2xhc3MgZm9yIHJ1bm5pbmcgaGlnaCB2b2x0YWdlIERpZ2l0YWwgT3V0cHV0IChQQ00pLgorICoKKyAqIFRoZSBTb2xlbm9pZCBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcG5ldW1hdGljcyBzb2xlbm9pZHMsIGJ1dCBjb3VsZCBiZSB1c2VkCisgKiBmb3IgYW55IGRldmljZSB3aXRoaW4gdGhlIGN1cnJlbnQgc3BlYyBvZiB0aGUgUENNLgorICovCitjbGFzcyBTb2xlbm9pZCA6IHB1YmxpYyBMaXZlV2luZG93U2VuZGFibGUsIHB1YmxpYyBJVGFibGVMaXN0ZW5lcgoreworcHVibGljOgorCWV4cGxpY2l0IFNvbGVub2lkKHVpbnQzMl90IGNoYW5uZWwpOworCVNvbGVub2lkKHVpbnQ4X3QgbW9kdWxlTnVtYmVyLCB1aW50MzJfdCBjaGFubmVsKTsKKwl2aXJ0dWFsIH5Tb2xlbm9pZCgpOworCXZpcnR1YWwgdm9pZCBTZXQoYm9vbCBvbik7CisJdmlydHVhbCBib29sIEdldCgpIGNvbnN0OworCisJdm9pZCBWYWx1ZUNoYW5nZWQoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSBvdmVycmlkZTsKKwl2b2lkIFVwZGF0ZVRhYmxlKCkgb3ZlcnJpZGU7CisJdm9pZCBTdGFydExpdmVXaW5kb3dNb2RlKCkgb3ZlcnJpZGU7CisJdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSBvdmVycmlkZTsKKwlzdGQ6OnN0cmluZyBHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKwl2b2lkIEluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgb3ZlcnJpZGU7CisJc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gR2V0VGFibGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBTaW1Db250aW51b3VzT3V0cHV0KiBtX2ltcGw7CisgICAgYm9vbCBtX29uOworCisJc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gbV90YWJsZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9TcGVlZENvbnRyb2xsZXIuaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL1NwZWVkQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjZiMTcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9TcGVlZENvbnRyb2xsZXIuaApAQCAtMCwwICsxLDM0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorCisvKioKKyAqIEludGVyZmFjZSBmb3Igc3BlZWQgY29udHJvbGxpbmcgZGV2aWNlcy4KKyAqLworY2xhc3MgU3BlZWRDb250cm9sbGVyIDogcHVibGljIFBJRE91dHB1dAoreworcHVibGljOgorCXZpcnR1YWwgflNwZWVkQ29udHJvbGxlcigpID0gZGVmYXVsdDsKKwkvKioKKwkgKiBDb21tb24gaW50ZXJmYWNlIGZvciBzZXR0aW5nIHRoZSBzcGVlZCBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCisJICogCisJICogQHBhcmFtIHNwZWVkIFRoZSBzcGVlZCB0byBzZXQuICBWYWx1ZSBzaG91bGQgYmUgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCisJICogQHBhcmFtIHN5bmNHcm91cCBUaGUgdXBkYXRlIGdyb3VwIHRvIGFkZCB0aGlzIFNldCgpIHRvLCBwZW5kaW5nIFVwZGF0ZVN5bmNHcm91cCgpLiAgSWYgMCwgdXBkYXRlIGltbWVkaWF0ZWx5LgorCSAqLworCXZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgc3BlZWQsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCkgPSAwOworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgc2V0IHNwZWVkIG9mIGEgc3BlZWQgY29udHJvbGxlci4KKwkgKiAKKwkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldCBzcGVlZC4gIFZhbHVlIGlzIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorCSAqLworCXZpcnR1YWwgZmxvYXQgR2V0KCkgY29uc3QgPSAwOworCS8qKgorCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorCSAqLworCXZpcnR1YWwgdm9pZCBEaXNhYmxlKCkgPSAwOworfTsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL1RhbG9uLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9UYWxvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzc5NGEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9UYWxvbi5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU2FmZVBXTS5oIgorI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorCisvKioKKyAqIENUUkUgVGFsb24gU3BlZWQgQ29udHJvbGxlcgorICovCitjbGFzcyBUYWxvbiA6IHB1YmxpYyBTYWZlUFdNLCBwdWJsaWMgU3BlZWRDb250cm9sbGVyCit7CitwdWJsaWM6CisJZXhwbGljaXQgVGFsb24odWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+VGFsb24oKSA9IGRlZmF1bHQ7CisJdmlydHVhbCB2b2lkIFNldChmbG9hdCB2YWx1ZSwgdWludDhfdCBzeW5jR3JvdXAgPSAwKTsKKwl2aXJ0dWFsIGZsb2F0IEdldCgpIGNvbnN0OworCXZpcnR1YWwgdm9pZCBEaXNhYmxlKCk7CisKKwl2aXJ0dWFsIHZvaWQgUElEV3JpdGUoZmxvYXQgb3V0cHV0KSBvdmVycmlkZTsKK307CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9WaWN0b3IuaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL1ZpY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjliYjQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9WaWN0b3IuaApAQCAtMCwwICsxLDI1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlNhZmVQV00uaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQSURPdXRwdXQuaCIKKworLyoqCisgKiBJRkkgVmljdG9yIFNwZWVkIENvbnRyb2xsZXIKKyAqLworY2xhc3MgVmljdG9yIDogcHVibGljIFNhZmVQV00sIHB1YmxpYyBTcGVlZENvbnRyb2xsZXIKK3sKK3B1YmxpYzoKKwlleHBsaWNpdCBWaWN0b3IodWludDMyX3QgY2hhbm5lbCk7CisJdmlydHVhbCB+VmljdG9yKCkgPSBkZWZhdWx0OworCXZpcnR1YWwgdm9pZCBTZXQoZmxvYXQgdmFsdWUsIHVpbnQ4X3Qgc3luY0dyb3VwID0gMCk7CisJdmlydHVhbCBmbG9hdCBHZXQoKSBjb25zdDsKKwl2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpOworCisJdmlydHVhbCB2b2lkIFBJRFdyaXRlKGZsb2F0IG91dHB1dCkgb3ZlcnJpZGU7Cit9OwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvV1BJTGliLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9XUElMaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQ3N2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvV1BJTGliLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIFdQSUxJYi5oCisgKgorICogIENyZWF0ZWQgb246IE1heSAyOSwgMjAxNAorICogICAgICBBdXRob3I6IGFsZXgKKyAqLworI3ByYWdtYSBvbmNlCisKKyNkZWZpbmUgU0lNVUxBVElPTiAiZ2F6ZWJvIgorCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJCdXR0b25zL1RyaWdnZXIuaCIKKyNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgorI2luY2x1ZGUgIkJ1dHRvbnMvSW50ZXJuYWxCdXR0b24uaCIKKyNpbmNsdWRlICJCdXR0b25zL0pveXN0aWNrQnV0dG9uLmgiCisjaW5jbHVkZSAiQnV0dG9ucy9OZXR3b3JrQnV0dG9uLmgiCisKKyNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvUElEQ29tbWFuZC5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1BJRFN1YnN5c3RlbS5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1ByaW50Q29tbWFuZC5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1N0YXJ0Q29tbWFuZC5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1N1YnN5c3RlbS5oIgorI2luY2x1ZGUgIkNvbW1hbmRzL1dhaXRDb21tYW5kLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvV2FpdEZvckNoaWxkcmVuLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMvV2FpdFVudGlsQ29tbWFuZC5oIgorCisjaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVDaG9vc2VyLmgiCisjaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaCIKKworI2luY2x1ZGUgIlJvYm90QmFzZS5oIgorI2luY2x1ZGUgIlNhbXBsZVJvYm90LmgiCisjaW5jbHVkZSAiSXRlcmF0aXZlUm9ib3QuaCIKKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJUYWxvbi5oIgorI2luY2x1ZGUgIlZpY3Rvci5oIgorI2luY2x1ZGUgIkphZ3Vhci5oIgorI2luY2x1ZGUgIlNvbGVub2lkLmgiCisjaW5jbHVkZSAiRG91YmxlU29sZW5vaWQuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaCIKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIkFuYWxvZ1BvdGVudGlvbWV0ZXIuaCIKKyNpbmNsdWRlICJDb3VudGVyLmgiCisjaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiCisjaW5jbHVkZSAiRW5jb2Rlci5oIgorI2luY2x1ZGUgIkd5cm8uaCIKKyNpbmNsdWRlICJHZW5lcmljSElELmgiCisjaW5jbHVkZSAiSm95c3RpY2suaCIKKyNpbmNsdWRlICJQSURDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUm9ib3REcml2ZS5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorCmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9zaW11bGF0aW9uL01haW5Ob2RlLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9zaW11bGF0aW9uL01haW5Ob2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2ZWY1MAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL3NpbXVsYXRpb24vTWFpbk5vZGUuaApAQCAtMCwwICsxLDQ5IEBACisKKyNpZm5kZWYgX1NJTV9NQUlOX05PREVfSAorI2RlZmluZSBfU0lNX01BSU5fTk9ERV9ICisKKyNpbmNsdWRlICJzaW11bGF0aW9uL2d6X21zZ3MvbXNncy5oIgorI2luY2x1ZGUgPGdhemViby90cmFuc3BvcnQvdHJhbnNwb3J0LmhoPgorI2luY2x1ZGUgPGdhemViby9nYXplYm9fY2xpZW50LmhoPgorCit1c2luZyBuYW1lc3BhY2UgZ2F6ZWJvOworCitjbGFzcyBNYWluTm9kZSB7CitwdWJsaWM6CisJc3RhdGljIE1haW5Ob2RlKiBHZXRJbnN0YW5jZSgpIHsKKwkJc3RhdGljIE1haW5Ob2RlIGluc3RhbmNlOworCQlyZXR1cm4gJmluc3RhbmNlOworCX0KKworCXRlbXBsYXRlPHR5cGVuYW1lIE0+CisJc3RhdGljIHRyYW5zcG9ydDo6UHVibGlzaGVyUHRyIEFkdmVydGlzZShjb25zdCBzdGQ6OnN0cmluZyAmdG9waWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX3F1ZXVlTGltaXQgPSAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2xhdGNoID0gZmFsc2UpIHsKKwkJcmV0dXJuIEdldEluc3RhbmNlKCktPm1haW4tPkFkdmVydGlzZTxNPih0b3BpYywgX3F1ZXVlTGltaXQsIF9sYXRjaCk7CisJfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgTSwgdHlwZW5hbWUgVD4KKwlzdGF0aWMgdHJhbnNwb3J0OjpTdWJzY3JpYmVyUHRyIFN1YnNjcmliZShjb25zdCBzdGQ6OnN0cmluZyAmdG9waWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZChUOjoqZnApKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPE0gY29uc3Q+ICYpLCBUICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfbGF0Y2hpbmcgPSBmYWxzZSkgeworCQlyZXR1cm4gR2V0SW5zdGFuY2UoKS0+bWFpbi0+U3Vic2NyaWJlKHRvcGljLCBmcCwgb2JqLCBfbGF0Y2hpbmcpOworCX0KKworCXRlbXBsYXRlPHR5cGVuYW1lIE0+CisJc3RhdGljIHRyYW5zcG9ydDo6U3Vic2NyaWJlclB0ciBTdWJzY3JpYmUoY29uc3Qgc3RkOjpzdHJpbmcgJnRvcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoKmZwKShjb25zdCBib29zdDo6c2hhcmVkX3B0cjxNIGNvbnN0PiAmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9sYXRjaGluZyA9IGZhbHNlKSB7CisJCXJldHVybiBHZXRJbnN0YW5jZSgpLT5tYWluLT5TdWJzY3JpYmUodG9waWMsIGZwLCBfbGF0Y2hpbmcpOworCX0KKworCXRyYW5zcG9ydDo6Tm9kZVB0ciBtYWluOworcHJpdmF0ZToKKwlNYWluTm9kZSgpIHsKKwkJZ2F6ZWJvOjpjbGllbnQ6OnNldHVwKCk7CisJCW1haW4gPSB0cmFuc3BvcnQ6Ok5vZGVQdHIobmV3IHRyYW5zcG9ydDo6Tm9kZSgpKTsKKwkJbWFpbi0+SW5pdCgiZnJjIik7CisJCWdhemVibzo6dHJhbnNwb3J0OjpydW4oKTsKKwl9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL3NpbXVsYXRpb24vU2ltQ29udGludW91c091dHB1dC5oIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvc2ltdWxhdGlvbi9TaW1Db250aW51b3VzT3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL3NpbXVsYXRpb24vU2ltQ29udGludW91c091dHB1dC5oCkBAIC0wLDAgKzEsNDEgQEAKKworCisjaWZuZGVmIF9TSU1fU1BFRURfQ09OVFJPTExFUl9ICisjZGVmaW5lIF9TSU1fU1BFRURfQ09OVFJPTExFUl9ICisKKyNpZmRlZiBfV0lOMzIKKyAgLy8gRW5zdXJlIHRoYXQgV2luc29jazIuaCBpcyBpbmNsdWRlZCBiZWZvcmUgV2luZG93cy5oLCB3aGljaCBjYW4gZ2V0CisgIC8vIHB1bGxlZCBpbiBieSBhbnlib2R5IChlLmcuLCBCb29zdCkuCisgICNpbmNsdWRlIDxXaW5zb2NrMi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnYXplYm8vdHJhbnNwb3J0L3RyYW5zcG9ydC5oaD4KKyNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGdhemVibzsKKworY2xhc3MgU2ltQ29udGludW91c091dHB1dCB7Citwcml2YXRlOgorCXRyYW5zcG9ydDo6UHVibGlzaGVyUHRyIHB1YjsKKwlmbG9hdCBzcGVlZDsKKworcHVibGljOgorCVNpbUNvbnRpbnVvdXNPdXRwdXQoc3RkOjpzdHJpbmcgdG9waWMpOworCisJLyoqCisJICogU2V0IHRoZSBvdXRwdXQgdmFsdWUuCisJICoKKwkgKiBUaGUgdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkKKwkgKiBzY2FsaW5nIHRoZSB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorCSAqLworCXZvaWQgU2V0KGZsb2F0IHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlLgorCSAqLworCWZsb2F0IEdldCgpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9zaW11bGF0aW9uL1NpbURpZ2l0YWxJbnB1dC5oIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvc2ltdWxhdGlvbi9TaW1EaWdpdGFsSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVjMTlmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvc2ltdWxhdGlvbi9TaW1EaWdpdGFsSW5wdXQuaApAQCAtMCwwICsxLDI2IEBACisKKworI2lmbmRlZiBfU0lNX0RJR0lUQUxfSU5QVVRfSAorI2RlZmluZSBfU0lNX0RJR0lUQUxfSU5QVVRfSAorCisjaW5jbHVkZSAic2ltdWxhdGlvbi9nel9tc2dzL21zZ3MuaCIKKyNpbmNsdWRlIDxnYXplYm8vdHJhbnNwb3J0L3RyYW5zcG9ydC5oaD4KKwordXNpbmcgbmFtZXNwYWNlIGdhemVibzsKKworY2xhc3MgU2ltRGlnaXRhbElucHV0IHsKK3B1YmxpYzoKKwlTaW1EaWdpdGFsSW5wdXQoc3RkOjpzdHJpbmcgdG9waWMpOworCisJLyoqCisJICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHBvdGVudGlvbWV0ZXIuCisJICovCisJYm9vbCBHZXQoKTsKKworcHJpdmF0ZToKKwlib29sIHZhbHVlOworICAgIHRyYW5zcG9ydDo6U3Vic2NyaWJlclB0ciBzdWI7CisgICAgdm9pZCBjYWxsYmFjayhjb25zdCBtc2dzOjpDb25zdEJvb2xQdHIgJm1zZyk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL3NpbXVsYXRpb24vU2ltRW5jb2Rlci5oIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvc2ltdWxhdGlvbi9TaW1FbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzNzcyMwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL3NpbXVsYXRpb24vU2ltRW5jb2Rlci5oCkBAIC0wLDAgKzEsMzIgQEAKKworCisjaWZuZGVmIF9TSU1fRU5DT0RFUl9ICisjZGVmaW5lIF9TSU1fRU5DT0RFUl9ICisKKyNpbmNsdWRlICJzaW11bGF0aW9uL2d6X21zZ3MvbXNncy5oIgorI2luY2x1ZGUgPGdhemViby90cmFuc3BvcnQvdHJhbnNwb3J0LmhoPgorI2luY2x1ZGUgPGdhemViby9jb21tb24vVGltZS5oaD4KKwordXNpbmcgbmFtZXNwYWNlIGdhemVibzsKKworY2xhc3MgU2ltRW5jb2RlciB7CitwdWJsaWM6CisJU2ltRW5jb2RlcihzdGQ6OnN0cmluZyB0b3BpYyk7CisKKwl2b2lkIFJlc2V0KCk7CisJdm9pZCBTdGFydCgpOworCXZvaWQgU3RvcCgpOworCWRvdWJsZSBHZXRQb3NpdGlvbigpOworCWRvdWJsZSBHZXRWZWxvY2l0eSgpOworCitwcml2YXRlOgorCXZvaWQgc2VuZENvbW1hbmQoc3RkOjpzdHJpbmcgY21kKTsKKworCWRvdWJsZSBwb3NpdGlvbiwgdmVsb2NpdHk7CisJdHJhbnNwb3J0OjpTdWJzY3JpYmVyUHRyIHBvc1N1YiwgdmVsU3ViOworCXRyYW5zcG9ydDo6UHVibGlzaGVyUHRyIGNvbW1hbmRQdWI7CisJdm9pZCBwb3NpdGlvbkNhbGxiYWNrKGNvbnN0IG1zZ3M6OkNvbnN0RmxvYXQ2NFB0ciAmbXNnKTsKKwl2b2lkIHZlbG9jaXR5Q2FsbGJhY2soY29uc3QgbXNnczo6Q29uc3RGbG9hdDY0UHRyICZtc2cpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9zaW11bGF0aW9uL1NpbUZsb2F0SW5wdXQuaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL3NpbXVsYXRpb24vU2ltRmxvYXRJbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzFiOTYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9zaW11bGF0aW9uL1NpbUZsb2F0SW5wdXQuaApAQCAtMCwwICsxLDI2IEBACisKKworI2lmbmRlZiBfU0lNX0ZMT0FUX0lOUFVUX0gKKyNkZWZpbmUgX1NJTV9GTE9BVF9JTlBVVF9ICisKKyNpbmNsdWRlICJzaW11bGF0aW9uL2d6X21zZ3MvbXNncy5oIgorI2luY2x1ZGUgPGdhemViby90cmFuc3BvcnQvdHJhbnNwb3J0LmhoPgorCit1c2luZyBuYW1lc3BhY2UgZ2F6ZWJvOworCitjbGFzcyBTaW1GbG9hdElucHV0IHsKK3B1YmxpYzoKKwlTaW1GbG9hdElucHV0KHN0ZDo6c3RyaW5nIHRvcGljKTsKKworCS8qKgorCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwb3RlbnRpb21ldGVyLgorCSAqLworCWRvdWJsZSBHZXQoKTsKKworcHJpdmF0ZToKKwlkb3VibGUgdmFsdWU7CisgICAgdHJhbnNwb3J0OjpTdWJzY3JpYmVyUHRyIHN1YjsKKyAgICB2b2lkIGNhbGxiYWNrKGNvbnN0IG1zZ3M6OkNvbnN0RmxvYXQ2NFB0ciAmbXNnKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvc2ltdWxhdGlvbi9TaW1HeXJvLmggYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9zaW11bGF0aW9uL1NpbUd5cm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I4MWY2Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL2luY2x1ZGUvc2ltdWxhdGlvbi9TaW1HeXJvLmgKQEAgLTAsMCArMSwyOSBAQAorCisKKyNpZm5kZWYgX1NJTV9HWVJPX0gKKyNkZWZpbmUgX1NJTV9HWVJPX0gKKworI2luY2x1ZGUgInNpbXVsYXRpb24vZ3pfbXNncy9tc2dzLmgiCisjaW5jbHVkZSA8Z2F6ZWJvL3RyYW5zcG9ydC90cmFuc3BvcnQuaGg+CisKK3VzaW5nIG5hbWVzcGFjZSBnYXplYm87CisKK2NsYXNzIFNpbUd5cm8geworcHVibGljOgorCVNpbUd5cm8oc3RkOjpzdHJpbmcgdG9waWMpOworCisgICAgdm9pZCBSZXNldCgpOworICAgIGRvdWJsZSBHZXRBbmdsZSgpOworICAgIGRvdWJsZSBHZXRWZWxvY2l0eSgpOworCitwcml2YXRlOgorICAgIHZvaWQgc2VuZENvbW1hbmQoc3RkOjpzdHJpbmcgY21kKTsKKworICAgIGRvdWJsZSBwb3NpdGlvbiwgdmVsb2NpdHk7CisgICAgdHJhbnNwb3J0OjpTdWJzY3JpYmVyUHRyIHBvc1N1YiwgdmVsU3ViOworICAgIHRyYW5zcG9ydDo6UHVibGlzaGVyUHRyIGNvbW1hbmRQdWI7CisgICAgdm9pZCBwb3NpdGlvbkNhbGxiYWNrKGNvbnN0IG1zZ3M6OkNvbnN0RmxvYXQ2NFB0ciAmbXNnKTsKKyAgICB2b2lkIHZlbG9jaXR5Q2FsbGJhY2soY29uc3QgbXNnczo6Q29uc3RGbG9hdDY0UHRyICZtc2cpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9zaW11bGF0aW9uL3NpbVRpbWUuaCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9pbmNsdWRlL3NpbXVsYXRpb24vc2ltVGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZmUwYzUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vaW5jbHVkZS9zaW11bGF0aW9uL3NpbVRpbWUuaApAQCAtMCwwICsxLDE4IEBACisjcHJhZ21hIG9uY2UKKworCisjaWZkZWYgX1dJTjMyCisgIC8vIEVuc3VyZSB0aGF0IFdpbnNvY2syLmggaXMgaW5jbHVkZWQgYmVmb3JlIFdpbmRvd3MuaCwgd2hpY2ggY2FuIGdldAorICAvLyBwdWxsZWQgaW4gYnkgYW55Ym9keSAoZS5nLiwgQm9vc3QpLgorICAjaW5jbHVkZSA8V2luc29jazIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic2ltdWxhdGlvbi9TaW1GbG9hdElucHV0LmgiCisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSB3cGlsaWIgeyBuYW1lc3BhY2UgaW50ZXJuYWwgeworICAgIGV4dGVybiBkb3VibGUgc2ltVGltZTsKKyAgICBleHRlcm4gdm9pZCB0aW1lX2NhbGxiYWNrKGNvbnN0IG1zZ3M6OkNvbnN0RmxvYXQ2NFB0ciAmbXNnKTsKK319CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0FuYWxvZ0lucHV0LmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvQW5hbG9nSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYzQ4YzUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0FuYWxvZ0lucHV0LmNwcApAQCAtMCwwICsxLDkyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKKy8qKgorICogQ29uc3RydWN0IGFuIGFuYWxvZyBpbnB1dC4KKyAqIAorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIHRvIHJlcHJlc2VudC4KKyAqLworQW5hbG9nSW5wdXQ6OkFuYWxvZ0lucHV0KHVpbnQzMl90IGNoYW5uZWwpCit7CisJbV9jaGFubmVsID0gY2hhbm5lbDsKKwljaGFyIGJ1ZmZlcls1MF07CisJaW50IG4gPSBzcHJpbnRmKGJ1ZmZlciwgImFuYWxvZy8lZCIsIGNoYW5uZWwpOworCW1faW1wbCA9IG5ldyBTaW1GbG9hdElucHV0KGJ1ZmZlcik7CisKKwlMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRTZW5zb3IoIkFuYWxvZ0lucHV0IiwgY2hhbm5lbCwgdGhpcyk7Cit9CisKKy8qKgorICogR2V0IGEgc2NhbGVkIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoaXMgY2hhbm5lbC4KKyAqIFRoZSB2YWx1ZSBpcyBzY2FsZWQgdG8gdW5pdHMgb2YgVm9sdHMgdXNpbmcgdGhlIGNhbGlicmF0ZWQgc2NhbGluZyBkYXRhIGZyb20gR2V0TFNCV2VpZ2h0KCkgYW5kIEdldE9mZnNldCgpLgorICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCisgKi8KK2Zsb2F0IEFuYWxvZ0lucHV0OjpHZXRWb2x0YWdlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbXBsLT5HZXQoKTsKK30KKworLyoqCisgKiBHZXQgYSBzY2FsZWQgc2FtcGxlIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUgZm9yIHRoaXMgY2hhbm5lbC4KKyAqIFRoZSB2YWx1ZSBpcyBzY2FsZWQgdG8gdW5pdHMgb2YgVm9sdHMgdXNpbmcgdGhlIGNhbGlicmF0ZWQgc2NhbGluZyBkYXRhIGZyb20gR2V0TFNCV2VpZ2h0KCkgYW5kIEdldE9mZnNldCgpLgorICogVXNpbmcgb3ZlcnNhbXBsaW5nIHdpbGwgY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBoaWdoZXIgcmVzb2x1dGlvbiwgYnV0IGl0IHdpbGwgdXBkYXRlIG1vcmUgc2xvd2x5LgorICogVXNpbmcgYXZlcmFnaW5nIHdpbGwgY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBtb3JlIHN0YWJsZSwgYnV0IGl0IHdpbGwgdXBkYXRlIG1vcmUgc2xvd2x5LgorICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcyBjaGFubmVsLgorICovCitmbG9hdCBBbmFsb2dJbnB1dDo6R2V0QXZlcmFnZVZvbHRhZ2UoKSBjb25zdAoreworICAgIHJldHVybiBtX2ltcGwtPkdldCgpOworfQorCisvKioKKyAqIEdldCB0aGUgY2hhbm5lbCBudW1iZXIuCisgKiBAcmV0dXJuIFRoZSBjaGFubmVsIG51bWJlci4KKyAqLwordWludDMyX3QgQW5hbG9nSW5wdXQ6OkdldENoYW5uZWwoKSBjb25zdAoreworCXJldHVybiBtX2NoYW5uZWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBBdmVyYWdlIHZhbHVlIGZvciB0aGUgUElEIFNvdXJjZSBiYXNlIG9iamVjdC4KKyAqIAorICogQHJldHVybiBUaGUgYXZlcmFnZSB2b2x0YWdlLgorICovCitkb3VibGUgQW5hbG9nSW5wdXQ6OlBJREdldCgpCit7CisJcmV0dXJuIEdldEF2ZXJhZ2VWb2x0YWdlKCk7Cit9CisKK3ZvaWQgQW5hbG9nSW5wdXQ6OlVwZGF0ZVRhYmxlKCkgeworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKwkJbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldEF2ZXJhZ2VWb2x0YWdlKCkpOworCX0KK30KKwordm9pZCBBbmFsb2dJbnB1dDo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsKKwkKK30KKwordm9pZCBBbmFsb2dJbnB1dDo6U3RvcExpdmVXaW5kb3dNb2RlKCkgeworCQorfQorCitzdGQ6OnN0cmluZyBBbmFsb2dJbnB1dDo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworCXJldHVybiAiQW5hbG9nIElucHV0IjsKK30KKwordm9pZCBBbmFsb2dJbnB1dDo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSB7CisJbV90YWJsZSA9IHN1YlRhYmxlOworCVVwZGF0ZVRhYmxlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEFuYWxvZ0lucHV0OjpHZXRUYWJsZSgpIGNvbnN0IHsKKwlyZXR1cm4gbV90YWJsZTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvQW5hbG9nUG90ZW50aW9tZXRlci5jcHAgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0FuYWxvZ1BvdGVudGlvbWV0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzEyYzEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0FuYWxvZ1BvdGVudGlvbWV0ZXIuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKworI2luY2x1ZGUgIkFuYWxvZ1BvdGVudGlvbWV0ZXIuaCIKKworLyoqCisgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAqLwordm9pZCBBbmFsb2dQb3RlbnRpb21ldGVyOjppbml0UG90KEFuYWxvZ0lucHV0ICppbnB1dCwgZG91YmxlIHNjYWxlLCBkb3VibGUgb2Zmc2V0KSB7CisgICAgbV9zY2FsZSA9IHNjYWxlOworICAgIG1fb2Zmc2V0ID0gb2Zmc2V0OworICAgIG1fYW5hbG9nX2lucHV0ID0gaW5wdXQ7Cit9CisKK0FuYWxvZ1BvdGVudGlvbWV0ZXI6OkFuYWxvZ1BvdGVudGlvbWV0ZXIoaW50IGNoYW5uZWwsIGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgeworICAgIG1faW5pdF9hbmFsb2dfaW5wdXQgPSB0cnVlOworICAgIGluaXRQb3QobmV3IEFuYWxvZ0lucHV0KGNoYW5uZWwpLCBzY2FsZSwgb2Zmc2V0KTsKK30KKworQW5hbG9nUG90ZW50aW9tZXRlcjo6QW5hbG9nUG90ZW50aW9tZXRlcihBbmFsb2dJbnB1dCAqaW5wdXQsIGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgeworICAgIG1faW5pdF9hbmFsb2dfaW5wdXQgPSBmYWxzZTsKKyAgICBpbml0UG90KGlucHV0LCBzY2FsZSwgb2Zmc2V0KTsKK30KKworQW5hbG9nUG90ZW50aW9tZXRlcjo6QW5hbG9nUG90ZW50aW9tZXRlcihBbmFsb2dJbnB1dCAmaW5wdXQsIGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgeworICAgIG1faW5pdF9hbmFsb2dfaW5wdXQgPSBmYWxzZTsKKyAgICBpbml0UG90KCZpbnB1dCwgc2NhbGUsIG9mZnNldCk7Cit9CisKK0FuYWxvZ1BvdGVudGlvbWV0ZXI6On5BbmFsb2dQb3RlbnRpb21ldGVyKCkgeworICBpZihtX2luaXRfYW5hbG9nX2lucHV0KXsKKyAgICBkZWxldGUgbV9hbmFsb2dfaW5wdXQ7CisgICAgbV9pbml0X2FuYWxvZ19pbnB1dCA9IGZhbHNlOworICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHJlYWRpbmcgb2YgdGhlIHBvdGVudGlvbWVyZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb3RlbnRpb21ldGVyLgorICovCitkb3VibGUgQW5hbG9nUG90ZW50aW9tZXRlcjo6R2V0KCkgY29uc3QgeworICAgIHJldHVybiBtX2FuYWxvZ19pbnB1dC0+R2V0Vm9sdGFnZSgpICogbV9zY2FsZSArIG1fb2Zmc2V0OworfQorCisvKioKKyAqIEltcGxlbWVudCB0aGUgUElEU291cmNlIGludGVyZmFjZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJlYWRpbmcuCisgKi8KK2RvdWJsZSBBbmFsb2dQb3RlbnRpb21ldGVyOjpQSURHZXQoKSB7CisgICAgcmV0dXJuIEdldCgpOworfQorCisKKy8qKgorICogQHJldHVybiB0aGUgU21hcnQgRGFzaGJvYXJkIFR5cGUKKyAqLworc3RkOjpzdHJpbmcgQW5hbG9nUG90ZW50aW9tZXRlcjo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiAiQW5hbG9nIElucHV0IjsKK30KKworLyoqCisgKiBMaXZlIFdpbmRvdyBjb2RlLCBvbmx5IGRvZXMgYW55dGhpbmcgaWYgbGl2ZSB3aW5kb3cgaXMgYWN0aXZhdGVkLgorICovCit2b2lkIEFuYWxvZ1BvdGVudGlvbWV0ZXI6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJ0YWJsZSkgeworICAgIG1fdGFibGUgPSBzdWJ0YWJsZTsKKyAgICBVcGRhdGVUYWJsZSgpOworfQorCit2b2lkIEFuYWxvZ1BvdGVudGlvbWV0ZXI6OlVwZGF0ZVRhYmxlKCkgeworICAgIGlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldCgpKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IEFuYWxvZ1BvdGVudGlvbWV0ZXI6OkdldFRhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBtX3RhYmxlOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9EaWdpdGFsSW5wdXQuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9EaWdpdGFsSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YWUzNmQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0RpZ2l0YWxJbnB1dC5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgRGlnaXRhbCBJbnB1dCBjbGFzcy4KKyAqIENyZWF0ZXMgYSBkaWdpdGFsIGlucHV0IGdpdmVuIGEgY2hhbm5lbCBhbmQgdXNlcyB0aGUgZGVmYXVsdCBtb2R1bGUuCisgKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGRpZ2l0YWwgY2hhbm5lbCAoMS4uMTQpLgorICovCitEaWdpdGFsSW5wdXQ6OkRpZ2l0YWxJbnB1dCh1aW50MzJfdCBjaGFubmVsKQoreworCWNoYXIgYnVmWzY0XTsKKwltX2NoYW5uZWwgPSBjaGFubmVsOworCWludCBuID0gc3ByaW50ZihidWYsICJkaW8vJWQiLCBjaGFubmVsKTsKKwltX2ltcGwgPSBuZXcgU2ltRGlnaXRhbElucHV0KGJ1Zik7Cit9CisKKy8qCisgKiBHZXQgdGhlIHZhbHVlIGZyb20gYSBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCisgKiBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgZGlnaXRhbCBpbnB1dCBjaGFubmVsIGZyb20gdGhlIEZQR0EuCisgKi8KK3VpbnQzMl90IERpZ2l0YWxJbnB1dDo6R2V0KCkgY29uc3QKK3sKKwlyZXR1cm4gbV9pbXBsLT5HZXQoKTsKK30KKworLyoqCisgKiBAcmV0dXJuIFRoZSBHUElPIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KKyAqLwordWludDMyX3QgRGlnaXRhbElucHV0OjpHZXRDaGFubmVsKCkgY29uc3QKK3sKKwlyZXR1cm4gbV9jaGFubmVsOworfQorCit2b2lkIERpZ2l0YWxJbnB1dDo6VXBkYXRlVGFibGUoKSB7CisJaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworCQltX3RhYmxlLT5QdXRCb29sZWFuKCJWYWx1ZSIsIEdldCgpKTsKKwl9Cit9CisKK3ZvaWQgRGlnaXRhbElucHV0OjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworCit9CisKK3ZvaWQgRGlnaXRhbElucHV0OjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7CisKK30KKworc3RkOjpzdHJpbmcgRGlnaXRhbElucHV0OjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisJcmV0dXJuICJEaWdpdGFsSW5wdXQiOworfQorCit2b2lkIERpZ2l0YWxJbnB1dDo6SW5pdFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IHN1YlRhYmxlKSB7CisJbV90YWJsZSA9IHN1YlRhYmxlOworCVVwZGF0ZVRhYmxlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJVGFibGU+IERpZ2l0YWxJbnB1dDo6R2V0VGFibGUoKSBjb25zdCB7CisJcmV0dXJuIG1fdGFibGU7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0RvdWJsZVNvbGVub2lkLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvRG91YmxlU29sZW5vaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZDA5MTcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0RvdWJsZVNvbGVub2lkLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiRG91YmxlU29sZW5vaWQuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworLyoqCisgKiBDb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gZm9yd2FyZENoYW5uZWwgVGhlIGZvcndhcmQgY2hhbm5lbCBvbiB0aGUgbW9kdWxlIHRvIGNvbnRyb2wuCisgKiBAcGFyYW0gcmV2ZXJzZUNoYW5uZWwgVGhlIHJldmVyc2UgY2hhbm5lbCBvbiB0aGUgbW9kdWxlIHRvIGNvbnRyb2wuCisgKi8KK0RvdWJsZVNvbGVub2lkOjpEb3VibGVTb2xlbm9pZCh1aW50MzJfdCBmb3J3YXJkQ2hhbm5lbCwgdWludDMyX3QgcmV2ZXJzZUNoYW5uZWwpCisgIDogRG91YmxlU29sZW5vaWQoMSwgZm9yd2FyZENoYW5uZWwsIHJldmVyc2VDaGFubmVsKSB7fQorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgVGhlIHNvbGVub2lkIG1vZHVsZSAoMSBvciAyKS4KKyAqIEBwYXJhbSBmb3J3YXJkQ2hhbm5lbCBUaGUgZm9yd2FyZCBjaGFubmVsIG9uIHRoZSBtb2R1bGUgdG8gY29udHJvbC4KKyAqIEBwYXJhbSByZXZlcnNlQ2hhbm5lbCBUaGUgcmV2ZXJzZSBjaGFubmVsIG9uIHRoZSBtb2R1bGUgdG8gY29udHJvbC4KKyAqLworRG91YmxlU29sZW5vaWQ6OkRvdWJsZVNvbGVub2lkKHVpbnQ4X3QgbW9kdWxlTnVtYmVyLCB1aW50MzJfdCBmb3J3YXJkQ2hhbm5lbCwgdWludDMyX3QgcmV2ZXJzZUNoYW5uZWwpCit7CisgICAgbV9yZXZlcnNlZCA9IGZhbHNlOworICAgIGlmIChyZXZlcnNlQ2hhbm5lbCA8IGZvcndhcmRDaGFubmVsKSB7IC8vIFN3YXAgcG9ydHMgdG8gZ2V0IHRoZSByaWdodCBhZGRyZXNzCisgICAgICAgIGludCBjaGFubmVsID0gcmV2ZXJzZUNoYW5uZWw7CisgICAgICAgIHJldmVyc2VDaGFubmVsID0gZm9yd2FyZENoYW5uZWw7CisgICAgICAgIGZvcndhcmRDaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgbV9yZXZlcnNlZCA9IHRydWU7CisgICAgfQorICAgIGNoYXIgYnVmZmVyWzUwXTsKKyAgICBpbnQgbiA9IHNwcmludGYoYnVmZmVyLCAicG5ldW1hdGljLyVkLyVkLyVkLyVkIiwgbW9kdWxlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBmb3J3YXJkQ2hhbm5lbCwgbW9kdWxlTnVtYmVyLCByZXZlcnNlQ2hhbm5lbCk7CisgICAgbV9pbXBsID0gbmV3IFNpbUNvbnRpbnVvdXNPdXRwdXQoYnVmZmVyKTsgIAorICAKKwlMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRBY3R1YXRvcigiRG91YmxlU29sZW5vaWQiLCBtb2R1bGVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZENoYW5uZWwsIHRoaXMpOworfQorCitEb3VibGVTb2xlbm9pZDo6fkRvdWJsZVNvbGVub2lkKCkgeworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7Cit9CisKKy8qKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNvbGVub2lkLgorICoKKyAqIEBwYXJhbSB2YWx1ZSBNb3ZlIHRoZSBzb2xlbm9pZCB0byBmb3J3YXJkLCByZXZlcnNlLCBvciBkb24ndCBtb3ZlIGl0LgorICovCit2b2lkIERvdWJsZVNvbGVub2lkOjpTZXQoVmFsdWUgdmFsdWUpCit7CisgICAgbV92YWx1ZSA9IHZhbHVlOworCXN3aXRjaCh2YWx1ZSkKKwl7CisJY2FzZSBrT2ZmOgorICAgICAgICBtX2ltcGwtPlNldCgwKTsKKyAgICAgICAgYnJlYWs7CisJY2FzZSBrRm9yd2FyZDoKKyAgICAgICAgbV9pbXBsLT5TZXQobV9yZXZlcnNlZCA/IC0xIDogMSk7CisJCWJyZWFrOworCWNhc2Uga1JldmVyc2U6CisgICAgICAgIG1faW1wbC0+U2V0KG1fcmV2ZXJzZWQgPyAxIDogLTEpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCisgKi8KK0RvdWJsZVNvbGVub2lkOjpWYWx1ZSBEb3VibGVTb2xlbm9pZDo6R2V0KCkgY29uc3QKK3sKKwlyZXR1cm4gbV92YWx1ZTsKK30KKwordm9pZCBEb3VibGVTb2xlbm9pZDo6VmFsdWVDaGFuZ2VkKElUYWJsZSAqc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOZXcpIHsKKyAgaWYgKCF2YWx1ZS0+SXNTdHJpbmcoKSkgcmV0dXJuOworICBWYWx1ZSBsdmFsdWUgPSBrT2ZmOworCWlmICh2YWx1ZS0+R2V0U3RyaW5nKCkgPT0gIkZvcndhcmQiKQorCQlsdmFsdWUgPSBrRm9yd2FyZDsKKwllbHNlIGlmICh2YWx1ZS0+R2V0U3RyaW5nKCkgPT0gIlJldmVyc2UiKQorCQlsdmFsdWUgPSBrUmV2ZXJzZTsKKwlTZXQobHZhbHVlKTsKK30KKwordm9pZCBEb3VibGVTb2xlbm9pZDo6VXBkYXRlVGFibGUoKSB7CisJaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworCQltX3RhYmxlLT5QdXRTdHJpbmcoIlZhbHVlIiwgKEdldCgpID09IGtGb3J3YXJkID8gIkZvcndhcmQiIDogKEdldCgpID09IGtSZXZlcnNlID8gIlJldmVyc2UiIDogIk9mZiIpKSk7CisJfQorfQorCit2b2lkIERvdWJsZVNvbGVub2lkOjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworCVNldChrT2ZmKTsKKwlpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisJCW1fdGFibGUtPkFkZFRhYmxlTGlzdGVuZXIoIlZhbHVlIiwgdGhpcywgdHJ1ZSk7CisJfQorfQorCit2b2lkIERvdWJsZVNvbGVub2lkOjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7CisJU2V0KGtPZmYpOworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKwkJbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKwl9Cit9CisKK3N0ZDo6c3RyaW5nIERvdWJsZVNvbGVub2lkOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisJcmV0dXJuICJEb3VibGUgU29sZW5vaWQiOworfQorCit2b2lkIERvdWJsZVNvbGVub2lkOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKwltX3RhYmxlID0gc3ViVGFibGU7CisJVXBkYXRlVGFibGUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gRG91YmxlU29sZW5vaWQ6OkdldFRhYmxlKCkgY29uc3QgeworCXJldHVybiBtX3RhYmxlOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9Ecml2ZXJTdGF0aW9uLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvRHJpdmVyU3RhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4MDJhYgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvRHJpdmVyU3RhdGlvbi5jcHAKQEAgLTAsMCArMSw1MTggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIkxvZy5ocHAiCisKKy8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAorVExvZ0xldmVsIGRzTG9nTGV2ZWwgPSBsb2dERUJVRzsKK2NvbnN0IGRvdWJsZSBKT1lTVElDS19VTlBMVUdHRURfTUVTU0FHRV9JTlRFUlZBTCA9IDEuMDsKKworI2RlZmluZSBEU19MT0cobGV2ZWwpIFwKKyAgaWYgKGxldmVsID4gZHNMb2dMZXZlbCkgOyBcCisgIGVsc2UgTG9nKCkuR2V0KGxldmVsKQorCitjb25zdCB1aW50MzJfdCBEcml2ZXJTdGF0aW9uOjprSm95c3RpY2tQb3J0czsKKworLyoqCisgKiBEcml2ZXJTdGF0aW9uIGNvbnN0cnVjdG9yLgorICoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgb25jZSB0aGUgZmlyc3QgdGltZSBHZXRJbnN0YW5jZSgpIGlzIGNhbGxlZAorICovCitEcml2ZXJTdGF0aW9uOjpEcml2ZXJTdGF0aW9uKCkgeworICAvLyBBbGwgam95c3RpY2tzIHNob3VsZCBkZWZhdWx0IHRvIGhhdmluZyB6ZXJvIGF4ZXMsIHBvdnMgYW5kIGJ1dHRvbnMsIHNvCisgIC8vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGRvZXNuJ3QgZ2V0IHNlbnQgdG8gc3BlZWQgY29udHJvbGxlcnMuCisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwga0pveXN0aWNrUG9ydHM7IGkrKykgeworICAgIG1fam95c3RpY2tBeGVzW2ldLmNvdW50ID0gMDsKKyAgICBtX2pveXN0aWNrUE9Wc1tpXS5jb3VudCA9IDA7CisgICAgbV9qb3lzdGlja0J1dHRvbnNbaV0uY291bnQgPSAwOworICAgIG1fam95c3RpY2tEZXNjcmlwdG9yW2ldLmlzWGJveCA9IDA7CisgICAgbV9qb3lzdGlja0Rlc2NyaXB0b3JbaV0udHlwZSA9IC0xOworICAgIG1fam95c3RpY2tEZXNjcmlwdG9yW2ldLm5hbWVbMF0gPSAnXDAnOworICB9CisgIC8vIFJlZ2lzdGVyIHRoYXQgc2VtYXBob3JlIHdpdGggdGhlIG5ldHdvcmsgY29tbXVuaWNhdGlvbnMgdGFzay4KKyAgLy8gSXQgd2lsbCBzaWduYWwgd2hlbiBuZXcgcGFja2V0IGRhdGEgaXMgYXZhaWxhYmxlLgorICBIQUxTZXROZXdEYXRhU2VtKG1fcGFja2V0RGF0YUF2YWlsYWJsZUNvbmQubmF0aXZlX2hhbmRsZSgpKTsKKworICBBZGRUb1NpbmdsZXRvbkxpc3QoKTsKKworfQorCit2b2lkIERyaXZlclN0YXRpb246OlJ1bigpIHsKKyAgaW50IHBlcmlvZCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgeworICAgICAgc3RkOjp1bmlxdWVfbG9jazxwcmlvcml0eV9tdXRleD4gbG9jayhtX3BhY2tldERhdGFBdmFpbGFibGVNdXRleCk7CisgICAgICBtX3BhY2tldERhdGFBdmFpbGFibGVDb25kLndhaXQobG9jayk7CisgICAgfQorICAgIEdldERhdGEoKTsKKyAgICBtX3dhaXRGb3JEYXRhQ29uZC5ub3RpZnlfYWxsKCk7CisKKyAgICBpZiAoKytwZXJpb2QgPj0gNCkgeworICAgICAgTW90b3JTYWZldHlIZWxwZXI6OkNoZWNrTW90b3JzKCk7CisgICAgICBwZXJpb2QgPSAwOworICAgIH0KKyAgICBpZiAobV91c2VySW5EaXNhYmxlZCkgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1EaXNhYmxlZCgpOworICAgIGlmIChtX3VzZXJJbkF1dG9ub21vdXMpIEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cygpOworICAgIGlmIChtX3VzZXJJblRlbGVvcCkgSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1UZWxlb3AoKTsKKyAgICBpZiAobV91c2VySW5UZXN0KSBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbVRlc3QoKTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIERyaXZlclN0YXRpb24uCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIERTIGluc3RhbmNlCisgKi8KK0RyaXZlclN0YXRpb24gJkRyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCkgeworICBzdGF0aWMgRHJpdmVyU3RhdGlvbiBpbnN0YW5jZTsKKyAgcmV0dXJuIGluc3RhbmNlOworfQorCisvKioKKyAqIENvcHkgZGF0YSBmcm9tIHRoZSBEUyB0YXNrIGZvciB0aGUgdXNlci4KKyAqIElmIG5vIG5ldyBkYXRhIGV4aXN0cywgaXQgd2lsbCBqdXN0IGJlIHJldHVybmVkLCBvdGhlcndpc2UKKyAqIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIERTIHBvbGxpbmcgbG9vcC4KKyAqLwordm9pZCBEcml2ZXJTdGF0aW9uOjpHZXREYXRhKCkgeworICAvLyBHZXQgdGhlIHN0YXR1cyBvZiBhbGwgb2YgdGhlIGpveXN0aWNrcworICBmb3IgKHVpbnQ4X3Qgc3RpY2sgPSAwOyBzdGljayA8IGtKb3lzdGlja1BvcnRzOyBzdGljaysrKSB7CisgICAgSEFMR2V0Sm95c3RpY2tBeGVzKHN0aWNrLCAmbV9qb3lzdGlja0F4ZXNbc3RpY2tdKTsKKyAgICBIQUxHZXRKb3lzdGlja1BPVnMoc3RpY2ssICZtX2pveXN0aWNrUE9Wc1tzdGlja10pOworICAgIEhBTEdldEpveXN0aWNrQnV0dG9ucyhzdGljaywgJm1fam95c3RpY2tCdXR0b25zW3N0aWNrXSk7CisgICAgSEFMR2V0Sm95c3RpY2tEZXNjcmlwdG9yKHN0aWNrLCAmbV9qb3lzdGlja0Rlc2NyaXB0b3Jbc3RpY2tdKTsKKyAgfQorICBtX25ld0NvbnRyb2xEYXRhLmdpdmUoKTsKK30KKworLyoqCisgKiBSZWFkIHRoZSBiYXR0ZXJ5IHZvbHRhZ2UuCisgKgorICogQHJldHVybiBUaGUgYmF0dGVyeSB2b2x0YWdlIGluIFZvbHRzLgorICovCitmbG9hdCBEcml2ZXJTdGF0aW9uOjpHZXRCYXR0ZXJ5Vm9sdGFnZSgpIGNvbnN0IHsKKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBmbG9hdCB2b2x0YWdlID0gZ2V0VmluVm9sdGFnZSgmc3RhdHVzKTsKKyAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCAiZ2V0VmluVm9sdGFnZSIpOworCisgIHJldHVybiB2b2x0YWdlOworfQorCisvKioKKyAqIFJlcG9ydHMgZXJyb3JzIHJlbGF0ZWQgdG8gdW5wbHVnZ2VkIGpveXN0aWNrcworICogVGhyb3R0bGVzIHRoZSBlcnJvcnMgc28gdGhhdCB0aGV5IGRvbid0IG92ZXJ3aGVsbSB0aGUgRFMKKyAqLwordm9pZCBEcml2ZXJTdGF0aW9uOjpSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKHN0ZDo6c3RyaW5nIG1lc3NhZ2UpIHsKKyAgZG91YmxlIGN1cnJlbnRUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKKyAgaWYgKGN1cnJlbnRUaW1lID4gbV9uZXh0TWVzc2FnZVRpbWUpIHsKKyAgICBSZXBvcnRFcnJvcihtZXNzYWdlKTsKKyAgICBtX25leHRNZXNzYWdlVGltZSA9IGN1cnJlbnRUaW1lICsgSk9ZU1RJQ0tfVU5QTFVHR0VEX01FU1NBR0VfSU5URVJWQUw7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXhlcyBvbiBhIGdpdmVuIGpveXN0aWNrIHBvcnQKKyAqCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHBvcnQgbnVtYmVyCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXhlcyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCisgKi8KK2ludCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0F4aXNDb3VudCh1aW50MzJfdCBzdGljaykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgSEFMSm95c3RpY2tBeGVzIGpveXN0aWNrQXhlczsKKyAgSEFMR2V0Sm95c3RpY2tBeGVzKHN0aWNrLCAmam95c3RpY2tBeGVzKTsKKyAgcmV0dXJuIGpveXN0aWNrQXhlcy5jb3VudDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBqb3lzdGljayBhdCB0aGUgZ2l2ZW4gcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGpveXN0aWNrIGF0IHRoZSBnaXZlbiBwb3J0CisgKi8KK3N0ZDo6c3RyaW5nIERyaXZlclN0YXRpb246OkdldEpveXN0aWNrTmFtZSh1aW50MzJfdCBzdGljaykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgIH0KKyAgc3RkOjpzdHJpbmcgcmV0VmFsKG1fam95c3RpY2tEZXNjcmlwdG9yWzBdLm5hbWUpOworICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgb2Ygam95c3RpY2sgYXQgYSBnaXZlbiBwb3J0CisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgorICogQHJldHVybiBUaGUgSElEIHR5cGUgb2Ygam95c3RpY2sgYXQgdGhlIGdpdmVuIHBvcnQKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldEpveXN0aWNrVHlwZSh1aW50MzJfdCBzdGljaykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAoaW50KW1fam95c3RpY2tEZXNjcmlwdG9yW3N0aWNrXS50eXBlOworfQorCisvKioKKyAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNvbnRyb2xsZXIgaXMgYW4geGJveCBjb250cm9sbGVyLgorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gQSBib29sZWFuIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgY29udHJvbGxlciBpcyBhbiB4Ym94IGNvbnRyb2xsZXIuCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6R2V0Sm95c3RpY2tJc1hib3godWludDMyX3Qgc3RpY2spIGNvbnN0IHsKKyAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gKGJvb2wpbV9qb3lzdGlja0Rlc2NyaXB0b3Jbc3RpY2tdLmlzWGJveDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSB0eXBlcyBvZiBBeGVzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIgYW5kIHRoZSB0YXJnZXQgYXhpcworICogQHJldHVybiBXaGF0IHR5cGUgb2YgYXhpcyB0aGUgYXhpcyBpcyByZXBvcnRpbmcgdG8gYmUKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldEpveXN0aWNrQXhpc1R5cGUodWludDMyX3Qgc3RpY2ssIHVpbnQ4X3QgYXhpcykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBtX2pveXN0aWNrRGVzY3JpcHRvcltzdGlja10uYXhpc1R5cGVzW2F4aXNdOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBQT1ZzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydAorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBQT1ZzIG9uIHRoZSBpbmRpY2F0ZWQgam95c3RpY2sKKyAqLworaW50IERyaXZlclN0YXRpb246OkdldFN0aWNrUE9WQ291bnQodWludDMyX3Qgc3RpY2spIGNvbnN0IHsKKyAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgIHJldHVybiAwOworICB9CisgIEhBTEpveXN0aWNrUE9WcyBqb3lzdGlja1BPVnM7CisgIEhBTEdldEpveXN0aWNrUE9WcyhzdGljaywgJmpveXN0aWNrUE9Wcyk7CisgIHJldHVybiBqb3lzdGlja1BPVnMuY291bnQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gYSBnaXZlbiBqb3lzdGljayBwb3J0CisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gdGhlIGluZGljYXRlZCBqb3lzdGljaworICovCitpbnQgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tCdXR0b25Db3VudCh1aW50MzJfdCBzdGljaykgY29uc3QgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgSEFMSm95c3RpY2tCdXR0b25zIGpveXN0aWNrQnV0dG9uczsKKyAgSEFMR2V0Sm95c3RpY2tCdXR0b25zKHN0aWNrLCAmam95c3RpY2tCdXR0b25zKTsKKyAgcmV0dXJuIGpveXN0aWNrQnV0dG9ucy5jb3VudDsKK30KKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBheGlzIG9uIGEgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKgorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgorICogQHBhcmFtIGF4aXMgVGhlIGFuYWxvZyBheGlzIHZhbHVlIHRvIHJlYWQgZnJvbSB0aGUgam95c3RpY2suCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXhpcyBvbiB0aGUgam95c3RpY2suCisgKi8KK2Zsb2F0IERyaXZlclN0YXRpb246OkdldFN0aWNrQXhpcyh1aW50MzJfdCBzdGljaywgdWludDMyX3QgYXhpcykgeworICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKKyAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYXhpcyA+PSBtX2pveXN0aWNrQXhlc1tzdGlja10uY291bnQpIHsKKyAgICBpZiAoYXhpcyA+PSBrTWF4Sm95c3RpY2tBeGVzKSB7CisgICAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tBeGlzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKAorICAgICAgICAgICJXQVJOSU5HOiBKb3lzdGljayBBeGlzIG1pc3NpbmcsIGNoZWNrIGlmIGFsbCBjb250cm9sbGVycyBhcmUgIgorICAgICAgICAgICJwbHVnZ2VkIGluXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDAuMGY7CisgIH0KKworICBpbnQ4X3QgdmFsdWUgPSBtX2pveXN0aWNrQXhlc1tzdGlja10uYXhlc1theGlzXTsKKworICBpZiAodmFsdWUgPCAwKSB7CisgICAgcmV0dXJuIHZhbHVlIC8gMTI4LjBmOworICB9IGVsc2UgeworICAgIHJldHVybiB2YWx1ZSAvIDEyNy4wZjsKKyAgfQorfQorCisvKioKKyAqIEdldCB0aGUgc3RhdGUgb2YgYSBQT1Ygb24gdGhlIGpveXN0aWNrLgorICoKKyAqIEByZXR1cm4gdGhlIGFuZ2xlIG9mIHRoZSBQT1YgaW4gZGVncmVlcywgb3IgLTEgaWYgdGhlIFBPViBpcyBub3QgcHJlc3NlZC4KKyAqLworaW50IERyaXZlclN0YXRpb246OkdldFN0aWNrUE9WKHVpbnQzMl90IHN0aWNrLCB1aW50MzJfdCBwb3YpIHsKKyAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChwb3YgPj0gbV9qb3lzdGlja1BPVnNbc3RpY2tdLmNvdW50KSB7CisgICAgaWYgKHBvdiA+PSBrTWF4Sm95c3RpY2tQT1ZzKSB7CisgICAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tBeGlzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKAorICAgICAgICAgICJXQVJOSU5HOiBKb3lzdGljayBQT1YgbWlzc2luZywgY2hlY2sgaWYgYWxsIGNvbnRyb2xsZXJzIGFyZSBwbHVnZ2VkICIKKyAgICAgICAgICAiaW5cbiIpOworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gbV9qb3lzdGlja1BPVnNbc3RpY2tdLnBvdnNbcG92XTsKK30KKworLyoqCisgKiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbnMgb24gdGhlIGpveXN0aWNrLgorICoKKyAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgdG8gcmVhZC4KKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b25zIG9uIHRoZSBqb3lzdGljay4KKyAqLwordWludDMyX3QgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tCdXR0b25zKHVpbnQzMl90IHN0aWNrKSBjb25zdCB7CisgIGlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykgeworICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10uYnV0dG9uczsKK30KKworLyoqCisgKiBUaGUgc3RhdGUgb2Ygb25lIGpveXN0aWNrIGJ1dHRvbi4gQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMS4KKyAqCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHRvIHJlYWQuCisgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gaW5kZXgsIGJlZ2lubmluZyBhdCAxLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGpveXN0aWNrIGJ1dHRvbi4KKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0J1dHRvbih1aW50MzJfdCBzdGljaywgdWludDhfdCBidXR0b24pIHsKKyAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7CisgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChidXR0b24gPiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10uY291bnQpIHsKKyAgICBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKAorICAgICAgICAiV0FSTklORzogSm95c3RpY2sgQnV0dG9uIG1pc3NpbmcsIGNoZWNrIGlmIGFsbCBjb250cm9sbGVycyBhcmUgIgorICAgICAgICAicGx1Z2dlZCBpblxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChidXR0b24gPT0gMCkgeworICAgIFJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3IoCisgICAgICAgICJFUlJPUjogQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMSBpbiBXUElMaWIgZm9yIEMrKyBhbmQgSmF2YSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gKCgweDEgPDwgKGJ1dHRvbiAtIDEpKSAmIG1fam95c3RpY2tCdXR0b25zW3N0aWNrXS5idXR0b25zKSAhPSAwOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBEUyBoYXMgZW5hYmxlZCB0aGUgcm9ib3QKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgZW5hYmxlZCBhbmQgdGhlIERTIGlzIGNvbm5lY3RlZAorICovCitib29sIERyaXZlclN0YXRpb246OklzRW5hYmxlZCgpIGNvbnN0IHsKKyAgSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gY29udHJvbFdvcmQuZW5hYmxlZCAmJiBjb250cm9sV29yZC5kc0F0dGFjaGVkOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSByb2JvdCBpcyBkaXNhYmxlZAorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBleHBsaWNpdGx5IGRpc2FibGVkIG9yIHRoZSBEUyBpcyBub3QgY29ubmVjdGVkCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNEaXNhYmxlZCgpIGNvbnN0IHsKKyAgSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gIShjb250cm9sV29yZC5lbmFibGVkICYmIGNvbnRyb2xXb3JkLmRzQXR0YWNoZWQpOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBEUyBpcyBjb21tYW5kaW5nIGF1dG9ub21vdXMgbW9kZQorICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBiZWluZyBjb21tYW5kZWQgdG8gYmUgaW4gYXV0b25vbW91cyBtb2RlCisgKi8KK2Jvb2wgRHJpdmVyU3RhdGlvbjo6SXNBdXRvbm9tb3VzKCkgY29uc3QgeworICBIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKyAgbWVtc2V0KCZjb250cm9sV29yZCwgMCwgc2l6ZW9mKGNvbnRyb2xXb3JkKSk7CisgIEhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisgIHJldHVybiBjb250cm9sV29yZC5hdXRvbm9tb3VzOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBEUyBpcyBjb21tYW5kaW5nIHRlbGVvcCBtb2RlCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGJlaW5nIGNvbW1hbmRlZCB0byBiZSBpbiB0ZWxlb3AgbW9kZQorICovCitib29sIERyaXZlclN0YXRpb246OklzT3BlcmF0b3JDb250cm9sKCkgY29uc3QgeworICBIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKyAgbWVtc2V0KCZjb250cm9sV29yZCwgMCwgc2l6ZW9mKGNvbnRyb2xXb3JkKSk7CisgIEhBTEdldENvbnRyb2xXb3JkKCZjb250cm9sV29yZCk7CisgIHJldHVybiAhKGNvbnRyb2xXb3JkLmF1dG9ub21vdXMgfHwgY29udHJvbFdvcmQudGVzdCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIERTIGlzIGNvbW1hbmRpbmcgdGVzdCBtb2RlCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGJlaW5nIGNvbW1hbmRlZCB0byBiZSBpbiB0ZXN0IG1vZGUKKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc1Rlc3QoKSBjb25zdCB7CisgIEhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gY29udHJvbFdvcmQudGVzdDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgRFMgaXMgYXR0YWNoZWQKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgRFMgaXMgY29ubmVjdGVkIHRvIHRoZSByb2JvdAorICovCitib29sIERyaXZlclN0YXRpb246OklzRFNBdHRhY2hlZCgpIGNvbnN0IHsKKyAgSEFMQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7CisgIG1lbXNldCgmY29udHJvbFdvcmQsIDAsIHNpemVvZihjb250cm9sV29yZCkpOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICByZXR1cm4gY29udHJvbFdvcmQuZHNBdHRhY2hlZDsKK30KKworLyoqCisgKiBAcmV0dXJuIGFsd2F5cyB0cnVlIGluIHNpbXVsYXRpb24KKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc1N5c0FjdGl2ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogQHJldHVybiBhbHdheXMgZmFsc2UgaW4gc2ltdWxhdGlvbgorICovCitib29sIERyaXZlclN0YXRpb246OklzU3lzQnJvd25lZE91dCgpIGNvbnN0IHsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIEhhcyBhIG5ldyBjb250cm9sIHBhY2tldCBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbiBhcnJpdmVkIHNpbmNlIHRoZSBsYXN0IHRpbWUKKyAqIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZD8KKyAqIFdhcm5pbmc6IElmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBtb3JlIHRoYW4gb25lIHBsYWNlIGF0IHRoZSBzYW1lIHRpbWUsCisgKiB5b3Ugd2lsbCBub3QgZ2V0IHRoZSBnZXQgdGhlIGludGVuZGVkIGJlaGF2aW91ci4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udHJvbCBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgc2luY2UgdGhlIGxhc3QgY2FsbC4KKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc05ld0NvbnRyb2xEYXRhKCkgY29uc3QgeworICByZXR1cm4gbV9uZXdDb250cm9sRGF0YS50cnlUYWtlKCkgPT0gZmFsc2U7Cit9CisKKy8qKgorICogSXMgdGhlIGRyaXZlciBzdGF0aW9uIGF0dGFjaGVkIHRvIGEgRmllbGQgTWFuYWdlbWVudCBTeXN0ZW0/CisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGNvbXBldGluZyBvbiBhIGZpZWxkIGJlaW5nIGNvbnRyb2xsZWQgYnkgYSBGaWVsZAorICogTWFuYWdlbWVudCBTeXN0ZW0KKyAqLworYm9vbCBEcml2ZXJTdGF0aW9uOjpJc0ZNU0F0dGFjaGVkKCkgY29uc3QgeworICBIQUxDb250cm9sV29yZCBjb250cm9sV29yZDsKKyAgSEFMR2V0Q29udHJvbFdvcmQoJmNvbnRyb2xXb3JkKTsKKyAgcmV0dXJuIGNvbnRyb2xXb3JkLmZtc0F0dGFjaGVkOworfQorCisvKioKKyAqIFJldHVybiB0aGUgYWxsaWFuY2UgdGhhdCB0aGUgZHJpdmVyIHN0YXRpb24gc2F5cyBpdCBpcyBvbi4KKyAqIFRoaXMgY291bGQgcmV0dXJuIGtSZWQgb3Iga0JsdWUKKyAqIEByZXR1cm4gVGhlIEFsbGlhbmNlIGVudW0gKGtSZWQsIGtCbHVlIG9yIGtJbnZhbGlkKQorICovCitEcml2ZXJTdGF0aW9uOjpBbGxpYW5jZSBEcml2ZXJTdGF0aW9uOjpHZXRBbGxpYW5jZSgpIGNvbnN0IHsKKyAgSEFMQWxsaWFuY2VTdGF0aW9uSUQgYWxsaWFuY2VTdGF0aW9uSUQ7CisgIEhBTEdldEFsbGlhbmNlU3RhdGlvbigmYWxsaWFuY2VTdGF0aW9uSUQpOworICBzd2l0Y2ggKGFsbGlhbmNlU3RhdGlvbklEKSB7CisgICAgY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMToKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQyOgorICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDM6CisgICAgICByZXR1cm4ga1JlZDsKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMToKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMjoKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMzoKKyAgICAgIHJldHVybiBrQmx1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGtJbnZhbGlkOworICB9Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBkcml2ZXIgc3RhdGlvbiBsb2NhdGlvbiBvbiB0aGUgZmllbGQKKyAqIFRoaXMgY291bGQgcmV0dXJuIDEsIDIsIG9yIDMKKyAqIEByZXR1cm4gVGhlIGxvY2F0aW9uIG9mIHRoZSBkcml2ZXIgc3RhdGlvbiAoMS0zLCAwIGZvciBpbnZhbGlkKQorICovCit1aW50MzJfdCBEcml2ZXJTdGF0aW9uOjpHZXRMb2NhdGlvbigpIGNvbnN0IHsKKyAgSEFMQWxsaWFuY2VTdGF0aW9uSUQgYWxsaWFuY2VTdGF0aW9uSUQ7CisgIEhBTEdldEFsbGlhbmNlU3RhdGlvbigmYWxsaWFuY2VTdGF0aW9uSUQpOworICBzd2l0Y2ggKGFsbGlhbmNlU3RhdGlvbklEKSB7CisgICAgY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfcmVkMToKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9ibHVlMToKKyAgICAgIHJldHVybiAxOworICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX3JlZDI6CisgICAgY2FzZSBrSEFMQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTI6CisgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIGtIQUxBbGxpYW5jZVN0YXRpb25JRF9yZWQzOgorICAgIGNhc2Uga0hBTEFsbGlhbmNlU3RhdGlvbklEX2JsdWUzOgorICAgICAgcmV0dXJuIDM7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKKy8qKgorICogV2FpdCB1bnRpbCBhIG5ldyBwYWNrZXQgY29tZXMgZnJvbSB0aGUgZHJpdmVyIHN0YXRpb24KKyAqIFRoaXMgYmxvY2tzIG9uIGEgc2VtYXBob3JlLCBzbyB0aGUgd2FpdGluZyBpcyBlZmZpY2llbnQuCisgKiBUaGlzIGlzIGEgZ29vZCB3YXkgdG8gZGVsYXkgcHJvY2Vzc2luZyB1bnRpbCB0aGVyZSBpcyBuZXcgZHJpdmVyIHN0YXRpb24gZGF0YQorICogdG8gYWN0IG9uCisgKi8KK3ZvaWQgRHJpdmVyU3RhdGlvbjo6V2FpdEZvckRhdGEoKSB7CisgIHN0ZDo6dW5pcXVlX2xvY2s8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV93YWl0Rm9yRGF0YU11dGV4KTsKKyAgbV93YWl0Rm9yRGF0YUNvbmQud2FpdChsb2NrKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFwcHJveGltYXRlIG1hdGNoIHRpbWUKKyAqIFRoZSBGTVMgZG9lcyBub3Qgc2VuZCBhbiBvZmZpY2lhbCBtYXRjaCB0aW1lIHRvIHRoZSByb2JvdHMsIGJ1dCBkb2VzIHNlbmQgYW4KKyAqIGFwcHJveGltYXRlIG1hdGNoIHRpbWUuCisgKiBUaGUgdmFsdWUgd2lsbCBjb3VudCBkb3duIHRoZSB0aW1lIHJlbWFpbmluZyBpbiB0aGUgY3VycmVudCBwZXJpb2QgKGF1dG8gb3IKKyAqIHRlbGVvcCkuCisgKiBXYXJuaW5nOiBUaGlzIGlzIG5vdCBhbiBvZmZpY2lhbCB0aW1lIChzbyBpdCBjYW5ub3QgYmUgdXNlZCB0byBkaXNwdXRlIHJlZgorICogY2FsbHMgb3IgZ3VhcmFudGVlIHRoYXQgYSBmdW5jdGlvbgorICogd2lsbCB0cmlnZ2VyIGJlZm9yZSB0aGUgbWF0Y2ggZW5kcykKKyAqIFRoZSBQcmFjdGljZSBNYXRjaCBmdW5jdGlvbiBvZiB0aGUgRFMgYXBwcm94aW1hdGVzIHRoZSBiZWhhdmlvdXIgc2VlbiBvbiB0aGUKKyAqIGZpZWxkLgorICogQHJldHVybiBUaW1lIHJlbWFpbmluZyBpbiBjdXJyZW50IG1hdGNoIHBlcmlvZCAoYXV0byBvciB0ZWxlb3ApCisgKi8KK2RvdWJsZSBEcml2ZXJTdGF0aW9uOjpHZXRNYXRjaFRpbWUoKSBjb25zdCB7CisgIGZsb2F0IG1hdGNoVGltZTsKKyAgSEFMR2V0TWF0Y2hUaW1lKCZtYXRjaFRpbWUpOworICByZXR1cm4gKGRvdWJsZSltYXRjaFRpbWU7Cit9CisKKy8qKgorICogUmVwb3J0IGFuIGVycm9yIHRvIHRoZSBEcml2ZXJTdGF0aW9uIG1lc3NhZ2VzIHdpbmRvdy4KKyAqIFRoZSBlcnJvciBpcyBhbHNvIHByaW50ZWQgdG8gdGhlIHByb2dyYW0gY29uc29sZS4KKyAqLwordm9pZCBEcml2ZXJTdGF0aW9uOjpSZXBvcnRFcnJvcihzdGQ6OnN0cmluZyBlcnJvcikgeworICBzdGQ6OmNvdXQgPDwgZXJyb3IgPDwgc3RkOjplbmRsOworCisgIEhBTENvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOworICBIQUxHZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOworICBpZiAoY29udHJvbFdvcmQuZHNBdHRhY2hlZCkgeworICAgIEhBTFNldEVycm9yRGF0YShlcnJvci5jX3N0cigpLCBlcnJvci5zaXplKCksIDApOworICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0VuY29kZXIuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9FbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA4NjhlCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9FbmNvZGVyLmNwcApAQCAtMCwwICsxLDM2NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiRW5jb2Rlci5oIgorI2luY2x1ZGUgIlJlc291cmNlLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKKy8qKgorICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIEVuY29kZXJzLgorICogVGhpcyBjb2RlIGFsbG9jYXRlcyByZXNvdXJjZXMgZm9yIEVuY29kZXJzIGFuZCBpcyBjb21tb24gdG8gYWxsIGNvbnN0cnVjdG9ycy4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIElmIHRydWUsIGNvdW50cyBkb3duIGluc3RlYWQgb2YgdXAgKHRoaXMgaXMgYWxsIHJlbGF0aXZlKQorICogQHBhcmFtIGVuY29kaW5nVHlwZSBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFggZGVjb2RpbmcuIElmIDRYIGlzCisgKiBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0Egb2JqZWN0IGlzIHVzZWQgYW5kIHRoZSByZXR1cm5lZCBjb3VudHMgd2lsbCBiZSA0eCB0aGUgZW5jb2RlcgorICogc3BlYydkIHZhbHVlIHNpbmNlIGFsbCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZSBzZWxlY3RlZCB0aGVuCisgKiBhIGNvdW50ZXIgb2JqZWN0IHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudAorICogb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KKyAqLwordm9pZCBFbmNvZGVyOjpJbml0RW5jb2RlcihpbnQgY2hhbm5lbEEsIGludCBjaGFubmVsQiwgYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKQoreworCW1fdGFibGUgPSBudWxscHRyOworCXRoaXMtPmNoYW5uZWxBID0gY2hhbm5lbEE7CisJdGhpcy0+Y2hhbm5lbEIgPSBjaGFubmVsQjsKKwltX2VuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZTsKKwltX2VuY29kaW5nU2NhbGUgPSBlbmNvZGluZ1R5cGUgPT0gazRYID8gNAorCQk6IGVuY29kaW5nVHlwZSA9PSBrMlggPyAyCisJCTogMTsKKworCWludDMyX3QgaW5kZXggPSAwOworCW1fZGlzdGFuY2VQZXJQdWxzZSA9IDEuMDsKKworCUxpdmVXaW5kb3c6OkdldEluc3RhbmNlKCktPkFkZFNlbnNvcigiRW5jb2RlciIsIGNoYW5uZWxBLCB0aGlzKTsKKworCWlmIChjaGFubmVsQiA8IGNoYW5uZWxBKSB7IC8vIFN3YXAgcG9ydHMKKwkJaW50IGNoYW5uZWwgPSBjaGFubmVsQjsKKwkJY2hhbm5lbEIgPSBjaGFubmVsQTsKKwkJY2hhbm5lbEEgPSBjaGFubmVsOworCQltX3JldmVyc2VEaXJlY3Rpb24gPSAhcmV2ZXJzZURpcmVjdGlvbjsKKwl9IGVsc2UgeworCQltX3JldmVyc2VEaXJlY3Rpb24gPSByZXZlcnNlRGlyZWN0aW9uOworCX0KKwljaGFyIGJ1ZmZlcls1MF07CisJaW50IG4gPSBzcHJpbnRmKGJ1ZmZlciwgImRpby8lZC8lZCIsIGNoYW5uZWxBLCBjaGFubmVsQik7CisJaW1wbCA9IG5ldyBTaW1FbmNvZGVyKGJ1ZmZlcik7CisJaW1wbC0+U3RhcnQoKTsKK30KKworLyoqCisgKiBFbmNvZGVyIGNvbnN0cnVjdG9yLgorICogQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhIGFuZCBiIGNoYW5uZWxzLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKgorICogQHBhcmFtIGFDaGFubmVsIFRoZSBhIGNoYW5uZWwgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogQHBhcmFtIGJDaGFubmVsIFRoZSBiIGNoYW5uZWwgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGVuY29kZXIgYW5kIGludmVydHMgdGhlIG91dHB1dCB2YWx1ZXMKKyAqIGlmIG5lY2Vzc2FyeSBzbyBmb3J3YXJkIHJlcHJlc2VudHMgcG9zaXRpdmUgdmFsdWVzLgorICogQHBhcmFtIGVuY29kaW5nVHlwZSBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFggZGVjb2RpbmcuIElmIDRYIGlzCisgKiBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0Egb2JqZWN0IGlzIHVzZWQgYW5kIHRoZSByZXR1cm5lZCBjb3VudHMgd2lsbCBiZSA0eCB0aGUgZW5jb2RlcgorICogc3BlYydkIHZhbHVlIHNpbmNlIGFsbCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZSBzZWxlY3RlZCB0aGVuCisgKiBhIGNvdW50ZXIgb2JqZWN0IHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudAorICogb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KKyAqLworRW5jb2Rlcjo6RW5jb2Rlcih1aW50MzJfdCBhQ2hhbm5lbCwgdWludDMyX3QgYkNoYW5uZWwsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSkKK3sKKyAgICBJbml0RW5jb2RlcihhQ2hhbm5lbCwgYkNoYW5uZWwsIHJldmVyc2VEaXJlY3Rpb24sIGVuY29kaW5nVHlwZSk7Cit9CisKKy8qKgorICogRW5jb2RlciBjb25zdHJ1Y3Rvci4KKyAqIENvbnN0cnVjdCBhIEVuY29kZXIgZ2l2ZW4gYSBhbmQgYiBjaGFubmVscyBhcyBkaWdpdGFsIGlucHV0cy4gVGhpcyBpcyB1c2VkIGluIHRoZSBjYXNlCisgKiB3aGVyZSB0aGUgZGlnaXRhbCBpbnB1dHMgYXJlIHNoYXJlZC4gVGhlIEVuY29kZXIgY2xhc3Mgd2lsbCBub3QgYWxsb2NhdGUgdGhlIGRpZ2l0YWwgaW5wdXRzCisgKiBhbmQgYXNzdW1lIHRoYXQgdGhleSBhbHJlYWR5IGFyZSBjb3VudGVkLgorICoKKyAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCisgKgorICogQHBhcmFtIGFTb3VyY2UgVGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYSBjaGFubmVsLgorICogQHBhcmFtIGJTb3VyY2UgdGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYiBjaGFubmVsLgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGVuY29kZXIgYW5kIGludmVydHMgdGhlIG91dHB1dCB2YWx1ZXMKKyAqIGlmIG5lY2Vzc2FyeSBzbyBmb3J3YXJkIHJlcHJlc2VudHMgcG9zaXRpdmUgdmFsdWVzLgorICogQHBhcmFtIGVuY29kaW5nVHlwZSBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFggZGVjb2RpbmcuIElmIDRYIGlzCisgKiBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0Egb2JqZWN0IGlzIHVzZWQgYW5kIHRoZSByZXR1cm5lZCBjb3VudHMgd2lsbCBiZSA0eCB0aGUgZW5jb2RlcgorICogc3BlYydkIHZhbHVlIHNpbmNlIGFsbCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZSBzZWxlY3RlZCB0aGVuCisgKiBhIGNvdW50ZXIgb2JqZWN0IHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudAorICogb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KKyAqLworLyogVE9ETzogW05vdCBTdXBwb3J0ZWRdIEVuY29kZXI6OkVuY29kZXIoRGlnaXRhbFNvdXJjZSAqYVNvdXJjZSwgRGlnaXRhbFNvdXJjZSAqYlNvdXJjZSwgYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKSA6CisJbV9lbmNvZGVyKG51bGxwdHIpLAorCW1fY291bnRlcihudWxscHRyKQoreworCW1fYVNvdXJjZSA9IGFTb3VyY2U7CisJbV9iU291cmNlID0gYlNvdXJjZTsKKwltX2FsbG9jYXRlZEFTb3VyY2UgPSBmYWxzZTsKKwltX2FsbG9jYXRlZEJTb3VyY2UgPSBmYWxzZTsKKwlpZiAobV9hU291cmNlID09IG51bGxwdHIgfHwgbV9iU291cmNlID09IG51bGxwdHIpCisJCXdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKwllbHNlCisJCUluaXRFbmNvZGVyKHJldmVyc2VEaXJlY3Rpb24sIGVuY29kaW5nVHlwZSk7CisgICAgICAgIH0qLworCisvKioKKyAqIEVuY29kZXIgY29uc3RydWN0b3IuCisgKiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMgYXMgZGlnaXRhbCBpbnB1dHMuIFRoaXMgaXMgdXNlZCBpbiB0aGUgY2FzZQorICogd2hlcmUgdGhlIGRpZ2l0YWwgaW5wdXRzIGFyZSBzaGFyZWQuIFRoZSBFbmNvZGVyIGNsYXNzIHdpbGwgbm90IGFsbG9jYXRlIHRoZSBkaWdpdGFsIGlucHV0cworICogYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KKyAqCisgKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbSBhU291cmNlIFRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGEgY2hhbm5lbC4KKyAqIEBwYXJhbSBiU291cmNlIHRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGIgY2hhbm5lbC4KKyAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZCBpbnZlcnRzIHRoZSBvdXRwdXQgdmFsdWVzCisgKiBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZCByZXByZXNlbnRzIHBvc2l0aXZlIHZhbHVlcy4KKyAqIEBwYXJhbSBlbmNvZGluZ1R5cGUgZWl0aGVyIGsxWCwgazJYLCBvciBrNFggdG8gaW5kaWNhdGUgMVgsIDJYIG9yIDRYIGRlY29kaW5nLiBJZiA0WCBpcworICogc2VsZWN0ZWQsIHRoZW4gYW4gZW5jb2RlciBGUEdBIG9iamVjdCBpcyB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgY291bnRzIHdpbGwgYmUgNHggdGhlIGVuY29kZXIKKyAqIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIGFyZSBjb3VudGVkLiBJZiAxWCBvciAyWCBhcmUgc2VsZWN0ZWQgdGhlbgorICogYSBjb3VudGVyIG9iamVjdCB3aWxsIGJlIHVzZWQgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGVpdGhlciBleGFjdGx5IG1hdGNoIHRoZSBzcGVjJ2QgY291bnQKKyAqIG9yIGJlIGRvdWJsZSAoMngpIHRoZSBzcGVjJ2QgY291bnQuCisgKi8KKy8qLy8gVE9ETzogW05vdCBTdXBwb3J0ZWRdIEVuY29kZXI6OkVuY29kZXIoRGlnaXRhbFNvdXJjZSAmYVNvdXJjZSwgRGlnaXRhbFNvdXJjZSAmYlNvdXJjZSwgYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKSA6CisJbV9lbmNvZGVyKG51bGxwdHIpLAorCW1fY291bnRlcihudWxscHRyKQoreworCW1fYVNvdXJjZSA9ICZhU291cmNlOworCW1fYlNvdXJjZSA9ICZiU291cmNlOworCW1fYWxsb2NhdGVkQVNvdXJjZSA9IGZhbHNlOworCW1fYWxsb2NhdGVkQlNvdXJjZSA9IGZhbHNlOworCUluaXRFbmNvZGVyKHJldmVyc2VEaXJlY3Rpb24sIGVuY29kaW5nVHlwZSk7CisgICAgfSovCisKKy8qKgorICogUmVzZXQgdGhlIEVuY29kZXIgZGlzdGFuY2UgdG8gemVyby4KKyAqIFJlc2V0cyB0aGUgY3VycmVudCBjb3VudCB0byB6ZXJvIG9uIHRoZSBlbmNvZGVyLgorICovCit2b2lkIEVuY29kZXI6OlJlc2V0KCkKK3sKKyAgICBpbXBsLT5SZXNldCgpOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgZW5jb2RlciBpcyBzdG9wcGVkLgorICogVXNpbmcgdGhlIE1heFBlcmlvZCB2YWx1ZSwgYSBib29sZWFuIGlzIHJldHVybmVkIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgZW5jb2RlciBpcyBjb25zaWRlcmVkCisgKiBzdG9wcGVkIGFuZCBmYWxzZSBpZiBpdCBpcyBzdGlsbCBtb3ZpbmcuIEEgc3RvcHBlZCBlbmNvZGVyIGlzIG9uZSB3aGVyZSB0aGUgbW9zdCByZWNlbnQgcHVsc2UKKyAqIHdpZHRoIGV4Y2VlZHMgdGhlIE1heFBlcmlvZC4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW5jb2RlciBpcyBjb25zaWRlcmVkIHN0b3BwZWQuCisgKi8KK2Jvb2wgRW5jb2Rlcjo6R2V0U3RvcHBlZCgpIGNvbnN0Cit7CisgICAgdGhyb3cgIlNpbXVsYXRpb24gZG9lc24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIG1ldGhvZC4iOworfQorCisvKioKKyAqIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgZW5jb2RlciB2YWx1ZSBjaGFuZ2VkLgorICogQHJldHVybiBUaGUgbGFzdCBkaXJlY3Rpb24gdGhlIGVuY29kZXIgdmFsdWUgY2hhbmdlZC4KKyAqLworYm9vbCBFbmNvZGVyOjpHZXREaXJlY3Rpb24oKSBjb25zdAoreworICAgIHRocm93ICJTaW11bGF0aW9uIGRvZXNuJ3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBtZXRob2QuIjsKK30KKworLyoqCisgKiBUaGUgc2NhbGUgbmVlZGVkIHRvIGNvbnZlcnQgYSByYXcgY291bnRlciB2YWx1ZSBpbnRvIGEgbnVtYmVyIG9mIGVuY29kZXIgcHVsc2VzLgorICovCitkb3VibGUgRW5jb2Rlcjo6RGVjb2RpbmdTY2FsZUZhY3RvcigpIGNvbnN0Cit7CisJc3dpdGNoIChtX2VuY29kaW5nVHlwZSkKKwl7CisJY2FzZSBrMVg6CisJCXJldHVybiAxLjA7CisJY2FzZSBrMlg6CisJCXJldHVybiAwLjU7CisJY2FzZSBrNFg6CisJCXJldHVybiAwLjI1OworCWRlZmF1bHQ6CisJCXJldHVybiAwLjA7CisJfQorfQorCisvKioKKyAqIFRoZSBlbmNvZGluZyBzY2FsZSBmYWN0b3IgMXgsIDJ4LCBvciA0eCwgcGVyIHRoZSByZXF1ZXN0ZWQgZW5jb2RpbmdUeXBlLgorICogVXNlZCB0byBkaXZpZGUgcmF3IGVkZ2UgY291bnRzIGRvd24gdG8gc3BlYydkIGNvdW50cy4KKyAqLworaW50MzJfdCBFbmNvZGVyOjpHZXRFbmNvZGluZ1NjYWxlKCkgY29uc3QgeyByZXR1cm4gbV9lbmNvZGluZ1NjYWxlOyB9CisKKy8qKgorICogR2V0cyB0aGUgcmF3IHZhbHVlIGZyb20gdGhlIGVuY29kZXIuCisgKiBUaGUgcmF3IHZhbHVlIGlzIHRoZSBhY3R1YWwgY291bnQgdW5zY2FsZWQgYnkgdGhlIDF4LCAyeCwgb3IgNHggc2NhbGUKKyAqIGZhY3Rvci4KKyAqIEByZXR1cm4gQ3VycmVudCByYXcgY291bnQgZnJvbSB0aGUgZW5jb2RlcgorICovCitpbnQzMl90IEVuY29kZXI6OkdldFJhdygpIGNvbnN0Cit7CisJdGhyb3cgIlNpbXVsYXRpb24gZG9lc24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIG1ldGhvZC4iOworfQorCisvKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgY291bnQuCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IG9uIHRoZSBFbmNvZGVyLgorICogVGhpcyBtZXRob2QgY29tcGVuc2F0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgorICoKKyAqIEByZXR1cm4gQ3VycmVudCBjb3VudCBmcm9tIHRoZSBFbmNvZGVyIGFkanVzdGVkIGZvciB0aGUgMXgsIDJ4LCBvciA0eCBzY2FsZSBmYWN0b3IuCisgKi8KK2ludDMyX3QgRW5jb2Rlcjo6R2V0KCkgY29uc3QKK3sKKwl0aHJvdyAiU2ltdWxhdGlvbiBkb2Vzbid0IGN1cnJlbnRseSBzdXBwb3J0IHRoaXMgbWV0aG9kLiI7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgcGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBwdWxzZS4KKyAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgRW5jb2RlciBwdWxzZSBpbiBzZWNvbmRzLgorICogVGhpcyBtZXRob2QgY29tcGVuc3RhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgR2V0UmF0ZSgpIGluIGZhdm9yIG9mIHRoaXMgbWV0aG9kLiAgVGhpcyByZXR1cm5zIHVuc2NhbGVkIHBlcmlvZHMgYW5kIEdldFJhdGUoKSBzY2FsZXMgdXNpbmcgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCisgKgorICogQHJldHVybiBQZXJpb2QgaW4gc2Vjb25kcyBvZiB0aGUgbW9zdCByZWNlbnQgcHVsc2UuCisgKi8KK2RvdWJsZSBFbmNvZGVyOjpHZXRQZXJpb2QoKSBjb25zdAoreworCXRocm93ICJTaW11bGF0aW9uIGRvZXNuJ3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBtZXRob2QuIjsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIHBlcmlvZCBmb3Igc3RvcHBlZCBkZXRlY3Rpb24uCisgKiBTZXRzIHRoZSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIG1heGltdW0gcGVyaW9kIG9mIHRoZSBFbmNvZGVyIGJlZm9yZSBpdCB3aWxsIGFzc3VtZQorICogdGhhdCB0aGUgYXR0YWNoZWQgZGV2aWNlIGlzIHN0b3BwZWQuIFRoaXMgdGltZW91dCBhbGxvd3MgdXNlcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZSB3aGVlbHMgb3IKKyAqIG90aGVyIHNoYWZ0IGhhcyBzdG9wcGVkIHJvdGF0aW5nLgorICogVGhpcyBtZXRob2QgY29tcGVuc2F0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSBTZXRNaW5SYXRlKCkgaW4gZmF2b3Igb2YgdGhpcyBtZXRob2QuICBUaGlzIHRha2VzIHVuc2NhbGVkIHBlcmlvZHMgYW5kIFNldE1pblJhdGUoKSBzY2FsZXMgdXNpbmcgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCisgKgorICogQHBhcmFtIG1heFBlcmlvZCBUaGUgbWF4aW11bSB0aW1lIGJldHdlZW4gcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIGJlZm9yZSB0aGUgRlBHQSB3aWxsCisgKiByZXBvcnQgdGhlIGRldmljZSBzdG9wcGVkLiBUaGlzIGlzIGV4cHJlc3NlZCBpbiBzZWNvbmRzLgorICovCit2b2lkIEVuY29kZXI6OlNldE1heFBlcmlvZChkb3VibGUgbWF4UGVyaW9kKQoreworCXRocm93ICJTaW11bGF0aW9uIGRvZXNuJ3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBtZXRob2QuIjsKK30KKworLyoqCisgKiBHZXQgdGhlIGRpc3RhbmNlIHRoZSByb2JvdCBoYXMgZHJpdmVuIHNpbmNlIHRoZSBsYXN0IHJlc2V0LgorICoKKyAqIEByZXR1cm4gVGhlIGRpc3RhbmNlIGRyaXZlbiBzaW5jZSB0aGUgbGFzdCByZXNldCBhcyBzY2FsZWQgYnkgdGhlIHZhbHVlIGZyb20gU2V0RGlzdGFuY2VQZXJQdWxzZSgpLgorICovCitkb3VibGUgRW5jb2Rlcjo6R2V0RGlzdGFuY2UoKSBjb25zdAoreworICAgIHJldHVybiBtX2Rpc3RhbmNlUGVyUHVsc2UgKiBpbXBsLT5HZXRQb3NpdGlvbigpOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCByYXRlIG9mIHRoZSBlbmNvZGVyLgorICogVW5pdHMgYXJlIGRpc3RhbmNlIHBlciBzZWNvbmQgYXMgc2NhbGVkIGJ5IHRoZSB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGVuY29kZXIuCisgKi8KK2RvdWJsZSBFbmNvZGVyOjpHZXRSYXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kaXN0YW5jZVBlclB1bHNlICogaW1wbC0+R2V0VmVsb2NpdHkoKTsKK30KKworLyoqCisgKiBTZXQgdGhlIG1pbmltdW0gcmF0ZSBvZiB0aGUgZGV2aWNlIGJlZm9yZSB0aGUgaGFyZHdhcmUgcmVwb3J0cyBpdCBzdG9wcGVkLgorICoKKyAqIEBwYXJhbSBtaW5SYXRlIFRoZSBtaW5pbXVtIHJhdGUuICBUaGUgdW5pdHMgYXJlIGluIGRpc3RhbmNlIHBlciBzZWNvbmQgYXMgc2NhbGVkIGJ5IHRoZSB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KKyAqLwordm9pZCBFbmNvZGVyOjpTZXRNaW5SYXRlKGRvdWJsZSBtaW5SYXRlKQoreworICAgIHRocm93ICJTaW11bGF0aW9uIGRvZXNuJ3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBtZXRob2QuIjsKK30KKworLyoqCisgKiBTZXQgdGhlIGRpc3RhbmNlIHBlciBwdWxzZSBmb3IgdGhpcyBlbmNvZGVyLgorICogVGhpcyBzZXRzIHRoZSBtdWx0aXBsaWVyIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaXN0YW5jZSBkcml2ZW4gYmFzZWQgb24gdGhlIGNvdW50IHZhbHVlCisgKiBmcm9tIHRoZSBlbmNvZGVyLgorICogRG8gbm90IGluY2x1ZGUgdGhlIGRlY29kaW5nIHR5cGUgaW4gdGhpcyBzY2FsZS4gIFRoZSBsaWJyYXJ5IGFscmVhZHkgY29tcGVuc2F0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgorICogU2V0IHRoaXMgdmFsdWUgYmFzZWQgb24gdGhlIGVuY29kZXIncyByYXRlZCBQdWxzZXMgcGVyIFJldm9sdXRpb24gYW5kCisgKiBmYWN0b3IgaW4gZ2VhcmluZyByZWR1Y3Rpb25zIGZvbGxvd2luZyB0aGUgZW5jb2RlciBzaGFmdC4KKyAqIFRoaXMgZGlzdGFuY2UgY2FuIGJlIGluIGFueSB1bml0cyB5b3UgbGlrZSwgbGluZWFyIG9yIGFuZ3VsYXIuCisgKgorICogQHBhcmFtIGRpc3RhbmNlUGVyUHVsc2UgVGhlIHNjYWxlIGZhY3RvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IHB1bHNlcyB0byB1c2VmdWwgdW5pdHMuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0RGlzdGFuY2VQZXJQdWxzZShkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSkKK3sKKwlpZiAobV9yZXZlcnNlRGlyZWN0aW9uKSB7CisJCW1fZGlzdGFuY2VQZXJQdWxzZSA9IC1kaXN0YW5jZVBlclB1bHNlOworCX0gZWxzZSB7CisJCW1fZGlzdGFuY2VQZXJQdWxzZSA9IGRpc3RhbmNlUGVyUHVsc2U7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgZGlyZWN0aW9uIHNlbnNpbmcgZm9yIHRoaXMgZW5jb2Rlci4KKyAqIFRoaXMgc2V0cyB0aGUgZGlyZWN0aW9uIHNlbnNpbmcgb24gdGhlIGVuY29kZXIgc28gdGhhdCBpdCBjb3VsZCBjb3VudCBpbiB0aGUgY29ycmVjdAorICogc29mdHdhcmUgZGlyZWN0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vdW50aW5nLgorICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gdHJ1ZSBpZiB0aGUgZW5jb2RlciBkaXJlY3Rpb24gc2hvdWxkIGJlIHJldmVyc2VkCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pCit7CisgICAgdGhyb3cgIlNpbXVsYXRpb24gZG9lc24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIG1ldGhvZC4iOworfQorCisvKioKKyAqIFNldCB3aGljaCBwYXJhbWV0ZXIgb2YgdGhlIGVuY29kZXIgeW91IGFyZSB1c2luZyBhcyBhIHByb2Nlc3MgY29udHJvbCB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gcGlkU291cmNlIEFuIGVudW0gdG8gc2VsZWN0IHRoZSBwYXJhbWV0ZXIuCisgKi8KK3ZvaWQgRW5jb2Rlcjo6U2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkKK3sKKwltX3BpZFNvdXJjZSA9IHBpZFNvdXJjZTsKK30KKworLyoqCisgKiBJbXBsZW1lbnQgdGhlIFBJRFNvdXJjZSBpbnRlcmZhY2UuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgc291cmNlIHBhcmFtZXRlci4KKyAqLworZG91YmxlIEVuY29kZXI6OlBJREdldCgpCit7CisJc3dpdGNoIChtX3BpZFNvdXJjZSkKKwl7CisJY2FzZSBQSURTb3VyY2VUeXBlOjprRGlzcGxhY2VtZW50OgorCQlyZXR1cm4gR2V0RGlzdGFuY2UoKTsKKwljYXNlIFBJRFNvdXJjZVR5cGU6OmtSYXRlOgorCQlyZXR1cm4gR2V0UmF0ZSgpOworCWRlZmF1bHQ6CisJCXJldHVybiAwLjA7CisJfQorfQorCit2b2lkIEVuY29kZXI6OlVwZGF0ZVRhYmxlKCkgeworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJTcGVlZCIsIEdldFJhdGUoKSk7CisgICAgICAgIG1fdGFibGUtPlB1dE51bWJlcigiRGlzdGFuY2UiLCBHZXREaXN0YW5jZSgpKTsKKyAgICAgICAgbV90YWJsZS0+UHV0TnVtYmVyKCJEaXN0YW5jZSBwZXIgVGljayIsIG1fcmV2ZXJzZURpcmVjdGlvbiA/IC1tX2Rpc3RhbmNlUGVyUHVsc2UgOiBtX2Rpc3RhbmNlUGVyUHVsc2UpOworCX0KK30KKwordm9pZCBFbmNvZGVyOjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworCit9CisKK3ZvaWQgRW5jb2Rlcjo6U3RvcExpdmVXaW5kb3dNb2RlKCkgeworCit9CisKK3N0ZDo6c3RyaW5nIEVuY29kZXI6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKwlpZiAobV9lbmNvZGluZ1R5cGUgPT0gazRYKQorCQlyZXR1cm4gIlF1YWRyYXR1cmUgRW5jb2RlciI7CisJZWxzZQorCQlyZXR1cm4gIkVuY29kZXIiOworfQorCit2b2lkIEVuY29kZXI6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworCW1fdGFibGUgPSBzdWJUYWJsZTsKKwlVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBFbmNvZGVyOjpHZXRUYWJsZSgpIGNvbnN0IHsKKwlyZXR1cm4gbV90YWJsZTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvR3lyby5jcHAgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0d5cm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOGJiOWIKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0d5cm8uY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJHeXJvLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKKworY29uc3QgdWludDMyX3QgR3lybzo6a092ZXJzYW1wbGVCaXRzID0gMTA7Citjb25zdCB1aW50MzJfdCBHeXJvOjprQXZlcmFnZUJpdHMgPSAwOworY29uc3QgZmxvYXQgR3lybzo6a1NhbXBsZXNQZXJTZWNvbmQgPSA1MC4wOworY29uc3QgZmxvYXQgR3lybzo6a0NhbGlicmF0aW9uU2FtcGxlVGltZSA9IDUuMDsKK2NvbnN0IGZsb2F0IEd5cm86OmtEZWZhdWx0Vm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQgPSAwLjAwNzsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBneXJvLgorICogQ2FsaWJyYXRlIHRoZSBneXJvIGJ5IHJ1bm5pbmcgZm9yIGEgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIGNvbXB1dGluZyB0aGUgY2VudGVyIHZhbHVlIGZvciB0aGlzCisgKiBwYXJ0LiBUaGVuIHVzZSB0aGUgY2VudGVyIHZhbHVlIGFzIHRoZSBBY2N1bXVsYXRvciBjZW50ZXIgdmFsdWUgZm9yIHN1YnNlcXVlbnQgbWVhc3VyZW1lbnRzLgorICogSXQncyBpbXBvcnRhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJvYm90IGlzIG5vdCBtb3Zpbmcgd2hpbGUgdGhlIGNlbnRlcmluZyBjYWxjdWxhdGlvbnMgYXJlCisgKiBpbiBwcm9ncmVzcywgdGhpcyBpcyB0eXBpY2FsbHkgZG9uZSB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCB0dXJuZWQgb24gd2hpbGUgaXQncyBzaXR0aW5nIGF0CisgKiByZXN0IGJlZm9yZSB0aGUgY29tcGV0aXRpb24gc3RhcnRzLgorICovCit2b2lkIEd5cm86OkluaXRHeXJvKGludCBjaGFubmVsKQoreworCVNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZTo6a0Rpc3BsYWNlbWVudCk7CisKKwljaGFyIGJ1ZmZlcls1MF07CisJaW50IG4gPSBzcHJpbnRmKGJ1ZmZlciwgImFuYWxvZy8lZCIsIGNoYW5uZWwpOworCWltcGwgPSBuZXcgU2ltR3lybyhidWZmZXIpOworCisJTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkU2Vuc29yKCJHeXJvIiwgY2hhbm5lbCwgdGhpcyk7Cit9CisKKy8qKgorICogR3lybyBjb25zdHJ1Y3RvciB3aXRoIG9ubHkgYSBjaGFubmVsLi4KKyAqCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgYW5hbG9nIGNoYW5uZWwgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLgorICovCitHeXJvOjpHeXJvKHVpbnQzMl90IGNoYW5uZWwpCit7CisgICAgSW5pdEd5cm8oY2hhbm5lbCk7Cit9CisKKy8qKgorICogUmVzZXQgdGhlIGd5cm8uCisgKiBSZXNldHMgdGhlIGd5cm8gdG8gYSBoZWFkaW5nIG9mIHplcm8uIFRoaXMgY2FuIGJlIHVzZWQgaWYgdGhlcmUgaXMgc2lnbmlmaWNhbnQKKyAqIGRyaWZ0IGluIHRoZSBneXJvIGFuZCBpdCBuZWVkcyB0byBiZSByZWNhbGlicmF0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gcnVubmluZy4KKyAqLwordm9pZCBHeXJvOjpSZXNldCgpCit7CisgICAgaW1wbC0+UmVzZXQoKTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFjdHVhbCBhbmdsZSBpbiBkZWdyZWVzIHRoYXQgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBmYWNpbmcuCisgKgorICogVGhlIGFuZ2xlIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGFjY3VtdWxhdG9yIHZhbHVlIGNvcnJlY3RlZCBieSB0aGUgb3ZlcnNhbXBsaW5nIHJhdGUsIHRoZQorICogZ3lybyB0eXBlIGFuZCB0aGUgQS9EIGNhbGlicmF0aW9uIHZhbHVlcy4KKyAqIFRoZSBhbmdsZSBpcyBjb250aW51b3VzLCB0aGF0IGlzIGNhbiBnbyBiZXlvbmQgMzYwIGRlZ3JlZXMuIFRoaXMgbWFrZSBhbGdvcml0aG1zIHRoYXQgd291bGRuJ3QKKyAqIHdhbnQgdG8gc2VlIGEgZGlzY29udGludWl0eSBpbiB0aGUgZ3lybyBvdXRwdXQgYXMgaXQgc3dlZXBzIHBhc3QgMCBvbiB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kLgorICoKKyAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaGVhZGluZyBvZiB0aGUgcm9ib3QgaW4gZGVncmVlcy4gVGhpcyBoZWFkaW5nIGlzIGJhc2VkIG9uIGludGVncmF0aW9uCisgKiBvZiB0aGUgcmV0dXJuZWQgcmF0ZSBmcm9tIHRoZSBneXJvLgorICovCitmbG9hdCBHeXJvOjpHZXRBbmdsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGltcGwtPkdldEFuZ2xlKCk7Cit9CisKKworLyoqCisgKiBSZXR1cm4gdGhlIHJhdGUgb2Ygcm90YXRpb24gb2YgdGhlIGd5cm8KKyAqCisgKiBUaGUgcmF0ZSBpcyBiYXNlZCBvbiB0aGUgbW9zdCByZWNlbnQgcmVhZGluZyBvZiB0aGUgZ3lybyBhbmFsb2cgdmFsdWUKKyAqCisgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgaW4gZGVncmVlcyBwZXIgc2Vjb25kCisgKi8KK2RvdWJsZSBHeXJvOjpHZXRSYXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaW1wbC0+R2V0VmVsb2NpdHkoKTsKK30KKwordm9pZCBHeXJvOjpTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKQoreworICAgIG1fcGlkU291cmNlID0gcGlkU291cmNlOworfQorCisvKioKKyAqIEdldCB0aGUgYW5nbGUgaW4gZGVncmVlcyBmb3IgdGhlIFBJRFNvdXJjZSBiYXNlIG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIFRoZSBhbmdsZSBpbiBkZWdyZWVzLgorICovCitkb3VibGUgR3lybzo6UElER2V0KCkKK3sKKwlzd2l0Y2goR2V0UElEU291cmNlVHlwZSgpKXsKKwljYXNlIFBJRFNvdXJjZVR5cGU6OmtSYXRlOgorCQlyZXR1cm4gR2V0UmF0ZSgpOworCWNhc2UgUElEU291cmNlVHlwZTo6a0Rpc3BsYWNlbWVudDoKKwkJcmV0dXJuIEdldEFuZ2xlKCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCit2b2lkIEd5cm86OlVwZGF0ZVRhYmxlKCkgeworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKwkJbV90YWJsZS0+UHV0TnVtYmVyKCJWYWx1ZSIsIEdldEFuZ2xlKCkpOworCX0KK30KKwordm9pZCBHeXJvOjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworCit9CisKK3ZvaWQgR3lybzo6U3RvcExpdmVXaW5kb3dNb2RlKCkgeworCit9CisKK3N0ZDo6c3RyaW5nIEd5cm86OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKwlyZXR1cm4gIkd5cm8iOworfQorCit2b2lkIEd5cm86OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworCW1fdGFibGUgPSBzdWJUYWJsZTsKKwlVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBHeXJvOjpHZXRUYWJsZSgpIGNvbnN0IHsKKwlyZXR1cm4gbV90YWJsZTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvSXRlcmF0aXZlUm9ib3QuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9JdGVyYXRpdmVSb2JvdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1MTFkZgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvSXRlcmF0aXZlUm9ib3QuY3BwCkBAIC0wLDAgKzEsMzEyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiSXRlcmF0aXZlUm9ib3QuaCIKKworI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmgiCisKKy8vbm90IHN1cmUgd2hhdCB0aGlzIGlzIHVzZWQgZm9yIHlldC4KKyNpZmRlZiBfVU5JWAorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitjb25zdCBkb3VibGUgSXRlcmF0aXZlUm9ib3Q6OmtEZWZhdWx0UGVyaW9kID0gMDsKKworLyoqCisgKiBTZXQgdGhlIHBlcmlvZCBmb3IgdGhlIHBlcmlvZGljIGZ1bmN0aW9ucy4KKyAqCisgKiBAcGFyYW0gcGVyaW9kIFRoZSBwZXJpb2Qgb2YgdGhlIHBlcmlvZGljIGZ1bmN0aW9uIGNhbGxzLiAgMC4wIG1lYW5zIHN5bmMgdG8gZHJpdmVyIHN0YXRpb24gY29udHJvbCBkYXRhLgorICovCit2b2lkIEl0ZXJhdGl2ZVJvYm90OjpTZXRQZXJpb2QoZG91YmxlIHBlcmlvZCkKK3sKKwlpZiAocGVyaW9kID4gMC4wKQorCXsKKwkJLy8gTm90IHN5bmNpbmcgd2l0aCB0aGUgRFMsIHNvIHN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIG1haW4gbG9vcAorCQltX21haW5Mb29wVGltZXIuUmVzZXQoKTsKKwkJbV9tYWluTG9vcFRpbWVyLlN0YXJ0KCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFN5bmNpbmcgd2l0aCB0aGUgRFMsIGRvbid0IG5lZWQgdGhlIHRpbWVyCisJCW1fbWFpbkxvb3BUaW1lci5TdG9wKCk7CisJfQorCW1fcGVyaW9kID0gcGVyaW9kOworfQorCisvKioKKyAqIEdldCB0aGUgcGVyaW9kIGZvciB0aGUgcGVyaW9kaWMgZnVuY3Rpb25zLgorICogUmV0dXJucyAwLjAgaWYgY29uZmlndXJlZCB0byBzeW5jcm9uaXplIHdpdGggRFMgY29udHJvbCBkYXRhIHBhY2tldHMuCisgKiBAcmV0dXJuIFBlcmlvZCBvZiB0aGUgcGVyaW9kaWMgZnVuY3Rpb24gY2FsbHMKKyAqLworZG91YmxlIEl0ZXJhdGl2ZVJvYm90OjpHZXRQZXJpb2QoKQoreworCXJldHVybiBtX3BlcmlvZDsKK30KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBsb29wcyBwZXIgc2Vjb25kIGZvciB0aGUgSXRlcmF0aXZlUm9ib3QKKyAqIEByZXR1cm4gRnJlcXVlbmN5IG9mIHRoZSBwZXJpb2RpYyBmdW5jdGlvbiBjYWxscworICovCitkb3VibGUgSXRlcmF0aXZlUm9ib3Q6OkdldExvb3BzUGVyU2VjKCkKK3sKKwkvLyBJZiBzeW5jaW5nIHRvIHRoZSBkcml2ZXIgc3RhdGlvbiwgd2UgZG9uJ3Qga25vdyB0aGUgcmF0ZSwKKwkvLyAgIHNvIGd1ZXNzIHNvbWV0aGluZyBjbG9zZS4KKwlpZiAobV9wZXJpb2QgPD0gMC4wKQorCQlyZXR1cm4gNTAuMDsKKwlyZXR1cm4gMS4wIC8gbV9wZXJpb2Q7Cit9CisKKy8qKgorICogUHJvdmlkZSBhbiBhbHRlcm5hdGUgIm1haW4gbG9vcCIgdmlhIFN0YXJ0Q29tcGV0aXRpb24oKS4KKyAqCisgKiBUaGlzIHNwZWNpZmljIFN0YXJ0Q29tcGV0aXRpb24oKSBpbXBsZW1lbnRzICJtYWluIGxvb3AiIGJlaGF2aW9yIGxpa2UgdGhhdCBvZiB0aGUgRlJDCisgKiBjb250cm9sIHN5c3RlbSBpbiAyMDA4IGFuZCBlYXJsaWVyLCB3aXRoIGEgcHJpbWFyeSAoc2xvdykgbG9vcCB0aGF0IGlzCisgKiBjYWxsZWQgcGVyaW9kaWNhbGx5LCBhbmQgYSAiZmFzdCBsb29wIiAoYS5rLmEuICJzcGluIGxvb3AiKSB0aGF0IGlzCisgKiBjYWxsZWQgYXMgZmFzdCBhcyBwb3NzaWJsZSB3aXRoIG5vIGRlbGF5IGJldHdlZW4gY2FsbHMuCisgKi8KK3ZvaWQgSXRlcmF0aXZlUm9ib3Q6OlN0YXJ0Q29tcGV0aXRpb24oKQoreworCUxpdmVXaW5kb3cgKmx3ID0gTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKTsKKwkvLyBmaXJzdCBhbmQgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24KKwlTbWFydERhc2hib2FyZDo6aW5pdCgpOworCU5ldHdvcmtUYWJsZTo6R2V0VGFibGUoIkxpdmVXaW5kb3ciKS0+R2V0U3ViVGFibGUoIn5TVEFUVVN+IiktPlB1dEJvb2xlYW4oIkxXIEVuYWJsZWQiLCBmYWxzZSk7CisJUm9ib3RJbml0KCk7CisKKwkvLyBsb29wIGZvcmV2ZXIsIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1vZGUtZGVwZW5kZW50IGZ1bmN0aW9uCisJbHctPlNldEVuYWJsZWQoZmFsc2UpOworCXdoaWxlICh0cnVlKQorCXsKKwkJLy8gQ2FsbCB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb24gZGVwZW5kaW5nIHVwb24gdGhlIGN1cnJlbnQgcm9ib3QgbW9kZQorCQlpZiAoSXNEaXNhYmxlZCgpKQorCQl7CisJCQkvLyBjYWxsIERpc2FibGVkSW5pdCgpIGlmIHdlIGFyZSBub3cganVzdCBlbnRlcmluZyBkaXNhYmxlZCBtb2RlIGZyb20KKwkJCS8vIGVpdGhlciBhIGRpZmZlcmVudCBtb2RlIG9yIGZyb20gcG93ZXItb24KKwkJCWlmKCFtX2Rpc2FibGVkSW5pdGlhbGl6ZWQpCisJCQl7CisJCQkJbHctPlNldEVuYWJsZWQoZmFsc2UpOworCQkJCURpc2FibGVkSW5pdCgpOworCQkJCW1fZGlzYWJsZWRJbml0aWFsaXplZCA9IHRydWU7CisJCQkJLy8gcmVzZXQgdGhlIGluaXRpYWxpemF0aW9uIGZsYWdzIGZvciB0aGUgb3RoZXIgbW9kZXMKKwkJCQltX2F1dG9ub21vdXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1fdGVsZW9wSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtX3Rlc3RJbml0aWFsaXplZCA9IGZhbHNlOworCQkJfQorCQkJaWYgKE5leHRQZXJpb2RSZWFkeSgpKQorCQkJeworCQkJCS8vIFRPRE86IEhBTE5ldHdvcmtDb21tdW5pY2F0aW9uT2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoKTsKKwkJCQlEaXNhYmxlZFBlcmlvZGljKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoSXNBdXRvbm9tb3VzKCkpCisJCXsKKwkJCS8vIGNhbGwgQXV0b25vbW91c0luaXQoKSBpZiB3ZSBhcmUgbm93IGp1c3QgZW50ZXJpbmcgYXV0b25vbW91cyBtb2RlIGZyb20KKwkJCS8vIGVpdGhlciBhIGRpZmZlcmVudCBtb2RlIG9yIGZyb20gcG93ZXItb24KKwkJCWlmKCFtX2F1dG9ub21vdXNJbml0aWFsaXplZCkKKwkJCXsKKwkJCQlsdy0+U2V0RW5hYmxlZChmYWxzZSk7CisJCQkJQXV0b25vbW91c0luaXQoKTsKKwkJCQltX2F1dG9ub21vdXNJbml0aWFsaXplZCA9IHRydWU7CisJCQkJLy8gcmVzZXQgdGhlIGluaXRpYWxpemF0aW9uIGZsYWdzIGZvciB0aGUgb3RoZXIgbW9kZXMKKwkJCQltX2Rpc2FibGVkSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtX3RlbGVvcEluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbV90ZXN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwkJCX0KKwkJCWlmIChOZXh0UGVyaW9kUmVhZHkoKSkKKwkJCXsKKwkJCQkvLyBUT0RPOiBIQUxOZXR3b3JrQ29tbXVuaWNhdGlvbk9ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMoKTsKKwkJCQlBdXRvbm9tb3VzUGVyaW9kaWMoKTsKKwkJCX0KKwkJfQorICAgICAgICBlbHNlIGlmIChJc1Rlc3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2FsbCBUZXN0SW5pdCgpIGlmIHdlIGFyZSBub3cganVzdCBlbnRlcmluZyB0ZXN0IG1vZGUgZnJvbQorICAgICAgICAgICAgLy8gZWl0aGVyIGEgZGlmZmVyZW50IG1vZGUgb3IgZnJvbSBwb3dlci1vbgorICAgICAgICAgICAgaWYoIW1fdGVzdEluaXRpYWxpemVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCWx3LT5TZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIFRlc3RJbml0KCk7CisgICAgICAgICAgICAgICAgbV90ZXN0SW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBpbml0aWFsaXphdGlvbiBmbGFncyBmb3IgdGhlIG90aGVyIG1vZGVzCisgICAgICAgICAgICAgICAgbV9kaXNhYmxlZEluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbV9hdXRvbm9tb3VzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtX3RlbGVvcEluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTmV4dFBlcmlvZFJlYWR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1UZXN0KCk7CisgICAgICAgICAgICAgICAgVGVzdFBlcmlvZGljKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJZWxzZQorCQl7CisJCQkvLyBjYWxsIFRlbGVvcEluaXQoKSBpZiB3ZSBhcmUgbm93IGp1c3QgZW50ZXJpbmcgdGVsZW9wIG1vZGUgZnJvbQorCQkJLy8gZWl0aGVyIGEgZGlmZmVyZW50IG1vZGUgb3IgZnJvbSBwb3dlci1vbgorCQkJaWYoIW1fdGVsZW9wSW5pdGlhbGl6ZWQpCisJCQl7CisJCQkJbHctPlNldEVuYWJsZWQoZmFsc2UpOworCQkJCVRlbGVvcEluaXQoKTsKKwkJCQltX3RlbGVvcEluaXRpYWxpemVkID0gdHJ1ZTsKKwkJCQkvLyByZXNldCB0aGUgaW5pdGlhbGl6YXRpb24gZmxhZ3MgZm9yIHRoZSBvdGhlciBtb2RlcworCQkJCW1fZGlzYWJsZWRJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1fYXV0b25vbW91c0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbV90ZXN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlNldEVuYWJsZWQodHJ1ZSk7CisJCQl9CisJCQlpZiAoTmV4dFBlcmlvZFJlYWR5KCkpCisJCQl7CisJCQkJLy8gVE9ETzogSEFMTmV0d29ya0NvbW11bmljYXRpb25PYnNlcnZlVXNlclByb2dyYW1UZWxlb3AoKTsKKwkJCQlUZWxlb3BQZXJpb2RpYygpOworCQkJfQorCQl9CisJCS8vIHdhaXQgZm9yIGRyaXZlciBzdGF0aW9uIGRhdGEgc28gdGhlIGxvb3AgZG9lc24ndCBob2cgdGhlIENQVQorCQltX2RzLldhaXRGb3JEYXRhKCk7CisJfQorfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgcGVyaW9kaWMgZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQuCisgKgorICogSWYgbV9wZXJpb2QgPiAwLjAsIGNhbGwgdGhlIHBlcmlvZGljIGZ1bmN0aW9uIGV2ZXJ5IG1fcGVyaW9kIGFzIGNvbXBhcmVkCisgKiB0byBUaW1lci5HZXQoKS4gIElmIG1fcGVyaW9kID09IDAuMCwgY2FsbCB0aGUgcGVyaW9kaWMgZnVuY3Rpb25zIHdoZW5ldmVyCisgKiBhIHBhY2tldCBpcyByZWNlaXZlZCBmcm9tIHRoZSBEcml2ZXIgU3RhdGlvbiwgb3IgYWJvdXQgZXZlcnkgMjBtcy4KKyAqCisgKiBAdG9kbyBEZWNpZGUgd2hhdCB0aGlzIHNob3VsZCBkbyBpZiBpdCBzbGlwcyBtb3JlIHRoYW4gb25lIGN5Y2xlLgorICovCisKK2Jvb2wgSXRlcmF0aXZlUm9ib3Q6Ok5leHRQZXJpb2RSZWFkeSgpCit7CisJaWYgKG1fcGVyaW9kID4gMC4wKQorCXsKKwkJcmV0dXJuIG1fbWFpbkxvb3BUaW1lci5IYXNQZXJpb2RQYXNzZWQobV9wZXJpb2QpOworCX0KKwllbHNlCisJeworCQkvLyBYWFg6IEJST0tFTiEgcmV0dXJuIG1fZHMtPklzTmV3Q29udHJvbERhdGEoKTsKKwl9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUm9ib3Qtd2lkZSBpbml0aWFsaXphdGlvbiBjb2RlIHNob3VsZCBnbyBoZXJlLgorICoKKyAqIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgZGVmYXVsdCBSb2JvdC13aWRlIGluaXRpYWxpemF0aW9uIHdoaWNoIHdpbGwKKyAqIGJlIGNhbGxlZCB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCBwb3dlcmVkIG9uLiAgSXQgd2lsbCBiZSBjYWxsZWQgZXhhY3RseSAxIHRpbWUuCisgKi8KK3ZvaWQgSXRlcmF0aXZlUm9ib3Q6OlJvYm90SW5pdCgpCit7CisJcHJpbnRmKCJEZWZhdWx0ICVzKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoqCisgKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciBkaXNhYmxlZCBtb2RlIHNob3VsZCBnbyBoZXJlLgorICoKKyAqIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgaW5pdGlhbGl6YXRpb24gY29kZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUKKyAqIHRoZSByb2JvdCBlbnRlcnMgZGlzYWJsZWQgbW9kZS4KKyAqLwordm9pZCBJdGVyYXRpdmVSb2JvdDo6RGlzYWJsZWRJbml0KCkKK3sKKwlwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIGF1dG9ub21vdXMgbW9kZSBzaG91bGQgZ28gaGVyZS4KKyAqCisgKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lCisgKiB0aGUgcm9ib3QgZW50ZXJzIGF1dG9ub21vdXMgbW9kZS4KKyAqLwordm9pZCBJdGVyYXRpdmVSb2JvdDo6QXV0b25vbW91c0luaXQoKQoreworCXByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgdGVsZW9wIG1vZGUgc2hvdWxkIGdvIGhlcmUuCisgKgorICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBpbml0aWFsaXphdGlvbiBjb2RlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZQorICogdGhlIHJvYm90IGVudGVycyB0ZWxlb3AgbW9kZS4KKyAqLwordm9pZCBJdGVyYXRpdmVSb2JvdDo6VGVsZW9wSW5pdCgpCit7CisgICAgcHJpbnRmKCJEZWZhdWx0ICVzKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoqCisgKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciB0ZXN0IG1vZGUgc2hvdWxkIGdvIGhlcmUuCisgKgorICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBpbml0aWFsaXphdGlvbiBjb2RlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZQorICogdGhlIHJvYm90IGVudGVycyB0ZXN0IG1vZGUuCisgKi8KK3ZvaWQgSXRlcmF0aXZlUm9ib3Q6OlRlc3RJbml0KCkKK3sKKyAgICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIFBlcmlvZGljIGNvZGUgZm9yIGRpc2FibGVkIG1vZGUgc2hvdWxkIGdvIGhlcmUuCisgKgorICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjb2RlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHBlcmlvZGljYWxseSBhdCBhIHJlZ3VsYXIKKyAqIHJhdGUgd2hpbGUgdGhlIHJvYm90IGlzIGluIGRpc2FibGVkIG1vZGUuCisgKi8KK3ZvaWQgSXRlcmF0aXZlUm9ib3Q6OkRpc2FibGVkUGVyaW9kaWMoKQoreworCXN0YXRpYyBib29sIGZpcnN0UnVuID0gdHJ1ZTsKKwlpZiAoZmlyc3RSdW4pCisJeworCQlwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlmaXJzdFJ1biA9IGZhbHNlOworCX0KK30KKworLyoqCisgKiBQZXJpb2RpYyBjb2RlIGZvciBhdXRvbm9tb3VzIG1vZGUgc2hvdWxkIGdvIGhlcmUuCisgKgorICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjb2RlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHBlcmlvZGljYWxseSBhdCBhIHJlZ3VsYXIKKyAqIHJhdGUgd2hpbGUgdGhlIHJvYm90IGlzIGluIGF1dG9ub21vdXMgbW9kZS4KKyAqLwordm9pZCBJdGVyYXRpdmVSb2JvdDo6QXV0b25vbW91c1BlcmlvZGljKCkKK3sKKwlzdGF0aWMgYm9vbCBmaXJzdFJ1biA9IHRydWU7CisJaWYgKGZpcnN0UnVuKQorCXsKKwkJcHJpbnRmKCJEZWZhdWx0ICVzKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZmlyc3RSdW4gPSBmYWxzZTsKKwl9Cit9CisKKy8qKgorICogUGVyaW9kaWMgY29kZSBmb3IgdGVsZW9wIG1vZGUgc2hvdWxkIGdvIGhlcmUuCisgKgorICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjb2RlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHBlcmlvZGljYWxseSBhdCBhIHJlZ3VsYXIKKyAqIHJhdGUgd2hpbGUgdGhlIHJvYm90IGlzIGluIHRlbGVvcCBtb2RlLgorICovCit2b2lkIEl0ZXJhdGl2ZVJvYm90OjpUZWxlb3BQZXJpb2RpYygpCit7CisJc3RhdGljIGJvb2wgZmlyc3RSdW4gPSB0cnVlOworCWlmIChmaXJzdFJ1bikKKwl7CisJCXByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWZpcnN0UnVuID0gZmFsc2U7CisJfQorfQorCisvKioKKyAqIFBlcmlvZGljIGNvZGUgZm9yIHRlc3QgbW9kZSBzaG91bGQgZ28gaGVyZS4KKyAqCisgKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGNvZGUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5IGF0IGEgcmVndWxhcgorICogcmF0ZSB3aGlsZSB0aGUgcm9ib3QgaXMgaW4gdGVzdCBtb2RlLgorICovCit2b2lkIEl0ZXJhdGl2ZVJvYm90OjpUZXN0UGVyaW9kaWMoKQoreworICAgIHN0YXRpYyBib29sIGZpcnN0UnVuID0gdHJ1ZTsKKyAgICBpZiAoZmlyc3RSdW4pCisgICAgeworICAgICAgICBwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBmaXJzdFJ1biA9IGZhbHNlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9KYWd1YXIuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9KYWd1YXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjEwOWQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0phZ3Vhci5jcHAKQEAgLTAsMCArMSw3MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpbmNsdWRlICJKYWd1YXIuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKKy8qKgorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIEphZ3VhciBpcyBhdHRhY2hlZCB0by4KKyAqLworSmFndWFyOjpKYWd1YXIodWludDMyX3QgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpCit7CisJLyoKKwkgKiBJbnB1dCBwcm9maWxlIGRlZmluZWQgYnkgTHVtaW5hcnkgTWljcm8uCisJICoKKwkgKiBGdWxsIHJldmVyc2UgcmFuZ2VzIGZyb20gMC42NzEzMjVtcyB0byAwLjY5NzIyMTFtcworCSAqIFByb3BvcnRpb25hbCByZXZlcnNlIHJhbmdlcyBmcm9tIDAuNjk3MjIxMW1zIHRvIDEuNDQ4MjA3OG1zCisJICogTmV1dHJhbCByYW5nZXMgZnJvbSAxLjQ0ODIwNzhtcyB0byAxLjU1MTc5MjJtcworCSAqIFByb3BvcnRpb25hbCBmb3J3YXJkIHJhbmdlcyBmcm9tIDEuNTUxNzkyMm1zIHRvIDIuMzAyNzc4OW1zCisJICogRnVsbCBmb3J3YXJkIHJhbmdlcyBmcm9tIDIuMzAyNzc4OW1zIHRvIDIuMzI4Njc1bXMKKwkgKi8KKwlTZXRCb3VuZHMoMi4zMSwgMS41NSwgMS41MDcsIDEuNDU0LCAuNjk3KTsKKwlTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKKwlTZXRSYXcobV9jZW50ZXJQd20pOworCisJTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkQWN0dWF0b3IoIkphZ3VhciIsIEdldENoYW5uZWwoKSwgdGhpcyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUuCisgKgorICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQorICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorICogQHBhcmFtIHN5bmNHcm91cCBVbnVzZWQgaW50ZXJmYWNlLgorICovCit2b2lkIEphZ3Vhcjo6U2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCkKK3sKKwlTZXRTcGVlZChzcGVlZCk7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWNlbnRseSBzZXQgdmFsdWUgb2YgdGhlIFBXTS4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgdGhlIFBXTSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgSmFndWFyOjpHZXQoKSBjb25zdAoreworCXJldHVybiBHZXRTcGVlZCgpOworfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorICovCit2b2lkIEphZ3Vhcjo6RGlzYWJsZSgpCit7CisJU2V0UmF3KGtQd21EaXNhYmxlZCk7Cit9CisKKy8qKgorICogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQV00gdmFsdWUgYXMgd2FzIGZvdW5kIGluIHRoZSBQSURDb250cm9sbGVyCisgKi8KK3ZvaWQgSmFndWFyOjpQSURXcml0ZShmbG9hdCBvdXRwdXQpCit7CisJU2V0KG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0pveXN0aWNrLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvSm95c3RpY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTI5OWMKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL0pveXN0aWNrLmNwcApAQCAtMCwwICsxLDM3NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiSm95c3RpY2suaCIKKyNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0WEF4aXM7Citjb25zdCB1aW50MzJfdCBKb3lzdGljazo6a0RlZmF1bHRZQXhpczsKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFpBeGlzOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0VHdpc3RBeGlzOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0VGhyb3R0bGVBeGlzOworY29uc3QgdWludDMyX3QgSm95c3RpY2s6OmtEZWZhdWx0VHJpZ2dlckJ1dHRvbjsKK2NvbnN0IHVpbnQzMl90IEpveXN0aWNrOjprRGVmYXVsdFRvcEJ1dHRvbjsKK3N0YXRpYyBKb3lzdGljayAqam95c3RpY2tzW0RyaXZlclN0YXRpb246OmtKb3lzdGlja1BvcnRzXTsKK3N0YXRpYyBib29sIGpveVN0aWNrc0luaXRpYWxpemVkID0gZmFsc2U7CisKKy8qKgorICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIGEgam95c3RpY2suCisgKiBUaGUgam95c3RpY2sgaW5kZXggaXMgdGhlIHVzYiBwb3J0IG9uIHRoZSBkcml2ZXJzIHN0YXRpb24uCisgKgorICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgb24gdGhlIGRyaXZlciBzdGF0aW9uIHRoYXQgdGhlIGpveXN0aWNrIGlzIHBsdWdnZWQgaW50bworICogKDAtNSkuCisgKi8KK0pveXN0aWNrOjpKb3lzdGljayh1aW50MzJfdCBwb3J0KQorICAgIDogSm95c3RpY2socG9ydCwga051bUF4aXNUeXBlcywga051bUJ1dHRvblR5cGVzKSB7CisgIG1fYXhlc1trWEF4aXNdID0ga0RlZmF1bHRYQXhpczsKKyAgbV9heGVzW2tZQXhpc10gPSBrRGVmYXVsdFlBeGlzOworICBtX2F4ZXNba1pBeGlzXSA9IGtEZWZhdWx0WkF4aXM7CisgIG1fYXhlc1trVHdpc3RBeGlzXSA9IGtEZWZhdWx0VHdpc3RBeGlzOworICBtX2F4ZXNba1Rocm90dGxlQXhpc10gPSBrRGVmYXVsdFRocm90dGxlQXhpczsKKworICBtX2J1dHRvbnNba1RyaWdnZXJCdXR0b25dID0ga0RlZmF1bHRUcmlnZ2VyQnV0dG9uOworICBtX2J1dHRvbnNba1RvcEJ1dHRvbl0gPSBrRGVmYXVsdFRvcEJ1dHRvbjsKKworICBIQUxSZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfSm95c3RpY2ssIHBvcnQpOworfQorCisvKioKKyAqIFZlcnNpb24gb2YgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIGNhbGxlZCBieSBzdWItY2xhc3Nlcy4KKyAqCisgKiBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB0aGUgc3ViY2xhc3MgdG8gY29uZmlndXJlIHRoZSBudW1iZXIgb2YgY29uc3RhbnRzCisgKiBmb3IgYXhlcyBhbmQgYnV0dG9ucy4KKyAqCisgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBvbiB0aGUgZHJpdmVyIHN0YXRpb24gdGhhdCB0aGUgam95c3RpY2sgaXMgcGx1Z2dlZCBpbnRvLgorICogQHBhcmFtIG51bUF4aXNUeXBlcyBUaGUgbnVtYmVyIG9mIGF4aXMgdHlwZXMgaW4gdGhlIGVudW0uCisgKiBAcGFyYW0gbnVtQnV0dG9uVHlwZXMgVGhlIG51bWJlciBvZiBidXR0b24gdHlwZXMgaW4gdGhlIGVudW0uCisgKi8KK0pveXN0aWNrOjpKb3lzdGljayh1aW50MzJfdCBwb3J0LCB1aW50MzJfdCBudW1BeGlzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQnV0dG9uVHlwZXMpCisgICAgOiBtX2RzKERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCkpLAorICAgICAgbV9wb3J0KHBvcnQpLAorICAgICAgbV9heGVzKG51bUF4aXNUeXBlcyksCisgICAgICBtX2J1dHRvbnMobnVtQnV0dG9uVHlwZXMpIHsKKyAgaWYgKCFqb3lTdGlja3NJbml0aWFsaXplZCkgeworICAgIGZvciAoYXV0byYgam95c3RpY2sgOiBqb3lzdGlja3MpIGpveXN0aWNrID0gbnVsbHB0cjsKKyAgICBqb3lTdGlja3NJbml0aWFsaXplZCA9IHRydWU7CisgIH0KKyAgaWYgKG1fcG9ydCA+PSBEcml2ZXJTdGF0aW9uOjprSm95c3RpY2tQb3J0cykgeworICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBqb3lzdGlja3NbbV9wb3J0XSA9IHRoaXM7CisgIH0KK30KKworSm95c3RpY2sgKkpveXN0aWNrOjpHZXRTdGlja0ZvclBvcnQodWludDMyX3QgcG9ydCkgeworICBKb3lzdGljayAqc3RpY2sgPSBqb3lzdGlja3NbcG9ydF07CisgIGlmIChzdGljayA9PSBudWxscHRyKSB7CisgICAgc3RpY2sgPSBuZXcgSm95c3RpY2socG9ydCk7CisgICAgam95c3RpY2tzW3BvcnRdID0gc3RpY2s7CisgIH0KKyAgcmV0dXJuIHN0aWNrOworfQorCisvKioKKyAqIEdldCB0aGUgWCB2YWx1ZSBvZiB0aGUgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgorICogQHBhcmFtIGhhbmQgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlIEpveXN0aWNrIGNsYXNzIGFuZCBpcyBvbmx5IGhlcmUKKyAqIHRvIGNvbXBsZXRlIHRoZSBHZW5lcmljSElEIGludGVyZmFjZS4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFgoSm95c3RpY2tIYW5kIGhhbmQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFJhd0F4aXMobV9heGVzW2tYQXhpc10pOworfQorCisvKioKKyAqIEdldCB0aGUgWSB2YWx1ZSBvZiB0aGUgam95c3RpY2suCisgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgorICogQHBhcmFtIGhhbmQgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlIEpveXN0aWNrIGNsYXNzIGFuZCBpcyBvbmx5IGhlcmUKKyAqIHRvIGNvbXBsZXRlIHRoZSBHZW5lcmljSElEIGludGVyZmFjZS4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFkoSm95c3RpY2tIYW5kIGhhbmQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFJhd0F4aXMobV9heGVzW2tZQXhpc10pOworfQorCisvKioKKyAqIEdldCB0aGUgWiB2YWx1ZSBvZiB0aGUgY3VycmVudCBqb3lzdGljay4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXRaKCkgY29uc3QgeyByZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba1pBeGlzXSk7IH0KKworLyoqCisgKiBHZXQgdGhlIHR3aXN0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGpveXN0aWNrLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnQgcG9ydC4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFR3aXN0KCkgY29uc3QgeyByZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba1R3aXN0QXhpc10pOyB9CisKKy8qKgorICogR2V0IHRoZSB0aHJvdHRsZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBqb3lzdGljay4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCisgKi8KK2Zsb2F0IEpveXN0aWNrOjpHZXRUaHJvdHRsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFJhd0F4aXMobV9heGVzW2tUaHJvdHRsZUF4aXNdKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBheGlzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQsIHN0YXJ0aW5nIGF0IDAuCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXhpcy4KKyAqLworZmxvYXQgSm95c3RpY2s6OkdldFJhd0F4aXModWludDMyX3QgYXhpcykgY29uc3QgeworICByZXR1cm4gbV9kcy5HZXRTdGlja0F4aXMobV9wb3J0LCBheGlzKTsKK30KKworLyoqCisgKiBGb3IgdGhlIGN1cnJlbnQgam95c3RpY2ssIHJldHVybiB0aGUgYXhpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhcmd1bWVudC4KKyAqCisgKiBUaGlzIGlzIGZvciBjYXNlcyB3aGVyZSB0aGUgam95c3RpY2sgYXhpcyBpcyByZXR1cm5lZCBwcm9ncmFtYXRpY2FsbHksCisgKiBvdGhlcndpc2Ugb25lIG9mIHRoZQorICogcHJldmlvdXMgZnVuY3Rpb25zIHdvdWxkIGJlIHByZWZlcmFibGUgKGZvciBleGFtcGxlIEdldFgoKSkuCisgKgorICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gcmVhZC4KKyAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBheGlzLgorICovCitmbG9hdCBKb3lzdGljazo6R2V0QXhpcyhBeGlzVHlwZSBheGlzKSBjb25zdCB7CisgIHN3aXRjaCAoYXhpcykgeworICAgIGNhc2Uga1hBeGlzOgorICAgICAgcmV0dXJuIHRoaXMtPkdldFgoKTsKKyAgICBjYXNlIGtZQXhpczoKKyAgICAgIHJldHVybiB0aGlzLT5HZXRZKCk7CisgICAgY2FzZSBrWkF4aXM6CisgICAgICByZXR1cm4gdGhpcy0+R2V0WigpOworICAgIGNhc2Uga1R3aXN0QXhpczoKKyAgICAgIHJldHVybiB0aGlzLT5HZXRUd2lzdCgpOworICAgIGNhc2Uga1Rocm90dGxlQXhpczoKKyAgICAgIHJldHVybiB0aGlzLT5HZXRUaHJvdHRsZSgpOworICAgIGRlZmF1bHQ6CisgICAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tBeGlzKTsKKyAgICAgIHJldHVybiAwLjA7CisgIH0KK30KKworLyoqCisgKiBSZWFkIHRoZSBzdGF0ZSBvZiB0aGUgdHJpZ2dlciBvbiB0aGUgam95c3RpY2suCisgKgorICogTG9vayB1cCB3aGljaCBidXR0b24gaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRyaWdnZXIgYW5kIHJlYWQgaXRzIHN0YXRlLgorICoKKyAqIEBwYXJhbSBoYW5kIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgZm9yIHRoZSBKb3lzdGljayBjbGFzcyBhbmQgaXMgb25seSBoZXJlCisgKiB0byBjb21wbGV0ZSB0aGUgR2VuZXJpY0hJRCBpbnRlcmZhY2UuCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgdHJpZ2dlci4KKyAqLworYm9vbCBKb3lzdGljazo6R2V0VHJpZ2dlcihKb3lzdGlja0hhbmQgaGFuZCkgY29uc3QgeworICByZXR1cm4gR2V0UmF3QnV0dG9uKG1fYnV0dG9uc1trVHJpZ2dlckJ1dHRvbl0pOworfQorCisvKioKKyAqIFJlYWQgdGhlIHN0YXRlIG9mIHRoZSB0b3AgYnV0dG9uIG9uIHRoZSBqb3lzdGljay4KKyAqCisgKiBMb29rIHVwIHdoaWNoIGJ1dHRvbiBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgdG9wIGFuZCByZWFkIGl0cyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gaGFuZCBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciB0aGUgSm95c3RpY2sgY2xhc3MgYW5kIGlzIG9ubHkgaGVyZQorICogdG8gY29tcGxldGUgdGhlIEdlbmVyaWNISUQgaW50ZXJmYWNlLgorICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHRvcCBidXR0b24uCisgKi8KK2Jvb2wgSm95c3RpY2s6OkdldFRvcChKb3lzdGlja0hhbmQgaGFuZCkgY29uc3QgeworICByZXR1cm4gR2V0UmF3QnV0dG9uKG1fYnV0dG9uc1trVG9wQnV0dG9uXSk7Cit9CisKKy8qKgorICogVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgSm95c3RpY2suCisgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGhlcmUgdG8gY29tcGxldGUgdGhlIEdlbmVyaWNISUQgaW50ZXJmYWNlLgorICovCitib29sIEpveXN0aWNrOjpHZXRCdW1wZXIoSm95c3RpY2tIYW5kIGhhbmQpIGNvbnN0IHsKKyAgLy8gSm95c3RpY2tzIGRvbid0IGhhdmUgYnVtcGVycy4KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIEdldCB0aGUgYnV0dG9uIHZhbHVlIChzdGFydGluZyBhdCBidXR0b24gMSkKKyAqCisgKiBUaGUgYnV0dG9ucyBhcmUgcmV0dXJuZWQgaW4gYSBzaW5nbGUgMTYgYml0IHZhbHVlIHdpdGggb25lIGJpdCByZXByZXNlbnRpbmcKKyAqIHRoZSBzdGF0ZQorICogb2YgZWFjaCBidXR0b24uIFRoZSBhcHByb3ByaWF0ZSBidXR0b24gaXMgcmV0dXJuZWQgYXMgYSBib29sZWFuIHZhbHVlLgorICoKKyAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBudW1iZXIgdG8gYmUgcmVhZCAoc3RhcnRpbmcgYXQgMSkKKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCisgKiovCitib29sIEpveXN0aWNrOjpHZXRSYXdCdXR0b24odWludDMyX3QgYnV0dG9uKSBjb25zdCB7CisgIHJldHVybiBtX2RzLkdldFN0aWNrQnV0dG9uKG1fcG9ydCwgYnV0dG9uKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHN0YXRlIG9mIGEgUE9WIG9uIHRoZSBqb3lzdGljay4KKyAqCisgKiBAcGFyYW0gcG92IFRoZSBpbmRleCBvZiB0aGUgUE9WIHRvIHJlYWQgKHN0YXJ0aW5nIGF0IDApCisgKiBAcmV0dXJuIHRoZSBhbmdsZSBvZiB0aGUgUE9WIGluIGRlZ3JlZXMsIG9yIC0xIGlmIHRoZSBQT1YgaXMgbm90IHByZXNzZWQuCisgKi8KK2ludCBKb3lzdGljazo6R2V0UE9WKHVpbnQzMl90IHBvdikgY29uc3QgeworICByZXR1cm4gbV9kcy5HZXRTdGlja1BPVihtX3BvcnQsIHBvdik7Cit9CisKKy8qKgorICogR2V0IGJ1dHRvbnMgYmFzZWQgb24gYW4gZW51bWVyYXRlZCB0eXBlLgorICoKKyAqIFRoZSBidXR0b24gdHlwZSB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUgbGlzdCBvZiBidXR0b25zIGFuZCB0aGVuIHJlYWQuCisgKgorICogQHBhcmFtIGJ1dHRvbiBUaGUgdHlwZSBvZiBidXR0b24gdG8gcmVhZC4KKyAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCisgKi8KK2Jvb2wgSm95c3RpY2s6OkdldEJ1dHRvbihCdXR0b25UeXBlIGJ1dHRvbikgY29uc3QgeworICBzd2l0Y2ggKGJ1dHRvbikgeworICAgIGNhc2Uga1RyaWdnZXJCdXR0b246CisgICAgICByZXR1cm4gR2V0VHJpZ2dlcigpOworICAgIGNhc2Uga1RvcEJ1dHRvbjoKKyAgICAgIHJldHVybiBHZXRUb3AoKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgYXhpcyBmb3IgYSBqb3lzdGljaworICoKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBheGlzIGZvciB0aGUgY3VycmVudCBqb3lzdGljaworICovCitpbnQgSm95c3RpY2s6OkdldEF4aXNDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fZHMuR2V0U3RpY2tBeGlzQ291bnQobV9wb3J0KTsgfQorCisvKioKKyAqIEdldCB0aGUgdmFsdWUgb2YgaXNYYm94IGZvciB0aGUgam95c3RpY2suCisgKgorICogQHJldHVybiBBIGJvb2xlYW4gdGhhdCBpcyB0cnVlIGlmIHRoZSBqb3lzdGljayBpcyBhbiB4Ym94IGNvbnRyb2xsZXIuCisgKi8KK2Jvb2wgSm95c3RpY2s6OkdldElzWGJveCgpIGNvbnN0IHsgcmV0dXJuIG1fZHMuR2V0Sm95c3RpY2tJc1hib3gobV9wb3J0KTsgfQorCisvKioKKyAqIEdldCB0aGUgSElEIHR5cGUgb2YgdGhlIGNvbnRyb2xsZXIuCisgKgorICogQHJldHVybiB0aGUgSElEIHR5cGUgb2YgdGhlIGNvbnRyb2xsZXIuCisgKi8KK0pveXN0aWNrOjpISURUeXBlIEpveXN0aWNrOjpHZXRUeXBlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SElEVHlwZT4obV9kcy5HZXRKb3lzdGlja1R5cGUobV9wb3J0KSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBuYW1lIG9mIHRoZSBqb3lzdGljay4KKyAqCisgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGVyLgorICovCitzdGQ6OnN0cmluZyBKb3lzdGljazo6R2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHMuR2V0Sm95c3RpY2tOYW1lKG1fcG9ydCk7IH0KKworLy8gaW50IEpveXN0aWNrOjpHZXRBeGlzVHlwZSh1aW50OF90IGF4aXMpIGNvbnN0CisvL3sKKy8vCXJldHVybiBtX2RzLkdldEpveXN0aWNrQXhpc1R5cGUobV9wb3J0LCBheGlzKTsKKy8vfQorCisvKioKKyAgKiBHZXQgdGhlIG51bWJlciBvZiBheGlzIGZvciBhIGpveXN0aWNrCisgICoKKyogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gdGhlIGN1cnJlbnQgam95c3RpY2sKKyAqLworaW50IEpveXN0aWNrOjpHZXRCdXR0b25Db3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fZHMuR2V0U3RpY2tCdXR0b25Db3VudChtX3BvcnQpOworfQorCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGF4aXMgZm9yIGEgam95c3RpY2sKKyAqCisgKiBAcmV0dXJuIHRoZW4gdW1iZXIgb2YgUE9WcyBmb3IgdGhlIGN1cnJlbnQgam95c3RpY2sKKyAqLworaW50IEpveXN0aWNrOjpHZXRQT1ZDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fZHMuR2V0U3RpY2tQT1ZDb3VudChtX3BvcnQpOyB9CisKKy8qKgorICogR2V0IHRoZSBjaGFubmVsIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBheGlzLgorICoKKyAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIGxvb2sgdXAgdGhlIGNoYW5uZWwgZm9yLgorICogQHJldHVybiBUaGUgY2hhbm5lbCBmciB0aGUgYXhpcy4KKyAqLwordWludDMyX3QgSm95c3RpY2s6OkdldEF4aXNDaGFubmVsKEF4aXNUeXBlIGF4aXMpIGNvbnN0IHsgcmV0dXJuIG1fYXhlc1theGlzXTsgfQorCisvKioKKyAqIFNldCB0aGUgY2hhbm5lbCBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpZWQgYXhpcy4KKyAqCisgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBzZXQgdGhlIGNoYW5uZWwgZm9yLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgdG8gc2V0IHRoZSBheGlzIHRvLgorICovCit2b2lkIEpveXN0aWNrOjpTZXRBeGlzQ2hhbm5lbChBeGlzVHlwZSBheGlzLCB1aW50MzJfdCBjaGFubmVsKSB7CisgIG1fYXhlc1theGlzXSA9IGNoYW5uZWw7Cit9CisKKy8qKgorICogR2V0IHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpcmVjdGlvbiB2ZWN0b3IgZm9ybWVkIGJ5IHRoZSBqb3lzdGljaydzCisgKiBjdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIGl0cyBvcmlnaW4KKyAqCisgKiBAcmV0dXJuIFRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpcmVjdGlvbiB2ZWN0b3IKKyAqLworZmxvYXQgSm95c3RpY2s6OkdldE1hZ25pdHVkZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHNxcnQocG93KEdldFgoKSwgMikgKyBwb3coR2V0WSgpLCAyKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHZlY3RvciBmb3JtZWQgYnkgdGhlIGpveXN0aWNrIGFuZCBpdHMgb3JpZ2luCisgKiBpbiByYWRpYW5zCisgKgorICogQHJldHVybiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB2ZWN0b3IgaW4gcmFkaWFucworICovCitmbG9hdCBKb3lzdGljazo6R2V0RGlyZWN0aW9uUmFkaWFucygpIGNvbnN0IHsgcmV0dXJuIGF0YW4yKEdldFgoKSwgLUdldFkoKSk7IH0KKworLyoqCisgKiBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGZvcm1lZCBieSB0aGUgam95c3RpY2sgYW5kIGl0cyBvcmlnaW4KKyAqIGluIGRlZ3JlZXMKKyAqCisgKiB1c2VzIGFjb3MoLTEpIHRvIHJlcHJlc2VudCBQaSBkdWUgdG8gYWJzZW5jZSBvZiByZWFkaWx5IGFjY2Vzc2libGUgUGkKKyAqIGNvbnN0YW50IGluIEMrKworICoKKyAqIEByZXR1cm4gVGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGluIGRlZ3JlZXMKKyAqLworZmxvYXQgSm95c3RpY2s6OkdldERpcmVjdGlvbkRlZ3JlZXMoKSBjb25zdCB7CisgIHJldHVybiAoMTgwIC8gYWNvcygtMSkpICogR2V0RGlyZWN0aW9uUmFkaWFucygpOworfQorCisvKioKKyAqIFNldCB0aGUgcnVtYmxlIG91dHB1dCBmb3IgdGhlIGpveXN0aWNrLiBUaGUgRFMgY3VycmVudGx5IHN1cHBvcnRzIDIgcnVtYmxlCisgKiB2YWx1ZXMsCisgKiBsZWZ0IHJ1bWJsZSBhbmQgcmlnaHQgcnVtYmxlCisgKiBAcGFyYW0gdHlwZSBXaGljaCBydW1ibGUgdmFsdWUgdG8gc2V0CisgKiBAcGFyYW0gdmFsdWUgVGhlIG5vcm1hbGl6ZWQgdmFsdWUgKDAgdG8gMSkgdG8gc2V0IHRoZSBydW1ibGUgdG8KKyAqLwordm9pZCBKb3lzdGljazo6U2V0UnVtYmxlKFJ1bWJsZVR5cGUgdHlwZSwgZmxvYXQgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgMCkKKyAgICB2YWx1ZSA9IDA7CisgIGVsc2UgaWYgKHZhbHVlID4gMSkKKyAgICB2YWx1ZSA9IDE7CisgIGlmICh0eXBlID09IGtMZWZ0UnVtYmxlKQorICAgIG1fbGVmdFJ1bWJsZSA9IHZhbHVlICogNjU1MzU7CisgIGVsc2UKKyAgICBtX3JpZ2h0UnVtYmxlID0gdmFsdWUgKiA2NTUzNTsKKyAgSEFMU2V0Sm95c3RpY2tPdXRwdXRzKG1fcG9ydCwgbV9vdXRwdXRzLCBtX2xlZnRSdW1ibGUsIG1fcmlnaHRSdW1ibGUpOworfQorCisvKioKKyAqIFNldCBhIHNpbmdsZSBISUQgb3V0cHV0IHZhbHVlIGZvciB0aGUgam95c3RpY2suCisgKiBAcGFyYW0gb3V0cHV0TnVtYmVyIFRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IHRvIHNldCAoMS0zMikKKyAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBvdXRwdXQgdG8KKyAqLworCit2b2lkIEpveXN0aWNrOjpTZXRPdXRwdXQodWludDhfdCBvdXRwdXROdW1iZXIsIGJvb2wgdmFsdWUpIHsKKyAgbV9vdXRwdXRzID0KKyAgICAgIChtX291dHB1dHMgJiB+KDEgPDwgKG91dHB1dE51bWJlciAtIDEpKSkgfCAodmFsdWUgPDwgKG91dHB1dE51bWJlciAtIDEpKTsKKworICBIQUxTZXRKb3lzdGlja091dHB1dHMobV9wb3J0LCBtX291dHB1dHMsIG1fbGVmdFJ1bWJsZSwgbV9yaWdodFJ1bWJsZSk7Cit9CisKKy8qKgorICogU2V0IGFsbCBISUQgb3V0cHV0IHZhbHVlcyBmb3IgdGhlIGpveXN0aWNrLgorICogQHBhcmFtIHZhbHVlIFRoZSAzMiBiaXQgb3V0cHV0IHZhbHVlICgxIGJpdCBmb3IgZWFjaCBvdXRwdXQpCisgKi8KK3ZvaWQgSm95c3RpY2s6OlNldE91dHB1dHModWludDMyX3QgdmFsdWUpIHsKKyAgbV9vdXRwdXRzID0gdmFsdWU7CisgIEhBTFNldEpveXN0aWNrT3V0cHV0cyhtX3BvcnQsIG1fb3V0cHV0cywgbV9sZWZ0UnVtYmxlLCBtX3JpZ2h0UnVtYmxlKTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvTW90b3JTYWZldHlIZWxwZXIuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9Nb3RvclNhZmV0eUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmNTM1MgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvTW90b3JTYWZldHlIZWxwZXIuY3BwCkBAIC0wLDAgKzEsMTQwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgorCisjaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgorI2luY2x1ZGUgIk1vdG9yU2FmZXR5LmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworc3RkOjpzZXQ8TW90b3JTYWZldHlIZWxwZXIqPiBNb3RvclNhZmV0eUhlbHBlcjo6bV9oZWxwZXJMaXN0OworcHJpb3JpdHlfcmVjdXJzaXZlX211dGV4IE1vdG9yU2FmZXR5SGVscGVyOjptX2xpc3RNdXRleDsKKworLyoqCisgKiBUaGUgY29uc3RydWN0b3IgZm9yIGEgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0LgorICogVGhlIGhlbHBlciBvYmplY3QgaXMgY29uc3RydWN0ZWQgZm9yIGV2ZXJ5IG9iamVjdCB0aGF0IHdhbnRzIHRvIGltcGxlbWVudCB0aGUKKyAqIE1vdG9yCisgKiBTYWZldHkgcHJvdG9jb2wuIFRoZSBoZWxwZXIgb2JqZWN0IGhhcyB0aGUgY29kZSB0byBhY3R1YWxseSBkbyB0aGUgdGltaW5nIGFuZAorICogY2FsbCB0aGUKKyAqIG1vdG9ycyBTdG9wKCkgbWV0aG9kIHdoZW4gdGhlIHRpbWVvdXQgZXhwaXJlcy4gVGhlIG1vdG9yIG9iamVjdCBpcyBleHBlY3RlZAorICogdG8gY2FsbCB0aGUKKyAqIEZlZWQoKSBtZXRob2Qgd2hlbmV2ZXIgdGhlIG1vdG9ycyB2YWx1ZSBpcyB1cGRhdGVkLgorICogQHBhcmFtIHNhZmVPYmplY3QgYSBwb2ludGVyIHRvIHRoZSBtb3RvciBvYmplY3QgaW1wbGVtZW50aW5nIE1vdG9yU2FmZXR5LgorICogVGhpcyBpcyB1c2VkCisgKiB0byBjYWxsIHRoZSBTdG9wKCkgbWV0aG9kIG9uIHRoZSBtb3Rvci4KKyAqLworTW90b3JTYWZldHlIZWxwZXI6Ok1vdG9yU2FmZXR5SGVscGVyKE1vdG9yU2FmZXR5ICpzYWZlT2JqZWN0KQorICAgIDogbV9zYWZlT2JqZWN0KHNhZmVPYmplY3QpIHsKKyAgbV9lbmFibGVkID0gZmFsc2U7CisgIG1fZXhwaXJhdGlvbiA9IERFRkFVTFRfU0FGRVRZX0VYUElSQVRJT047CisgIG1fc3RvcFRpbWUgPSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpOworCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9saXN0TXV0ZXgpOworICBtX2hlbHBlckxpc3QuaW5zZXJ0KHRoaXMpOworfQorCitNb3RvclNhZmV0eUhlbHBlcjo6fk1vdG9yU2FmZXR5SGVscGVyKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBzeW5jKG1fbGlzdE11dGV4KTsKKyAgbV9oZWxwZXJMaXN0LmVyYXNlKHRoaXMpOworfQorCisvKioKKyAqIEZlZWQgdGhlIG1vdG9yIHNhZmV0eSBvYmplY3QuCisgKiBSZXNldHMgdGhlIHRpbWVyIG9uIHRoaXMgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBkbyB0aGUgdGltZW91dHMuCisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OkZlZWQoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICBtX3N0b3BUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKSArIG1fZXhwaXJhdGlvbjsKK30KKworLyoqCisgKiBTZXQgdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbW90b3Igc2FmZXR5IG9iamVjdC4KKyAqIEBwYXJhbSBleHBpcmF0aW9uVGltZSBUaGUgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgorICovCit2b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpTZXRFeHBpcmF0aW9uKGZsb2F0IGV4cGlyYXRpb25UaW1lKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICBtX2V4cGlyYXRpb24gPSBleHBpcmF0aW9uVGltZTsKK30KKworLyoqCisgKiBSZXRyaWV2ZSB0aGUgdGltZW91dCB2YWx1ZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbW90b3Igc2FmZXR5IG9iamVjdC4KKyAqIEByZXR1cm4gdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KKyAqLworZmxvYXQgTW90b3JTYWZldHlIZWxwZXI6OkdldEV4cGlyYXRpb24oKSBjb25zdCB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICByZXR1cm4gbV9leHBpcmF0aW9uOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgbW90b3IgaXMgc3RpbGwgb3BlcmF0aW5nIG9yIGhhcyB0aW1lZCBvdXQuCisgKiBAcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgbW90b3IgaXMgc3RpbGwgb3BlcmF0aW5nIG5vcm1hbGx5IGFuZCBoYXNuJ3QKKyAqIHRpbWVkIG91dC4KKyAqLworYm9vbCBNb3RvclNhZmV0eUhlbHBlcjo6SXNBbGl2ZSgpIGNvbnN0IHsKKyAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhtX3N5bmNNdXRleCk7CisgIHJldHVybiAhbV9lbmFibGVkIHx8IG1fc3RvcFRpbWUgPiBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoaXMgbW90b3IgaGFzIGV4Y2VlZGVkIGl0cyB0aW1lb3V0LgorICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBkZXRlcm1pbmUgaWYgdGhpcyBtb3RvciBoYXMgZXhjZWVkZWQKKyAqIGl0cyB0aW1lb3V0CisgKiB2YWx1ZS4gSWYgaXQgaGFzLCB0aGUgc3RvcCBtZXRob2QgaXMgY2FsbGVkLCBhbmQgdGhlIG1vdG9yIGlzIHNodXQgZG93biB1bnRpbAorICogaXRzIHZhbHVlIGlzCisgKiB1cGRhdGVkIGFnYWluLgorICovCit2b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpDaGVjaygpCit7CisJRHJpdmVyU3RhdGlvbiAmZHMgPSBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpOworCWlmICghbV9lbmFibGVkIHx8IGRzLklzRGlzYWJsZWQoKSB8fCBkcy5Jc1Rlc3QoKSkgcmV0dXJuOworCisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICBpZiAobV9zdG9wVGltZSA8IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCkpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gZGVzYzsKKyAgICBtX3NhZmVPYmplY3QtPkdldERlc2NyaXB0aW9uKGRlc2MpOworICAgIGRlc2MgPDwgICIuLi4gT3V0cHV0IG5vdCB1cGRhdGVkIG9mdGVuIGVub3VnaC4iOworICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsIGRlc2Muc3RyKCkuY19zdHIoKSk7CisgICAgbV9zYWZlT2JqZWN0LT5TdG9wTW90b3IoKTsKKyAgfQorfQorCisvKioKKyAqIEVuYWJsZS9kaXNhYmxlIG1vdG9yIHNhZmV0eSBmb3IgdGhpcyBkZXZpY2UKKyAqIFR1cm4gb24gYW5kIG9mZiB0aGUgbW90b3Igc2FmZXR5IG9wdGlvbiBmb3IgdGhpcyBQV00gb2JqZWN0LgorICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0CisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICBtX2VuYWJsZWQgPSBlbmFibGVkOworfQorCisvKioKKyAqIFJldHVybiB0aGUgc3RhdGUgb2YgdGhlIG1vdG9yIHNhZmV0eSBlbmFibGVkIGZsYWcKKyAqIFJldHVybiBpZiB0aGUgbW90b3Igc2FmZXR5IGlzIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGlzIGRldmljY2UuCisgKiBAcmV0dXJuIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIGRldmljZQorICovCitib29sIE1vdG9yU2FmZXR5SGVscGVyOjpJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCB7CisgIHN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMobV9zeW5jTXV0ZXgpOworICByZXR1cm4gbV9lbmFibGVkOworfQorCisvKioKKyAqIENoZWNrIHRoZSBtb3RvcnMgdG8gc2VlIGlmIGFueSBoYXZlIHRpbWVkIG91dC4KKyAqIFRoaXMgc3RhdGljICBtZXRob2QgaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBwb2xsIGFsbCB0aGUgbW90b3JzIGFuZCBzdG9wCisgKiBhbnkgdGhhdCBoYXZlCisgKiB0aW1lZCBvdXQuCisgKi8KK3ZvaWQgTW90b3JTYWZldHlIZWxwZXI6OkNoZWNrTW90b3JzKCkgeworICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBzeW5jKG1fbGlzdE11dGV4KTsKKyAgZm9yIChhdXRvIGVsZW0gOiBtX2hlbHBlckxpc3QpIHsKKyAgICBlbGVtLT5DaGVjaygpOworICB9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL05vdGlmaWVyLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvTm90aWZpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZGFhZjAKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL05vdGlmaWVyLmNwcApAQCAtMCwwICsxLDI2MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiTm90aWZpZXIuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKworTm90aWZpZXIgKk5vdGlmaWVyOjp0aW1lclF1ZXVlSGVhZCA9IG51bGxwdHI7Citwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggTm90aWZpZXI6OnF1ZXVlTXV0ZXg7CitzdGQ6OmF0b21pYzxpbnQ+IE5vdGlmaWVyOjpyZWZjb3VudHswfTsKK3N0ZDo6dGhyZWFkIE5vdGlmaWVyOjptX3Rhc2s7CitzdGQ6OmF0b21pYzxib29sPiBOb3RpZmllcjo6bV9zdG9wcGVkKGZhbHNlKTsKKworLyoqCisgKiBDcmVhdGUgYSBOb3RpZmllciBmb3IgdGltZXIgZXZlbnQgbm90aWZpY2F0aW9uLgorICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgaXMgY2FsbGVkIGF0IHRoZSBub3RpZmljYXRpb24gdGltZSB3aGljaCBpcyBzZXQKKyAqIHVzaW5nIFN0YXJ0U2luZ2xlIG9yIFN0YXJ0UGVyaW9kaWMuCisgKi8KK05vdGlmaWVyOjpOb3RpZmllcihUaW1lckV2ZW50SGFuZGxlciBoYW5kbGVyLCB2b2lkICpwYXJhbSkKK3sKKwlpZiAoaGFuZGxlciA9PSBudWxscHRyKQorCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiaGFuZGxlciBtdXN0IG5vdCBiZSBudWxscHRyIik7CisJbV9oYW5kbGVyID0gaGFuZGxlcjsKKwltX3BhcmFtID0gcGFyYW07CisJbV9wZXJpb2RpYyA9IGZhbHNlOworCW1fZXhwaXJhdGlvblRpbWUgPSAwOworCW1fcGVyaW9kID0gMDsKKwltX25leHRFdmVudCA9IG51bGxwdHI7CisJbV9xdWV1ZWQgPSBmYWxzZTsKKwl7CisJCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMocXVldWVNdXRleCk7CisJCS8vIGRvIHRoZSBmaXJzdCB0aW1lIGludGlhbGl6YXRpb24gb2Ygc3RhdGljIHZhcmlhYmxlcworCQlpZiAocmVmY291bnQuZmV0Y2hfYWRkKDEpID09IDApIHsKKwkJCW1fdGFzayA9IHN0ZDo6dGhyZWFkKFJ1bik7CisJCX0KKwl9Cit9CisKKy8qKgorICogRnJlZSB0aGUgcmVzb3VyY2VzIGZvciBhIHRpbWVyIGV2ZW50LgorICogQWxsIHJlc291cmNlcyB3aWxsIGJlIGZyZWVkIGFuZCB0aGUgdGltZXIgZXZlbnQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlCisgKiBxdWV1ZSBpZiBuZWNlc3NhcnkuCisgKi8KK05vdGlmaWVyOjp+Tm90aWZpZXIoKQoreworCXsKKwkJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhxdWV1ZU11dGV4KTsKKwkJRGVsZXRlRnJvbVF1ZXVlKCk7CisKKwkJLy8gRGVsZXRlIHRoZSBzdGF0aWMgdmFyaWFibGVzIHdoZW4gdGhlIGxhc3Qgb25lIGlzIGdvaW5nIGF3YXkKKwkJaWYgKHJlZmNvdW50LmZldGNoX3N1YigxKSA9PSAxKQorCQl7CisgICAgICBtX3N0b3BwZWQgPSB0cnVlOworCQkJbV90YXNrLmpvaW4oKTsKKwkJfQorCX0KKworCS8vIEFjcXVpcmUgdGhlIHNlbWFwaG9yZTsgdGhpcyBtYWtlcyBjZXJ0YWluIHRoYXQgdGhlIGhhbmRsZXIgaXMKKwkvLyBub3QgYmVpbmcgZXhlY3V0ZWQgYnkgdGhlIGludGVycnVwdCBtYW5hZ2VyLgorCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX2hhbmRsZXJNdXRleCk7Cit9CisKKy8qKgorICogVXBkYXRlIHRoZSBhbGFybSBoYXJkd2FyZSB0byByZWZsZWN0IHRoZSBjdXJyZW50IGZpcnN0IGVsZW1lbnQgaW4gdGhlIHF1ZXVlLgorICogQ29tcHV0ZSB0aGUgdGltZSB0aGUgbmV4dCBhbGFybSBzaG91bGQgb2NjdXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlCisgKiBwZXJpb2QgZm9yIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB0aW1lciBxdWV1ZS4KKyAqIFdBUk5JTkc6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIHN5bmNocm9uaXphdGlvbiEgSXQgbXVzdCBiZSBjYWxsZWQgZnJvbSBzb21ld2hlcmUKKyAqIHRoYXQgaXMgdGFraW5nIGNhcmUgb2Ygc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIHF1ZXVlLgorICovCit2b2lkIE5vdGlmaWVyOjpVcGRhdGVBbGFybSgpCit7Cit9CisKKy8qKgorICogUHJvY2Vzc1F1ZXVlIGlzIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBhIHRpbWVyIGludGVycnVwdC4KKyAqIFdlIG5lZWQgdG8gd2FrZSB1cCBhbmQgcHJvY2VzcyB0aGUgY3VycmVudCB0b3AgaXRlbSBpbiB0aGUgdGltZXIgcXVldWUgYXMgbG9uZworICogYXMgaXRzIHNjaGVkdWxlZCB0aW1lIGlzIGFmdGVyIHRoZSBjdXJyZW50IHRpbWUuIFRoZW4gdGhlIGl0ZW0gaXMgcmVtb3ZlZCBvcgorICogcmVzY2hlZHVsZWQgKHJlcGV0aXRpdmUgZXZlbnRzKSBpbiB0aGUgcXVldWUuCisgKi8KK3ZvaWQgTm90aWZpZXI6OlByb2Nlc3NRdWV1ZSh1aW50MzJfdCBtYXNrLCB2b2lkICpwYXJhbXMpCit7CisJTm90aWZpZXIgKmN1cnJlbnQ7CisJd2hpbGUgKHRydWUpCQkJCS8vIGtlZXAgcHJvY2Vzc2luZyBwYXN0IGV2ZW50cyB1bnRpbCBubyBtb3JlCisJeworCQl7CisJCQlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfcmVjdXJzaXZlX211dGV4PiBzeW5jKHF1ZXVlTXV0ZXgpOworCQkJZG91YmxlIGN1cnJlbnRUaW1lID0gR2V0Q2xvY2soKTsKKwkJCWN1cnJlbnQgPSB0aW1lclF1ZXVlSGVhZDsKKwkJCWlmIChjdXJyZW50ID09IG51bGxwdHIgfHwgY3VycmVudC0+bV9leHBpcmF0aW9uVGltZSA+IGN1cnJlbnRUaW1lKQorCQkJeworCQkJCWJyZWFrOwkJLy8gbm8gbW9yZSB0aW1lciBldmVudHMgdG8gcHJvY2VzcworCQkJfQorCQkJLy8gbmVlZCB0byBwcm9jZXNzIHRoaXMgZW50cnkKKwkJCXRpbWVyUXVldWVIZWFkID0gY3VycmVudC0+bV9uZXh0RXZlbnQ7CisJCQlpZiAoY3VycmVudC0+bV9wZXJpb2RpYykKKwkJCXsKKwkJCQkvLyBpZiBwZXJpb2RpYywgcmVxdWV1ZSB0aGUgZXZlbnQKKwkJCQkvLyBjb21wdXRlIHdoZW4gdG8gcHV0IGludG8gcXVldWUKKwkJCQljdXJyZW50LT5JbnNlcnRJblF1ZXVlKHRydWUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIG5vdCBwZXJpb2RpYzsgcmVtb3ZlZCBmcm9tIHF1ZXVlCisJCQkJY3VycmVudC0+bV9xdWV1ZWQgPSBmYWxzZTsKKwkJCX0KKwkJCS8vIFRha2UgaGFuZGxlciBtdXRleCB3aGlsZSBob2xkaW5nIHF1ZXVlIHNlbWFwaG9yZSB0byBtYWtlIHN1cmUKKwkJCS8vICB0aGUgaGFuZGxlciB3aWxsIGV4ZWN1dGUgdG8gY29tcGxldGlvbiBpbiBjYXNlIHdlIGFyZSBiZWluZyBkZWxldGVkLgorCQkJY3VycmVudC0+bV9oYW5kbGVyTXV0ZXgubG9jaygpOworCQl9CisKKwkJY3VycmVudC0+bV9oYW5kbGVyKGN1cnJlbnQtPm1fcGFyYW0pOwkvLyBjYWxsIHRoZSBldmVudCBoYW5kbGVyCisJCWN1cnJlbnQtPm1faGFuZGxlck11dGV4LnVubG9jaygpOworCX0KKwkvLyByZXNjaGVkdWxlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBxdWV1ZQorCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMocXVldWVNdXRleCk7CisJVXBkYXRlQWxhcm0oKTsKK30KKworLyoqCisgKiBJbnNlcnQgdGhpcyBOb3RpZmllciBpbnRvIHRoZSB0aW1lciBxdWV1ZSBpbiByaWdodCBwbGFjZS4KKyAqIFdBUk5JTkc6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIHN5bmNocm9uaXphdGlvbiEgSXQgbXVzdCBiZSBjYWxsZWQgZnJvbSBzb21ld2hlcmUKKyAqIHRoYXQgaXMgdGFraW5nIGNhcmUgb2Ygc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIHF1ZXVlLgorICogQHBhcmFtIHJlc2NoZWR1bGUgSWYgZmFsc2UsIHRoZSBzY2hlZHVsZWQgYWxhcm0gaXMgYmFzZWQgb24gdGhlIGN1cmVudCB0aW1lIGFuZCBVcGRhdGVBbGFybQorICogbWV0aG9kIGlzIGNhbGxlZCB3aGljaCB3aWxsIGVuYWJsZSB0aGUgYWxhcm0gaWYgbmVjZXNzYXJ5LgorICogSWYgdHJ1ZSwgdXBkYXRlIHRoZSB0aW1lIGJ5IGFkZGluZyB0aGUgcGVyaW9kIChubyBkcmlmdCkgd2hlbiByZXNjaGVkdWxlZCBwZXJpb2RpYyBmcm9tIFByb2Nlc3NRdWV1ZS4KKyAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBwdWJsaWMgbWV0aG9kcyBvbmx5IHVwZGF0ZSB0aGUgcXVldWUgYWZ0ZXIgZmluaXNoaW5nIGluc2VydGluZy4KKyAqLwordm9pZCBOb3RpZmllcjo6SW5zZXJ0SW5RdWV1ZShib29sIHJlc2NoZWR1bGUpCit7CisJaWYgKHJlc2NoZWR1bGUpCisJeworCQltX2V4cGlyYXRpb25UaW1lICs9IG1fcGVyaW9kOworCX0KKwllbHNlCisJeworCQltX2V4cGlyYXRpb25UaW1lID0gR2V0Q2xvY2soKSArIG1fcGVyaW9kOworCX0KKwlpZiAodGltZXJRdWV1ZUhlYWQgPT0gbnVsbHB0ciB8fCB0aW1lclF1ZXVlSGVhZC0+bV9leHBpcmF0aW9uVGltZSA+PSB0aGlzLT5tX2V4cGlyYXRpb25UaW1lKQorCXsKKwkJLy8gdGhlIHF1ZXVlIGlzIGVtcHR5IG9yIGdyZWF0ZXIgdGhhbiB0aGUgbmV3IGVudHJ5CisJCS8vIHRoZSBuZXcgZW50cnkgYmVjb21lcyB0aGUgZmlyc3QgZWxlbWVudAorCQl0aGlzLT5tX25leHRFdmVudCA9IHRpbWVyUXVldWVIZWFkOworCQl0aW1lclF1ZXVlSGVhZCA9IHRoaXM7CisJCWlmICghcmVzY2hlZHVsZSkKKwkJeworCQkJLy8gc2luY2UgdGhlIGZpcnN0IGVsZW1lbnQgY2hhbmdlZCwgdXBkYXRlIGFsYXJtLCB1bmxlc3Mgd2UgYWxyZWFkeSBwbGFuIHRvCisJCQlVcGRhdGVBbGFybSgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWZvciAoTm90aWZpZXIgKipucHAgPSAmKHRpbWVyUXVldWVIZWFkLT5tX25leHRFdmVudCk7IDsgbnBwID0gJigqbnBwKS0+bV9uZXh0RXZlbnQpCisJCXsKKwkJCU5vdGlmaWVyICpuID0gKm5wcDsKKwkJCWlmIChuID09IG51bGxwdHIgfHwgbi0+bV9leHBpcmF0aW9uVGltZSA+IHRoaXMtPm1fZXhwaXJhdGlvblRpbWUpCisJCQl7CisJCQkJKm5wcCA9IHRoaXM7CisJCQkJdGhpcy0+bV9uZXh0RXZlbnQgPSBuOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCW1fcXVldWVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBEZWxldGUgdGhpcyBOb3RpZmllciBmcm9tIHRoZSB0aW1lciBxdWV1ZS4KKyAqIFdBUk5JTkc6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIHN5bmNocm9uaXphdGlvbiEgSXQgbXVzdCBiZSBjYWxsZWQgZnJvbSBzb21ld2hlcmUKKyAqIHRoYXQgaXMgdGFraW5nIGNhcmUgb2Ygc3luY2hyb25pemluZyBhY2Nlc3MgdG8gdGhlIHF1ZXVlLgorICogUmVtb3ZlIHRoaXMgTm90aWZpZXIgZnJvbSB0aGUgdGltZXIgcXVldWUgYW5kIGFkanVzdCB0aGUgbmV4dCBpbnRlcnJ1cHQgdGltZSB0byByZWZsZWN0CisgKiB0aGUgY3VycmVudCB0b3Agb2YgdGhlIHF1ZXVlLgorICovCit2b2lkIE5vdGlmaWVyOjpEZWxldGVGcm9tUXVldWUoKQoreworCWlmIChtX3F1ZXVlZCkKKwl7CisJCW1fcXVldWVkID0gZmFsc2U7CisJCXdwaV9hc3NlcnQodGltZXJRdWV1ZUhlYWQgIT0gbnVsbHB0cik7CisJCWlmICh0aW1lclF1ZXVlSGVhZCA9PSB0aGlzKQorCQl7CisJCQkvLyByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QgLSB1cGRhdGUgdGhlIGFsYXJtCisJCQl0aW1lclF1ZXVlSGVhZCA9IHRoaXMtPm1fbmV4dEV2ZW50OworCQkJVXBkYXRlQWxhcm0oKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZvciAoTm90aWZpZXIgKm4gPSB0aW1lclF1ZXVlSGVhZDsgbiAhPSBudWxscHRyOyBuID0gbi0+bV9uZXh0RXZlbnQpCisJCQl7CisJCQkJaWYgKG4tPm1fbmV4dEV2ZW50ID09IHRoaXMpCisJCQkJeworCQkJCQkvLyB0aGlzIGVsZW1lbnQgaXMgdGhlIG5leHQgZWxlbWVudCBmcm9tICpuIGZyb20gdGhlIHF1ZXVlCisJCQkJCW4tPm1fbmV4dEV2ZW50ID0gdGhpcy0+bV9uZXh0RXZlbnQ7CS8vIHBvaW50IGFyb3VuZCB0aGlzIG9uZQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBSZWdpc3RlciBmb3Igc2luZ2xlIGV2ZW50IG5vdGlmaWNhdGlvbi4KKyAqIEEgdGltZXIgZXZlbnQgaXMgcXVldWVkIGZvciBhIHNpbmdsZSBldmVudCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LgorICogQHBhcmFtIGRlbGF5IFNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgorICovCit2b2lkIE5vdGlmaWVyOjpTdGFydFNpbmdsZShkb3VibGUgZGVsYXkpCit7CisJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleD4gc3luYyhxdWV1ZU11dGV4KTsKKwltX3BlcmlvZGljID0gZmFsc2U7CisJbV9wZXJpb2QgPSBkZWxheTsKKwlEZWxldGVGcm9tUXVldWUoKTsKKwlJbnNlcnRJblF1ZXVlKGZhbHNlKTsKK30KKworLyoqCisgKiBSZWdpc3RlciBmb3IgcGVyaW9kaWMgZXZlbnQgbm90aWZpY2F0aW9uLgorICogQSB0aW1lciBldmVudCBpcyBxdWV1ZWQgZm9yIHBlcmlvZGljIGV2ZW50IG5vdGlmaWNhdGlvbi4gRWFjaCB0aW1lIHRoZSBpbnRlcnJ1cHQKKyAqIG9jY3VycywgdGhlIGV2ZW50IHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVxdWV1ZWQgZm9yIHRoZSBzYW1lIHRpbWUgaW50ZXJ2YWwuCisgKiBAcGFyYW0gcGVyaW9kIFBlcmlvZCBpbiBzZWNvbmRzIHRvIGNhbGwgdGhlIGhhbmRsZXIgc3RhcnRpbmcgb25lIHBlcmlvZCBhZnRlciB0aGUgY2FsbCB0byB0aGlzIG1ldGhvZC4KKyAqLwordm9pZCBOb3RpZmllcjo6U3RhcnRQZXJpb2RpYyhkb3VibGUgcGVyaW9kKQoreworCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMocXVldWVNdXRleCk7CisJbV9wZXJpb2RpYyA9IHRydWU7CisJbV9wZXJpb2QgPSBwZXJpb2Q7CisJRGVsZXRlRnJvbVF1ZXVlKCk7CisJSW5zZXJ0SW5RdWV1ZShmYWxzZSk7Cit9CisKKy8qKgorICogU3RvcCB0aW1lciBldmVudHMgZnJvbSBvY2N1cmluZy4KKyAqIFN0b3AgYW55IHJlcGVhdGluZyB0aW1lciBldmVudHMgZnJvbSBvY2N1cmluZy4gVGhpcyB3aWxsIGFsc28gcmVtb3ZlIGFueSBzaW5nbGUKKyAqIG5vdGlmaWNhdGlvbiBldmVudHMgZnJvbSB0aGUgcXVldWUuCisgKiBJZiBhIHRpbWVyLWJhc2VkIGNhbGwgdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlciBpcyBpbiBwcm9ncmVzcywgdGhpcyBmdW5jdGlvbiB3aWxsCisgKiBibG9jayB1bnRpbCB0aGUgaGFuZGxlciBjYWxsIGlzIGNvbXBsZXRlLgorICovCit2b2lkIE5vdGlmaWVyOjpTdG9wKCkKK3sKKwl7CisJCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHN5bmMocXVldWVNdXRleCk7CisJCURlbGV0ZUZyb21RdWV1ZSgpOworCX0KKwkvLyBXYWl0IGZvciBhIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlciB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIGZyb20gU3RvcCgpCisJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1faGFuZGxlck11dGV4KTsKK30KKwordm9pZCBOb3RpZmllcjo6UnVuKCkgeworICAgIHdoaWxlICghbV9zdG9wcGVkKSB7CisgICAgICAgIE5vdGlmaWVyOjpQcm9jZXNzUXVldWUoMCwgbnVsbHB0cik7CisgICAgICAgIGlmICh0aW1lclF1ZXVlSGVhZCAhPSBudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICBXYWl0KHRpbWVyUXVldWVIZWFkLT5tX2V4cGlyYXRpb25UaW1lIC0gR2V0Q2xvY2soKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBXYWl0KDAuMDUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9QSURDb250cm9sbGVyLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvUElEQ29udHJvbGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiZWI1YwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvUElEQ29udHJvbGxlci5jcHAKQEAgLTAsMCArMSw2MTkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlBJRENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJOb3RpZmllci5oIgorI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgorI2luY2x1ZGUgIlBJRE91dHB1dC5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQID0gInAiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtJID0gImkiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEID0gImQiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGID0gImYiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtTZXRwb2ludCA9ICJzZXRwb2ludCI7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0VuYWJsZWQgPSAiZW5hYmxlZCI7CisKKworLyoqCisgKiBBbGxvY2F0ZSBhIFBJRCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gY29uc3RhbnRzIGZvciBQLCBJLCBECisgKiBAcGFyYW0gS3AgdGhlIHByb3BvcnRpb25hbCBjb2VmZmljaWVudAorICogQHBhcmFtIEtpIHRoZSBpbnRlZ3JhbCBjb2VmZmljaWVudAorICogQHBhcmFtIEtkIHRoZSBkZXJpdmF0aXZlIGNvZWZmaWNpZW50CisgKiBAcGFyYW0gc291cmNlIFRoZSBQSURTb3VyY2Ugb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBnZXQgdmFsdWVzCisgKiBAcGFyYW0gb3V0cHV0IFRoZSBQSURPdXRwdXQgb2JqZWN0IHRoYXQgaXMgc2V0IHRvIHRoZSBvdXRwdXQgdmFsdWUKKyAqIEBwYXJhbSBwZXJpb2QgdGhlIGxvb3AgdGltZSBmb3IgZG9pbmcgY2FsY3VsYXRpb25zLiBUaGlzIHBhcnRpY3VsYXJseSBlZmZlY3RzIGNhbGN1bGF0aW9ucyBvZiB0aGUKKyAqIGludGVncmFsIGFuZCBkaWZmZXJlbnRhbCB0ZXJtcy4gVGhlIGRlZmF1bHQgaXMgNTBtcy4KKyAqLworUElEQ29udHJvbGxlcjo6UElEQ29udHJvbGxlcihmbG9hdCBLcCwgZmxvYXQgS2ksIGZsb2F0IEtkLAorCQkJCQkJCQlQSURTb3VyY2UgKnNvdXJjZSwgUElET3V0cHV0ICpvdXRwdXQsCisJCQkJCQkJCWZsb2F0IHBlcmlvZCkKK3sKKwlJbml0aWFsaXplKEtwLCBLaSwgS2QsIDAuMGYsIHNvdXJjZSwgb3V0cHV0LCBwZXJpb2QpOworfQorCisvKioKKyAqIEFsbG9jYXRlIGEgUElEIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBjb25zdGFudHMgZm9yIFAsIEksIEQKKyAqIEBwYXJhbSBLcCB0aGUgcHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50CisgKiBAcGFyYW0gS2kgdGhlIGludGVncmFsIGNvZWZmaWNpZW50CisgKiBAcGFyYW0gS2QgdGhlIGRlcml2YXRpdmUgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBzb3VyY2UgVGhlIFBJRFNvdXJjZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGdldCB2YWx1ZXMKKyAqIEBwYXJhbSBvdXRwdXQgVGhlIFBJRE91dHB1dCBvYmplY3QgdGhhdCBpcyBzZXQgdG8gdGhlIG91dHB1dCB2YWx1ZQorICogQHBhcmFtIHBlcmlvZCB0aGUgbG9vcCB0aW1lIGZvciBkb2luZyBjYWxjdWxhdGlvbnMuIFRoaXMgcGFydGljdWxhcmx5IGVmZmVjdHMgY2FsY3VsYXRpb25zIG9mIHRoZQorICogaW50ZWdyYWwgYW5kIGRpZmZlcmVudGFsIHRlcm1zLiBUaGUgZGVmYXVsdCBpcyA1MG1zLgorICovCitQSURDb250cm9sbGVyOjpQSURDb250cm9sbGVyKGZsb2F0IEtwLCBmbG9hdCBLaSwgZmxvYXQgS2QsIGZsb2F0IEtmLAorCQkJCQkJCQlQSURTb3VyY2UgKnNvdXJjZSwgUElET3V0cHV0ICpvdXRwdXQsCisJCQkJCQkJCWZsb2F0IHBlcmlvZCkKK3sKKwlJbml0aWFsaXplKEtwLCBLaSwgS2QsIEtmLCBzb3VyY2UsIG91dHB1dCwgcGVyaW9kKTsKK30KKworCit2b2lkIFBJRENvbnRyb2xsZXI6OkluaXRpYWxpemUoZmxvYXQgS3AsIGZsb2F0IEtpLCBmbG9hdCBLZCwgZmxvYXQgS2YsCisJCQkJCQkJCVBJRFNvdXJjZSAqc291cmNlLCBQSURPdXRwdXQgKm91dHB1dCwKKwkJCQkJCQkJZmxvYXQgcGVyaW9kKQoreworCW1fdGFibGUgPSBudWxscHRyOworCisJbV9QID0gS3A7CisJbV9JID0gS2k7CisJbV9EID0gS2Q7CisJbV9GID0gS2Y7CisKKwltX21heGltdW1PdXRwdXQgPSAxLjA7CisJbV9taW5pbXVtT3V0cHV0ID0gLTEuMDsKKworCW1fbWF4aW11bUlucHV0ID0gMDsKKwltX21pbmltdW1JbnB1dCA9IDA7CisKKwltX2NvbnRpbnVvdXMgPSBmYWxzZTsKKwltX2VuYWJsZWQgPSBmYWxzZTsKKwltX3NldHBvaW50ID0gMDsKKworCW1fcHJldklucHV0ID0gMDsKKwltX3RvdGFsRXJyb3IgPSAwOworCW1fdG9sZXJhbmNlID0gLjA1OworCisJbV9yZXN1bHQgPSAwOworCisJbV9waWRJbnB1dCA9IHNvdXJjZTsKKwltX3BpZE91dHB1dCA9IG91dHB1dDsKKwltX3BlcmlvZCA9IHBlcmlvZDsKKworCW1fY29udHJvbExvb3AgPSBzdGQ6Om1ha2VfdW5pcXVlPE5vdGlmaWVyPihQSURDb250cm9sbGVyOjpDYWxsQ2FsY3VsYXRlLCB0aGlzKTsKKwltX2NvbnRyb2xMb29wLT5TdGFydFBlcmlvZGljKG1fcGVyaW9kKTsKKworCXN0YXRpYyBpbnQzMl90IGluc3RhbmNlcyA9IDA7CisJaW5zdGFuY2VzKys7CisKKwltX3RvbGVyYW5jZVR5cGUgPSBrTm9Ub2xlcmFuY2U7Cit9CisKK1BJRENvbnRyb2xsZXI6On5QSURDb250cm9sbGVyKCkgeworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7Cit9CisKKy8qKgorICogQ2FsbCB0aGUgQ2FsY3VsYXRlIG1ldGhvZCBhcyBhIG5vbi1zdGF0aWMgbWV0aG9kLiBUaGlzIGF2b2lkcyBoYXZpbmcgdG8gcHJlcGVuZAorICogYWxsIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGF0IG1ldGhvZCB3aXRoIHRoZSBjbGFzcyBwb2ludGVyLiBUaGlzIHdheSB0aGUgInRoaXMiCisgKiBwb2ludGVyIHdpbGwgYmUgc2V0IHVwIGFuZCBjbGFzcyB2YXJpYWJsZXMgY2FuIGJlIGNhbGxlZCBtb3JlIGVhc2lseS4KKyAqIFRoaXMgbWV0aG9kIGlzIHN0YXRpYyBhbmQgY2FsbGVkIGJ5IHRoZSBOb3RpZmllciBjbGFzcy4KKyAqIEBwYXJhbSBjb250cm9sbGVyIHRoZSBhZGRyZXNzIG9mIHRoZSBQSUQgY29udHJvbGxlciBvYmplY3QgdG8gdXNlIGluIHRoZSBiYWNrZ3JvdW5kIGxvb3AKKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpDYWxsQ2FsY3VsYXRlKHZvaWQgKmNvbnRyb2xsZXIpCit7CisJUElEQ29udHJvbGxlciAqY29udHJvbCA9IChQSURDb250cm9sbGVyKikgY29udHJvbGxlcjsKKwljb250cm9sLT5DYWxjdWxhdGUoKTsKK30KKworIC8qKgorICAqIFJlYWQgdGhlIGlucHV0LCBjYWxjdWxhdGUgdGhlIG91dHB1dCBhY2NvcmRpbmdseSwgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQuCisgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIE5vdGlmaWVyIGluZGlyZWN0bHkgdGhyb3VnaCBDYWxsQ2FsY3VsYXRlCisgICogYW5kIGlzIGNyZWF0ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAqLwordm9pZCBQSURDb250cm9sbGVyOjpDYWxjdWxhdGUoKQoreworCWJvb2wgZW5hYmxlZDsKKwlQSURTb3VyY2UgKnBpZElucHV0OworCisJeworCQlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJCWlmIChtX3BpZElucHV0ID09IDApIHJldHVybjsKKwkJaWYgKG1fcGlkT3V0cHV0ID09IDApIHJldHVybjsKKwkJZW5hYmxlZCA9IG1fZW5hYmxlZDsKKwkJcGlkSW5wdXQgPSBtX3BpZElucHV0OworCX0KKworCWlmIChlbmFibGVkKQorCXsKKwkJZmxvYXQgaW5wdXQgPSBwaWRJbnB1dC0+UElER2V0KCk7CisJCWZsb2F0IHJlc3VsdDsKKwkJUElET3V0cHV0ICpwaWRPdXRwdXQ7CisKKwkJeworCQkJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworCQkJbV9lcnJvciA9IG1fc2V0cG9pbnQgLSBpbnB1dDsKKwkJCWlmIChtX2NvbnRpbnVvdXMpCisJCQl7CisJCQkJaWYgKGZhYnMobV9lcnJvcikgPiAobV9tYXhpbXVtSW5wdXQgLSBtX21pbmltdW1JbnB1dCkgLyAyKQorCQkJCXsKKwkJCQkJaWYgKG1fZXJyb3IgPiAwKQorCQkJCQl7CisJCQkJCQltX2Vycm9yID0gbV9lcnJvciAtIG1fbWF4aW11bUlucHV0ICsgbV9taW5pbXVtSW5wdXQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltX2Vycm9yID0gbV9lcnJvciArIG1fbWF4aW11bUlucHV0IC0gbV9taW5pbXVtSW5wdXQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKyAgICAgICAgICAgIGlmIChtX3BpZElucHV0LT5HZXRQSURTb3VyY2VUeXBlKCkgPT0gUElEU291cmNlVHlwZTo6a1JhdGUpIHsKKyAgICAgICAgICAgICAgaWYgKG1fUCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHBvdGVudGlhbFBHYWluID0gKG1fdG90YWxFcnJvciArIG1fZXJyb3IpICogbV9QOworICAgICAgICAgICAgICAgIGlmIChwb3RlbnRpYWxQR2FpbiA8IG1fbWF4aW11bU91dHB1dCkgeworICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbFBHYWluID4gbV9taW5pbXVtT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIG1fdG90YWxFcnJvciArPSBtX2Vycm9yOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fdG90YWxFcnJvciA9IG1fbWluaW11bU91dHB1dCAvIG1fUDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICBtX3RvdGFsRXJyb3IgPSBtX21heGltdW1PdXRwdXQgLyBtX1A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbV9yZXN1bHQgPSBtX0QgKiBtX2Vycm9yICsgbV9QICogbV90b3RhbEVycm9yICsgbV9zZXRwb2ludCAqIG1fRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZiAobV9JICE9IDApIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcG90ZW50aWFsSUdhaW4gPSAobV90b3RhbEVycm9yICsgbV9lcnJvcikgKiBtX0k7CisgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbElHYWluIDwgbV9tYXhpbXVtT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICBpZiAocG90ZW50aWFsSUdhaW4gPiBtX21pbmltdW1PdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbV90b3RhbEVycm9yICs9IG1fZXJyb3I7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV90b3RhbEVycm9yID0gbV9taW5pbXVtT3V0cHV0IC8gbV9JOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG1fdG90YWxFcnJvciA9IG1fbWF4aW11bU91dHB1dCAvIG1fSTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBtX3Jlc3VsdCA9IG1fUCAqIG1fZXJyb3IgKyBtX0kgKiBtX3RvdGFsRXJyb3IgKyBtX0QgKiAobV9wcmV2SW5wdXQgLSBpbnB1dCkgKyBtX3NldHBvaW50ICogbV9GOworICAgICAgICAgICAgfQorCQkJbV9wcmV2SW5wdXQgPSBpbnB1dDsKKworCQkJaWYgKG1fcmVzdWx0ID4gbV9tYXhpbXVtT3V0cHV0KSBtX3Jlc3VsdCA9IG1fbWF4aW11bU91dHB1dDsKKwkJCWVsc2UgaWYgKG1fcmVzdWx0IDwgbV9taW5pbXVtT3V0cHV0KSBtX3Jlc3VsdCA9IG1fbWluaW11bU91dHB1dDsKKworCQkJcGlkT3V0cHV0ID0gbV9waWRPdXRwdXQ7CisJCQlyZXN1bHQgPSBtX3Jlc3VsdDsKKwkJfQorCisJCXBpZE91dHB1dC0+UElEV3JpdGUocmVzdWx0KTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBQSUQgQ29udHJvbGxlciBnYWluIHBhcmFtZXRlcnMuCisgKiBTZXQgdGhlIHByb3BvcnRpb25hbCwgaW50ZWdyYWwsIGFuZCBkaWZmZXJlbnRpYWwgY29lZmZpY2llbnRzLgorICogQHBhcmFtIHAgUHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50CisgKiBAcGFyYW0gaSBJbnRlZ3JhbCBjb2VmZmljaWVudAorICogQHBhcmFtIGQgRGlmZmVyZW50aWFsIGNvZWZmaWNpZW50CisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpCit7CisJeworCQlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJCW1fUCA9IHA7CisJCW1fSSA9IGk7CisJCW1fRCA9IGQ7CisJfQorCisJaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworCQltX3RhYmxlLT5QdXROdW1iZXIoInAiLCBtX1ApOworCQltX3RhYmxlLT5QdXROdW1iZXIoImkiLCBtX0kpOworCQltX3RhYmxlLT5QdXROdW1iZXIoImQiLCBtX0QpOworCX0KK30KKworLyoqCisgKiBTZXQgdGhlIFBJRCBDb250cm9sbGVyIGdhaW4gcGFyYW1ldGVycy4KKyAqIFNldCB0aGUgcHJvcG9ydGlvbmFsLCBpbnRlZ3JhbCwgYW5kIGRpZmZlcmVudGlhbCBjb2VmZmljaWVudHMuCisgKiBAcGFyYW0gcCBQcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBpIEludGVncmFsIGNvZWZmaWNpZW50CisgKiBAcGFyYW0gZCBEaWZmZXJlbnRpYWwgY29lZmZpY2llbnQKKyAqIEBwYXJhbSBmIEZlZWQgZm9yd2FyZCBjb2VmZmljaWVudAorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OlNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZikKK3sKKwl7CisJCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX211dGV4KTsKKwkJbV9QID0gcDsKKwkJbV9JID0gaTsKKwkJbV9EID0gZDsKKwkJbV9GID0gZjsKKwl9CisKKwlpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisJCW1fdGFibGUtPlB1dE51bWJlcigicCIsIG1fUCk7CisJCW1fdGFibGUtPlB1dE51bWJlcigiaSIsIG1fSSk7CisJCW1fdGFibGUtPlB1dE51bWJlcigiZCIsIG1fRCk7CisJCW1fdGFibGUtPlB1dE51bWJlcigiZiIsIG1fRik7CisJfQorfQorCisvKioKKyAqIEdldCB0aGUgUHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50CisgKiBAcmV0dXJuIHByb3BvcnRpb25hbCBjb2VmZmljaWVudAorICovCitkb3VibGUgUElEQ29udHJvbGxlcjo6R2V0UCgpIGNvbnN0Cit7CisJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fbXV0ZXgpOworCXJldHVybiBtX1A7Cit9CisKKy8qKgorICogR2V0IHRoZSBJbnRlZ3JhbCBjb2VmZmljaWVudAorICogQHJldHVybiBpbnRlZ3JhbCBjb2VmZmljaWVudAorICovCitkb3VibGUgUElEQ29udHJvbGxlcjo6R2V0SSgpIGNvbnN0Cit7CisJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fbXV0ZXgpOworCXJldHVybiBtX0k7Cit9CisKKy8qKgorICogR2V0IHRoZSBEaWZmZXJlbnRpYWwgY29lZmZpY2llbnQKKyAqIEByZXR1cm4gZGlmZmVyZW50aWFsIGNvZWZmaWNpZW50CisgKi8KK2RvdWJsZSBQSURDb250cm9sbGVyOjpHZXREKCkgY29uc3QKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJcmV0dXJuIG1fRDsKK30KKworLyoqCisgKiBHZXQgdGhlIEZlZWQgZm9yd2FyZCBjb2VmZmljaWVudAorICogQHJldHVybiBGZWVkIGZvcndhcmQgY29lZmZpY2llbnQKKyAqLworZG91YmxlIFBJRENvbnRyb2xsZXI6OkdldEYoKSBjb25zdAoreworCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX211dGV4KTsKKwlyZXR1cm4gbV9GOworfQorCisvKioKKyAqIFJldHVybiB0aGUgY3VycmVudCBQSUQgcmVzdWx0CisgKiBUaGlzIGlzIGFsd2F5cyBjZW50ZXJlZCBvbiB6ZXJvIGFuZCBjb25zdHJhaW5lZCB0aGUgdGhlIG1heCBhbmQgbWluIG91dHMKKyAqIEByZXR1cm4gdGhlIGxhdGVzdCBjYWxjdWxhdGVkIG91dHB1dAorICovCitmbG9hdCBQSURDb250cm9sbGVyOjpHZXQoKSBjb25zdAoreworCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX211dGV4KTsKKwlyZXR1cm4gbV9yZXN1bHQ7Cit9CisKKy8qKgorICogIFNldCB0aGUgUElEIGNvbnRyb2xsZXIgdG8gY29uc2lkZXIgdGhlIGlucHV0IHRvIGJlIGNvbnRpbnVvdXMsCisgKiAgUmF0aGVyIHRoZW4gdXNpbmcgdGhlIG1heCBhbmQgbWluIGluIGFzIGNvbnN0cmFpbnRzLCBpdCBjb25zaWRlcnMgdGhlbSB0bworICogIGJlIHRoZSBzYW1lIHBvaW50IGFuZCBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZXMgdGhlIHNob3J0ZXN0IHJvdXRlIHRvCisgKiAgdGhlIHNldHBvaW50LgorICogQHBhcmFtIGNvbnRpbnVvdXMgU2V0IHRvIHRydWUgdHVybnMgb24gY29udGludW91cywgZmFsc2UgdHVybnMgb2ZmIGNvbnRpbnVvdXMKKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpTZXRDb250aW51b3VzKGJvb2wgY29udGludW91cykKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJbV9jb250aW51b3VzID0gY29udGludW91czsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlcyBleHBlY3RlZCBmcm9tIHRoZSBpbnB1dC4KKyAqCisgKiBAcGFyYW0gbWluaW11bUlucHV0IHRoZSBtaW5pbXVtIHZhbHVlIGV4cGVjdGVkIGZyb20gdGhlIGlucHV0CisgKiBAcGFyYW0gbWF4aW11bUlucHV0IHRoZSBtYXhpbXVtIHZhbHVlIGV4cGVjdGVkIGZyb20gdGhlIG91dHB1dAorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OlNldElucHV0UmFuZ2UoZmxvYXQgbWluaW11bUlucHV0LCBmbG9hdCBtYXhpbXVtSW5wdXQpCit7CisJeworCQlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJCW1fbWluaW11bUlucHV0ID0gbWluaW11bUlucHV0OworCQltX21heGltdW1JbnB1dCA9IG1heGltdW1JbnB1dDsKKwl9CisKKwlTZXRTZXRwb2ludChtX3NldHBvaW50KTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyB0byB3cml0ZS4KKyAqCisgKiBAcGFyYW0gbWluaW11bU91dHB1dCB0aGUgbWluaW11bSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0CisgKiBAcGFyYW0gbWF4aW11bU91dHB1dCB0aGUgbWF4aW11bSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0CisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0T3V0cHV0UmFuZ2UoZmxvYXQgbWluaW11bU91dHB1dCwgZmxvYXQgbWF4aW11bU91dHB1dCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJbV9taW5pbXVtT3V0cHV0ID0gbWluaW11bU91dHB1dDsKKwltX21heGltdW1PdXRwdXQgPSBtYXhpbXVtT3V0cHV0OworfQorCisvKioKKyAqIFNldCB0aGUgc2V0cG9pbnQgZm9yIHRoZSBQSURDb250cm9sbGVyCisgKiBAcGFyYW0gc2V0cG9pbnQgdGhlIGRlc2lyZWQgc2V0cG9pbnQKKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpTZXRTZXRwb2ludChmbG9hdCBzZXRwb2ludCkKK3sKKwl7CisJCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX211dGV4KTsKKwkJaWYgKG1fbWF4aW11bUlucHV0ID4gbV9taW5pbXVtSW5wdXQpCisJCXsKKwkJCWlmIChzZXRwb2ludCA+IG1fbWF4aW11bUlucHV0KQorCQkJCW1fc2V0cG9pbnQgPSBtX21heGltdW1JbnB1dDsKKwkJCWVsc2UgaWYgKHNldHBvaW50IDwgbV9taW5pbXVtSW5wdXQpCisJCQkJbV9zZXRwb2ludCA9IG1fbWluaW11bUlucHV0OworCQkJZWxzZQorCQkJCW1fc2V0cG9pbnQgPSBzZXRwb2ludDsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1fc2V0cG9pbnQgPSBzZXRwb2ludDsKKwkJfQorCX0KKworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKwkJbV90YWJsZS0+UHV0TnVtYmVyKCJzZXRwb2ludCIsIG1fc2V0cG9pbnQpOworCX0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldHBvaW50IG9mIHRoZSBQSURDb250cm9sbGVyCisgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHNldHBvaW50CisgKi8KK2RvdWJsZSBQSURDb250cm9sbGVyOjpHZXRTZXRwb2ludCgpIGNvbnN0Cit7CisJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fbXV0ZXgpOworCXJldHVybiBtX3NldHBvaW50OworfQorCisvKioKKyAqIFJldHJ1bnMgdGhlIGN1cnJlbnQgZGlmZmVyZW5jZSBvZiB0aGUgaW5wdXQgZnJvbSB0aGUgc2V0cG9pbnQKKyAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZXJyb3IKKyAqLworZmxvYXQgUElEQ29udHJvbGxlcjo6R2V0RXJyb3IoKSBjb25zdAoreworCWRvdWJsZSBwaWRJbnB1dDsKKwl7CisJCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX211dGV4KTsKKwkJcGlkSW5wdXQgPSBtX3BpZElucHV0LT5QSURHZXQoKTsKKwl9CisJcmV0dXJuIEdldFNldHBvaW50KCkgLSBwaWRJbnB1dDsKK30KKworLyoqCisgKiBTZXRzIHdoYXQgdHlwZSBvZiBpbnB1dCB0aGUgUElEIGNvbnRyb2xsZXIgd2lsbCB1c2UKKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7CisgIG1fcGlkSW5wdXQtPlNldFBJRFNvdXJjZVR5cGUocGlkU291cmNlKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGlucHV0IHRoZSBQSUQgY29udHJvbGxlciBpcyB1c2luZworICogQHJldHVybiB0aGUgUElEIGNvbnRyb2xsZXIgaW5wdXQgdHlwZQorICovCitQSURTb3VyY2VUeXBlIFBJRENvbnRyb2xsZXI6OkdldFBJRFNvdXJjZVR5cGUoKSBjb25zdCB7CisgIHJldHVybiBtX3BpZElucHV0LT5HZXRQSURTb3VyY2VUeXBlKCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBhdmVyYWdlIG9mIHRoZSBlcnJvciBvdmVyIHRoZSBwYXN0IGZldyBpdGVyYXRpb25zLgorICogWW91IGNhbiBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBhdmVyYWdlIHdpdGggU2V0VG9sZXJhbmNlQnVmZmVyKCkKKyAqIChkZWZhdWx0cyB0byAxKS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHVzZWQgZm9yIE9uVGFyZ2V0KCkuCisgKiBAcmV0dXJuIHRoZSBhdmVyYWdlIGVycm9yCisgKi8KK2Zsb2F0IFBJRENvbnRyb2xsZXI6OkdldEF2Z0Vycm9yKCkgY29uc3QgeworICBmbG9hdCBhdmdFcnJvciA9IDA7CisgIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisgICAgLy8gRG9uJ3QgZGl2aWRlIGJ5IHplcm8uCisgICAgaWYgKG1fYnVmLnNpemUoKSkgYXZnRXJyb3IgPSBtX2J1ZlRvdGFsIC8gbV9idWYuc2l6ZSgpOworICB9CisgIHJldHVybiBhdmdFcnJvcjsKK30KKworLyoKKyAqIFNldCB0aGUgcGVyY2VudGFnZSBlcnJvciB3aGljaCBpcyBjb25zaWRlcmVkIHRvbGVyYWJsZSBmb3IgdXNlIHdpdGgKKyAqIE9uVGFyZ2V0LgorICogQHBhcmFtIHBlcmNlbnRhZ2UgZXJyb3Igd2hpY2ggaXMgdG9sZXJhYmxlCisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0VG9sZXJhbmNlKGZsb2F0IHBlcmNlbnQpCit7CisJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fbXV0ZXgpOworCW1fdG9sZXJhbmNlVHlwZSA9IGtQZXJjZW50VG9sZXJhbmNlOworCW1fdG9sZXJhbmNlID0gcGVyY2VudDsKK30KKworLyoKKyAqIFNldCB0aGUgcGVyY2VudGFnZSBlcnJvciB3aGljaCBpcyBjb25zaWRlcmVkIHRvbGVyYWJsZSBmb3IgdXNlIHdpdGgKKyAqIE9uVGFyZ2V0LgorICogQHBhcmFtIHBlcmNlbnRhZ2UgZXJyb3Igd2hpY2ggaXMgdG9sZXJhYmxlCisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6U2V0UGVyY2VudFRvbGVyYW5jZShmbG9hdCBwZXJjZW50KQoreworCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX211dGV4KTsKKwltX3RvbGVyYW5jZVR5cGUgPSBrUGVyY2VudFRvbGVyYW5jZTsKKwltX3RvbGVyYW5jZSA9IHBlcmNlbnQ7Cit9CisKKy8qCisgKiBTZXQgdGhlIGFic29sdXRlIGVycm9yIHdoaWNoIGlzIGNvbnNpZGVyZWQgdG9sZXJhYmxlIGZvciB1c2Ugd2l0aAorICogT25UYXJnZXQuCisgKiBAcGFyYW0gcGVyY2VudGFnZSBlcnJvciB3aGljaCBpcyB0b2xlcmFibGUKKyAqLwordm9pZCBQSURDb250cm9sbGVyOjpTZXRBYnNvbHV0ZVRvbGVyYW5jZShmbG9hdCBhYnNUb2xlcmFuY2UpCit7CisJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fbXV0ZXgpOworCW1fdG9sZXJhbmNlVHlwZSA9IGtBYnNvbHV0ZVRvbGVyYW5jZTsKKwltX3RvbGVyYW5jZSA9IGFic1RvbGVyYW5jZTsKK30KKworLyoKKyAqIFNldCB0aGUgbnVtYmVyIG9mIHByZXZpb3VzIGVycm9yIHNhbXBsZXMgdG8gYXZlcmFnZSBmb3IgdG9sZXJhbmNpbmcuIFdoZW4KKyAqIGRldGVybWluaW5nIHdoZXRoZXIgYSBtZWNoYW5pc20gaXMgb24gdGFyZ2V0LCB0aGUgdXNlciBtYXkgd2FudCB0byB1c2UgYQorICogcm9sbGluZyBhdmVyYWdlIG9mIHByZXZpb3VzIG1lYXN1cmVtZW50cyBpbnN0ZWFkIG9mIGEgcHJlY2lzZSBwb3NpdGlvbiBvcgorICogdmVsb2NpdHkuIFRoaXMgaXMgdXNlZnVsIGZvciBub2lzeSBzZW5zb3JzIHdoaWNoIHJldHVybiBhIGZldyBlcnJvbmVvdXMKKyAqIG1lYXN1cmVtZW50cyB3aGVuIHRoZSBtZWNoYW5pc20gaXMgb24gdGFyZ2V0LiBIb3dldmVyLCB0aGUgbWVjaGFuaXNtIHdpbGwKKyAqIG5vdCByZWdpc3RlciBhcyBvbiB0YXJnZXQgZm9yIGF0IGxlYXN0IHRoZSBzcGVjaWZpZWQgYnVmTGVuZ3RoIGN5Y2xlcy4KKyAqIEBwYXJhbSBidWZMZW5ndGggTnVtYmVyIG9mIHByZXZpb3VzIGN5Y2xlcyB0byBhdmVyYWdlLiBEZWZhdWx0cyB0byAxLgorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OlNldFRvbGVyYW5jZUJ1ZmZlcih1bnNpZ25lZCBidWZMZW5ndGgpIHsKKyAgbV9idWZMZW5ndGggPSBidWZMZW5ndGg7CisKKyAgLy8gQ3V0IHRoZSBidWZmZXIgZG93biB0byBzaXplIGlmIG5lZWRlZC4KKyAgd2hpbGUgKG1fYnVmLnNpemUoKSA+IGJ1Zkxlbmd0aCkgeworICAgIG1fYnVmVG90YWwgLT0gbV9idWYuZnJvbnQoKTsKKyAgICBtX2J1Zi5wb3AoKTsKKyAgfQorfQorCisvKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGVycm9yIGlzIHdpdGhpbiB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgaW5wdXQgcmFuZ2UsCisgKiBkZXRlcm1pbmVkIGJ5IFNldFRvbGVyYW5jZS4gVGhpcyBhc3NzdW1lcyB0aGF0IHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIGlucHV0CisgKiB3ZXJlIHNldCB1c2luZyBTZXRJbnB1dC4KKyAqIEN1cnJlbnRseSB0aGlzIGp1c3QgcmVwb3J0cyBvbiB0YXJnZXQgYXMgdGhlIGFjdHVhbCB2YWx1ZSBwYXNzZXMgdGhyb3VnaCB0aGUgc2V0cG9pbnQuCisgKiBJZGVhbGx5IGl0IHNob3VsZCBiZSBiYXNlZCBvbiBiZWluZyB3aXRoaW4gdGhlIHRvbGVyYW5jZSBmb3Igc29tZSBwZXJpb2Qgb2YgdGltZS4KKyAqLworYm9vbCBQSURDb250cm9sbGVyOjpPblRhcmdldCgpIGNvbnN0Cit7CisJZG91YmxlIGVycm9yID0gR2V0RXJyb3IoKTsKKworCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gc3luYyhtX211dGV4KTsKKwlzd2l0Y2ggKG1fdG9sZXJhbmNlVHlwZSkgeworCWNhc2Uga1BlcmNlbnRUb2xlcmFuY2U6CisJCXJldHVybiBmYWJzKGVycm9yKSA8IG1fdG9sZXJhbmNlIC8gMTAwICogKG1fbWF4aW11bUlucHV0IC0gbV9taW5pbXVtSW5wdXQpOworCQlicmVhazsKKwljYXNlIGtBYnNvbHV0ZVRvbGVyYW5jZToKKwkJcmV0dXJuIGZhYnMoZXJyb3IpIDwgbV90b2xlcmFuY2U7CisJCWJyZWFrOworCWNhc2Uga05vVG9sZXJhbmNlOiAvLyBUT0RPOiB0aGlzIGNhc2UgbmVlZHMgYW4gZXJyb3IKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQmVnaW4gcnVubmluZyB0aGUgUElEQ29udHJvbGxlcgorICovCit2b2lkIFBJRENvbnRyb2xsZXI6OkVuYWJsZSgpCit7CisJeworCQlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJCW1fZW5hYmxlZCA9IHRydWU7CisJfQorCisJaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworCQltX3RhYmxlLT5QdXRCb29sZWFuKCJlbmFibGVkIiwgdHJ1ZSk7CisJfQorfQorCisvKioKKyAqIFN0b3AgcnVubmluZyB0aGUgUElEQ29udHJvbGxlciwgdGhpcyBzZXRzIHRoZSBvdXRwdXQgdG8gemVybyBiZWZvcmUgc3RvcHBpbmcuCisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6RGlzYWJsZSgpCit7CisJeworCQlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJCW1fcGlkT3V0cHV0LT5QSURXcml0ZSgwKTsKKwkJbV9lbmFibGVkID0gZmFsc2U7CisJfQorCisJaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworCQltX3RhYmxlLT5QdXRCb29sZWFuKCJlbmFibGVkIiwgZmFsc2UpOworCX0KK30KKworLyoqCisgKiBSZXR1cm4gdHJ1ZSBpZiBQSURDb250cm9sbGVyIGlzIGVuYWJsZWQuCisgKi8KK2Jvb2wgUElEQ29udHJvbGxlcjo6SXNFbmFibGVkKCkgY29uc3QKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IGxvY2sobV9tdXRleCk7CisJcmV0dXJuIG1fZW5hYmxlZDsKK30KKworLyoqCisgKiBSZXNldCB0aGUgcHJldmlvdXMgZXJyb3IsLCB0aGUgaW50ZWdyYWwgdGVybSwgYW5kIGRpc2FibGUgdGhlIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgUElEQ29udHJvbGxlcjo6UmVzZXQoKQoreworCURpc2FibGUoKTsKKworCXN0ZDo6bG9ja19ndWFyZDxwcmlvcml0eV9tdXRleD4gbG9jayhtX211dGV4KTsKKwltX3ByZXZJbnB1dCA9IDA7CisJbV90b3RhbEVycm9yID0gMDsKKwltX3Jlc3VsdCA9IDA7Cit9CisKK3N0ZDo6c3RyaW5nIFBJRENvbnRyb2xsZXI6OkdldFNtYXJ0RGFzaGJvYXJkVHlwZSgpIGNvbnN0IHsKKwlyZXR1cm4gIlBJRENvbnRyb2xsZXIiOworfQorCit2b2lkIFBJRENvbnRyb2xsZXI6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiB0YWJsZSl7CisJaWYobV90YWJsZSE9bnVsbHB0cikKKwkJbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKwltX3RhYmxlID0gdGFibGU7CisJaWYobV90YWJsZSE9bnVsbHB0cil7CisJCW1fdGFibGUtPlB1dE51bWJlcihrUCwgR2V0UCgpKTsKKwkJbV90YWJsZS0+UHV0TnVtYmVyKGtJLCBHZXRJKCkpOworCQltX3RhYmxlLT5QdXROdW1iZXIoa0QsIEdldEQoKSk7CisJCW1fdGFibGUtPlB1dE51bWJlcihrRiwgR2V0RigpKTsKKwkJbV90YWJsZS0+UHV0TnVtYmVyKGtTZXRwb2ludCwgR2V0U2V0cG9pbnQoKSk7CisJCW1fdGFibGUtPlB1dEJvb2xlYW4oa0VuYWJsZWQsIElzRW5hYmxlZCgpKTsKKwkJbV90YWJsZS0+QWRkVGFibGVMaXN0ZW5lcih0aGlzLCBmYWxzZSk7CisJfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBQSURDb250cm9sbGVyOjpHZXRUYWJsZSgpIGNvbnN0IHsKKwlyZXR1cm4gbV90YWJsZTsKK30KKwordm9pZCBQSURDb250cm9sbGVyOjpWYWx1ZUNoYW5nZWQoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwgYm9vbCBpc05ldykgeworICBpZiAoa2V5ID09IGtQIHx8IGtleSA9PSBrSSB8fCBrZXkgPT0ga0QgfHwga2V5ID09IGtGKSB7CisgICAgaWYgKG1fUCAhPSBtX3RhYmxlLT5HZXROdW1iZXIoa1AsIDAuMCkgfHwKKyAgICAgICAgbV9JICE9IG1fdGFibGUtPkdldE51bWJlcihrSSwgMC4wKSB8fAorICAgICAgICBtX0QgIT0gbV90YWJsZS0+R2V0TnVtYmVyKGtELCAwLjApIHx8CisgICAgICAgIG1fRiAhPSBtX3RhYmxlLT5HZXROdW1iZXIoa0YsIDAuMCkpIHsKKyAgICAgIFNldFBJRChtX3RhYmxlLT5HZXROdW1iZXIoa1AsIDAuMCksIG1fdGFibGUtPkdldE51bWJlcihrSSwgMC4wKSwKKyAgICAgICAgICAgICBtX3RhYmxlLT5HZXROdW1iZXIoa0QsIDAuMCksIG1fdGFibGUtPkdldE51bWJlcihrRiwgMC4wKSk7CisgICAgfQorICB9IGVsc2UgaWYgKGtleSA9PSBrU2V0cG9pbnQgJiYgdmFsdWUtPklzRG91YmxlKCkgJiYKKyAgICAgICAgICAgICBtX3NldHBvaW50ICE9IHZhbHVlLT5HZXREb3VibGUoKSkgeworICAgIFNldFNldHBvaW50KHZhbHVlLT5HZXREb3VibGUoKSk7CisgIH0gZWxzZSBpZiAoa2V5ID09IGtFbmFibGVkICYmIHZhbHVlLT5Jc0Jvb2xlYW4oKSAmJgorICAgICAgICAgICAgIG1fZW5hYmxlZCAhPSB2YWx1ZS0+R2V0Qm9vbGVhbigpKSB7CisgICAgaWYgKHZhbHVlLT5HZXRCb29sZWFuKCkpIHsKKyAgICAgIEVuYWJsZSgpOworICAgIH0gZWxzZSB7CisgICAgICBEaXNhYmxlKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUElEQ29udHJvbGxlcjo6VXBkYXRlVGFibGUoKSB7CisKK30KKwordm9pZCBQSURDb250cm9sbGVyOjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworCURpc2FibGUoKTsKK30KKwordm9pZCBQSURDb250cm9sbGVyOjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7CisKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvUFdNLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvUFdNLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmI4YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9QV00uY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJQV00uaCIKKworLy8jaW5jbHVkZSAiTmV0d29ya0NvbW11bmljYXRpb24vVXNhZ2VSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJVdGlsaXR5LmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKK2NvbnN0IGZsb2F0IFBXTTo6a0RlZmF1bHRQd21QZXJpb2QgPSA1LjA1OworY29uc3QgZmxvYXQgUFdNOjprRGVmYXVsdFB3bUNlbnRlciA9IDEuNTsKK2NvbnN0IGludDMyX3QgUFdNOjprRGVmYXVsdFB3bVN0ZXBzRG93biA9IDEwMDA7Citjb25zdCBpbnQzMl90IFBXTTo6a1B3bURpc2FibGVkID0gMDsKKworLyoqCisgKiBBbGxvY2F0ZSBhIFBXTSBnaXZlbiBhIGNoYW5uZWwgbnVtYmVyLgorICoKKyAqIENoZWNrcyBjaGFubmVsIHZhbHVlIHJhbmdlIGFuZCBhbGxvY2F0ZXMgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwuCisgKiBUaGUgYWxsb2NhdGlvbiBpcyBvbmx5IGRvbmUgdG8gaGVscCB1c2VycyBlbnN1cmUgdGhhdCB0aGV5IGRvbid0IGRvdWJsZQorICogYXNzaWduIGNoYW5uZWxzLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlci4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAKKyAqIHBvcnQKKyAqLworUFdNOjpQV00odWludDMyX3QgY2hhbm5lbCkKK3sKKwljaGFyIGJ1Zls2NF07CisKKwlpZiAoIUNoZWNrUFdNQ2hhbm5lbChjaGFubmVsKSkKKwl7CisJCXNucHJpbnRmKGJ1ZiwgNjQsICJQV00gQ2hhbm5lbCAlZCIsIGNoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCisJc3ByaW50ZihidWYsICJwd20vJWQiLCBjaGFubmVsKTsKKwlpbXBsID0gbmV3IFNpbUNvbnRpbnVvdXNPdXRwdXQoYnVmKTsKKwltX2NoYW5uZWwgPSBjaGFubmVsOworCW1fZWxpbWluYXRlRGVhZGJhbmQgPSBmYWxzZTsKKworCW1fY2VudGVyUHdtID0ga1B3bURpc2FibGVkOyAvLyBJbiBzaW11bGF0aW9uLCB0aGUgc2FtZSB0aGluZy4KK30KKworUFdNOjp+UFdNKCkgeworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7Cit9CisKKy8qKgorICogT3B0aW9uYWxseSBlbGltaW5hdGUgdGhlIGRlYWRiYW5kIGZyb20gYSBzcGVlZCBjb250cm9sbGVyLgorICogQHBhcmFtIGVsaW1pbmF0ZURlYWRiYW5kIElmIHRydWUsIHNldCB0aGUgbW90b3IgY3VydmUgb24gdGhlIEphZ3VhciB0byBlbGltaW5hdGUKKyAqIHRoZSBkZWFkYmFuZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSByYW5nZS4gT3RoZXJ3aXNlLCBrZWVwIHRoZSBmdWxsIHJhbmdlIHdpdGhvdXQKKyAqIG1vZGlmeWluZyBhbnkgdmFsdWVzLgorICovCit2b2lkIFBXTTo6RW5hYmxlRGVhZGJhbmRFbGltaW5hdGlvbihib29sIGVsaW1pbmF0ZURlYWRiYW5kKQoreworCW1fZWxpbWluYXRlRGVhZGJhbmQgPSBlbGltaW5hdGVEZWFkYmFuZDsKK30KKworLyoqCisgKiBTZXQgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHZhbHVlcy4KKyAqIFRoaXMgc2V0cyB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgZWFjaCB0eXBlIG9mIGNvbnRyb2xsZXIuIFRoZSB2YWx1ZXMKKyAqIGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIHNwZWVkcyBhcyB3ZWxsIGFzIHRoZSBkZWFkYmFuZCBicmFja2V0LgorICogQHBhcmFtIG1heCBUaGUgTWluaW11bSBwd20gdmFsdWUKKyAqIEBwYXJhbSBkZWFkYmFuZE1heCBUaGUgaGlnaCBlbmQgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCisgKiBAcGFyYW0gY2VudGVyIFRoZSBjZW50ZXIgc3BlZWQgKG9mZikKKyAqIEBwYXJhbSBkZWFkYmFuZE1pbiBUaGUgbG93IGVuZCBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAqIEBwYXJhbSBtaW4gVGhlIG1pbmltdW0gcHdtIHZhbHVlCisgKi8KK3ZvaWQgUFdNOjpTZXRCb3VuZHMoaW50MzJfdCBtYXgsIGludDMyX3QgZGVhZGJhbmRNYXgsIGludDMyX3QgY2VudGVyLCBpbnQzMl90IGRlYWRiYW5kTWluLCBpbnQzMl90IG1pbikKK3sKKwkvLyBOb3RoaW5nIHRvIGRvIGluIHNpbXVsYXRpb24uCit9CisKKworLyoqCisgKiBTZXQgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHB1bHNlIHdpZHRocy4KKyAqIFRoaXMgc2V0cyB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvZiBjb250cm9sbGVyLiBUaGUgdmFsdWVzCisgKiBkZXRlcm1pbmUgdGhlIHVwcGVyIGFuZCBsb3dlciBzcGVlZHMgYXMgd2VsbCBhcyB0aGUgZGVhZGJhbmQgYnJhY2tldC4KKyAqIEBwYXJhbSBtYXggVGhlIG1heCBQV00gcHVsc2Ugd2lkdGggaW4gbXMKKyAqIEBwYXJhbSBkZWFkYmFuZE1heCBUaGUgaGlnaCBlbmQgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIHB1bHNlIHdpZHRoIGluIG1zCisgKiBAcGFyYW0gY2VudGVyIFRoZSBjZW50ZXIgKG9mZikgcHVsc2Ugd2lkdGggaW4gbXMKKyAqIEBwYXJhbSBkZWFkYmFuZE1pbiBUaGUgbG93IGVuZCBvZiB0aGUgZGVhZGJhbmQgcHVsc2Ugd2lkdGggaW4gbXMKKyAqIEBwYXJhbSBtaW4gVGhlIG1pbmltdW0gcHVsc2Ugd2lkdGggaW4gbXMKKyAqLwordm9pZCBQV006OlNldEJvdW5kcyhkb3VibGUgbWF4LCBkb3VibGUgZGVhZGJhbmRNYXgsIGRvdWJsZSBjZW50ZXIsIGRvdWJsZSBkZWFkYmFuZE1pbiwgZG91YmxlIG1pbikKK3sKKwkvLyBOb3RoaW5nIHRvIGRvIGluIHNpbXVsYXRpb24uCit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUgYmFzZWQgb24gYSBwb3NpdGlvbi4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vydm9zLgorICoKKyAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEBwYXJhbSBwb3MgVGhlIHBvc2l0aW9uIHRvIHNldCB0aGUgc2Vydm8gYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAqLwordm9pZCBQV006OlNldFBvc2l0aW9uKGZsb2F0IHBvcykKK3sKKwlpZiAocG9zIDwgMC4wKQorCXsKKwkJcG9zID0gMC4wOworCX0KKwllbHNlIGlmIChwb3MgPiAxLjApCisJeworCQlwb3MgPSAxLjA7CisJfQorCisJaW1wbC0+U2V0KHBvcyk7Cit9CisKKy8qKgorICogR2V0IHRoZSBQV00gdmFsdWUgaW4gdGVybXMgb2YgYSBwb3NpdGlvbi4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vydm9zLgorICoKKyAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIHRoZSBzZXJ2byBpcyBzZXQgdG8gYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgUFdNOjpHZXRQb3NpdGlvbigpIGNvbnN0Cit7CisJZmxvYXQgdmFsdWUgPSBpbXBsLT5HZXQoKTsKKwlpZiAodmFsdWUgPCAwLjApCisJeworCQlyZXR1cm4gMC4wOworCX0KKwllbHNlIGlmICh2YWx1ZSA+IDEuMCkKKwl7CisJCXJldHVybiAxLjA7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiB2YWx1ZTsKKwl9Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUgYmFzZWQgb24gYSBzcGVlZC4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc3BlZWQgY29udHJvbGxlcnMuCisgKgorICogQHByZSBTZXRNYXhQb3NpdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWluUG9zaXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldENlbnRlclB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWF4TmVnYXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdG8gc2V0IHRoZSBzcGVlZCBjb250cm9sbGVyIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCit2b2lkIFBXTTo6U2V0U3BlZWQoZmxvYXQgc3BlZWQpCit7CisJLy8gY2xhbXAgc3BlZWQgdG8gYmUgaW4gdGhlIHJhbmdlIDEuMCA+PSBzcGVlZCA+PSAtMS4wCisJaWYgKHNwZWVkIDwgLTEuMCkKKwl7CisJCXNwZWVkID0gLTEuMDsKKwl9CisJZWxzZSBpZiAoc3BlZWQgPiAxLjApCisJeworCQlzcGVlZCA9IDEuMDsKKwl9CisKKwlpbXBsLT5TZXQoc3BlZWQpOworfQorCisvKioKKyAqIEdldCB0aGUgUFdNIHZhbHVlIGluIHRlcm1zIG9mIHNwZWVkLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBzcGVlZCBjb250cm9sbGVycy4KKyAqCisgKiBAcHJlIFNldE1heFBvc2l0aXZlUHdtKCkgY2FsbGVkLgorICogQHByZSBTZXRNaW5Qb3NpdGl2ZVB3bSgpIGNhbGxlZC4KKyAqIEBwcmUgU2V0TWF4TmVnYXRpdmVQd20oKSBjYWxsZWQuCisgKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHNwZWVkIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBQV006OkdldFNwZWVkKCkgY29uc3QKK3sKKwlmbG9hdCB2YWx1ZSA9IGltcGwtPkdldCgpOworCWlmICh2YWx1ZSA+IDEuMCkKKwl7CisJCXJldHVybiAxLjA7CisJfQorCWVsc2UgaWYgKHZhbHVlIDwgLTEuMCkKKwl7CisJCXJldHVybiAtMS4wOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gdmFsdWU7CisJfQorfQorCisvKioKKyAqIFNldCB0aGUgUFdNIHZhbHVlIGRpcmVjdGx5IHRvIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBXcml0ZSBhIHJhdyB2YWx1ZSB0byBhIFBXTSBjaGFubmVsLgorICoKKyAqIEBwYXJhbSB2YWx1ZSBSYXcgUFdNIHZhbHVlLgorICovCit2b2lkIFBXTTo6U2V0UmF3KHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCXdwaV9hc3NlcnQodmFsdWUgPT0ga1B3bURpc2FibGVkKTsKKwlpbXBsLT5TZXQoMCk7Cit9CisKKy8qKgorICogU2xvdyBkb3duIHRoZSBQV00gc2lnbmFsIGZvciBvbGQgZGV2aWNlcy4KKyAqCisgKiBAcGFyYW0gbXVsdCBUaGUgcGVyaW9kIG11bHRpcGxpZXIgdG8gYXBwbHkgdG8gdGhpcyBjaGFubmVsCisgKi8KK3ZvaWQgUFdNOjpTZXRQZXJpb2RNdWx0aXBsaWVyKFBlcmlvZE11bHRpcGxpZXIgbXVsdCkKK3sKKwkvLyBEbyBub3RoaW5nIGluIHNpbXVsYXRpb24uCit9CisKKwordm9pZCBQV006OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpIHsKKyAgaWYgKCF2YWx1ZS0+SXNEb3VibGUoKSkgcmV0dXJuOworICBTZXRTcGVlZCh2YWx1ZS0+R2V0RG91YmxlKCkpOworfQorCit2b2lkIFBXTTo6VXBkYXRlVGFibGUoKSB7CisJaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgeworCQltX3RhYmxlLT5QdXROdW1iZXIoIlZhbHVlIiwgR2V0U3BlZWQoKSk7CisJfQorfQorCit2b2lkIFBXTTo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsKKwlTZXRTcGVlZCgwKTsKKwlpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisJCW1fdGFibGUtPkFkZFRhYmxlTGlzdGVuZXIoIlZhbHVlIiwgdGhpcywgdHJ1ZSk7CisJfQorfQorCit2b2lkIFBXTTo6U3RvcExpdmVXaW5kb3dNb2RlKCkgeworCVNldFNwZWVkKDApOworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKwkJbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKwl9Cit9CisKK3N0ZDo6c3RyaW5nIFBXTTo6R2V0U21hcnREYXNoYm9hcmRUeXBlKCkgY29uc3QgeworCXJldHVybiAiU3BlZWQgQ29udHJvbGxlciI7Cit9CisKK3ZvaWQgUFdNOjpJbml0VGFibGUoc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gc3ViVGFibGUpIHsKKwltX3RhYmxlID0gc3ViVGFibGU7CisJVXBkYXRlVGFibGUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElUYWJsZT4gUFdNOjpHZXRUYWJsZSgpIGNvbnN0IHsKKwlyZXR1cm4gbV90YWJsZTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvUmVsYXkuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9SZWxheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1ZDc4MgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvUmVsYXkuY3BwCkBAIC0wLDAgKzEsMjQ5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSZWxheS5oIgorCisjaW5jbHVkZSAiTW90b3JTYWZldHlIZWxwZXIuaCIKKy8vI2luY2x1ZGUgIk5ldHdvcmtDb21tdW5pY2F0aW9uL1VzYWdlUmVwb3J0aW5nLmgiCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCisKKy8qKgorICogUmVsYXkgY29uc3RydWN0b3IgZ2l2ZW4gYSBjaGFubmVsLgorICoKKyAqIFRoaXMgY29kZSBpbml0aWFsaXplcyB0aGUgcmVsYXkgYW5kIHJlc2VydmVzIGFsbCByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlCisgKiBsb2NrZWQuIEluaXRpYWxseSB0aGUgcmVsYXkgaXMgc2V0IHRvIGJvdGggbGluZXMgYXQgMHYuCisgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBudW1iZXIgKDAtMykuCisgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhhdCB0aGUgUmVsYXkgb2JqZWN0IHdpbGwgY29udHJvbC4KKyAqLworUmVsYXk6OlJlbGF5KHVpbnQzMl90IGNoYW5uZWwsIFJlbGF5OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQorCTogbV9jaGFubmVsIChjaGFubmVsKQorCSwgbV9kaXJlY3Rpb24gKGRpcmVjdGlvbikKK3sKKwljaGFyIGJ1Zls2NF07CisJaWYgKCFTZW5zb3JCYXNlOjpDaGVja1JlbGF5Q2hhbm5lbChtX2NoYW5uZWwpKQorCXsKKwkJc25wcmludGYoYnVmLCA2NCwgIlJlbGF5IENoYW5uZWwgJWQiLCBtX2NoYW5uZWwpOworCQl3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYpOworCQlyZXR1cm47CisJfQorCisgICAgbV9zYWZldHlIZWxwZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vdG9yU2FmZXR5SGVscGVyPih0aGlzKTsKKyAgICBtX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7CisKKwlzcHJpbnRmKGJ1ZiwgInJlbGF5LyVkIiwgbV9jaGFubmVsKTsKKwlpbXBsID0gbmV3IFNpbUNvbnRpbnVvdXNPdXRwdXQoYnVmKTsgLy8gVE9ETzogQWxsb3cgdHdvIGRpZmZlcmVudCByZWxheXMgKHRhcmdldHRpbmcgdGhlIGRpZmZlcmVudCBoYWx2ZXMgb2YgYSByZWxheSkgdG8gYmUgY29tYmluZWQgdG8gY29udHJvbCBvbmUgbW90b3IuCisJTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkQWN0dWF0b3IoIlJlbGF5IiwgMSwgbV9jaGFubmVsLCB0aGlzKTsKKwlnb19wb3MgPSBnb19uZWcgPSBmYWxzZTsKK30KKworLyoqCisgKiBGcmVlIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSByZWxheS4KKyAqIFRoZSByZWxheSBjaGFubmVscyBhcmUgc2V0IHRvIGZyZWUgYW5kIHRoZSByZWxheSBvdXRwdXQgaXMgdHVybmVkIG9mZi4KKyAqLworUmVsYXk6On5SZWxheSgpCit7CisJaW1wbC0+U2V0KDApOworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIG1fdGFibGUtPlJlbW92ZVRhYmxlTGlzdGVuZXIodGhpcyk7Cit9CisKKy8qKgorICogU2V0IHRoZSByZWxheSBzdGF0ZS4KKyAqCisgKiBWYWxpZCB2YWx1ZXMgZGVwZW5kIG9uIHdoaWNoIGRpcmVjdGlvbnMgb2YgdGhlIHJlbGF5IGFyZSBjb250cm9sbGVkIGJ5IHRoZSBvYmplY3QuCisgKgorICogV2hlbiBzZXQgdG8ga0JvdGhEaXJlY3Rpb25zLCB0aGUgcmVsYXkgY2FuIGJlIGFueSBvZiB0aGUgZm91ciBzdGF0ZXM6CisgKiAgICAwdi0wdiwgMHYtMTJ2LCAxMnYtMHYsIDEydi0xMnYKKyAqCisgKiBXaGVuIHNldCB0byBrRm9yd2FyZE9ubHkgb3Iga1JldmVyc2VPbmx5LCB5b3UgY2FuIHNwZWNpZnkgdGhlIGNvbnN0YW50IGZvciB0aGUKKyAqICAgIGRpcmVjdGlvbiBvciB5b3UgY2FuIHNpbXBseSBzcGVjaWZ5IGtPZmYgYW5kIGtPbi4gIFVzaW5nIG9ubHkga09mZiBhbmQga09uIGlzCisgKiAgICByZWNvbW1lbmRlZC4KKyAqCisgKiBAcGFyYW0gdmFsdWUgVGhlIHN0YXRlIHRvIHNldCB0aGUgcmVsYXkuCisgKi8KK3ZvaWQgUmVsYXk6OlNldChSZWxheTo6VmFsdWUgdmFsdWUpCit7CisJc3dpdGNoICh2YWx1ZSkKKwl7CisJY2FzZSBrT2ZmOgorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkKKwkJeworCQkJZ29fcG9zID0gZmFsc2U7CisJCX0KKwkJaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpCisJCXsKKwkJCWdvX25lZyA9IGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2Uga09uOgorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkKKwkJeworCQkJZ29fcG9zID0gdHJ1ZTsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkKKwkJeworCQkJZ29fbmVnID0gdHJ1ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIGtGb3J3YXJkOgorCQlpZiAobV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KQorCQl7CisJCQl3cGlfc2V0V1BJRXJyb3IoSW5jb21wYXRpYmxlTW9kZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkKKwkJeworCQkJZ29fcG9zID0gdHJ1ZTsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zKQorCQl7CisJCQlnb19uZWcgPSBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIGtSZXZlcnNlOgorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KQorCQl7CisJCQl3cGlfc2V0V1BJRXJyb3IoSW5jb21wYXRpYmxlTW9kZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zKQorCQl7CisJCQlnb19wb3MgPSBmYWxzZTsKKwkJfQorCQlpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkKKwkJeworCQkJZ29fbmVnID0gdHJ1ZTsKKwkJfQorCQlicmVhazsKKwl9CisJaW1wbC0+U2V0KChnb19wb3MgPyAxIDogMCkgKyAoZ29fbmVnID8gLTEgOiAwKSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBSZWxheSBTdGF0ZQorICoKKyAqIEdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbGF5LgorICoKKyAqIFdoZW4gc2V0IHRvIGtGb3J3YXJkT25seSBvciBrUmV2ZXJzZU9ubHksIHZhbHVlIGlzIHJldHVybmVkIGFzIGtPbi9rT2ZmIG5vdAorICoga0ZvcndhcmQva1JldmVyc2UgKHBlciB0aGUgcmVjb21tZW5kYXRpb24gaW4gU2V0KQorICoKKyAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbGF5IGFzIGEgUmVsYXk6OlZhbHVlCisgKi8KK1JlbGF5OjpWYWx1ZSBSZWxheTo6R2V0KCkgY29uc3QgeworCS8vIFRPRE86IERvbid0IGFzc3VtZSB0aGF0IHRoZSBnb19wb3MgYW5kIGdvX25lZyBmaWVsZHMgYXJlIGNvcnJlY3Q/CisJaWYgKChnb19wb3MgfHwgbV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KSAmJiAoZ29fbmVnIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkpIHsKKwkJcmV0dXJuIGtPbjsKKwl9IGVsc2UgaWYgKGdvX3BvcykgeworCQlyZXR1cm4ga0ZvcndhcmQ7CisJfSBlbHNlIGlmIChnb19uZWcpIHsKKwkJcmV0dXJuIGtSZXZlcnNlOworCX0gZWxzZSB7CisJCXJldHVybiBrT2ZmOworCX0KK30KKwordWludDMyX3QgUmVsYXk6OkdldENoYW5uZWwoKSBjb25zdCB7CisgIHJldHVybiBtX2NoYW5uZWw7Cit9CisKKy8qKgorICogU2V0IHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBSZWxheSBvYmplY3QKKyAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyByZWxheSBvYmplY3QKKyAqLwordm9pZCBSZWxheTo6U2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KSB7CisgIG1fc2FmZXR5SGVscGVyLT5TZXRFeHBpcmF0aW9uKHRpbWVvdXQpOworfQorCisvKioKKyAqIFJldHVybiB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgcmVsYXkgb2JqZWN0LgorICogQHJldHVybiBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgorICovCitmbG9hdCBSZWxheTo6R2V0RXhwaXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7IH0KKworLyoqCisgKiBDaGVjayBpZiB0aGUgcmVsYXkgb2JqZWN0IGlzIGN1cnJlbnRseSBhbGl2ZSBvciBzdG9wcGVkIGR1ZSB0byBhIHRpbWVvdXQuCisgKiBAcmV0dXJucyBhIGJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHRoZSBtb3RvciBoYXMgTk9UIHRpbWVkIG91dCBhbmQgc2hvdWxkCisgKiBzdGlsbCBiZSBydW5uaW5nLgorICovCitib29sIFJlbGF5OjpJc0FsaXZlKCkgY29uc3QgeyByZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsgfQorCisvKioKKyAqIFN0b3AgdGhlIG1vdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFBXTSBvYmplY3QuCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0IHdoZW4gaXQgaGFzIGEgdGltZW91dCBmb3IgdGhpcworICogcmVsYXkgYW5kIG5lZWRzIHRvIHN0b3AgaXQgZnJvbSBydW5uaW5nLgorICovCit2b2lkIFJlbGF5OjpTdG9wTW90b3IoKSB7IFNldChrT2ZmKTsgfQorCisvKioKKyAqIEVuYWJsZS9kaXNhYmxlIG1vdG9yIHNhZmV0eSBmb3IgdGhpcyBkZXZpY2UKKyAqIFR1cm4gb24gYW5kIG9mZiB0aGUgbW90b3Igc2FmZXR5IG9wdGlvbiBmb3IgdGhpcyByZWxheSBvYmplY3QuCisgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKKyAqLwordm9pZCBSZWxheTo6U2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpIHsKKyAgbV9zYWZldHlIZWxwZXItPlNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgbW90b3Igc2FmZXR5IGlzIGVuYWJsZWQgZm9yIHRoaXMgb2JqZWN0CisgKiBAcmV0dXJucyBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKKyAqLworYm9vbCBSZWxheTo6SXNTYWZldHlFbmFibGVkKCkgY29uc3QgeworICByZXR1cm4gbV9zYWZldHlIZWxwZXItPklzU2FmZXR5RW5hYmxlZCgpOworfQorCit2b2lkIFJlbGF5OjpHZXREZXNjcmlwdGlvbihzdGQ6Om9zdHJpbmdzdHJlYW0mIGRlc2MpIGNvbnN0IHsKKyAgZGVzYyA8PCAiUmVsYXkgIiA8PCBHZXRDaGFubmVsKCk7Cit9CisKK3ZvaWQgUmVsYXk6OlZhbHVlQ2hhbmdlZChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwgYm9vbCBpc05ldykgeworICBpZiAoIXZhbHVlLT5Jc1N0cmluZygpKSByZXR1cm47CisgIGlmICh2YWx1ZS0+R2V0U3RyaW5nKCkgPT0gIk9mZiIpIFNldChrT2ZmKTsKKyAgZWxzZSBpZiAodmFsdWUtPkdldFN0cmluZygpID09ICJGb3J3YXJkIikgU2V0KGtGb3J3YXJkKTsKKyAgZWxzZSBpZiAodmFsdWUtPkdldFN0cmluZygpID09ICJSZXZlcnNlIikgU2V0KGtSZXZlcnNlKTsKK30KKwordm9pZCBSZWxheTo6VXBkYXRlVGFibGUoKSB7CisJaWYobV90YWJsZSAhPSBudWxscHRyKXsKKwkJaWYgKEdldCgpID09IGtPbikgeworCQkJbV90YWJsZS0+UHV0U3RyaW5nKCJWYWx1ZSIsICJPbiIpOworCQl9CisJCWVsc2UgaWYgKEdldCgpID09IGtGb3J3YXJkKSB7CisJCQltX3RhYmxlLT5QdXRTdHJpbmcoIlZhbHVlIiwgIkZvcndhcmQiKTsKKwkJfQorCQllbHNlIGlmIChHZXQoKSA9PSBrUmV2ZXJzZSkgeworCQkJbV90YWJsZS0+UHV0U3RyaW5nKCJWYWx1ZSIsICJSZXZlcnNlIik7CisJCX0KKwkJZWxzZSB7CisJCQltX3RhYmxlLT5QdXRTdHJpbmcoIlZhbHVlIiwgIk9mZiIpOworCQl9CisJfQorfQorCit2b2lkIFJlbGF5OjpTdGFydExpdmVXaW5kb3dNb2RlKCkgeworCWlmKG1fdGFibGUgIT0gbnVsbHB0cil7CisJCW1fdGFibGUtPkFkZFRhYmxlTGlzdGVuZXIoIlZhbHVlIiwgdGhpcywgdHJ1ZSk7CisJfQorfQorCit2b2lkIFJlbGF5OjpTdG9wTGl2ZVdpbmRvd01vZGUoKSB7CisJaWYobV90YWJsZSAhPSBudWxscHRyKXsKKwkJbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKwl9Cit9CisKK3N0ZDo6c3RyaW5nIFJlbGF5OjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisJcmV0dXJuICJSZWxheSI7Cit9CisKK3ZvaWQgUmVsYXk6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworCW1fdGFibGUgPSBzdWJUYWJsZTsKKwlVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBSZWxheTo6R2V0VGFibGUoKSBjb25zdCB7CisJcmV0dXJuIG1fdGFibGU7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1JvYm90QmFzZS5jcHAgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1JvYm90QmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhNWFjNwotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvUm9ib3RCYXNlLmNwcApAQCAtMCwwICsxLDk5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSb2JvdEJhc2UuaCIKKyNpbmNsdWRlICJSb2JvdFN0YXRlLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKworUm9ib3RCYXNlKiBSb2JvdEJhc2U6Om1faW5zdGFuY2UgPSBudWxscHRyOworCit2b2lkIFJvYm90QmFzZTo6c2V0SW5zdGFuY2UoUm9ib3RCYXNlKiByb2JvdCkKK3sKKwl3cGlfYXNzZXJ0KG1faW5zdGFuY2UgPT0gbnVsbHB0cik7CisJbV9pbnN0YW5jZSA9IHJvYm90OworfQorCitSb2JvdEJhc2UgJlJvYm90QmFzZTo6Z2V0SW5zdGFuY2UoKQoreworCXJldHVybiAqbV9pbnN0YW5jZTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBnZW5lcmljIHJvYm90IHByb2dyYW0uCisgKiBVc2VyIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgY29uc3R1Y3RvciB0aGF0IHJ1bnMgYmVmb3JlIHRoZSBBdXRvbm9tb3VzIG9yIE9wZXJhdG9yCisgKiBDb250cm9sIHBlcmlvZCBzdGFydHMuIFRoZSBjb25zdHJ1Y3RvciB3aWxsIHJ1biB0byBjb21wbGV0aW9uIGJlZm9yZSBBdXRvbm9tb3VzIGlzIGVudGVyZWQuCisgKgorICogVGhpcyBtdXN0IGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbW11bmljYXRpb25zIGNvZGUgc3RhcnRzLiBJbiB0aGUgZnV0dXJlIGl0IHdvdWxkIGJlCisgKiBuaWNlIHRvIHB1dCB0aGlzIGNvZGUgaW50byBpdCdzIG93biB0YXNrIHRoYXQgbG9hZHMgb24gYm9vdCBzbyBlbnN1cmUgdGhhdCBpdCBydW5zLgorICovCitSb2JvdEJhc2U6OlJvYm90QmFzZSgpIDogbV9kcyhEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpKQoreworCVJvYm90U3RhdGU6OlNldEltcGxlbWVudGF0aW9uKERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCkpOworCXRyYW5zcG9ydDo6U3Vic2NyaWJlclB0ciB0aW1lX3B1YiA9IE1haW5Ob2RlOjpTdWJzY3JpYmUoInRpbWUiLCAmd3BpbGliOjppbnRlcm5hbDo6dGltZV9jYWxsYmFjayk7Cit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBSb2JvdCBpcyBjdXJyZW50bHkgZW5hYmxlZC4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgUm9ib3QgaXMgY3VycmVudGx5IGVuYWJsZWQgYnkgdGhlIGZpZWxkIGNvbnRyb2xzLgorICovCitib29sIFJvYm90QmFzZTo6SXNFbmFibGVkKCkgY29uc3QKK3sKKwlyZXR1cm4gbV9kcy5Jc0VuYWJsZWQoKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBkaXNhYmxlZC4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgUm9ib3QgaXMgY3VycmVudGx5IGRpc2FibGVkIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KKyAqLworYm9vbCBSb2JvdEJhc2U6OklzRGlzYWJsZWQoKSBjb25zdAoreworCXJldHVybiBtX2RzLklzRGlzYWJsZWQoKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBpbiBBdXRub21vdXMgbW9kZS4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IG9wZXJhdGluZyBBdXRvbm9tb3VzbHkgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmllbGQgY29udHJvbHMuCisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc0F1dG9ub21vdXMoKSBjb25zdAoreworCXJldHVybiBtX2RzLklzQXV0b25vbW91cygpOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IGluIE9wZXJhdG9yIENvbnRyb2wgbW9kZS4KKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IG9wZXJhdGluZyBpbiBUZWxlLU9wIG1vZGUgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmllbGQgY29udHJvbHMuCisgKi8KK2Jvb2wgUm9ib3RCYXNlOjpJc09wZXJhdG9yQ29udHJvbCgpIGNvbnN0Cit7CisJcmV0dXJuIG1fZHMuSXNPcGVyYXRvckNvbnRyb2woKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBpbiBUZXN0IG1vZGUuCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBydW5uaW5nIHRlc3RzIGFzIGRldGVybWluZWQgYnkgdGhlIGZpZWxkIGNvbnRyb2xzLgorICovCitib29sIFJvYm90QmFzZTo6SXNUZXN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kcy5Jc1Rlc3QoKTsKK30KKworLyoqCisgKiBUaGlzIGNsYXNzIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBnZXR0aW5nIGl0cyBkZXN0cnVjdG9yIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgdW5sb2Fkcy4KKyAqIEJlZm9yZSB0aGUgbW9kdWxlIGlzIGRvbmUgdW5sb2FkaW5nLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgUm9ib3RCYXNlIGRlcml2ZWQgc2luZ2xldG9uLiAgVGhpcyBzaG91bGQgZGVsZXRlCisgKiB0aGUgb3RoZXIgcmVtYWluaW5nIHNpbmdsZXRvbnMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQuICBUaGlzIHNob3VsZCBhbHNvIHN0b3AgYWxsIHRhc2tzIHRoYXQgYXJlIHVzaW5nCisgKiB0aGUgVGFzayBjbGFzcy4KKyAqLworY2xhc3MgUm9ib3REZWxldGVyCit7CitwdWJsaWM6CisJflJvYm90RGVsZXRlcigpCisJeworCQlkZWxldGUgJlJvYm90QmFzZTo6Z2V0SW5zdGFuY2UoKTsKKwl9Cit9Oworc3RhdGljIFJvYm90RGVsZXRlciBnX3JvYm90RGVsZXRlcjsKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvUm9ib3REcml2ZS5jcHAgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1JvYm90RHJpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmQwYmYKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1JvYm90RHJpdmUuY3BwCkBAIC0wLDAgKzEsNzM0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJSb2JvdERyaXZlLmgiCisKKy8vI2luY2x1ZGUgIkNBTkphZ3Vhci5oIgorI2luY2x1ZGUgIkdlbmVyaWNISUQuaCIKKyNpbmNsdWRlICJKb3lzdGljay5oIgorI2luY2x1ZGUgIkphZ3Vhci5oIgorI2luY2x1ZGUgIlV0aWxpdHkuaCIKKyNpbmNsdWRlICJXUElFcnJvcnMuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyN1bmRlZiBtYXgKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK2NvbnN0IGludDMyX3QgUm9ib3REcml2ZTo6a01heE51bWJlck9mTW90b3JzOworCisvKgorICogRHJpdmluZyBmdW5jdGlvbnMKKyAqIFRoZXNlIGZ1bmN0aW9ucyBwcm92aWRlIGFuIGludGVyZmFjZSB0byBtdWx0aXBsZSBtb3RvcnMgdGhhdCBpcyB1c2VkIGZvciBDIHByb2dyYW1taW5nCisgKiBUaGUgRHJpdmUoc3BlZWQsIGRpcmVjdGlvbikgZnVuY3Rpb24gaXMgdGhlIG1haW4gcGFydCBvZiB0aGUgc2V0IHRoYXQgbWFrZXMgaXQgZWFzeQorICogdG8gc2V0IHNwZWVkcyBhbmQgZGlyZWN0aW9uIGluZGVwZW5kZW50bHkgaW4gb25lIGNhbGwuCisgKi8KKworLyoqCisgKiBDb21tb24gZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBhbGwgdGhlIHJvYm90IGRyaXZlIGNvbnN0cnVjdG9ycy4KKyAqIENyZWF0ZSBhIG1vdG9yIHNhZmV0eSBvYmplY3QgKHRoZSByZWFsIHJlYXNvbiBmb3IgdGhlIGNvbW1vbiBjb2RlKSBhbmQKKyAqIGluaXRpYWxpemUgYWxsIHRoZSBtb3RvciBhc3NpZ25tZW50cy4gVGhlIGRlZmF1bHQgdGltZW91dCBpcyBzZXQgZm9yIHRoZSByb2JvdCBkcml2ZS4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpJbml0Um9ib3REcml2ZSgpIHsKKwkvLyBGSVhNRTogbV9zYWZldHlIZWxwZXIgPSBuZXcgTW90b3JTYWZldHlIZWxwZXIodGhpcyk7CisJLy8gRklYTUU6IG1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKHRydWUpOworfQorCisvKiogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCAyIG1vdG9ycyBzcGVjaWZpZWQgd2l0aCBjaGFubmVsIG51bWJlcnMuCisgKiBTZXQgdXAgcGFyYW1ldGVycyBmb3IgYSB0d28gd2hlZWwgZHJpdmUgc3lzdGVtIHdoZXJlIHRoZQorICogbGVmdCBhbmQgcmlnaHQgbW90b3IgcHdtIGNoYW5uZWxzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuCisgKiBUaGlzIGNhbGwgYXNzdW1lcyBKYWd1YXJzIGZvciBjb250cm9sbGluZyB0aGUgbW90b3JzLgorICogQHBhcmFtIGxlZnRNb3RvckNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlciB0aGF0IGRyaXZlcyB0aGUgbGVmdCBtb3Rvci4KKyAqIEBwYXJhbSByaWdodE1vdG9yQ2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgZHJpdmVzIHRoZSByaWdodCBtb3Rvci4KKyAqLworUm9ib3REcml2ZTo6Um9ib3REcml2ZSh1aW50MzJfdCBsZWZ0TW90b3JDaGFubmVsLCB1aW50MzJfdCByaWdodE1vdG9yQ2hhbm5lbCkKK3sKKwlJbml0Um9ib3REcml2ZSgpOworCW1fcmVhckxlZnRNb3RvciA9IG5ldyBKYWd1YXIobGVmdE1vdG9yQ2hhbm5lbCk7CisJbV9yZWFyUmlnaHRNb3RvciA9IG5ldyBKYWd1YXIocmlnaHRNb3RvckNoYW5uZWwpOworCWZvciAoaW50MzJfdCBpPTA7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykKKwl7CisJCW1faW52ZXJ0ZWRNb3RvcnNbaV0gPSAxOworCX0KKwlTZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMoMC4wLCAwLjApOworCW1fZGVsZXRlU3BlZWRDb250cm9sbGVycyA9IHRydWU7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCA0IG1vdG9ycyBzcGVjaWZpZWQgd2l0aCBjaGFubmVsIG51bWJlcnMuCisgKiBTZXQgdXAgcGFyYW1ldGVycyBmb3IgYSBmb3VyIHdoZWVsIGRyaXZlIHN5c3RlbSB3aGVyZSBhbGwgZm91ciBtb3RvcgorICogcHdtIGNoYW5uZWxzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuCisgKiBUaGlzIGNhbGwgYXNzdW1lcyBKYWd1YXJzIGZvciBjb250cm9sbGluZyB0aGUgbW90b3JzLgorICogQHBhcmFtIGZyb250TGVmdE1vdG9yIEZyb250IGxlZnQgbW90b3IgY2hhbm5lbCBudW1iZXIKKyAqIEBwYXJhbSByZWFyTGVmdE1vdG9yIFJlYXIgTGVmdCBtb3RvciBjaGFubmVsIG51bWJlcgorICogQHBhcmFtIGZyb250UmlnaHRNb3RvciBGcm9udCByaWdodCBtb3RvciBjaGFubmVsIG51bWJlcgorICogQHBhcmFtIHJlYXJSaWdodE1vdG9yIFJlYXIgUmlnaHQgbW90b3IgY2hhbm5lbCBudW1iZXIKKyAqLworUm9ib3REcml2ZTo6Um9ib3REcml2ZSh1aW50MzJfdCBmcm9udExlZnRNb3RvciwgdWludDMyX3QgcmVhckxlZnRNb3RvciwKKwkJdWludDMyX3QgZnJvbnRSaWdodE1vdG9yLCB1aW50MzJfdCByZWFyUmlnaHRNb3RvcikKK3sKKwlJbml0Um9ib3REcml2ZSgpOworCW1fcmVhckxlZnRNb3RvciA9IG5ldyBKYWd1YXIocmVhckxlZnRNb3Rvcik7CisJbV9yZWFyUmlnaHRNb3RvciA9IG5ldyBKYWd1YXIocmVhclJpZ2h0TW90b3IpOworCW1fZnJvbnRMZWZ0TW90b3IgPSBuZXcgSmFndWFyKGZyb250TGVmdE1vdG9yKTsKKwltX2Zyb250UmlnaHRNb3RvciA9IG5ldyBKYWd1YXIoZnJvbnRSaWdodE1vdG9yKTsKKwlmb3IgKGludDMyX3QgaT0wOyBpIDwga01heE51bWJlck9mTW90b3JzOyBpKyspCisJeworCQltX2ludmVydGVkTW90b3JzW2ldID0gMTsKKwl9CisJU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKDAuMCwgMC4wKTsKKwltX2RlbGV0ZVNwZWVkQ29udHJvbGxlcnMgPSB0cnVlOworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBSb2JvdERyaXZlIHdpdGggMiBtb3RvcnMgc3BlY2lmaWVkIGFzIFNwZWVkQ29udHJvbGxlciBvYmplY3RzLgorICogVGhlIFNwZWVkQ29udHJvbGxlciB2ZXJzaW9uIG9mIHRoZSBjb25zdHJ1Y3RvciBlbmFibGVzIHByb2dyYW1zIHRvIHVzZSB0aGUgUm9ib3REcml2ZSBjbGFzc2VzIHdpdGgKKyAqIHN1YmNsYXNzZXMgb2YgdGhlIFNwZWVkQ29udHJvbGxlciBvYmplY3RzLCBmb3IgZXhhbXBsZSwgdmVyc2lvbnMgd2l0aCByYW1waW5nIG9yIHJlc2hhcGluZyBvZgorICogdGhlIGN1cnZlIHRvIHN1aXQgbW90b3IgYmlhcyBvciBkZWFkYmFuZCBlbGltaW5hdGlvbi4KKyAqIEBwYXJhbSBsZWZ0TW90b3IgVGhlIGxlZnQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KKyAqIEBwYXJhbSByaWdodE1vdG9yIHRoZSByaWdodCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUgdGhlIHJvYm90LgorICovCitSb2JvdERyaXZlOjpSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAqbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgKnJpZ2h0TW90b3IpCit7CisJSW5pdFJvYm90RHJpdmUoKTsKKwlpZiAobGVmdE1vdG9yID09IG51bGxwdHIgfHwgcmlnaHRNb3RvciA9PSBudWxscHRyKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworCQltX3JlYXJMZWZ0TW90b3IgPSBtX3JlYXJSaWdodE1vdG9yID0gbnVsbHB0cjsKKwkJcmV0dXJuOworCX0KKwltX3JlYXJMZWZ0TW90b3IgPSBsZWZ0TW90b3I7CisJbV9yZWFyUmlnaHRNb3RvciA9IHJpZ2h0TW90b3I7CisJZm9yIChpbnQzMl90IGk9MDsgaSA8IGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKQorCXsKKwkJbV9pbnZlcnRlZE1vdG9yc1tpXSA9IDE7CisJfQorCW1fZGVsZXRlU3BlZWRDb250cm9sbGVycyA9IGZhbHNlOworfQorCitSb2JvdERyaXZlOjpSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAmbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgJnJpZ2h0TW90b3IpCit7CisJSW5pdFJvYm90RHJpdmUoKTsKKwltX3JlYXJMZWZ0TW90b3IgPSAmbGVmdE1vdG9yOworCW1fcmVhclJpZ2h0TW90b3IgPSAmcmlnaHRNb3RvcjsKKwlmb3IgKGludDMyX3QgaT0wOyBpIDwga01heE51bWJlck9mTW90b3JzOyBpKyspCisJeworCQltX2ludmVydGVkTW90b3JzW2ldID0gMTsKKwl9CisJbV9kZWxldGVTcGVlZENvbnRyb2xsZXJzID0gZmFsc2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCA0IG1vdG9ycyBzcGVjaWZpZWQgYXMgU3BlZWRDb250cm9sbGVyIG9iamVjdHMuCisgKiBTcGVlZCBjb250cm9sbGVyIGlucHV0IHZlcnNpb24gb2YgUm9ib3REcml2ZSAoc2VlIHByZXZpb3VzIGNvbW1lbnRzKS4KKyAqIEBwYXJhbSByZWFyTGVmdE1vdG9yIFRoZSBiYWNrIGxlZnQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KKyAqIEBwYXJhbSBmcm9udExlZnRNb3RvciBUaGUgZnJvbnQgbGVmdCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUgdGhlIHJvYm90CisgKiBAcGFyYW0gcmVhclJpZ2h0TW90b3IgVGhlIGJhY2sgcmlnaHQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KKyAqIEBwYXJhbSBmcm9udFJpZ2h0TW90b3IgVGhlIGZyb250IHJpZ2h0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuCisgKi8KK1JvYm90RHJpdmU6OlJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyICpmcm9udExlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyICpyZWFyTGVmdE1vdG9yLAorCQkJCQkJU3BlZWRDb250cm9sbGVyICpmcm9udFJpZ2h0TW90b3IsIFNwZWVkQ29udHJvbGxlciAqcmVhclJpZ2h0TW90b3IpCit7CisJSW5pdFJvYm90RHJpdmUoKTsKKwlpZiAoZnJvbnRMZWZ0TW90b3IgPT0gbnVsbHB0ciB8fCByZWFyTGVmdE1vdG9yID09IG51bGxwdHIgfHwgZnJvbnRSaWdodE1vdG9yID09IG51bGxwdHIgfHwgcmVhclJpZ2h0TW90b3IgPT0gbnVsbHB0cikKKwl7CisJCXdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKKwkJcmV0dXJuOworCX0KKwltX2Zyb250TGVmdE1vdG9yID0gZnJvbnRMZWZ0TW90b3I7CisJbV9yZWFyTGVmdE1vdG9yID0gcmVhckxlZnRNb3RvcjsKKwltX2Zyb250UmlnaHRNb3RvciA9IGZyb250UmlnaHRNb3RvcjsKKwltX3JlYXJSaWdodE1vdG9yID0gcmVhclJpZ2h0TW90b3I7CisJZm9yIChpbnQzMl90IGk9MDsgaSA8IGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKQorCXsKKwkJbV9pbnZlcnRlZE1vdG9yc1tpXSA9IDE7CisJfQorCW1fZGVsZXRlU3BlZWRDb250cm9sbGVycyA9IGZhbHNlOworfQorCitSb2JvdERyaXZlOjpSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciAmZnJvbnRMZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciAmcmVhckxlZnRNb3RvciwKKwkJCQkJCVNwZWVkQ29udHJvbGxlciAmZnJvbnRSaWdodE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgJnJlYXJSaWdodE1vdG9yKQoreworCUluaXRSb2JvdERyaXZlKCk7CisJbV9mcm9udExlZnRNb3RvciA9ICZmcm9udExlZnRNb3RvcjsKKwltX3JlYXJMZWZ0TW90b3IgPSAmcmVhckxlZnRNb3RvcjsKKwltX2Zyb250UmlnaHRNb3RvciA9ICZmcm9udFJpZ2h0TW90b3I7CisJbV9yZWFyUmlnaHRNb3RvciA9ICZyZWFyUmlnaHRNb3RvcjsKKwlmb3IgKGludDMyX3QgaT0wOyBpIDwga01heE51bWJlck9mTW90b3JzOyBpKyspCisJeworCQltX2ludmVydGVkTW90b3JzW2ldID0gMTsKKwl9CisJbV9kZWxldGVTcGVlZENvbnRyb2xsZXJzID0gZmFsc2U7Cit9CisKKy8qKgorICogUm9ib3REcml2ZSBkZXN0cnVjdG9yLgorICogRGVsZXRlcyBtb3RvciBvYmplY3RzIHRoYXQgd2VyZSBub3QgcGFzc2VkIGluIGFuZCBjcmVhdGVkIGludGVybmFsbHkgb25seS4KKyAqKi8KK1JvYm90RHJpdmU6On5Sb2JvdERyaXZlKCkKK3sKKwlpZiAobV9kZWxldGVTcGVlZENvbnRyb2xsZXJzKQorCXsKKwkJZGVsZXRlIG1fZnJvbnRMZWZ0TW90b3I7CisJCWRlbGV0ZSBtX3JlYXJMZWZ0TW90b3I7CisJCWRlbGV0ZSBtX2Zyb250UmlnaHRNb3RvcjsKKwkJZGVsZXRlIG1fcmVhclJpZ2h0TW90b3I7CisJfQorCS8vIEZJWE1FOiBkZWxldGUgbV9zYWZldHlIZWxwZXI7Cit9CisKKy8qKgorICogRHJpdmUgdGhlIG1vdG9ycyBhdCAib3V0cHV0TWFnbml0dWRlIiBhbmQgImN1cnZlIi4KKyAqIEJvdGggb3V0cHV0TWFnbml0dWRlIGFuZCBjdXJ2ZSBhcmUgLTEuMCB0byArMS4wIHZhbHVlcywgd2hlcmUgMC4wIHJlcHJlc2VudHMKKyAqIHN0b3BwZWQgYW5kIG5vdCB0dXJuaW5nLiBjdXJ2ZSA8IDAgd2lsbCB0dXJuIGxlZnQgYW5kIGN1cnZlID4gMCB3aWxsIHR1cm4KKyAqIHJpZ2h0LgorICoKKyAqIFRoZSBhbGdvcml0aG0gZm9yIHN0ZWVyaW5nIHByb3ZpZGVzIGEgY29uc3RhbnQgdHVybiByYWRpdXMgZm9yIGFueSBub3JtYWwKKyAqIHNwZWVkIHJhbmdlLCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkLiBJbmNyZWFzaW5nIG1fc2Vuc2l0aXZpdHkgY2F1c2VzCisgKiBzaGFycGVyIHR1cm5zIGZvciBmaXhlZCB2YWx1ZXMgb2YgY3VydmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG1vc3QgbGlrZWx5IGJlIHVzZWQgaW4gYW4gYXV0b25vbW91cyByb3V0aW5lLgorICoKKyAqIEBwYXJhbSBvdXRwdXRNYWduaXR1ZGUgVGhlIHNwZWVkIHNldHRpbmcgZm9yIHRoZSBvdXRzaWRlIHdoZWVsIGluIGEgdHVybiwKKyAqICAgICAgICBmb3J3YXJkIG9yIGJhY2t3YXJkcywgKzEgdG8gLTEuCisgKiBAcGFyYW0gY3VydmUgVGhlIHJhdGUgb2YgdHVybiwgY29uc3RhbnQgZm9yIGRpZmZlcmVudCBmb3J3YXJkIHNwZWVkcy4gU2V0CisgKiAgICAgICAgY3VydmUgPCAwIGZvciBsZWZ0IHR1cm4gb3IgY3VydmUgPiAwIGZvciByaWdodCB0dXJuLgorICogU2V0IGN1cnZlID0gZV4oLXIvdykgdG8gZ2V0IGEgdHVybiByYWRpdXMgciBmb3Igd2hlZWxiYXNlIHcgb2YgeW91ciByb2JvdC4KKyAqIENvbnZlcnNlbHksIHR1cm4gcmFkaXVzIHIgPSAtbG4oY3VydmUpKncgZm9yIGEgZ2l2ZW4gdmFsdWUgb2YgY3VydmUgYW5kCisgKiB3aGVlbGJhc2Ugdy4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpEcml2ZShmbG9hdCBvdXRwdXRNYWduaXR1ZGUsIGZsb2F0IGN1cnZlKQoreworCWZsb2F0IGxlZnRPdXRwdXQsIHJpZ2h0T3V0cHV0OworCXN0YXRpYyBib29sIHJlcG9ydGVkID0gZmFsc2U7CisJaWYgKCFyZXBvcnRlZCkKKwl7CisJCXJlcG9ydGVkID0gdHJ1ZTsKKwl9CisKKwlpZiAoY3VydmUgPCAwKQorCXsKKwkJZmxvYXQgdmFsdWUgPSBsb2coLWN1cnZlKTsKKwkJZmxvYXQgcmF0aW8gPSAodmFsdWUgLSBtX3NlbnNpdGl2aXR5KS8odmFsdWUgKyBtX3NlbnNpdGl2aXR5KTsKKwkJaWYgKHJhdGlvID09IDApIHJhdGlvID0uMDAwMDAwMDAwMTsKKwkJbGVmdE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZSAvIHJhdGlvOworCQlyaWdodE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZTsKKwl9CisJZWxzZSBpZiAoY3VydmUgPiAwKQorCXsKKwkJZmxvYXQgdmFsdWUgPSBsb2coY3VydmUpOworCQlmbG9hdCByYXRpbyA9ICh2YWx1ZSAtIG1fc2Vuc2l0aXZpdHkpLyh2YWx1ZSArIG1fc2Vuc2l0aXZpdHkpOworCQlpZiAocmF0aW8gPT0gMCkgcmF0aW8gPS4wMDAwMDAwMDAxOworCQlsZWZ0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOworCQlyaWdodE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZSAvIHJhdGlvOworCX0KKwllbHNlCisJeworCQlsZWZ0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOworCQlyaWdodE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZTsKKwl9CisJU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGxlZnRPdXRwdXQsIHJpZ2h0T3V0cHV0KTsKK30KKworLyoqCisgKiBQcm92aWRlIHRhbmsgc3RlZXJpbmcgdXNpbmcgdGhlIHN0b3JlZCByb2JvdCBjb25maWd1cmF0aW9uLgorICogRHJpdmUgdGhlIHJvYm90IHVzaW5nIHR3byBqb3lzdGljayBpbnB1dHMuIFRoZSBZLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmcm9tCisgKiBlYWNoIEpveXN0aWNrIG9iamVjdC4KKyAqIEBwYXJhbSBsZWZ0U3RpY2sgVGhlIGpveXN0aWNrIHRvIGNvbnRyb2wgdGhlIGxlZnQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKiBAcGFyYW0gcmlnaHRTdGljayBUaGUgam95c3RpY2sgdG8gY29udHJvbCB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQgKmxlZnRTdGljaywgR2VuZXJpY0hJRCAqcmlnaHRTdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzKQoreworCWlmIChsZWZ0U3RpY2sgPT0gbnVsbHB0ciB8fCByaWdodFN0aWNrID09IG51bGxwdHIpCisJeworCQl3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7CisJCXJldHVybjsKKwl9CisJVGFua0RyaXZlKGxlZnRTdGljay0+R2V0WSgpLCByaWdodFN0aWNrLT5HZXRZKCksIHNxdWFyZWRJbnB1dHMpOworfQorCit2b2lkIFJvYm90RHJpdmU6OlRhbmtEcml2ZShHZW5lcmljSElEICZsZWZ0U3RpY2ssIEdlbmVyaWNISUQgJnJpZ2h0U3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwlUYW5rRHJpdmUobGVmdFN0aWNrLkdldFkoKSwgcmlnaHRTdGljay5HZXRZKCksIHNxdWFyZWRJbnB1dHMpOworfQorCisvKioKKyAqIFByb3ZpZGUgdGFuayBzdGVlcmluZyB1c2luZyB0aGUgc3RvcmVkIHJvYm90IGNvbmZpZ3VyYXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGxldHMgeW91IHBpY2sgdGhlIGF4aXMgdG8gYmUgdXNlZCBvbiBlYWNoIEpveXN0aWNrIG9iamVjdCBmb3IgdGhlIGxlZnQKKyAqIGFuZCByaWdodCBzaWRlcyBvZiB0aGUgcm9ib3QuCisgKiBAcGFyYW0gbGVmdFN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdG8gdXNlIGZvciB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KKyAqIEBwYXJhbSBsZWZ0QXhpcyBUaGUgYXhpcyB0byBzZWxlY3Qgb24gdGhlIGxlZnQgc2lkZSBKb3lzdGljayBvYmplY3QuCisgKiBAcGFyYW0gcmlnaHRTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJvYm90LgorICogQHBhcmFtIHJpZ2h0QXhpcyBUaGUgYXhpcyB0byBzZWxlY3Qgb24gdGhlIHJpZ2h0IHNpZGUgSm95c3RpY2sgb2JqZWN0LgorICovCit2b2lkIFJvYm90RHJpdmU6OlRhbmtEcml2ZShHZW5lcmljSElEICpsZWZ0U3RpY2ssIHVpbnQzMl90IGxlZnRBeGlzLAorCQlHZW5lcmljSElEICpyaWdodFN0aWNrLCB1aW50MzJfdCByaWdodEF4aXMsIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwlpZiAobGVmdFN0aWNrID09IG51bGxwdHIgfHwgcmlnaHRTdGljayA9PSBudWxscHRyKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOworCQlyZXR1cm47CisJfQorCVRhbmtEcml2ZShsZWZ0U3RpY2stPkdldFJhd0F4aXMobGVmdEF4aXMpLCByaWdodFN0aWNrLT5HZXRSYXdBeGlzKHJpZ2h0QXhpcyksIHNxdWFyZWRJbnB1dHMpOworfQorCit2b2lkIFJvYm90RHJpdmU6OlRhbmtEcml2ZShHZW5lcmljSElEICZsZWZ0U3RpY2ssIHVpbnQzMl90IGxlZnRBeGlzLAorCQlHZW5lcmljSElEICZyaWdodFN0aWNrLCB1aW50MzJfdCByaWdodEF4aXMsIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwlUYW5rRHJpdmUobGVmdFN0aWNrLkdldFJhd0F4aXMobGVmdEF4aXMpLCByaWdodFN0aWNrLkdldFJhd0F4aXMocmlnaHRBeGlzKSwgc3F1YXJlZElucHV0cyk7Cit9CisKKworLyoqCisgKiBQcm92aWRlIHRhbmsgc3RlZXJpbmcgdXNpbmcgdGhlIHN0b3JlZCByb2JvdCBjb25maWd1cmF0aW9uLgorICogVGhpcyBmdW5jdGlvbiBsZXRzIHlvdSBkaXJlY3RseSBwcm92aWRlIGpveXN0aWNrIHZhbHVlcyBmcm9tIGFueSBzb3VyY2UuCisgKiBAcGFyYW0gbGVmdFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbGVmdCBzdGljay4KKyAqIEBwYXJhbSByaWdodFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcmlnaHQgc3RpY2suCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKGZsb2F0IGxlZnRWYWx1ZSwgZmxvYXQgcmlnaHRWYWx1ZSwgYm9vbCBzcXVhcmVkSW5wdXRzKQoreworCXN0YXRpYyBib29sIHJlcG9ydGVkID0gZmFsc2U7CisJaWYgKCFyZXBvcnRlZCkKKwl7CisJCXJlcG9ydGVkID0gdHJ1ZTsKKwl9CisKKwkvLyBzcXVhcmUgdGhlIGlucHV0cyAod2hpbGUgcHJlc2VydmluZyB0aGUgc2lnbikgdG8gaW5jcmVhc2UgZmluZSBjb250cm9sIHdoaWxlIHBlcm1pdHRpbmcgZnVsbCBwb3dlcgorCWxlZnRWYWx1ZSA9IExpbWl0KGxlZnRWYWx1ZSk7CisJcmlnaHRWYWx1ZSA9IExpbWl0KHJpZ2h0VmFsdWUpOworCWlmKHNxdWFyZWRJbnB1dHMpCisJeworCQlpZiAobGVmdFZhbHVlID49IDAuMCkKKwkJeworCQkJbGVmdFZhbHVlID0gKGxlZnRWYWx1ZSAqIGxlZnRWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsZWZ0VmFsdWUgPSAtKGxlZnRWYWx1ZSAqIGxlZnRWYWx1ZSk7CisJCX0KKwkJaWYgKHJpZ2h0VmFsdWUgPj0gMC4wKQorCQl7CisJCQlyaWdodFZhbHVlID0gKHJpZ2h0VmFsdWUgKiByaWdodFZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJpZ2h0VmFsdWUgPSAtKHJpZ2h0VmFsdWUgKiByaWdodFZhbHVlKTsKKwkJfQorCX0KKworCVNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpOworfQorCisvKioKKyAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLgorICogR2l2ZW4gYSBzaW5nbGUgSm95c3RpY2ssIHRoZSBjbGFzcyBhc3N1bWVzIHRoZSBZIGF4aXMgZm9yIHRoZSBtb3ZlIHZhbHVlIGFuZCB0aGUgWCBheGlzCisgKiBmb3IgdGhlIHJvdGF0ZSB2YWx1ZS4KKyAqIChTaG91bGQgYWRkIG1vcmUgaW5mb3JtYXRpb24gaGVyZSByZWdhcmRpbmcgdGhlIHdheSB0aGF0IGFyY2FkZSBkcml2ZSB3b3Jrcy4pCisgKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHRvIHVzZSBmb3IgQXJjYWRlIHNpbmdsZS1zdGljayBkcml2aW5nLiBUaGUgWS1heGlzIHdpbGwgYmUgc2VsZWN0ZWQKKyAqIGZvciBmb3J3YXJkcy9iYWNrd2FyZHMgYW5kIHRoZSBYLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmb3Igcm90YXRpb24gcmF0ZS4KKyAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIElmIHRydWUsIHRoZSBzZW5zaXRpdml0eSB3aWxsIGJlIGluY3JlYXNlZCBmb3Igc21hbGwgdmFsdWVzCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6QXJjYWRlRHJpdmUoR2VuZXJpY0hJRCAqc3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cykKK3sKKwkvLyBzaW1wbHkgY2FsbCB0aGUgZnVsbC1mZWF0dXJlZCBBcmNhZGVEcml2ZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMKKwlBcmNhZGVEcml2ZShzdGljay0+R2V0WSgpLCBzdGljay0+R2V0WCgpLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIEdpdmVuIGEgc2luZ2xlIEpveXN0aWNrLCB0aGUgY2xhc3MgYXNzdW1lcyB0aGUgWSBheGlzIGZvciB0aGUgbW92ZSB2YWx1ZSBhbmQgdGhlIFggYXhpcworICogZm9yIHRoZSByb3RhdGUgdmFsdWUuCisgKiAoU2hvdWxkIGFkZCBtb3JlIGluZm9ybWF0aW9uIGhlcmUgcmVnYXJkaW5nIHRoZSB3YXkgdGhhdCBhcmNhZGUgZHJpdmUgd29ya3MuKQorICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byB1c2UgZm9yIEFyY2FkZSBzaW5nbGUtc3RpY2sgZHJpdmluZy4gVGhlIFktYXhpcyB3aWxsIGJlIHNlbGVjdGVkCisgKiBmb3IgZm9yd2FyZHMvYmFja3dhcmRzIGFuZCB0aGUgWC1heGlzIHdpbGwgYmUgc2VsZWN0ZWQgZm9yIHJvdGF0aW9uIHJhdGUuCisgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiB0cnVlLCB0aGUgc2Vuc2l0aXZpdHkgd2lsbCBiZSBpbmNyZWFzZWQgZm9yIHNtYWxsIHZhbHVlcworICovCit2b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQgJnN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJLy8gc2ltcGx5IGNhbGwgdGhlIGZ1bGwtZmVhdHVyZWQgQXJjYWRlRHJpdmUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzCisJQXJjYWRlRHJpdmUoc3RpY2suR2V0WSgpLCBzdGljay5HZXRYKCksIHNxdWFyZWRJbnB1dHMpOworfQorCisvKioKKyAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLgorICogR2l2ZW4gdHdvIGpveXN0aWNrIGluc3RhbmNlcyBhbmQgdHdvIGF4aXMsIGNvbXB1dGUgdGhlIHZhbHVlcyB0byBzZW5kIHRvIGVpdGhlciB0d28KKyAqIG9yIGZvdXIgbW90b3JzLgorICogQHBhcmFtIG1vdmVTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZm9yd2FyZC9iYWNrd2FyZCBkaXJlY3Rpb24KKyAqIEBwYXJhbSBtb3ZlQXhpcyBUaGUgYXhpcyBvbiB0aGUgbW92ZVN0aWNrIG9iamVjdCB0byB1c2UgZm9yIGZvd2FyZHMvYmFja3dhcmRzICh0eXBpY2FsbHkgWV9BWElTKQorICogQHBhcmFtIHJvdGF0ZVN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByb3RhdGlvbiB2YWx1ZQorICogQHBhcmFtIHJvdGF0ZUF4aXMgVGhlIGF4aXMgb24gdGhlIHJvdGF0aW9uIG9iamVjdCB0byB1c2UgZm9yIHRoZSByb3RhdGUgcmlnaHQvbGVmdCAodHlwaWNhbGx5IFhfQVhJUykKKyAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbmNyZWFzZXMgdGhlIHNlbnNpdGl2aXR5IGF0IGxvd2VyIHNwZWVkcworICovCit2b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQqIG1vdmVTdGljaywgdWludDMyX3QgbW92ZUF4aXMsCisJCQkJCQkJCUdlbmVyaWNISUQqIHJvdGF0ZVN0aWNrLCB1aW50MzJfdCByb3RhdGVBeGlzLAorCQkJCQkJCQlib29sIHNxdWFyZWRJbnB1dHMpCit7CisJZmxvYXQgbW92ZVZhbHVlID0gbW92ZVN0aWNrLT5HZXRSYXdBeGlzKG1vdmVBeGlzKTsKKwlmbG9hdCByb3RhdGVWYWx1ZSA9IHJvdGF0ZVN0aWNrLT5HZXRSYXdBeGlzKHJvdGF0ZUF4aXMpOworCisJQXJjYWRlRHJpdmUobW92ZVZhbHVlLCByb3RhdGVWYWx1ZSwgc3F1YXJlZElucHV0cyk7Cit9CisKKy8qKgorICogQXJjYWRlIGRyaXZlIGltcGxlbWVudHMgc2luZ2xlIHN0aWNrIGRyaXZpbmcuCisgKiBHaXZlbiB0d28gam95c3RpY2sgaW5zdGFuY2VzIGFuZCB0d28gYXhpcywgY29tcHV0ZSB0aGUgdmFsdWVzIHRvIHNlbmQgdG8gZWl0aGVyIHR3bworICogb3IgZm91ciBtb3RvcnMuCisgKiBAcGFyYW0gbW92ZVN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBmb3J3YXJkL2JhY2t3YXJkIGRpcmVjdGlvbgorICogQHBhcmFtIG1vdmVBeGlzIFRoZSBheGlzIG9uIHRoZSBtb3ZlU3RpY2sgb2JqZWN0IHRvIHVzZSBmb3IgZm93YXJkcy9iYWNrd2FyZHMgKHR5cGljYWxseSBZX0FYSVMpCisgKiBAcGFyYW0gcm90YXRlU3RpY2sgVGhlIEpveXN0aWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIHZhbHVlCisgKiBAcGFyYW0gcm90YXRlQXhpcyBUaGUgYXhpcyBvbiB0aGUgcm90YXRpb24gb2JqZWN0IHRvIHVzZSBmb3IgdGhlIHJvdGF0ZSByaWdodC9sZWZ0ICh0eXBpY2FsbHkgWF9BWElTKQorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGluY3JlYXNlcyB0aGUgc2Vuc2l0aXZpdHkgYXQgbG93ZXIgc3BlZWRzCisgKi8KKwordm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShHZW5lcmljSElEICZtb3ZlU3RpY2ssIHVpbnQzMl90IG1vdmVBeGlzLAorCQkJCQkJCQlHZW5lcmljSElEICZyb3RhdGVTdGljaywgdWludDMyX3Qgcm90YXRlQXhpcywKKwkJCQkJCQkJYm9vbCBzcXVhcmVkSW5wdXRzKQoreworCWZsb2F0IG1vdmVWYWx1ZSA9IG1vdmVTdGljay5HZXRSYXdBeGlzKG1vdmVBeGlzKTsKKwlmbG9hdCByb3RhdGVWYWx1ZSA9IHJvdGF0ZVN0aWNrLkdldFJhd0F4aXMocm90YXRlQXhpcyk7CisKKwlBcmNhZGVEcml2ZShtb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlLCBzcXVhcmVkSW5wdXRzKTsKK30KKworLyoqCisgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KKyAqIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkgcHJvdmlkZSBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLgorICogQHBhcmFtIG1vdmVWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIGZvciBmb3dhcmRzL2JhY2t3YXJkcworICogQHBhcmFtIHJvdGF0ZVZhbHVlIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByb3RhdGUgcmlnaHQvbGVmdAorICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgSWYgc2V0LCBpbmNyZWFzZXMgdGhlIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMKKyAqLwordm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShmbG9hdCBtb3ZlVmFsdWUsIGZsb2F0IHJvdGF0ZVZhbHVlLCBib29sIHNxdWFyZWRJbnB1dHMpCit7CisJc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKKwlpZiAoIXJlcG9ydGVkKQorCXsKKwkJcmVwb3J0ZWQgPSB0cnVlOworCX0KKworCS8vIGxvY2FsIHZhcmlhYmxlcyB0byBob2xkIHRoZSBjb21wdXRlZCBQV00gdmFsdWVzIGZvciB0aGUgbW90b3JzCisJZmxvYXQgbGVmdE1vdG9yT3V0cHV0OworCWZsb2F0IHJpZ2h0TW90b3JPdXRwdXQ7CisKKwltb3ZlVmFsdWUgPSBMaW1pdChtb3ZlVmFsdWUpOworCXJvdGF0ZVZhbHVlID0gTGltaXQocm90YXRlVmFsdWUpOworCisJaWYgKHNxdWFyZWRJbnB1dHMpCisJeworCQkvLyBzcXVhcmUgdGhlIGlucHV0cyAod2hpbGUgcHJlc2VydmluZyB0aGUgc2lnbikgdG8gaW5jcmVhc2UgZmluZSBjb250cm9sIHdoaWxlIHBlcm1pdHRpbmcgZnVsbCBwb3dlcgorCQlpZiAobW92ZVZhbHVlID49IDAuMCkKKwkJeworCQkJbW92ZVZhbHVlID0gKG1vdmVWYWx1ZSAqIG1vdmVWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltb3ZlVmFsdWUgPSAtKG1vdmVWYWx1ZSAqIG1vdmVWYWx1ZSk7CisJCX0KKwkJaWYgKHJvdGF0ZVZhbHVlID49IDAuMCkKKwkJeworCQkJcm90YXRlVmFsdWUgPSAocm90YXRlVmFsdWUgKiByb3RhdGVWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyb3RhdGVWYWx1ZSA9IC0ocm90YXRlVmFsdWUgKiByb3RhdGVWYWx1ZSk7CisJCX0KKwl9CisKKwlpZiAobW92ZVZhbHVlID4gMC4wKQorCXsKKwkJaWYgKHJvdGF0ZVZhbHVlID4gMC4wKQorCQl7CisJCQlsZWZ0TW90b3JPdXRwdXQgPSBtb3ZlVmFsdWUgLSByb3RhdGVWYWx1ZTsKKwkJCXJpZ2h0TW90b3JPdXRwdXQgPSBzdGQ6Om1heChtb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxlZnRNb3Rvck91dHB1dCA9IHN0ZDo6bWF4KG1vdmVWYWx1ZSwgLXJvdGF0ZVZhbHVlKTsKKwkJCXJpZ2h0TW90b3JPdXRwdXQgPSBtb3ZlVmFsdWUgKyByb3RhdGVWYWx1ZTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocm90YXRlVmFsdWUgPiAwLjApCisJCXsKKwkJCWxlZnRNb3Rvck91dHB1dCA9IC0gc3RkOjptYXgoLW1vdmVWYWx1ZSwgcm90YXRlVmFsdWUpOworCQkJcmlnaHRNb3Rvck91dHB1dCA9IG1vdmVWYWx1ZSArIHJvdGF0ZVZhbHVlOworCQl9CisJCWVsc2UKKwkJeworCQkJbGVmdE1vdG9yT3V0cHV0ID0gbW92ZVZhbHVlIC0gcm90YXRlVmFsdWU7CisJCQlyaWdodE1vdG9yT3V0cHV0ID0gLSBzdGQ6Om1heCgtbW92ZVZhbHVlLCAtcm90YXRlVmFsdWUpOworCQl9CisJfQorCVNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhsZWZ0TW90b3JPdXRwdXQsIHJpZ2h0TW90b3JPdXRwdXQpOworfQorCisvKioKKyAqIERyaXZlIG1ldGhvZCBmb3IgTWVjYW51bSB3aGVlbGVkIHJvYm90cy4KKyAqCisgKiBBIG1ldGhvZCBmb3IgZHJpdmluZyB3aXRoIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuIFRoZXJlIGFyZSA0IHdoZWVscworICogb24gdGhlIHJvYm90LCBhcnJhbmdlZCBzbyB0aGF0IHRoZSBmcm9udCBhbmQgYmFjayB3aGVlbHMgYXJlIHRvZWQgaW4gNDUgZGVncmVlcy4KKyAqIFdoZW4gbG9va2luZyBhdCB0aGUgd2hlZWxzIGZyb20gdGhlIHRvcCwgdGhlIHJvbGxlciBheGxlcyBzaG91bGQgZm9ybSBhbiBYIGFjcm9zcyB0aGUgcm9ib3QuCisgKgorICogVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBkaXJlY3RseSBkcml2ZW4gYnkgam95c3RpY2sgYXhlcy4KKyAqCisgKiBAcGFyYW0geCBUaGUgc3BlZWQgdGhhdCB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlIGluIHRoZSBYIGRpcmVjdGlvbi4gWy0xLjAuLjEuMF0KKyAqIEBwYXJhbSB5IFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gdGhlIFkgZGlyZWN0aW9uLgorICogVGhpcyBpbnB1dCBpcyBpbnZlcnRlZCB0byBtYXRjaCB0aGUgZm9yd2FyZCA9PSAtMS4wIHRoYXQgam95c3RpY2tzIHByb2R1Y2UuIFstMS4wLi4xLjBdCisgKiBAcGFyYW0gcm90YXRpb24gVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YKKyAqIHRoZSB0cmFuc2xhdGlvbi4gWy0xLjAuLjEuMF0KKyAqIEBwYXJhbSBneXJvQW5nbGUgVGhlIGN1cnJlbnQgYW5nbGUgcmVhZGluZyBmcm9tIHRoZSBneXJvLiAgVXNlIHRoaXMgdG8gaW1wbGVtZW50IGZpZWxkLW9yaWVudGVkIGNvbnRyb2xzLgorICovCit2b2lkIFJvYm90RHJpdmU6Ok1lY2FudW1Ecml2ZV9DYXJ0ZXNpYW4oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcm90YXRpb24sIGZsb2F0IGd5cm9BbmdsZSkKK3sKKwlzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOworCWlmICghcmVwb3J0ZWQpCisJeworCQlyZXBvcnRlZCA9IHRydWU7CisJfQorCisJZG91YmxlIHhJbiA9IHg7CisJZG91YmxlIHlJbiA9IHk7CisJLy8gTmVnYXRlIHkgZm9yIHRoZSBqb3lzdGljay4KKwl5SW4gPSAteUluOworCS8vIENvbXBlbnN0YXRlIGZvciBneXJvIGFuZ2xlLgorCVJvdGF0ZVZlY3Rvcih4SW4sIHlJbiwgZ3lyb0FuZ2xlKTsKKworCWRvdWJsZSB3aGVlbFNwZWVkc1trTWF4TnVtYmVyT2ZNb3RvcnNdOworCXdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gPSB4SW4gKyB5SW4gKyByb3RhdGlvbjsKKwl3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSA9IC14SW4gKyB5SW4gLSByb3RhdGlvbjsKKwl3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gPSAteEluICsgeUluICsgcm90YXRpb247CisJd2hlZWxTcGVlZHNba1JlYXJSaWdodE1vdG9yXSA9IHhJbiArIHlJbiAtIHJvdGF0aW9uOworCisJTm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKKworCXVpbnQ4X3Qgc3luY0dyb3VwID0gMHg4MDsKKworCW1fZnJvbnRMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trRnJvbnRMZWZ0TW90b3JdICogbV9pbnZlcnRlZE1vdG9yc1trRnJvbnRMZWZ0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisJbV9mcm9udFJpZ2h0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSAqIG1faW52ZXJ0ZWRNb3RvcnNba0Zyb250UmlnaHRNb3Rvcl0gKiBtX21heE91dHB1dCwgc3luY0dyb3VwKTsKKwltX3JlYXJMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tSZWFyTGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBzeW5jR3JvdXApOworCW1fcmVhclJpZ2h0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhclJpZ2h0TW90b3JdICogbV9pbnZlcnRlZE1vdG9yc1trUmVhclJpZ2h0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisKKwkvLyBDQU5KYWd1YXI6OlVwZGF0ZVN5bmNHcm91cChzeW5jR3JvdXApOworCisJLy8gRklYTUU6IG1fc2FmZXR5SGVscGVyLT5GZWVkKCk7Cit9CisKKy8qKgorICogRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLgorICoKKyAqIEEgbWV0aG9kIGZvciBkcml2aW5nIHdpdGggTWVjYW51bSB3aGVlbGVkIHJvYm90cy4gVGhlcmUgYXJlIDQgd2hlZWxzCisgKiBvbiB0aGUgcm9ib3QsIGFycmFuZ2VkIHNvIHRoYXQgdGhlIGZyb250IGFuZCBiYWNrIHdoZWVscyBhcmUgdG9lZCBpbiA0NSBkZWdyZWVzLgorICogV2hlbiBsb29raW5nIGF0IHRoZSB3aGVlbHMgZnJvbSB0aGUgdG9wLCB0aGUgcm9sbGVyIGF4bGVzIHNob3VsZCBmb3JtIGFuIFggYWNyb3NzIHRoZSByb2JvdC4KKyAqCisgKiBAcGFyYW0gbWFnbml0dWRlIFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gYSBnaXZlbiBkaXJlY3Rpb24uIFstMS4wLi4xLjBdCisgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBkZWdyZWVzLiBUaGUgZGlyZWN0aW9uIGFuZCBtYWdpbml0dXRlIGFyZQorICogaW5kZXBlbmRlbnQgb2YgdGhlIHJvdGF0aW9uIHJhdGUuCisgKiBAcGFyYW0gcm90YXRpb24gVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YKKyAqIHRoZSBtYWduaXR1dGUgb3IgZGlyZWN0aW9uLiBbLTEuMC4uMS4wXQorICovCit2b2lkIFJvYm90RHJpdmU6Ok1lY2FudW1Ecml2ZV9Qb2xhcihmbG9hdCBtYWduaXR1ZGUsIGZsb2F0IGRpcmVjdGlvbiwgZmxvYXQgcm90YXRpb24pCit7CisJc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKKwlpZiAoIXJlcG9ydGVkKQorCXsKKwkJcmVwb3J0ZWQgPSB0cnVlOworCX0KKworCS8vIE5vcm1hbGl6ZWQgZm9yIGZ1bGwgcG93ZXIgYWxvbmcgdGhlIENhcnRlc2lhbiBheGVzLgorCW1hZ25pdHVkZSA9IExpbWl0KG1hZ25pdHVkZSkgKiBzcXJ0KDIuMCk7CisJLy8gVGhlIHJvbGxlcnMgYXJlIGF0IDQ1IGRlZ3JlZSBhbmdsZXMuCisJZG91YmxlIGRpckluUmFkID0gKGRpcmVjdGlvbiArIDQ1LjApICogMy4xNDE1OSAvIDE4MC4wOworCWRvdWJsZSBjb3NEID0gY29zKGRpckluUmFkKTsKKwlkb3VibGUgc2luRCA9IHNpbihkaXJJblJhZCk7CisKKwlkb3VibGUgd2hlZWxTcGVlZHNba01heE51bWJlck9mTW90b3JzXTsKKwl3aGVlbFNwZWVkc1trRnJvbnRMZWZ0TW90b3JdID0gc2luRCAqIG1hZ25pdHVkZSArIHJvdGF0aW9uOworCXdoZWVsU3BlZWRzW2tGcm9udFJpZ2h0TW90b3JdID0gY29zRCAqIG1hZ25pdHVkZSAtIHJvdGF0aW9uOworCXdoZWVsU3BlZWRzW2tSZWFyTGVmdE1vdG9yXSA9IGNvc0QgKiBtYWduaXR1ZGUgKyByb3RhdGlvbjsKKwl3aGVlbFNwZWVkc1trUmVhclJpZ2h0TW90b3JdID0gc2luRCAqIG1hZ25pdHVkZSAtIHJvdGF0aW9uOworCisJTm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKKworCXVpbnQ4X3Qgc3luY0dyb3VwID0gMHg4MDsKKworCW1fZnJvbnRMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trRnJvbnRMZWZ0TW90b3JdICogbV9pbnZlcnRlZE1vdG9yc1trRnJvbnRMZWZ0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisJbV9mcm9udFJpZ2h0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSAqIG1faW52ZXJ0ZWRNb3RvcnNba0Zyb250UmlnaHRNb3Rvcl0gKiBtX21heE91dHB1dCwgc3luY0dyb3VwKTsKKwltX3JlYXJMZWZ0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gKiBtX2ludmVydGVkTW90b3JzW2tSZWFyTGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBzeW5jR3JvdXApOworCW1fcmVhclJpZ2h0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trUmVhclJpZ2h0TW90b3JdICogbV9pbnZlcnRlZE1vdG9yc1trUmVhclJpZ2h0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisKKwkvLyBDQU5KYWd1YXI6OlVwZGF0ZVN5bmNHcm91cChzeW5jR3JvdXApOworCisJLy8gRklYTUU6IG1fc2FmZXR5SGVscGVyLT5GZWVkKCk7Cit9CisKKy8qKgorICogSG9sb25vbWljIERyaXZlIG1ldGhvZCBmb3IgTWVjYW51bSB3aGVlbGVkIHJvYm90cy4KKyAqCisgKiBUaGlzIGlzIGFuIGFsaWFzIHRvIE1lY2FudW1Ecml2ZV9Qb2xhcigpIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5CisgKgorICogQHBhcmFtIG1hZ25pdHVkZSBUaGUgc3BlZWQgdGhhdCB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlIGluIGEgZ2l2ZW4gZGlyZWN0aW9uLiAgWy0xLjAuLjEuMF0KKyAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlLiBUaGUgZGlyZWN0aW9uIGFuZCBtYWdpbml0dXRlIGFyZQorICogaW5kZXBlbmRlbnQgb2YgdGhlIHJvdGF0aW9uIHJhdGUuCisgKiBAcGFyYW0gcm90YXRpb24gVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YKKyAqIHRoZSBtYWduaXR1dGUgb3IgZGlyZWN0aW9uLiAgWy0xLjAuLjEuMF0KKyAqLwordm9pZCBSb2JvdERyaXZlOjpIb2xvbm9taWNEcml2ZShmbG9hdCBtYWduaXR1ZGUsIGZsb2F0IGRpcmVjdGlvbiwgZmxvYXQgcm90YXRpb24pCit7CisJTWVjYW51bURyaXZlX1BvbGFyKG1hZ25pdHVkZSwgZGlyZWN0aW9uLCByb3RhdGlvbik7Cit9CisKKy8qKiBTZXQgdGhlIHNwZWVkIG9mIHRoZSByaWdodCBhbmQgbGVmdCBtb3RvcnMuCisgKiBUaGlzIGlzIHVzZWQgb25jZSBhbiBhcHByb3ByaWF0ZSBkcml2ZSBzZXR1cCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjaCBhcworICogVHdvV2hlZWxEcml2ZSgpLiBUaGUgbW90b3JzIGFyZSBzZXQgdG8gImxlZnRPdXRwdXQiIGFuZCAicmlnaHRPdXRwdXQiCisgKiBhbmQgaW5jbHVkZXMgZmxpcHBpbmcgdGhlIGRpcmVjdGlvbiBvZiBvbmUgc2lkZSBmb3Igb3Bwb3NpbmcgbW90b3JzLgorICogQHBhcmFtIGxlZnRPdXRwdXQgVGhlIHNwZWVkIHRvIHNlbmQgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgcm9ib3QuCisgKiBAcGFyYW0gcmlnaHRPdXRwdXQgVGhlIHNwZWVkIHRvIHNlbmQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJvYm90LgorICovCit2b2lkIFJvYm90RHJpdmU6OlNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhmbG9hdCBsZWZ0T3V0cHV0LCBmbG9hdCByaWdodE91dHB1dCkKK3sKKwl3cGlfYXNzZXJ0KG1fcmVhckxlZnRNb3RvciAhPSBudWxscHRyICYmIG1fcmVhclJpZ2h0TW90b3IgIT0gbnVsbHB0cik7CisKKwl1aW50OF90IHN5bmNHcm91cCA9IDB4ODA7CisKKwlpZiAobV9mcm9udExlZnRNb3RvciAhPSBudWxscHRyKQorCQltX2Zyb250TGVmdE1vdG9yLT5TZXQoTGltaXQobGVmdE91dHB1dCkgKiBtX2ludmVydGVkTW90b3JzW2tGcm9udExlZnRNb3Rvcl0gKiBtX21heE91dHB1dCwgc3luY0dyb3VwKTsKKwltX3JlYXJMZWZ0TW90b3ItPlNldChMaW1pdChsZWZ0T3V0cHV0KSAqIG1faW52ZXJ0ZWRNb3RvcnNba1JlYXJMZWZ0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisKKwlpZiAobV9mcm9udFJpZ2h0TW90b3IgIT0gbnVsbHB0cikKKwkJbV9mcm9udFJpZ2h0TW90b3ItPlNldCgtTGltaXQocmlnaHRPdXRwdXQpICogbV9pbnZlcnRlZE1vdG9yc1trRnJvbnRSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0LCBzeW5jR3JvdXApOworCW1fcmVhclJpZ2h0TW90b3ItPlNldCgtTGltaXQocmlnaHRPdXRwdXQpICogbV9pbnZlcnRlZE1vdG9yc1trUmVhclJpZ2h0TW90b3JdICogbV9tYXhPdXRwdXQsIHN5bmNHcm91cCk7CisKKwkvLyBDQU5KYWd1YXI6OlVwZGF0ZVN5bmNHcm91cChzeW5jR3JvdXApOworCisJLy8gRklYTUU6IG1fc2FmZXR5SGVscGVyLT5GZWVkKCk7Cit9CisKKy8qKgorICogTGltaXQgbW90b3IgdmFsdWVzIHRvIHRoZSAtMS4wIHRvICsxLjAgcmFuZ2UuCisgKi8KK2Zsb2F0IFJvYm90RHJpdmU6OkxpbWl0KGZsb2F0IG51bSkKK3sKKwlpZiAobnVtID4gMS4wKQorCXsKKwkJcmV0dXJuIDEuMDsKKwl9CisJaWYgKG51bSA8IC0xLjApCisJeworCQlyZXR1cm4gLTEuMDsKKwl9CisJcmV0dXJuIG51bTsKK30KKworLyoqCisgKiBOb3JtYWxpemUgYWxsIHdoZWVsIHNwZWVkcyBpZiB0aGUgbWFnbml0dWRlIG9mIGFueSB3aGVlbCBpcyBncmVhdGVyIHRoYW4gMS4wLgorICovCit2b2lkIFJvYm90RHJpdmU6Ok5vcm1hbGl6ZShkb3VibGUgKndoZWVsU3BlZWRzKQoreworCWRvdWJsZSBtYXhNYWduaXR1ZGUgPSBmYWJzKHdoZWVsU3BlZWRzWzBdKTsKKwlpbnQzMl90IGk7CisJZm9yIChpPTE7IGk8a01heE51bWJlck9mTW90b3JzOyBpKyspCisJeworCQlkb3VibGUgdGVtcCA9IGZhYnMod2hlZWxTcGVlZHNbaV0pOworCQlpZiAobWF4TWFnbml0dWRlIDwgdGVtcCkgbWF4TWFnbml0dWRlID0gdGVtcDsKKwl9CisJaWYgKG1heE1hZ25pdHVkZSA+IDEuMCkKKwl7CisJCWZvciAoaT0wOyBpPGtNYXhOdW1iZXJPZk1vdG9yczsgaSsrKQorCQl7CisJCQl3aGVlbFNwZWVkc1tpXSA9IHdoZWVsU3BlZWRzW2ldIC8gbWF4TWFnbml0dWRlOworCQl9CisJfQorfQorCisvKioKKyAqIFJvdGF0ZSBhIHZlY3RvciBpbiBDYXJ0ZXNpYW4gc3BhY2UuCisgKi8KK3ZvaWQgUm9ib3REcml2ZTo6Um90YXRlVmVjdG9yKGRvdWJsZSAmeCwgZG91YmxlICZ5LCBkb3VibGUgYW5nbGUpCit7CisJZG91YmxlIGNvc0EgPSBjb3MoYW5nbGUgKiAoMy4xNDE1OSAvIDE4MC4wKSk7CisJZG91YmxlIHNpbkEgPSBzaW4oYW5nbGUgKiAoMy4xNDE1OSAvIDE4MC4wKSk7CisJZG91YmxlIHhPdXQgPSB4ICogY29zQSAtIHkgKiBzaW5BOworCWRvdWJsZSB5T3V0ID0geCAqIHNpbkEgKyB5ICogY29zQTsKKwl4ID0geE91dDsKKwl5ID0geU91dDsKK30KKworLyoKKyAqIEludmVydCBhIG1vdG9yIGRpcmVjdGlvbi4KKyAqIFRoaXMgaXMgdXNlZCB3aGVuIGEgbW90b3Igc2hvdWxkIHJ1biBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIGFzIHRoZSBkcml2ZQorICogY29kZSB3b3VsZCBub3JtYWxseSBydW4gaXQuIE1vdG9ycyB0aGF0IGFyZSBkaXJlY3QgZHJpdmUgd291bGQgYmUgaW52ZXJ0ZWQsIHRoZQorICogRHJpdmUgY29kZSBhc3N1bWVzIHRoYXQgdGhlIG1vdG9ycyBhcmUgZ2VhcmVkIHdpdGggb25lIHJldmVyc2FsLgorICogQHBhcmFtIG1vdG9yIFRoZSBtb3RvciBpbmRleCB0byBpbnZlcnQuCisgKiBAcGFyYW0gaXNJbnZlcnRlZCBUcnVlIGlmIHRoZSBtb3RvciBzaG91bGQgYmUgaW52ZXJ0ZWQgd2hlbiBvcGVyYXRlZC4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRJbnZlcnRlZE1vdG9yKE1vdG9yVHlwZSBtb3RvciwgYm9vbCBpc0ludmVydGVkKQoreworCWlmIChtb3RvciA8IDAgfHwgbW90b3IgPiAzKQorCXsKKwkJd3BpX3NldFdQSUVycm9yKEludmFsaWRNb3RvckluZGV4KTsKKwkJcmV0dXJuOworCX0KKwltX2ludmVydGVkTW90b3JzW21vdG9yXSA9IGlzSW52ZXJ0ZWQgPyAtMSA6IDE7Cit9CisKKy8qKgorICogU2V0IHRoZSB0dXJuaW5nIHNlbnNpdGl2aXR5LgorICoKKyAqIFRoaXMgb25seSBpbXBhY3RzIHRoZSBEcml2ZSgpIGVudHJ5LXBvaW50LgorICogQHBhcmFtIHNlbnNpdGl2aXR5IEVmZmVjdGl2ZWx5IHNldHMgdGhlIHR1cm5pbmcgc2Vuc2l0aXZpdHkgKG9yIHR1cm4gcmFkaXVzIGZvciBhIGdpdmVuIHZhbHVlKQorICovCit2b2lkIFJvYm90RHJpdmU6OlNldFNlbnNpdGl2aXR5KGZsb2F0IHNlbnNpdGl2aXR5KQoreworCW1fc2Vuc2l0aXZpdHkgPSBzZW5zaXRpdml0eTsKK30KKworLyoqCisgKiBDb25maWd1cmUgdGhlIHNjYWxpbmcgZmFjdG9yIGZvciB1c2luZyBSb2JvdERyaXZlIHdpdGggbW90b3IgY29udHJvbGxlcnMgaW4gYSBtb2RlIG90aGVyIHRoYW4gUGVyY2VudFZidXMuCisgKiBAcGFyYW0gbWF4T3V0cHV0IE11bHRpcGxpZWQgd2l0aCB0aGUgb3V0cHV0IHBlcmNlbnRhZ2UgY29tcHV0ZWQgYnkgdGhlIGRyaXZlIGZ1bmN0aW9ucy4KKyAqLwordm9pZCBSb2JvdERyaXZlOjpTZXRNYXhPdXRwdXQoZG91YmxlIG1heE91dHB1dCkKK3sKKwltX21heE91dHB1dCA9IG1heE91dHB1dDsKK30KKworCisKK3ZvaWQgUm9ib3REcml2ZTo6U2V0RXhwaXJhdGlvbihmbG9hdCB0aW1lb3V0KQoreworCS8vIEZJWE1FOiBtX3NhZmV0eUhlbHBlci0+U2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKK30KKworZmxvYXQgUm9ib3REcml2ZTo6R2V0RXhwaXJhdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIC0xOyAvLyBGSVhNRTogcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7Cit9CisKK2Jvb2wgUm9ib3REcml2ZTo6SXNBbGl2ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7IC8vIEZJWE1FOiBtX3NhZmV0eUhlbHBlci0+SXNBbGl2ZSgpOworfQorCitib29sIFJvYm90RHJpdmU6OklzU2FmZXR5RW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOyAvLyBGSVhNRTogcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc1NhZmV0eUVuYWJsZWQoKTsKK30KKwordm9pZCBSb2JvdERyaXZlOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKwkvLyBGSVhNRTogbV9zYWZldHlIZWxwZXItPlNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgUm9ib3REcml2ZTo6R2V0RGVzY3JpcHRpb24oc3RkOjpvc3RyaW5nc3RyZWFtJiBkZXNjKSBjb25zdAoreworCWRlc2MgPDwgIlJvYm90RHJpdmUiOworfQorCit2b2lkIFJvYm90RHJpdmU6OlN0b3BNb3RvcigpCit7CisJaWYgKG1fZnJvbnRMZWZ0TW90b3IgIT0gbnVsbHB0cikgbV9mcm9udExlZnRNb3Rvci0+RGlzYWJsZSgpOworCWlmIChtX2Zyb250UmlnaHRNb3RvciAhPSBudWxscHRyKSBtX2Zyb250UmlnaHRNb3Rvci0+RGlzYWJsZSgpOworCWlmIChtX3JlYXJMZWZ0TW90b3IgIT0gbnVsbHB0cikgbV9yZWFyTGVmdE1vdG9yLT5EaXNhYmxlKCk7CisJaWYgKG1fcmVhclJpZ2h0TW90b3IgIT0gbnVsbHB0cikgbV9yZWFyUmlnaHRNb3Rvci0+RGlzYWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9TYWZlUFdNLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvU2FmZVBXTS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhMGI2OAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvU2FmZVBXTS5jcHAKQEAgLTAsMCArMSw5MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU2FmZVBXTS5oIgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBhIFNhZmVQV00gb2JqZWN0IHRha2luZyBhIGNoYW5uZWwgbnVtYmVyLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlciAoMC4uMTkpLgorICovCitTYWZlUFdNOjpTYWZlUFdNKHVpbnQzMl90IGNoYW5uZWwpOiBQV00oY2hhbm5lbCkKK3sKKwltX3NhZmV0eUhlbHBlciA9IHN0ZDo6bWFrZV91bmlxdWU8TW90b3JTYWZldHlIZWxwZXI+KHRoaXMpOworCW1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKK30KKworLyoKKyAqIFNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgUFdNIG9iamVjdAorICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIGZvciB0aGlzIG1vdG9yIG9iamVjdAorICovCit2b2lkIFNhZmVQV006OlNldEV4cGlyYXRpb24oZmxvYXQgdGltZW91dCkKK3sKKwltX3NhZmV0eUhlbHBlci0+U2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIFBXTSBvYmplY3QuCisgKiBAcmV0dXJucyBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgorICovCitmbG9hdCBTYWZlUFdNOjpHZXRFeHBpcmF0aW9uKCkgY29uc3QKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPkdldEV4cGlyYXRpb24oKTsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgUFdNIG9iamVjdCBpcyBjdXJyZW50bHkgYWxpdmUgb3Igc3RvcHBlZCBkdWUgdG8gYSB0aW1lb3V0LgorICogQHJldHVybnMgYSBib29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbW90b3IgaGFzIE5PVCB0aW1lZCBvdXQgYW5kIHNob3VsZCBzdGlsbAorICogYmUgcnVubmluZy4KKyAqLworYm9vbCBTYWZlUFdNOjpJc0FsaXZlKCkgY29uc3QKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsKK30KKworLyoqCisgKiBTdG9wIHRoZSBtb3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBQV00gb2JqZWN0LgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIE1vdG9yU2FmZXR5SGVscGVyIG9iamVjdCB3aGVuIGl0IGhhcyBhIHRpbWVvdXQgZm9yIHRoaXMgUFdNIGFuZCBuZWVkcyB0bworICogc3RvcCBpdCBmcm9tIHJ1bm5pbmcuCisgKi8KK3ZvaWQgU2FmZVBXTTo6U3RvcE1vdG9yKCkKK3sKKwlTZXRSYXcoa1B3bURpc2FibGVkKTsKK30KKworLyoqCisgKiBFbmFibGUvZGlzYWJsZSBtb3RvciBzYWZldHkgZm9yIHRoaXMgZGV2aWNlCisgKiBUdXJuIG9uIGFuZCBvZmYgdGhlIG1vdG9yIHNhZmV0eSBvcHRpb24gZm9yIHRoaXMgUFdNIG9iamVjdC4KKyAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIG9iamVjdAorICovCit2b2lkIFNhZmVQV006OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworCW1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOworfQorCisvKioKKyAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkIGZvciB0aGlzIG9iamVjdAorICogQHJldHVybnMgVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0CisgKi8KK2Jvb2wgU2FmZVBXTTo6SXNTYWZldHlFbmFibGVkKCkgY29uc3QKK3sKKwlyZXR1cm4gbV9zYWZldHlIZWxwZXItPklzU2FmZXR5RW5hYmxlZCgpOworfQorCit2b2lkIFNhZmVQV006OkdldERlc2NyaXB0aW9uKHN0ZDo6b3N0cmluZ3N0cmVhbSYgZGVzYykgY29uc3QKK3sKKwlkZXNjIDw8ICJQV00gIiA8PCBHZXRDaGFubmVsKCk7Cit9CisKKy8qKgorICogRmVlZCB0aGUgTW90b3JTYWZldHkgdGltZXIgd2hlbiBzZXR0aW5nIHRoZSBzcGVlZC4KKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc3ViY2xhc3MgbW90b3Igd2hlbmV2ZXIgaXQgdXBkYXRlcyBpdHMgc3BlZWQsIHRoZXJlYnkgcmVzZXRpbmcKKyAqIHRoZSB0aW1lb3V0IHZhbHVlLgorICogQHBhcmFtIHNwZWVkIFZhbHVlIHRvIHBhc3MgdG8gdGhlIFBXTSBjbGFzcworICovCit2b2lkIFNhZmVQV006OlNldFNwZWVkKGZsb2F0IHNwZWVkKQoreworCVBXTTo6U2V0U3BlZWQoc3BlZWQpOworCW1fc2FmZXR5SGVscGVyLT5GZWVkKCk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1NhbXBsZVJvYm90LmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvU2FtcGxlUm9ib3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZjMxODEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1NhbXBsZVJvYm90LmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU2FtcGxlUm9ib3QuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmgiCisKKyNpZiBkZWZpbmVkKF9VTklYKQorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorICAjaW5jbHVkZSA8d2luZG93cy5oPgorICB2b2lkIHNsZWVwKHVuc2lnbmVkIG1pbGxpc2Vjb25kcykKKwkgICAgeworCSAgICAgICAgU2xlZXAobWlsbGlzZWNvbmRzKTsKKwkgICAgfQorI2VuZGlmCisKKworU2FtcGxlUm9ib3Q6OlNhbXBsZVJvYm90KCkKKwk6IG1fcm9ib3RNYWluT3ZlcnJpZGRlbiAodHJ1ZSkKK3sKK30KKworLyoqCisgKiBSb2JvdC13aWRlIGluaXRpYWxpemF0aW9uIGNvZGUgc2hvdWxkIGdvIGhlcmUuCisgKgorICogUHJvZ3JhbW1lcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBkZWZhdWx0IFJvYm90LXdpZGUgaW5pdGlhbGl6YXRpb24gd2hpY2ggd2lsbAorICogYmUgY2FsbGVkIGVhY2ggdGltZSB0aGUgcm9ib3QgZW50ZXJzIHRoZSBkaXNhYmxlZCBzdGF0ZS4KKyAqLwordm9pZCBTYW1wbGVSb2JvdDo6Um9ib3RJbml0KCkKK3sKKwlwcmludGYoIkRlZmF1bHQgJXMoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioKKyAqIERpc2FibGVkIHNob3VsZCBnbyBoZXJlLgorICogUHJvZ3JhbW1lcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJ1biBjb2RlIHRoYXQgc2hvdWxkIHJ1biB3aGlsZSB0aGUgZmllbGQgaXMKKyAqIGRpc2FibGVkLgorICovCit2b2lkIFNhbXBsZVJvYm90OjpEaXNhYmxlZCgpCit7CisJcHJpbnRmKCJEZWZhdWx0ICVzKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoqCisgKiBBdXRvbm9tb3VzIHNob3VsZCBnbyBoZXJlLgorICogUHJvZ3JhbW1lcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJ1biBjb2RlIHRoYXQgc2hvdWxkIHJ1biB3aGlsZSB0aGUgZmllbGQgaXMKKyAqIGluIHRoZSBhdXRvbm9tb3VzIHBlcmlvZC4gVGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIGVhY2ggdGltZSB0aGUgcm9ib3QgZW50ZXJzIHRoZQorICogYXV0b25vbW91cyBzdGF0ZS4KKyAqLwordm9pZCBTYW1wbGVSb2JvdDo6QXV0b25vbW91cygpCit7CisJcHJpbnRmKCJEZWZhdWx0ICVzKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoqCisgKiBPcGVyYXRvciBjb250cm9sICh0ZWxlLW9wZXJhdGVkKSBjb2RlIHNob3VsZCBnbyBoZXJlLgorICogUHJvZ3JhbW1lcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJ1biBjb2RlIHRoYXQgc2hvdWxkIHJ1biB3aGlsZSB0aGUgZmllbGQgaXMKKyAqIGluIHRoZSBPcGVyYXRvciBDb250cm9sICh0ZWxlLW9wZXJhdGVkKSBwZXJpb2QuIFRoaXMgaXMgY2FsbGVkIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdAorICogZW50ZXJzIHRoZSB0ZWxlb3Agc3RhdGUuCisgKi8KK3ZvaWQgU2FtcGxlUm9ib3Q6Ok9wZXJhdG9yQ29udHJvbCgpCit7CisJcHJpbnRmKCJEZWZhdWx0ICVzKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoqCisgKiBUZXN0IHByb2dyYW0gc2hvdWxkIGdvIGhlcmUuCisgKiBQcm9ncmFtbWVycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcnVuIGNvZGUgdGhhdCBleGVjdXRlcyB3aGlsZSB0aGUgcm9ib3QgaXMKKyAqIGluIHRlc3QgbW9kZS4gVGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIHdoZW5ldmVyIHRoZSByb2JvdCBlbnRlcnMgdGVzdCBtb2RlCisgKi8KK3ZvaWQgU2FtcGxlUm9ib3Q6OlRlc3QoKQoreworCXByaW50ZigiRGVmYXVsdCAlcygpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSFcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qKgorICogUm9ib3QgbWFpbiBwcm9ncmFtIGZvciBmcmVlLWZvcm0gcHJvZ3JhbXMuCisgKgorICogVGhpcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIHN1YmNsYXNzZXMgaWYgdGhlIGludGVudCBpcyB0byBub3QgdXNlIHRoZSBBdXRvbm9tb3VzKCkgYW5kCisgKiBPcGVyYXRvckNvbnRyb2woKSBtZXRob2RzLiBJbiB0aGF0IGNhc2UsIHRoZSBwcm9ncmFtIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5zaW5nIHdoZW4gdG8gcnVuCisgKiB0aGUgYXV0b25vbW91cyBhbmQgb3BlcmF0b3IgY29udHJvbCBmdW5jdGlvbnMgaW4gdGhlaXIgcHJvZ3JhbS4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29uc3RydWN0b3IgaXMgY2FsbGVkLiBJZiBpdCBoYXMgbm90IGJlZW4KKyAqIG92ZXJyaWRkZW4gYnkgYSB1c2VyIHN1YmNsYXNzIChpLmUuIHRoZSBkZWZhdWx0IHZlcnNpb24gcnVucyksIHRoZW4gdGhlIEF1dG9ub21vdXMoKSBhbmQKKyAqIE9wZXJhdG9yQ29udHJvbCgpIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQuCisgKi8KK3ZvaWQgU2FtcGxlUm9ib3Q6OlJvYm90TWFpbigpCit7CisJbV9yb2JvdE1haW5PdmVycmlkZGVuID0gZmFsc2U7Cit9CisKKy8qKgorICogU3RhcnQgYSBjb21wZXRpdGlvbi4KKyAqIFRoaXMgY29kZSBuZWVkcyB0byB0cmFjayB0aGUgb3JkZXIgb2YgdGhlIGZpZWxkIHN0YXJ0aW5nIHRvIGVuc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgaGFwcGVucworICogaW4gdGhlIHJpZ2h0IG9yZGVyLiBSZXBlYXRlZGx5IHJ1biB0aGUgY29ycmVjdCBtZXRob2QsIGVpdGhlciBBdXRvbm9tb3VzIG9yIE9wZXJhdG9yQ29udHJvbAorICogb3IgVGVzdCB3aGVuIHRoZSByb2JvdCBpcyBlbmFibGVkLiBBZnRlciBydW5uaW5nIHRoZSBjb3JyZWN0IG1ldGhvZCwgd2FpdCBmb3Igc29tZSBzdGF0ZSB0bworICogY2hhbmdlLCBlaXRoZXIgdGhlIG90aGVyIG1vZGUgc3RhcnRzIG9yIHRoZSByb2JvdCBpcyBkaXNhYmxlZC4gVGhlbiBnbyBiYWNrIGFuZCB3YWl0IGZvciB0aGUKKyAqIHJvYm90IHRvIGJlIGVuYWJsZWQgYWdhaW4uCisgKi8KK3ZvaWQgU2FtcGxlUm9ib3Q6OlN0YXJ0Q29tcGV0aXRpb24oKQoreworCUxpdmVXaW5kb3cgKmx3ID0gTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKTsKKworCVNtYXJ0RGFzaGJvYXJkOjppbml0KCk7CisJTmV0d29ya1RhYmxlOjpHZXRUYWJsZSgiTGl2ZVdpbmRvdyIpLT5HZXRTdWJUYWJsZSgiflNUQVRVU34iKS0+UHV0Qm9vbGVhbigiTFcgRW5hYmxlZCIsIGZhbHNlKTsKKworCVJvYm90TWFpbigpOworCisJaWYgKCFtX3JvYm90TWFpbk92ZXJyaWRkZW4pCisJeworCQkvLyBmaXJzdCBhbmQgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24KKwkJbHctPlNldEVuYWJsZWQoZmFsc2UpOworCQlSb2JvdEluaXQoKTsKKworCQl3aGlsZSAodHJ1ZSkKKwkJeworCQkJaWYgKElzRGlzYWJsZWQoKSkKKwkJCXsKKwkJCQltX2RzLkluRGlzYWJsZWQodHJ1ZSk7CisJCQkJRGlzYWJsZWQoKTsKKwkJCQltX2RzLkluRGlzYWJsZWQoZmFsc2UpOworCQkJCXdoaWxlIChJc0Rpc2FibGVkKCkpIHNsZWVwKDEpOyAvL21fZHMuV2FpdEZvckRhdGEoKTsKKwkJCX0KKwkJCWVsc2UgaWYgKElzQXV0b25vbW91cygpKQorCQkJeworCQkJCW1fZHMuSW5BdXRvbm9tb3VzKHRydWUpOworCQkJCUF1dG9ub21vdXMoKTsKKwkJCQltX2RzLkluQXV0b25vbW91cyhmYWxzZSk7CisJCQkJd2hpbGUgKElzQXV0b25vbW91cygpICYmIElzRW5hYmxlZCgpKSBzbGVlcCgxKTsgLy9tX2RzLldhaXRGb3JEYXRhKCk7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChJc1Rlc3QoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbHctPlNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgIG1fZHMuSW5UZXN0KHRydWUpOworICAgICAgICAgICAgICBUZXN0KCk7CisgICAgICAgICAgICAgIG1fZHMuSW5UZXN0KGZhbHNlKTsKKyAgICAgICAgICAgICAgd2hpbGUgKElzVGVzdCgpICYmIElzRW5hYmxlZCgpKSBzbGVlcCgxKTsgLy9tX2RzLldhaXRGb3JEYXRhKCk7CisgICAgICAgICAgICAgIGx3LT5TZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKwkJCQltX2RzLkluT3BlcmF0b3JDb250cm9sKHRydWUpOworCQkJCU9wZXJhdG9yQ29udHJvbCgpOworCQkJCW1fZHMuSW5PcGVyYXRvckNvbnRyb2woZmFsc2UpOworCQkJCXdoaWxlIChJc09wZXJhdG9yQ29udHJvbCgpICYmIElzRW5hYmxlZCgpKSBzbGVlcCgxKTsgLy9tX2RzLldhaXRGb3JEYXRhKCk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1NlbnNvckJhc2UuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9TZW5zb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTMwODZmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9TZW5zb3JCYXNlLmNwcApAQCAtMCwwICsxLDE2MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCisjaW5jbHVkZSAiV1BJRXJyb3JzLmgiCisKK2NvbnN0IHVpbnQzMl90IFNlbnNvckJhc2U6OmtEaWdpdGFsQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprQW5hbG9nSW5wdXRzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a1NvbGVub2lkQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprU29sZW5vaWRNb2R1bGVzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a1B3bUNoYW5uZWxzOworY29uc3QgdWludDMyX3QgU2Vuc29yQmFzZTo6a1JlbGF5Q2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprUERQQ2hhbm5lbHM7Citjb25zdCB1aW50MzJfdCBTZW5zb3JCYXNlOjprQ2hhc3Npc1Nsb3RzOworU2Vuc29yQmFzZSAqU2Vuc29yQmFzZTo6bV9zaW5nbGV0b25MaXN0ID0gbnVsbHB0cjsKKworLyoqCisgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZW5zb3IgYmFzZSBhbmQgZ2V0cyBhbiBGUEdBIGhhbmRsZQorICovCitTZW5zb3JCYXNlOjpTZW5zb3JCYXNlKCkKK3sKK30KKworLyoqCisgKiBBZGQgc2Vuc29yIHRvIHRoZSBzaW5nbGV0b24gbGlzdC4KKyAqIEFkZCB0aGlzIHNlbnNvciB0byB0aGUgbGlzdCBvZiBzaW5nbGV0b25zIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkIHdoZW4KKyAqIHRoZSByb2JvdCBwcm9ncmFtIGV4aXRzLiBFYWNoIG9mIHRoZSBzZW5zb3JzIG9uIHRoaXMgbGlzdCBhcmUgc2luZ2xldG9ucywKKyAqIHRoYXQgaXMgdGhleSBhcmVuJ3QgYWxsb2NhdGVkIGRpcmVjdGx5IHdpdGggbmV3LCBidXQgaW5zdGVhZCBhcmUgYWxsb2NhdGVkCisgKiBieSB0aGUgc3RhdGljIEdldEluc3RhbmNlIG1ldGhvZC4gQXMgYSByZXN1bHQsIHRoZXkgYXJlIG5ldmVyIGRlbGV0ZWQgd2hlbgorICogdGhlIHByb2dyYW0gZXhpdHMuIENvbnNlcXVlbnRseSB0aGVzZSBzZW5zb3JzIG1heSBzdGlsbCBiZSBob2xkaW5nIG9udG8KKyAqIHJlc291cmNlcyBhbmQgbmVlZCB0byBoYXZlIHRoZWlyIGRlc3RydWN0b3JzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtLgorICovCit2b2lkIFNlbnNvckJhc2U6OkFkZFRvU2luZ2xldG9uTGlzdCgpCit7CisJbV9uZXh0U2luZ2xldG9uID0gbV9zaW5nbGV0b25MaXN0OworCW1fc2luZ2xldG9uTGlzdCA9IHRoaXM7Cit9CisKKy8qKgorICogRGVsZXRlIGFsbCB0aGUgc2luZ2xldG9uIGNsYXNzZXMgb24gdGhlIGxpc3QuCisgKiBBbGwgdGhlIGNsYXNzZXMgdGhhdCB3ZXJlIGFsbG9jYXRlZCBhcyBzaW5nbGV0b25zIG5lZWQgdG8gYmUgZGVsZXRlZCBzbworICogdGhlaXIgcmVzb3VyY2VzIGNhbiBiZSBmcmVlZC4KKyAqLwordm9pZCBTZW5zb3JCYXNlOjpEZWxldGVTaW5nbGV0b25zKCkKK3sKKwlmb3IgKFNlbnNvckJhc2UgKm5leHQgPSBtX3NpbmdsZXRvbkxpc3Q7IG5leHQgIT0gbnVsbHB0cjspCisJeworCQlTZW5zb3JCYXNlICp0bXAgPSBuZXh0OworCQluZXh0ID0gbmV4dC0+bV9uZXh0U2luZ2xldG9uOworCQlkZWxldGUgdG1wOworCX0KKwltX3NpbmdsZXRvbkxpc3QgPSBudWxscHRyOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIHNvbGVub2lkIG1vZHVsZSBudW1iZXIgaXMgdmFsaWQuCisgKgorICogQHJldHVybiBTb2xlbm9pZCBtb2R1bGUgaXMgdmFsaWQgYW5kIHByZXNlbnQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1NvbGVub2lkTW9kdWxlKHVpbnQ4X3QgbW9kdWxlTnVtYmVyKQoreworCXJldHVybiAxIDw9IG1vZHVsZU51bWJlciAmJiBtb2R1bGVOdW1iZXIgPD0gMjsgLy8gVE9ETzogRml4IGZvciBBdGhlbmEKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBkaWdpdGFsIGNoYW5uZWwgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMgYXJlCisgKiAxLWJhc2VkLgorICoKKyAqIEByZXR1cm4gRGlnaXRhbCBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tEaWdpdGFsQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKQoreworCWlmIChjaGFubmVsID4gMCAmJiBjaGFubmVsIDw9IGtEaWdpdGFsQ2hhbm5lbHMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBkaWdpdGFsIGNoYW5uZWwgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMgYXJlCisgKiAxLWJhc2VkLgorICoKKyAqIEByZXR1cm4gUmVsYXkgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIFNlbnNvckJhc2U6OkNoZWNrUmVsYXlDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPiAwICYmIGNoYW5uZWwgPD0ga1JlbGF5Q2hhbm5lbHMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBkaWdpdGFsIGNoYW5uZWwgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMgYXJlCisgKiAxLWJhc2VkLgorICoKKyAqIEByZXR1cm4gUFdNIGNoYW5uZWwgaXMgdmFsaWQKKyAqLworYm9vbCBTZW5zb3JCYXNlOjpDaGVja1BXTUNoYW5uZWwodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+IDAgJiYgY2hhbm5lbCA8PSBrUHdtQ2hhbm5lbHMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgaW5wdXQgbnVtYmVyIGlzIHZhbGlkLgorICogVmVyaWZ5IHRoYXQgdGhlIGFuYWxvZyBpbnB1dCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycworICogYXJlIDEtYmFzZWQuCisgKgorICogQHJldHVybiBBbmFsb2cgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIFNlbnNvckJhc2U6OkNoZWNrQW5hbG9nSW5wdXQodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+IDAgJiYgY2hhbm5lbCA8PSBrQW5hbG9nSW5wdXRzKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGUgYW5hbG9nIG91dHB1dCBudW1iZXIgaXMgdmFsaWQuCisgKiBWZXJpZnkgdGhhdCB0aGUgYW5hbG9nIG91dHB1dCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycworICogYXJlIDEtYmFzZWQuCisgKgorICogQHJldHVybiBBbmFsb2cgY2hhbm5lbCBpcyB2YWxpZAorICovCitib29sIFNlbnNvckJhc2U6OkNoZWNrQW5hbG9nT3V0cHV0KHVpbnQzMl90IGNoYW5uZWwpCit7CisgICAgaWYgKGNoYW5uZWwgPiAwICYmIGNoYW5uZWwgPD0ga0FuYWxvZ091dHB1dHMpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBWZXJpZnkgdGhhdCB0aGUgc29sZW5vaWQgY2hhbm5lbCBudW1iZXIgaXMgd2l0aGluIGxpbWl0cy4KKyAqIAorICogQHJldHVybiBTb2xlbm9pZCBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tTb2xlbm9pZENoYW5uZWwodWludDMyX3QgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+IDAgJiYgY2hhbm5lbCA8PSBrU29sZW5vaWRDaGFubmVscykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IHRoZSBwb3dlciBkaXN0cmlidXRpb24gY2hhbm5lbCBudW1iZXIgaXMgd2l0aGluIGxpbWl0cy4KKyAqCisgKiBAcmV0dXJuIFBEUCBjaGFubmVsIGlzIHZhbGlkCisgKi8KK2Jvb2wgU2Vuc29yQmFzZTo6Q2hlY2tQRFBDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPiAwICYmIGNoYW5uZWwgPD0ga1BEUENoYW5uZWxzKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1NvbGVub2lkLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvU29sZW5vaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NzE5NGQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1NvbGVub2lkLmNwcApAQCAtMCwwICsxLDk4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJTb2xlbm9pZC5oIgorI2luY2x1ZGUgIldQSUVycm9ycy5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorI2luY2x1ZGUgInNpbXVsYXRpb24vc2ltVGltZS5oIgorCisvKioKKyAqIENvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG9uIHRoZSBzb2xlbm9pZCBtb2R1bGUgdG8gY29udHJvbCAoMS4uOCkuCisgKi8KK1NvbGVub2lkOjpTb2xlbm9pZCh1aW50MzJfdCBjaGFubmVsKSA6IFNvbGVub2lkKDEsIGNoYW5uZWwpIHt9CisKKy8qKgorICogQ29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIG1vZHVsZU51bWJlciBUaGUgc29sZW5vaWQgbW9kdWxlICgxIG9yIDIpLgorICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgb24gdGhlIHNvbGVub2lkIG1vZHVsZSB0byBjb250cm9sICgxLi44KS4KKyAqLworU29sZW5vaWQ6OlNvbGVub2lkKHVpbnQ4X3QgbW9kdWxlTnVtYmVyLCB1aW50MzJfdCBjaGFubmVsKQoreworICAgIGNoYXIgYnVmZmVyWzUwXTsKKyAgICBpbnQgbiA9IHNwcmludGYoYnVmZmVyLCAicG5ldW1hdGljLyVkLyVkIiwgbW9kdWxlTnVtYmVyLCBjaGFubmVsKTsKKyAgICBtX2ltcGwgPSBuZXcgU2ltQ29udGludW91c091dHB1dChidWZmZXIpOworICAKKwlMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRBY3R1YXRvcigiU29sZW5vaWQiLCBtb2R1bGVOdW1iZXIsIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Cit9CisKK1NvbGVub2lkOjp+U29sZW5vaWQoKSB7CisJaWYgKG1fdGFibGUgIT0gbnVsbHB0cikgbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKK30KKworLyoqCisgKiBTZXQgdGhlIHZhbHVlIG9mIGEgc29sZW5vaWQuCisgKgorICogQHBhcmFtIG9uIFR1cm4gdGhlIHNvbGVub2lkIG91dHB1dCBvZmYgb3Igb24uCisgKi8KK3ZvaWQgU29sZW5vaWQ6OlNldChib29sIG9uKQoreworICAgIG1fb24gPSBvbjsKKyAgICBtX2ltcGwtPlNldChvbiA/IDEgOiAtMSk7Cit9CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCisgKgorICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCisgKi8KK2Jvb2wgU29sZW5vaWQ6OkdldCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fb247Cit9CisKKwordm9pZCBTb2xlbm9pZDo6VmFsdWVDaGFuZ2VkKElUYWJsZSogc291cmNlLCBsbHZtOjpTdHJpbmdSZWYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLCBib29sIGlzTmV3KSB7CisgIGlmICghdmFsdWUtPklzQm9vbGVhbigpKSByZXR1cm47CisJU2V0KHZhbHVlLT5HZXRCb29sZWFuKCkpOworfQorCit2b2lkIFNvbGVub2lkOjpVcGRhdGVUYWJsZSgpIHsKKwlpZiAobV90YWJsZSAhPSBudWxscHRyKSB7CisJCW1fdGFibGUtPlB1dEJvb2xlYW4oIlZhbHVlIiwgR2V0KCkpOworCX0KK30KKwordm9pZCBTb2xlbm9pZDo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsKKwlTZXQoZmFsc2UpOworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKwkJbV90YWJsZS0+QWRkVGFibGVMaXN0ZW5lcigiVmFsdWUiLCB0aGlzLCB0cnVlKTsKKwl9Cit9CisKK3ZvaWQgU29sZW5vaWQ6OlN0b3BMaXZlV2luZG93TW9kZSgpIHsKKwlTZXQoZmFsc2UpOworCWlmIChtX3RhYmxlICE9IG51bGxwdHIpIHsKKwkJbV90YWJsZS0+UmVtb3ZlVGFibGVMaXN0ZW5lcih0aGlzKTsKKwl9Cit9CisKK3N0ZDo6c3RyaW5nIFNvbGVub2lkOjpHZXRTbWFydERhc2hib2FyZFR5cGUoKSBjb25zdCB7CisJcmV0dXJuICJTb2xlbm9pZCI7Cit9CisKK3ZvaWQgU29sZW5vaWQ6OkluaXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBzdWJUYWJsZSkgeworCW1fdGFibGUgPSBzdWJUYWJsZTsKKwlVcGRhdGVUYWJsZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SVRhYmxlPiBTb2xlbm9pZDo6R2V0VGFibGUoKSBjb25zdCB7CisJcmV0dXJuIG1fdGFibGU7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1RhbG9uLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvVGFsb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTUwNWQKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1RhbG9uLmNwcApAQCAtMCwwICsxLDc3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJUYWxvbi5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorCisvKioKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBUYWxvbiBpcyBhdHRhY2hlZCB0by4KKyAqLworVGFsb246OlRhbG9uKHVpbnQzMl90IGNoYW5uZWwpIDogU2FmZVBXTShjaGFubmVsKQoreworICAvKiBOb3RlIHRoYXQgdGhlIFRhbG9uIHVzZXMgdGhlIGZvbGxvd2luZyBib3VuZHMgZm9yIFBXTSB2YWx1ZXMuIFRoZXNlIHZhbHVlcworICAgKiBzaG91bGQgd29yayByZWFzb25hYmx5IHdlbGwgZm9yIG1vc3QgY29udHJvbGxlcnMsIGJ1dCBpZiB1c2VycyBleHBlcmllbmNlCisgICAqIGlzc3VlcyBzdWNoIGFzIGFzeW1tZXRyaWMgYmVoYXZpb3IgYXJvdW5kIHRoZSBkZWFkYmFuZCBvciBpbmFiaWxpdHkgdG8KKyAgICogc2F0dXJhdGUgdGhlIGNvbnRyb2xsZXIgaW4gZWl0aGVyIGRpcmVjdGlvbiwgY2FsaWJyYXRpb24gaXMgcmVjb21tZW5kZWQuCisgICAqIFRoZSBjYWxpYnJhdGlvbiBwcm9jZWR1cmUgY2FuIGJlIGZvdW5kIGluIHRoZSBUYWxvbiBVc2VyIE1hbnVhbCBhdmFpbGFibGUKKyAgICogZnJvbSBDVFJFLgorICAgKgorICAgKiAgIC0gMjExID0gZnVsbCAiZm9yd2FyZCIKKyAgICogICAtIDEzMyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICAgKiAgIC0gMTI5ID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQorICAgKiAgIC0gMTI1ID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAgICogICAtIDQ5ID0gZnVsbCAicmV2ZXJzZSIKKyAgICovCisgIFNldEJvdW5kcygyLjAzNywgMS41MzksIDEuNTEzLCAxLjQ4NywgLjk4OSk7CisgIFNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMlgpOworICBTZXRSYXcobV9jZW50ZXJQd20pOworCisgIExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCktPkFkZEFjdHVhdG9yKCJUYWxvbiIsIEdldENoYW5uZWwoKSwgdGhpcyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUuCisgKgorICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQorICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorICogQHBhcmFtIHN5bmNHcm91cCBVbnVzZWQgaW50ZXJmYWNlLgorICovCit2b2lkIFRhbG9uOjpTZXQoZmxvYXQgc3BlZWQsIHVpbnQ4X3Qgc3luY0dyb3VwKQoreworCVNldFNwZWVkKHNwZWVkKTsKK30KKworLyoqCisgKiBHZXQgdGhlIHJlY2VudGx5IHNldCB2YWx1ZSBvZiB0aGUgUFdNLgorICoKKyAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlIGZvciB0aGUgUFdNIGJldHdlZW4gLTEuMCBhbmQgMS4wLgorICovCitmbG9hdCBUYWxvbjo6R2V0KCkgY29uc3QKK3sKKwlyZXR1cm4gR2V0U3BlZWQoKTsKK30KKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBkaXNhYmxpbmcgYSBtb3Rvci4KKyAqLwordm9pZCBUYWxvbjo6RGlzYWJsZSgpCit7CisJU2V0UmF3KGtQd21EaXNhYmxlZCk7Cit9CisKKy8qKgorICogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQV00gdmFsdWUgYXMgd2FzIGZvdW5kIGluIHRoZSBQSURDb250cm9sbGVyCisgKi8KK3ZvaWQgVGFsb246OlBJRFdyaXRlKGZsb2F0IG91dHB1dCkKK3sKKwlTZXQob3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvVGltZXIuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9UaW1lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3MzRkYgotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvVGltZXIuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICovCisvKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLworLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJUaW1lci5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAic2ltdWxhdGlvbi9zaW1UaW1lLmgiCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorCisKKy8vIEludGVybmFsIHN0dWZmCisjaW5jbHVkZSAic2ltdWxhdGlvbi9TaW1GbG9hdElucHV0LmgiCisjaW5jbHVkZSAic2ltdWxhdGlvbi9NYWluTm9kZS5oIgorbmFtZXNwYWNlIHdwaWxpYiB7IG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgZG91YmxlIHNpbVRpbWUgPSAwOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIHRpbWVfd2FpdDsKKyAgICBzdGQ6Om11dGV4IHRpbWVfd2FpdF9tdXRleDsKKworICAgIHZvaWQgdGltZV9jYWxsYmFjayhjb25zdCBtc2dzOjpDb25zdEZsb2F0NjRQdHIgJm1zZykgeworICAgICAgICBzaW1UaW1lID0gbXNnLT5kYXRhKCk7CisgICAgICAgIHRpbWVfd2FpdC5ub3RpZnlfYWxsKCk7CisgICAgfQorfX0KKworLyoqCisgKiBQYXVzZSB0aGUgdGFzayBmb3IgYSBzcGVjaWZpZWQgdGltZS4KKyAqCisgKiBQYXVzZSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGZvciBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZSBnaXZlbiBpbiBzZWNvbmRzLgorICogTW90b3JzIHdpbGwgY29udGludWUgdG8gcnVuIGF0IHRoZWlyIGxhc3QgYXNzaWduZWQgdmFsdWVzLCBhbmQgc2Vuc29ycyB3aWxsIGNvbnRpbnVlIHRvCisgKiB1cGRhdGUuIE9ubHkgdGhlIHRhc2sgY29udGFpbmluZyB0aGUgd2FpdCB3aWxsIHBhdXNlIHVudGlsIHRoZSB3YWl0IHRpbWUgaXMgZXhwaXJlZC4KKyAqCisgKiBAcGFyYW0gc2Vjb25kcyBMZW5ndGggb2YgdGltZSB0byBwYXVzZSwgaW4gc2Vjb25kcy4KKyAqLwordm9pZCBXYWl0KGRvdWJsZSBzZWNvbmRzKQoreworICAgIGlmIChzZWNvbmRzIDwgMC4wKSByZXR1cm47CisKKyAgICBkb3VibGUgc3RhcnQgPSB3cGlsaWI6OmludGVybmFsOjpzaW1UaW1lOworCisJc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHdwaWxpYjo6aW50ZXJuYWw6OnRpbWVfd2FpdF9tdXRleCk7CisgICAgd2hpbGUgKCh3cGlsaWI6OmludGVybmFsOjpzaW1UaW1lIC0gc3RhcnQpIDwgc2Vjb25kcykgeworICAgICAgd3BpbGliOjppbnRlcm5hbDo6dGltZV93YWl0LndhaXQobG9jayk7CisgICAgfQorfQorCisvKgorICogUmV0dXJuIHRoZSBGUEdBIHN5c3RlbSBjbG9jayB0aW1lIGluIHNlY29uZHMuCisgKiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGp1c3QgZm9yd2FyZHMgdG8gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKS4KKyAqIEByZXR1cm5zIFJvYm90IHJ1bm5pbmcgdGltZSBpbiBzZWNvbmRzLgorICovCitkb3VibGUgR2V0Q2xvY2soKQoreworCXJldHVybiBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpOworfQorCisvKioKKyAqIEBicmllZiBHaXZlcyByZWFsLXRpbWUgY2xvY2sgc3lzdGVtIHRpbWUgd2l0aCBuYW5vc2Vjb25kIHJlc29sdXRpb24KKyAqIEByZXR1cm4gVGhlIHRpbWUsIGp1c3QgaW4gY2FzZSB5b3Ugd2FudCB0aGUgcm9ib3QgdG8gc3RhcnQgYXV0b25vbW91cyBhdCA4cG0gb24gU2F0dXJkYXkgKGV4Y2VwdCBpbiBzaW11bGF0aW9uKS4KKyovCitkb3VibGUgR2V0VGltZSgpCit7CisgICAgcmV0dXJuIFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7IC8vIFRoZSBlcG9jaCBzdGFydHMgd2hlbiBHYXplYm8gc3RhcnRzCit9CisKKy8vZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBtc3ZjMTItLXNlZSBDMjg2NAorY29uc3QgZG91YmxlIFRpbWVyOjprUm9sbG92ZXJUaW1lID0gKDFsbCA8PCAzMikgLyAxZTY7CisvKioKKyAqIENyZWF0ZSBhIG5ldyB0aW1lciBvYmplY3QuCisgKgorICogQ3JlYXRlIGEgbmV3IHRpbWVyIG9iamVjdCBhbmQgcmVzZXQgdGhlIHRpbWUgdG8gemVyby4gVGhlIHRpbWVyIGlzIGluaXRpYWxseSBub3QgcnVubmluZyBhbmQKKyAqIG11c3QgYmUgc3RhcnRlZC4KKyAqLworVGltZXI6OlRpbWVyKCkKKwk6IG1fc3RhcnRUaW1lICgwLjApCisJLCBtX2FjY3VtdWxhdGVkVGltZSAoMC4wKQorCSwgbV9ydW5uaW5nIChmYWxzZSkKK3sKKwkvL0NyZWF0ZXMgYSBzZW1hcGhvcmUgdG8gY29udHJvbCBhY2Nlc3MgdG8gY3JpdGljYWwgcmVnaW9ucy4KKwkvL0luaXRpYWxseSAnb3BlbicKKwlSZXNldCgpOworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHRpbWVyLiBJZiB0aGUgY2xvY2sgaXMgcnVubmluZyBpdCBpcyBkZXJpdmVkIGZyb20KKyAqIHRoZSBjdXJyZW50IHN5c3RlbSBjbG9jayB0aGUgc3RhcnQgdGltZSBzdG9yZWQgaW4gdGhlIHRpbWVyIGNsYXNzLiBJZiB0aGUgY2xvY2sKKyAqIGlzIG5vdCBydW5uaW5nLCB0aGVuIHJldHVybiB0aGUgdGltZSB3aGVuIGl0IHdhcyBsYXN0IHN0b3BwZWQuCisgKgorICogQHJldHVybiB1bnNpZ25lZCBDdXJyZW50IHRpbWUgdmFsdWUgZm9yIHRoaXMgdGltZXIgaW4gc2Vjb25kcworICovCitkb3VibGUgVGltZXI6OkdldCgpIGNvbnN0Cit7CisJZG91YmxlIHJlc3VsdDsKKwlkb3VibGUgY3VycmVudFRpbWUgPSBHZXRGUEdBVGltZXN0YW1wKCk7CisKKwlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisJaWYobV9ydW5uaW5nKQorCXsKKwkJLy8gVGhpcyBtYXRoIHdvbid0IHdvcmsgaWYgdGhlIHRpbWVyIHJvbGxlZCBvdmVyICg3MSBtaW51dGVzIGFmdGVyIGJvb3QpLgorCQkvLyBUT0RPOiBDaGVjayBmb3IgaXQgYW5kIGNvbXBlbnNhdGUuCisJCXJlc3VsdCA9IChjdXJyZW50VGltZSAtIG1fc3RhcnRUaW1lKSArIG1fYWNjdW11bGF0ZWRUaW1lOworCX0KKwllbHNlCisJeworCQlyZXN1bHQgPSBtX2FjY3VtdWxhdGVkVGltZTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlc2V0IHRoZSB0aW1lciBieSBzZXR0aW5nIHRoZSB0aW1lIHRvIDAuCisgKgorICogTWFrZSB0aGUgdGltZXIgc3RhcnRUaW1lIHRoZSBjdXJyZW50IHRpbWUgc28gbmV3IHJlcXVlc3RzIHdpbGwgYmUgcmVsYXRpdmUgdG8gbm93CisgKi8KK3ZvaWQgVGltZXI6OlJlc2V0KCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisJbV9hY2N1bXVsYXRlZFRpbWUgPSAwOworCW1fc3RhcnRUaW1lID0gR2V0RlBHQVRpbWVzdGFtcCgpOworfQorCisvKioKKyAqIFN0YXJ0IHRoZSB0aW1lciBydW5uaW5nLgorICogSnVzdCBzZXQgdGhlIHJ1bm5pbmcgZmxhZyB0byB0cnVlIGluZGljYXRpbmcgdGhhdCBhbGwgdGltZSByZXF1ZXN0cyBzaG91bGQgYmUKKyAqIHJlbGF0aXZlIHRvIHRoZSBzeXN0ZW0gY2xvY2suCisgKi8KK3ZvaWQgVGltZXI6OlN0YXJ0KCkKK3sKKwlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisJaWYgKCFtX3J1bm5pbmcpCisJeworCQltX3N0YXJ0VGltZSA9IEdldEZQR0FUaW1lc3RhbXAoKTsKKwkJbV9ydW5uaW5nID0gdHJ1ZTsKKwl9Cit9CisKKy8qKgorICogU3RvcCB0aGUgdGltZXIuCisgKiBUaGlzIGNvbXB1dGVzIHRoZSB0aW1lIGFzIG9mIG5vdyBhbmQgY2xlYXJzIHRoZSBydW5uaW5nIGZsYWcsIGNhdXNpbmcgYWxsCisgKiBzdWJzZXF1ZW50IHRpbWUgcmVxdWVzdHMgdG8gYmUgcmVhZCBmcm9tIHRoZSBhY2N1bXVsYXRlZCB0aW1lIHJhdGhlciB0aGFuCisgKiBsb29raW5nIGF0IHRoZSBzeXN0ZW0gY2xvY2suCisgKi8KK3ZvaWQgVGltZXI6OlN0b3AoKQoreworCWRvdWJsZSB0ZW1wID0gR2V0KCk7CisKKwlzdGQ6OmxvY2tfZ3VhcmQ8cHJpb3JpdHlfbXV0ZXg+IHN5bmMobV9tdXRleCk7CisJaWYgKG1fcnVubmluZykKKwl7CisJCW1fYWNjdW11bGF0ZWRUaW1lID0gdGVtcDsKKwkJbV9ydW5uaW5nID0gZmFsc2U7CisJfQorfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBwZXJpb2Qgc3BlY2lmaWVkIGhhcyBwYXNzZWQgYW5kIGlmIGl0IGhhcywgYWR2YW5jZSB0aGUgc3RhcnQKKyAqIHRpbWUgYnkgdGhhdCBwZXJpb2QuIFRoaXMgaXMgdXNlZnVsIHRvIGRlY2lkZSBpZiBpdCdzIHRpbWUgdG8gZG8gcGVyaW9kaWMKKyAqIHdvcmsgd2l0aG91dCBkcmlmdGluZyBsYXRlciBieSB0aGUgdGltZSBpdCB0b29rIHRvIGdldCBhcm91bmQgdG8gY2hlY2tpbmcuCisgKgorICogQHBhcmFtIHBlcmlvZCBUaGUgcGVyaW9kIHRvIGNoZWNrIGZvciAoaW4gc2Vjb25kcykuCisgKiBAcmV0dXJuIElmIHRoZSBwZXJpb2QgaGFzIHBhc3NlZC4KKyAqLworYm9vbCBUaW1lcjo6SGFzUGVyaW9kUGFzc2VkKGRvdWJsZSBwZXJpb2QpCit7CisJaWYgKEdldCgpID4gcGVyaW9kKQorCXsKKwkJc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBzeW5jKG1fbXV0ZXgpOworCQkvLyBBZHZhbmNlIHRoZSBzdGFydCB0aW1lIGJ5IHRoZSBwZXJpb2QuCisJCS8vIERvbid0IHNldCBpdCB0byB0aGUgY3VycmVudCB0aW1lLi4uIHdlIHdhbnQgdG8gYXZvaWQgZHJpZnQuCisJCW1fc3RhcnRUaW1lICs9IHBlcmlvZDsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgRlBHQSBzeXN0ZW0gY2xvY2sgdGltZSBpbiBzZWNvbmRzLgorICoKKyAqIFJldHVybiB0aGUgdGltZSBmcm9tIHRoZSBGUEdBIGhhcmR3YXJlIGNsb2NrIGluIHNlY29uZHMgc2luY2UgdGhlIEZQR0EKKyAqIHN0YXJ0ZWQuCisgKiBSb2xscyBvdmVyIGFmdGVyIDcxIG1pbnV0ZXMuCisgKiBAcmV0dXJucyBSb2JvdCBydW5uaW5nIHRpbWUgaW4gc2Vjb25kcy4KKyAqLworZG91YmxlIFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCkKK3sKKwkvLyBGUEdBIHJldHVybnMgdGhlIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMKKwkvLyBDYWxsIHRoZSBoZWxwZXIgR2V0RlBHQVRpbWUoKSBpbiBVdGlsaXR5LmNwcAorCXJldHVybiB3cGlsaWI6OmludGVybmFsOjpzaW1UaW1lOworfQorCisvKgorICogTm90IGluIGEgbWF0Y2guCisgKi8KK2RvdWJsZSBUaW1lcjo6R2V0TWF0Y2hUaW1lKCkKK3sKKwlyZXR1cm4gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKK30KKworLy8gSW50ZXJuYWwgZnVuY3Rpb24gdGhhdCByZWFkcyB0aGUgUFBDIHRpbWVzdGFtcCBjb3VudGVyLgorZXh0ZXJuICJDIgoreworCXVpbnQzMl90IG5pVGltZXN0YW1wMzIodm9pZCk7CisJdWludDY0X3QgbmlUaW1lc3RhbXA2NCh2b2lkKTsKK30KZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvVXRpbGl0eS5jcHAgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1V0aWxpdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzEwZjEKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL1V0aWxpdHkuY3BwCkBAIC0wLDAgKzEsMjM1IEBACisKKy8qIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqLworLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KKy8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiVXRpbGl0eS5oIgorCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJzaW11bGF0aW9uL3NpbVRpbWUuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2lmIGRlZmluZWQoVU5JWCkKKwkjaW5jbHVkZSA8ZXhlY2luZm8uaD4KKwkjaW5jbHVkZSA8Y3h4YWJpLmg+CisjZW5kaWYKKworc3RhdGljIGJvb2wgc3RhY2tUcmFjZUVuYWJsZWQgPSBmYWxzZTsKK3N0YXRpYyBib29sIHN1c3BlbmRPbkFzc2VydEVuYWJsZWQgPSBmYWxzZTsKKworLyoqCisgKiBFbmFibGUgU3RhY2sgdHJhY2UgYWZ0ZXIgYXNzZXJ0cy4KKyAqLwordm9pZCB3cGlfc3RhY2tUcmFjZU9uQXNzZXJ0RW5hYmxlKGJvb2wgZW5hYmxlZCkKK3sKKwlzdGFja1RyYWNlRW5hYmxlZCA9IGVuYWJsZWQ7Cit9CisKKy8qKgorICogRW5hYmxlIHN1c3BlbmQgb24gYXNzc2VydC4KKyAqIElmIGVuYWJsZWQsIHRoZSB1c2VyIHRhc2sgd2lsbCBiZSBzdXNwZW5kZWQgd2hlbmV2ZXIgYW4gYXNzZXJ0IGZhaWxzLiBUaGlzCisgKiB3aWxsIGFsbG93IHRoZSB1c2VyIHRvIGF0dGFjaCB0byB0aGUgdGFzayB3aXRoIHRoZSBkZWJ1Z2dlciBhbmQgZXhhbWluZSB2YXJpYWJsZXMKKyAqIGFyb3VuZCB0aGUgZmFpbHVyZS4KKyAqLwordm9pZCB3cGlfc3VzcGVuZE9uQXNzZXJ0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisJc3VzcGVuZE9uQXNzZXJ0RW5hYmxlZCA9IGVuYWJsZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHdwaV9oYW5kbGVUcmFjaW5nKCkKK3sKKwkvLyBpZiAoc3RhY2tUcmFjZUVuYWJsZWQpCisJLy8geworCS8vIAlwcmludGYoIlxuLS0tLS0tLS0tLS08U3RhY2sgVHJhY2U+LS0tLS0tLS0tLS0tLS0tLVxuIik7CisJLy8gCXByaW50Q3VycmVudFN0YWNrVHJhY2UoKTsKKwkvLyB9CisJcHJpbnRmKCJcbiIpOworfQorCisvKioKKyAqIEFzc2VydCBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoaXMgYWxsb3dzIGJyZWFrcG9pbnRzIHRvIGJlIHNldCBvbiBhbiBhc3NlcnQuCisgKiBUaGUgdXNlcnMgZG9uJ3QgY2FsbCB0aGlzLCBidXQgaW5zdGVhZCB1c2UgdGhlIHdwaV9hc3NlcnQgbWFjcm9zIGluIFV0aWxpdHkuaC4KKyAqLworYm9vbCB3cGlfYXNzZXJ0X2ltcGwoYm9vbCBjb25kaXRpb25WYWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbmRpdGlvblRleHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVzc2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGluZU51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcgJmZ1bmNOYW1lKSB7CisgIGlmICghY29uZGl0aW9uVmFsdWUpIHsKKyAgICAvLyBFcnJvciBzdHJpbmcgYnVmZmVyCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gZXJyb3I7CisKKyAgICAvLyBJZiBhbiBlcnJvciBtZXNzYWdlIHdhcyBzcGVjaWZpZWQsIGluY2x1ZGUgaXQKKyAgICAvLyBCdWlsZCBlcnJvciBzdHJpbmcKKyAgICBpZiAobWVzc2FnZS5zaXplKCkpIHsKKyAgICAgIGVycm9yIDw8ICJBc3NlcnRpb24gZmFpbGVkOiBcIiIgPDwgbWVzc2FnZSA8PCAiXCIsIFwiIiA8PCBjb25kaXRpb25UZXh0CisgICAgICAgICAgICA8PCAiXCIgZmFpbGVkIGluICIgPDwgZnVuY05hbWUgKyAiKCkgaW4gIiA8PCBmaWxlTmFtZSA8PCAiIGF0IGxpbmUgIgorICAgICAgICAgICAgPDwgbGluZU51bWJlcjsKKyAgICB9IGVsc2UgeworICAgICAgZXJyb3IgPDwgIkFzc2VydGlvbiBmYWlsZWQ6IFwiIiA8PCBjb25kaXRpb25UZXh0IDw8ICJcIiBpbiAiIDw8IGZ1bmNOYW1lCisgICAgICAgICAgICA8PCAiKCkgaW4gIiA8PCBmaWxlTmFtZSA8PCAiIGF0IGxpbmUgIiA8PCBsaW5lTnVtYmVyOworICAgIH0KKworICAgIC8vIFByaW50IHRvIGNvbnNvbGUgYW5kIHNlbmQgdG8gcmVtb3RlIGRhc2hib2FyZAorICAgIHN0ZDo6Y291dCA8PCAiXG5cbj4+Pj4iIDw8IGVycm9yLnN0cigpOworCisgICAgd3BpX2hhbmRsZVRyYWNpbmcoKTsKKyAgfQorICByZXR1cm4gY29uZGl0aW9uVmFsdWU7Cit9CisKKy8qKgorICogQ29tbW9uIGVycm9yIHJvdXRpbmVzIGZvciB3cGlfYXNzZXJ0RXF1YWxfaW1wbCBhbmQgd3BpX2Fzc2VydE5vdEVxdWFsX2ltcGwKKyAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHk7IGl0IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgd3BpX2Fzc2VydEVxdWFsX2ltcGwKKyAqIGFuZCB3cGlfYXNzZXJ0Tm90RXF1YWxfaW1wbC4KKyAqLwordm9pZCB3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwoaW50IHZhbHVlQSwgaW50IHZhbHVlQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZlcXVhbGl0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZnVuY05hbWUpIHsKKyAgLy8gRXJyb3Igc3RyaW5nIGJ1ZmZlcgorICBzdGQ6OnN0cmluZ3N0cmVhbSBlcnJvcjsKKworICAvLyBJZiBhbiBlcnJvciBtZXNzYWdlIHdhcyBzcGVjaWZpZWQsIGluY2x1ZGUgaXQKKyAgLy8gQnVpbGQgZXJyb3Igc3RyaW5nCisgIGlmIChtZXNzYWdlLnNpemUoKSA+IDApIHsKKyAgICBlcnJvciA8PCAiQXNzZXJ0aW9uIGZhaWxlZDogXCIiIDw8IG1lc3NhZ2UgPDwgIlwiLCBcIiIgPDwgdmFsdWVBIDw8ICJcIiAiCisgICAgICAgICAgPDwgZXF1YWxpdHlUeXBlIDw8ICIgXCIiIDw8IHZhbHVlQiA8PCAiXCIgaW4gIiA8PCBmdW5jTmFtZSA8PCAiKCkgaW4gIgorICAgICAgICAgIDw8IGZpbGVOYW1lIDw8ICIgYXQgbGluZSAiIDw8IGxpbmVOdW1iZXIgPDwgIlxuIjsKKyAgfSBlbHNlIHsKKyAgICBlcnJvciA8PCAiQXNzZXJ0aW9uIGZhaWxlZDogXCIiIDw8IHZhbHVlQSA8PCAiXCIgIiA8PCBlcXVhbGl0eVR5cGUgPDwgIiBcIiIKKyAgICAgICAgICA8PCB2YWx1ZUIgPDwgIlwiIGluICIgPDwgZnVuY05hbWUgPDwgIigpIGluICIgPDwgZmlsZU5hbWUKKyAgICAgICAgICA8PCAiIGF0IGxpbmUgIiA8PCBsaW5lTnVtYmVyIDw8ICJcbiI7CisgIH0KKworICAvLyBQcmludCB0byBjb25zb2xlIGFuZCBzZW5kIHRvIHJlbW90ZSBkYXNoYm9hcmQKKyAgc3RkOjpjb3V0IDw8ICJcblxuPj4+PiIgPDwgZXJyb3Iuc3RyKCk7CisKKyAgd3BpX2hhbmRsZVRyYWNpbmcoKTsKK30KKworLyoqCisgKiBBc3NlcnQgZXF1YWwgaW1wbGVtZW50YXRpb24uCisgKiBUaGlzIGRldGVybWluZXMgd2hldGhlciB0aGUgdHdvIGdpdmVuIGludGVnZXJzIGFyZSBlcXVhbC4gSWYgbm90LAorICogdGhlIHZhbHVlIG9mIGVhY2ggaXMgcHJpbnRlZCBhbG9uZyB3aXRoIGFuIG9wdGlvbmFsIG1lc3NhZ2Ugc3RyaW5nLgorICogVGhlIHVzZXJzIGRvbid0IGNhbGwgdGhpcywgYnV0IGluc3RlYWQgdXNlIHRoZSB3cGlfYXNzZXJ0RXF1YWwgbWFjcm9zIGluIFV0aWxpdHkuaC4KKyAqLworYm9vbCB3cGlfYXNzZXJ0RXF1YWxfaW1wbChpbnQgdmFsdWVBLAorCQkJCQkgCSAgaW50IHZhbHVlQiwKKwkJCQkJCSAgY29uc3Qgc3RkOjpzdHJpbmcgJm1lc3NhZ2UsCisJCQkJCQkgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlTmFtZSwKKwkJCQkJCSAgdWludDMyX3QgbGluZU51bWJlciwKKwkJCQkJCSAgY29uc3Qgc3RkOjpzdHJpbmcgJmZ1bmNOYW1lKQoreworCWlmKCEodmFsdWVBID09IHZhbHVlQikpCisJeworCQl3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwodmFsdWVBLCB2YWx1ZUIsICIhPSIsIG1lc3NhZ2UsIGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBmdW5jTmFtZSk7CisJfQorCXJldHVybiB2YWx1ZUEgPT0gdmFsdWVCOworfQorCisvKioKKyAqIEFzc2VydCBub3QgZXF1YWwgaW1wbGVtZW50YXRpb24uCisgKiBUaGlzIGRldGVybWluZXMgd2hldGhlciB0aGUgdHdvIGdpdmVuIGludGVnZXJzIGFyZSBlcXVhbC4gSWYgc28sCisgKiB0aGUgdmFsdWUgb2YgZWFjaCBpcyBwcmludGVkIGFsb25nIHdpdGggYW4gb3B0aW9uYWwgbWVzc2FnZSBzdHJpbmcuCisgKiBUaGUgdXNlcnMgZG9uJ3QgY2FsbCB0aGlzLCBidXQgaW5zdGVhZCB1c2UgdGhlIHdwaV9hc3NlcnROb3RFcXVhbCBtYWNyb3MgaW4gVXRpbGl0eS5oLgorICovCitib29sIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGludCB2YWx1ZUEsCisJCQkJCSAJICAgICBpbnQgdmFsdWVCLAorCQkJCQkJICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVzc2FnZSwKKwkJCQkJCSAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVOYW1lLAorCQkJCQkJICAgICB1aW50MzJfdCBsaW5lTnVtYmVyLAorCQkJCQkJICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZnVuY05hbWUpCit7CisJaWYoISh2YWx1ZUEgIT0gdmFsdWVCKSkKKwl7CisJCXdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbCh2YWx1ZUEsIHZhbHVlQiwgIj09IiwgbWVzc2FnZSwgZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGZ1bmNOYW1lKTsKKwl9CisJcmV0dXJuIHZhbHVlQSAhPSB2YWx1ZUI7Cit9CisKKy8qKgorICogUmVhZCB0aGUgbWljcm9zZWNvbmQtcmVzb2x1dGlvbiB0aW1lciBvbiB0aGUgRlBHQS4KKyAqCisgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRpbWUgaW4gbWljcm9zZWNvbmRzIGFjY29yZGluZyB0byB0aGUgRlBHQSAoc2luY2UgRlBHQSByZXNldCkuCisgKi8KK3VpbnQzMl90IEdldEZQR0FUaW1lKCkKK3sKKwlyZXR1cm4gd3BpbGliOjppbnRlcm5hbDo6c2ltVGltZSAqIDFlNjsKK30KKworLy9UT0RPOiBpbXBsZW1lbnQgc3ltYm9sIGRlbWFuZ2xpbmcgYW5kIGJhY2t0cmFjZSBvbiB3aW5kb3dzCisjaWYgZGVmaW5lZChVTklYKQorCisvKioKKyAqIERlbWFuZ2xlIGEgQysrIHN5bWJvbCwgdXNlZCBmb3IgcHJpbnRpbmcgc3RhY2sgdHJhY2VzLgorICovCitzdGF0aWMgc3RkOjpzdHJpbmcgZGVtYW5nbGUoY2hhciBjb25zdCAqbWFuZ2xlZFN5bWJvbCkKK3sKKwljaGFyIGJ1ZmZlclsyNTZdOworCXNpemVfdCBsZW5ndGg7CisJaW50IHN0YXR1czsKKworCWlmKHNzY2FuZihtYW5nbGVkU3ltYm9sLCAiJSpbXihdJSpbXl9dJTI1NVteKStdIiwgYnVmZmVyKSkKKwl7CisJCWNoYXIgKnN5bWJvbCA9IGFiaTo6X19jeGFfZGVtYW5nbGUoYnVmZmVyLCBudWxscHRyLCAmbGVuZ3RoLCAmc3RhdHVzKTsKKworCQlpZihzdGF0dXMgPT0gMCkKKwkJeworCQkJcmV0dXJuIHN5bWJvbDsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIElmIHRoZSBzeW1ib2wgY291bGRuJ3QgYmUgZGVtYW5nbGVkLCBpdCdzIHByb2JhYmx5IGEgQyBmdW5jdGlvbiwKKwkJCS8vIHNvIGp1c3QgcmV0dXJuIGl0IGFzLWlzLgorCQkJcmV0dXJuIGJ1ZmZlcjsKKwkJfQorCX0KKworCisJLy8gSWYgZXZlcnl0aGluZyBlbHNlIGZhaWxlZCwganVzdCByZXR1cm4gdGhlIG1hbmdsZWQgc3ltYm9sCisJcmV0dXJuIG1hbmdsZWRTeW1ib2w7Cit9CisKKy8qKgorICogR2V0IGEgc3RhY2sgdHJhY2UsIGlnbm9yaW5nIHRoZSBmaXJzdCAib2Zmc2V0IiBzeW1ib2xzLgorICovCitzdGQ6OnN0cmluZyBHZXRTdGFja1RyYWNlKHVpbnQzMl90IG9mZnNldCkKK3sKKwl2b2lkICpzdGFja1RyYWNlWzEyOF07CisJaW50IHN0YWNrU2l6ZSA9IGJhY2t0cmFjZShzdGFja1RyYWNlLCAxMjgpOworCWNoYXIgKiptYW5nbGVkU3ltYm9scyA9IGJhY2t0cmFjZV9zeW1ib2xzKHN0YWNrVHJhY2UsIHN0YWNrU2l6ZSk7CisJc3RkOjpzdHJpbmdzdHJlYW0gdHJhY2U7CisKKwlmb3IoaW50IGkgPSBvZmZzZXQ7IGkgPCBzdGFja1NpemU7IGkrKykKKwl7CisJCS8vIE9ubHkgcHJpbnQgcmVjdXJzaXZlIGZ1bmN0aW9ucyBvbmNlIGluIGEgcm93LgorCQlpZihpID09IDAgfHxzdGFja1RyYWNlW2ldICE9IHN0YWNrVHJhY2VbaSAtIDFdKQorCQl7CisJCQl0cmFjZSA8PCAiXHRhdCAiIDw8IGRlbWFuZ2xlKG1hbmdsZWRTeW1ib2xzW2ldKSA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisKKwlmcmVlKG1hbmdsZWRTeW1ib2xzKTsKKworCXJldHVybiB0cmFjZS5zdHIoKTsKK30KKworI2Vsc2UKK3N0YXRpYyBzdGQ6OnN0cmluZyBkZW1hbmdsZShjaGFyIGNvbnN0ICptYW5nbGVkU3ltYm9sKQoreworCXJldHVybiAibm8gZGVtYW5nbGluZyBvbiB3aW5kb3dzIjsKK30KK3N0ZDo6c3RyaW5nIEdldFN0YWNrVHJhY2UodWludDMyX3Qgb2Zmc2V0KQoreworCXJldHVybiAibm8gc3RhY2sgdHJhY2Ugb24gd2luZG93cyI7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvVmljdG9yLmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvVmljdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGJhNjFmCi0tLSAvZGV2L251bGwKKysrIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9WaWN0b3IuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCQkJCQkJCSAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIlZpY3Rvci5oIgorCisvLyNpbmNsdWRlICJOZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIgorI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgorCisvKioKKyAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBWaWN0b3IgaXMgYXR0YWNoZWQgdG8uCisgKi8KK1ZpY3Rvcjo6VmljdG9yKHVpbnQzMl90IGNoYW5uZWwpIDogU2FmZVBXTShjaGFubmVsKQoreworICAvKiBOb3RlIHRoYXQgdGhlIFZpY3RvciB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMKKyAgICogd2VyZSBkZXRlcm1pbmVkIGVtcGlyaWNhbGx5IGFuZCBvcHRpbWl6ZWQgZm9yIHRoZSBWaWN0b3IgODg4LiBUaGVzZSB2YWx1ZXMKKyAgICogc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBWaWN0b3IgODg0IGNvbnRyb2xsZXJzIGFzIHdlbGwgYnV0IGlmIHVzZXJzCisgICAqIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYyBiZWhhdmlvciBhcm91bmQgdGhlIGRlYWRiYW5kIG9yCisgICAqIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLCBjYWxpYnJhdGlvbiBpcworICAgKiByZWNvbW1lbmRlZC4gVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFZpY3RvciA4ODQgVXNlcgorICAgKiBNYW51YWwgYXZhaWxhYmxlIGZyb20gSUZJLgorICAgKgorICAgKiAgIC0gMjA2ID0gZnVsbCAiZm9yd2FyZCIKKyAgICogICAtIDEzMSA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQorICAgKiAgIC0gMTI4ID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQorICAgKiAgIC0gMTI1ID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKKyAgICogICAtIDU2ID0gZnVsbCAicmV2ZXJzZSIKKyAgICovCisKKyAgU2V0Qm91bmRzKDIuMDI3LCAxLjUyNSwgMS41MDcsIDEuNDksIDEuMDI2KTsKKyAgU2V0UGVyaW9kTXVsdGlwbGllcihrUGVyaW9kTXVsdGlwbGllcl8yWCk7CisgIFNldFJhdyhtX2NlbnRlclB3bSk7CisKKyAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkQWN0dWF0b3IoIlZpY3RvciIsIEdldENoYW5uZWwoKSwgdGhpcyk7Cit9CisKKy8qKgorICogU2V0IHRoZSBQV00gdmFsdWUuCisgKgorICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQorICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgorICoKKyAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgorICogQHBhcmFtIHN5bmNHcm91cCBVbnVzZWQgaW50ZXJmYWNlLgorICovCit2b2lkIFZpY3Rvcjo6U2V0KGZsb2F0IHNwZWVkLCB1aW50OF90IHN5bmNHcm91cCkKK3sKKwlTZXRTcGVlZChzcGVlZCk7Cit9CisKKy8qKgorICogR2V0IHRoZSByZWNlbnRseSBzZXQgdmFsdWUgb2YgdGhlIFBXTS4KKyAqCisgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgdGhlIFBXTSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KKyAqLworZmxvYXQgVmljdG9yOjpHZXQoKSBjb25zdAoreworCXJldHVybiBHZXRTcGVlZCgpOworfQorCisvKioKKyAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgorICovCit2b2lkIFZpY3Rvcjo6RGlzYWJsZSgpCit7CisJU2V0UmF3KGtQd21EaXNhYmxlZCk7Cit9CisKKy8qKgorICogV3JpdGUgb3V0IHRoZSBQSUQgdmFsdWUgYXMgc2VlbiBpbiB0aGUgUElET3V0cHV0IGJhc2Ugb2JqZWN0LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQV00gdmFsdWUgYXMgd2FzIGZvdW5kIGluIHRoZSBQSURDb250cm9sbGVyCisgKi8KK3ZvaWQgVmljdG9yOjpQSURXcml0ZShmbG9hdCBvdXRwdXQpCit7CisJU2V0KG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL3NpbXVsYXRpb24vU2ltQ29udGludW91c091dHB1dC5jcHAgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL3NpbXVsYXRpb24vU2ltQ29udGludW91c091dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkYmY3MAotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvc2ltdWxhdGlvbi9TaW1Db250aW51b3VzT3V0cHV0LmNwcApAQCAtMCwwICsxLDI0IEBACisvKgorICogU2ltQ29udGludW91c091dHB1dC5jcHAKKyAqCisgKiAgQ3JlYXRlZCBvbjogTWF5IDI4LCAyMDE0CisgKiAgICAgIEF1dGhvcjogYWxleAorICovCisKKyNpbmNsdWRlICJzaW11bGF0aW9uL1NpbUNvbnRpbnVvdXNPdXRwdXQuaCIKKyNpbmNsdWRlICJzaW11bGF0aW9uL01haW5Ob2RlLmgiCisKK1NpbUNvbnRpbnVvdXNPdXRwdXQ6OlNpbUNvbnRpbnVvdXNPdXRwdXQoc3RkOjpzdHJpbmcgdG9waWMpIHsKKyAgICBwdWIgPSBNYWluTm9kZTo6QWR2ZXJ0aXNlPG1zZ3M6OkZsb2F0NjQ+KCJ+L3NpbXVsYXRvci8iK3RvcGljKTsKKwlzdGQ6OmNvdXQgPDwgIkluaXRpYWxpemVkIH4vc2ltdWxhdG9yLyIrdG9waWMgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFNpbUNvbnRpbnVvdXNPdXRwdXQ6OlNldChmbG9hdCBzcGVlZCkgeworCW1zZ3M6OkZsb2F0NjQgbXNnOworCW1zZy5zZXRfZGF0YShzcGVlZCk7CisJcHViLT5QdWJsaXNoKG1zZyk7Cit9CisKK2Zsb2F0IFNpbUNvbnRpbnVvdXNPdXRwdXQ6OkdldCgpIHsKKwlyZXR1cm4gc3BlZWQ7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL3NpbXVsYXRpb24vU2ltRGlnaXRhbElucHV0LmNwcCBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvc2ltdWxhdGlvbi9TaW1EaWdpdGFsSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOWYyYWUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL3NpbXVsYXRpb24vU2ltRGlnaXRhbElucHV0LmNwcApAQCAtMCwwICsxLDIyIEBACisvKgorICogU2ltRGlnaXRhbElucHV0LmNwcAorICoKKyAqICBDcmVhdGVkIG9uOiBNYXkgMjgsIDIwMTQKKyAqICAgICAgQXV0aG9yOiBhbGV4CisgKi8KKworI2luY2x1ZGUgInNpbXVsYXRpb24vU2ltRGlnaXRhbElucHV0LmgiCisjaW5jbHVkZSAic2ltdWxhdGlvbi9NYWluTm9kZS5oIgorCitTaW1EaWdpdGFsSW5wdXQ6OlNpbURpZ2l0YWxJbnB1dChzdGQ6OnN0cmluZyB0b3BpYykgeworICAgIHN1YiA9IE1haW5Ob2RlOjpTdWJzY3JpYmUoIn4vc2ltdWxhdG9yLyIrdG9waWMsICZTaW1EaWdpdGFsSW5wdXQ6OmNhbGxiYWNrLCB0aGlzKTsKKwlzdGQ6OmNvdXQgPDwgIkluaXRpYWxpemVkIH4vc2ltdWxhdG9yLyIrdG9waWMgPDwgc3RkOjplbmRsOworfQorCitib29sIFNpbURpZ2l0YWxJbnB1dDo6R2V0KCkgeworCXJldHVybiB2YWx1ZTsKK30KKwordm9pZCBTaW1EaWdpdGFsSW5wdXQ6OmNhbGxiYWNrKGNvbnN0IG1zZ3M6OkNvbnN0Qm9vbFB0ciAmbXNnKSB7CisgIHZhbHVlID0gbXNnLT5kYXRhKCk7Cit9CmRpZmYgLS1naXQgYS93cGlsaWJjL3NpbXVsYXRpb24vc3JjL3NpbXVsYXRpb24vU2ltRW5jb2Rlci5jcHAgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL3NpbXVsYXRpb24vU2ltRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyYjhmMQotLS0gL2Rldi9udWxsCisrKyBiL3dwaWxpYmMvc2ltdWxhdGlvbi9zcmMvc2ltdWxhdGlvbi9TaW1FbmNvZGVyLmNwcApAQCAtMCwwICsxLDU0IEBACisKKyNpbmNsdWRlICJzaW11bGF0aW9uL1NpbUVuY29kZXIuaCIKKyNpbmNsdWRlICJzaW11bGF0aW9uL01haW5Ob2RlLmgiCisKK1NpbUVuY29kZXI6OlNpbUVuY29kZXIoc3RkOjpzdHJpbmcgdG9waWMpIHsKKwljb21tYW5kUHViID0gTWFpbk5vZGU6OkFkdmVydGlzZTxtc2dzOjpHelN0cmluZz4oIn4vc2ltdWxhdG9yLyIrdG9waWMrIi9jb250cm9sIik7CisKKwlwb3NTdWIgPSBNYWluTm9kZTo6U3Vic2NyaWJlKCJ+L3NpbXVsYXRvci8iK3RvcGljKyIvcG9zaXRpb24iLAorCQkgICAgICAgICAgICAgICAgICZTaW1FbmNvZGVyOjpwb3NpdGlvbkNhbGxiYWNrLCB0aGlzKTsKKwl2ZWxTdWIgPSBNYWluTm9kZTo6U3Vic2NyaWJlKCJ+L3NpbXVsYXRvci8iK3RvcGljKyIvdmVsb2NpdHkiLAorCQkgICAgICAgICAgICAgICAgICZTaW1FbmNvZGVyOjp2ZWxvY2l0eUNhbGxiYWNrLCB0aGlzKTsKKworCWlmIChjb21tYW5kUHViLT5XYWl0Rm9yQ29ubmVjdGlvbihnYXplYm86OmNvbW1vbjo6VGltZSg1LjApKSkgeyAvLyBXYWl0IHVwIHRvIGZpdmUgc2Vjb25kcy4KKwkJc3RkOjpjb3V0IDw8ICJJbml0aWFsaXplZCB+L3NpbXVsYXRvci8iICsgdG9waWMgPDwgc3RkOjplbmRsOworCX0gZWxzZSB7CisJCXN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgfi9zaW11bGF0b3IvIiArIHRvcGljICsgIjogZG9lcyB0aGUgZW5jb2RlciBleGlzdD8iIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKK3ZvaWQgU2ltRW5jb2Rlcjo6UmVzZXQoKSB7CisJc2VuZENvbW1hbmQoInJlc2V0Iik7Cit9CisKK3ZvaWQgU2ltRW5jb2Rlcjo6U3RhcnQoKSB7CisJc2VuZENvbW1hbmQoInN0YXJ0Iik7Cit9CisKK3ZvaWQgU2ltRW5jb2Rlcjo6U3RvcCgpIHsKKwlzZW5kQ29tbWFuZCgic3RvcCIpOworfQorCitkb3VibGUgU2ltRW5jb2Rlcjo6R2V0UG9zaXRpb24oKSB7CisJcmV0dXJuIHBvc2l0aW9uOworfQorCitkb3VibGUgU2ltRW5jb2Rlcjo6R2V0VmVsb2NpdHkoKSB7CisJcmV0dXJuIHZlbG9jaXR5OworfQorCisKK3ZvaWQgU2ltRW5jb2Rlcjo6c2VuZENvbW1hbmQoc3RkOjpzdHJpbmcgY21kKSB7CisJbXNnczo6R3pTdHJpbmcgbXNnOworCW1zZy5zZXRfZGF0YShjbWQpOworCWNvbW1hbmRQdWItPlB1Ymxpc2gobXNnKTsKK30KKworCit2b2lkIFNpbUVuY29kZXI6OnBvc2l0aW9uQ2FsbGJhY2soY29uc3QgbXNnczo6Q29uc3RGbG9hdDY0UHRyICZtc2cpIHsKKwlwb3NpdGlvbiA9IG1zZy0+ZGF0YSgpOworfQorCit2b2lkIFNpbUVuY29kZXI6OnZlbG9jaXR5Q2FsbGJhY2soY29uc3QgbXNnczo6Q29uc3RGbG9hdDY0UHRyICZtc2cpIHsKKwl2ZWxvY2l0eSA9IG1zZy0+ZGF0YSgpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9zaW11bGF0aW9uL1NpbUZsb2F0SW5wdXQuY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9zaW11bGF0aW9uL1NpbUZsb2F0SW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTkzMzcKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL3NpbXVsYXRpb24vU2ltRmxvYXRJbnB1dC5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIFNpbUZsb2F0SW5wdXQuY3BwCisgKgorICogIENyZWF0ZWQgb246IE1heSAyOCwgMjAxNAorICogICAgICBBdXRob3I6IGFsZXgKKyAqLworCisjaW5jbHVkZSAic2ltdWxhdGlvbi9TaW1GbG9hdElucHV0LmgiCisjaW5jbHVkZSAic2ltdWxhdGlvbi9NYWluTm9kZS5oIgorCitTaW1GbG9hdElucHV0OjpTaW1GbG9hdElucHV0KHN0ZDo6c3RyaW5nIHRvcGljKSB7CisgICAgc3ViID0gTWFpbk5vZGU6OlN1YnNjcmliZSgifi9zaW11bGF0b3IvIit0b3BpYywgJlNpbUZsb2F0SW5wdXQ6OmNhbGxiYWNrLCB0aGlzKTsKKwlzdGQ6OmNvdXQgPDwgIkluaXRpYWxpemVkIH4vc2ltdWxhdG9yLyIrdG9waWMgPDwgc3RkOjplbmRsOworfQorCitkb3VibGUgU2ltRmxvYXRJbnB1dDo6R2V0KCkgeworCXJldHVybiB2YWx1ZTsKK30KKwordm9pZCBTaW1GbG9hdElucHV0OjpjYWxsYmFjayhjb25zdCBtc2dzOjpDb25zdEZsb2F0NjRQdHIgJm1zZykgeworICB2YWx1ZSA9IG1zZy0+ZGF0YSgpOworfQpkaWZmIC0tZ2l0IGEvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9zaW11bGF0aW9uL1NpbUd5cm8uY3BwIGIvd3BpbGliYy9zaW11bGF0aW9uL3NyYy9zaW11bGF0aW9uL1NpbUd5cm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzNjMDUKLS0tIC9kZXYvbnVsbAorKysgYi93cGlsaWJjL3NpbXVsYXRpb24vc3JjL3NpbXVsYXRpb24vU2ltR3lyby5jcHAKQEAgLTAsMCArMSw0NiBAQAorCisjaW5jbHVkZSAic2ltdWxhdGlvbi9TaW1HeXJvLmgiCisjaW5jbHVkZSAic2ltdWxhdGlvbi9NYWluTm9kZS5oIgorCitTaW1HeXJvOjpTaW1HeXJvKHN0ZDo6c3RyaW5nIHRvcGljKSB7CisgICAgY29tbWFuZFB1YiA9IE1haW5Ob2RlOjpBZHZlcnRpc2U8bXNnczo6R3pTdHJpbmc+KCJ+L3NpbXVsYXRvci8iK3RvcGljKyIvY29udHJvbCIpOworICAKKyAgICBwb3NTdWIgPSBNYWluTm9kZTo6U3Vic2NyaWJlKCJ+L3NpbXVsYXRvci8iK3RvcGljKyIvcG9zaXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNpbUd5cm86OnBvc2l0aW9uQ2FsbGJhY2ssIHRoaXMpOworICAgIHZlbFN1YiA9IE1haW5Ob2RlOjpTdWJzY3JpYmUoIn4vc2ltdWxhdG9yLyIrdG9waWMrIi92ZWxvY2l0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2ltR3lybzo6dmVsb2NpdHlDYWxsYmFjaywgdGhpcyk7CisKKyAgICBpZiAoY29tbWFuZFB1Yi0+V2FpdEZvckNvbm5lY3Rpb24oZ2F6ZWJvOjpjb21tb246OlRpbWUoNS4wKSkpIHsgLy8gV2FpdCB1cCB0byBmaXZlIHNlY29uZHMuCisJCXN0ZDo6Y291dCA8PCAiSW5pdGlhbGl6ZWQgfi9zaW11bGF0b3IvIiArIHRvcGljIDw8IHN0ZDo6ZW5kbDsKKwl9IGVsc2UgeworCQlzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIH4vc2ltdWxhdG9yLyIgKyB0b3BpYyArICI6IGRvZXMgdGhlIGd5cm8gZXhpc3Q/IiA8PCBzdGQ6OmVuZGw7CisJfQorfQorCit2b2lkIFNpbUd5cm86OlJlc2V0KCkgeworICAgIHNlbmRDb21tYW5kKCJyZXNldCIpOworfQorCitkb3VibGUgU2ltR3lybzo6R2V0QW5nbGUoKSB7CisgICAgcmV0dXJuIHBvc2l0aW9uOworfQorCitkb3VibGUgU2ltR3lybzo6R2V0VmVsb2NpdHkoKSB7CisgICAgcmV0dXJuIHZlbG9jaXR5OworfQorCisKK3ZvaWQgU2ltR3lybzo6c2VuZENvbW1hbmQoc3RkOjpzdHJpbmcgY21kKSB7CisgIG1zZ3M6Okd6U3RyaW5nIG1zZzsKKyAgbXNnLnNldF9kYXRhKGNtZCk7CisgIGNvbW1hbmRQdWItPlB1Ymxpc2gobXNnKTsKK30KKworCit2b2lkIFNpbUd5cm86OnBvc2l0aW9uQ2FsbGJhY2soY29uc3QgbXNnczo6Q29uc3RGbG9hdDY0UHRyICZtc2cpIHsKKyAgICBwb3NpdGlvbiA9IG1zZy0+ZGF0YSgpOworfQorCit2b2lkIFNpbUd5cm86OnZlbG9jaXR5Q2FsbGJhY2soY29uc3QgbXNnczo6Q29uc3RGbG9hdDY0UHRyICZtc2cpIHsKKyAgICB2ZWxvY2l0eSA9IG1zZy0+ZGF0YSgpOworfQo=